*************************************************;

*--- 3.6節 生存時間解析 ;

data MYDATA ;
  set   QOL ;
  where GROUP ne "C" ;
run ;

ods graphics on ;
proc lifetest data=MYDATA plots=(s) ;
  time   DAY * EVENT(2) ;  * 観察期間*イベントの有無を表す変数 ;
  strata GROUP ;           * 群を表す変数 ;
run;
ods graphics off ;

proc lifetest data=MYDATA ;
  time   DAY * EVENT(2) ;  * 観察期間*イベントの有無を表す変数 ;
  strata GROUP ;           * 群を表す変数 ;
run;

proc phreg data=MYDATA;
  class GROUP ;
  model DAY * EVENT(2) = GROUP / ties=exact;
run ;

proc phreg data=MYDATA;
  class GROUP ;
  model DAY * EVENT(2) = GROUP / ties=exact ;
  hazardratio GROUP / cl=wald ;
run ;

proc phreg data=MYDATA;
  model DAY * EVENT(2) = DURATION / ties=exact;
run ;

proc phreg data=MYDATA;
  class GROUP PREDRUG ;
  model DAY * EVENT(2) = GROUP PREDRUG / ties=exact;
run ;

proc phreg data=MYDATA;
  class GROUP ;
  model DAY * EVENT(2) = GROUP DURATION / ties=exact;
run ;

proc sort data=MYDATA ;
  by PREDRUG ;
run ;

proc phreg data=MYDATA;
  by    PREDRUG ;
  class GROUP ;
  model DAY * EVENT(2) = GROUP / ties=exact;
run ;

proc phreg data=MYDATA ;
  class GROUP PREDRUG ;
  model DAY * EVENT(2) = GROUP PREDRUG GROUP*PREDRUG ;
run ;

proc phreg data=MYDATA;
  class GROUP ;
  model DAY * EVENT(2) = GROUP DURATION GROUP*DURATION / ties=exact;
run ;

data QOL2 ;
  input ID GROUP $ EVENT START END DIFF STRATUM ;
  cards ;
    1 A 1 0 1 1 1
    1 A 1 1 2 1 2
    1 A 2 2 4 2 3
    2 A 1 0 6 6 1
    2 A 1 6 8 2 2
    3 B 2 0 3 3 1
    4 B 1 0 5 5 1
    4 B 2 5 7 2 2
    5 B 1 0 9 9 1
  ;
run ;

data IN ;
  GROUP="A" ; output;
  GROUP="B" ; output;
run;

proc phreg data=QOL2 covs(aggregate) ;
  by     GROUP ;
  class  GROUP ;
  model (START,END)*EVENT(2) = GROUP ;
  baseline covariates=IN out=OUT cmf=_all_ ;
  id ID ;
run;

proc print data=OUT ;
run ;

proc phreg data=QOL2 covs(aggregate) ;
  class  GROUP ;
  model (START,END)*EVENT(2) = GROUP ;
  id     ID ;
run ;

proc phreg data=QOL2 covs(aggregate) ;
  class  GROUP ;
  model (START,END)*EVENT(2) = GROUP ;
  strata STRATUM ;
  id     ID ;
run ;

proc phreg data=QOL2 covs(aggregate) ;
  class  GROUP ;
  model  DIFF*EVENT(2) = GROUP ;
  strata STRATUM ;
  id     ID ;
run ;

proc phreg data=QOL2 covs(aggregate) ;
  class  GROUP ;
  model  END*EVENT(2) = GROUP ;
  strata STRATUM ;
  id     ID ;
run ;

data QOL3 ;
  input ID GROUP $ EVENT END STRATUM ;
  cards ;
    1 A 1 1 1
    1 A 1 2 2
    1 A 2 4 3
    2 A 1 6 1
    2 A 1 8 2
    2 A 2 8 3
    3 B 2 3 1
    3 B 2 3 2
    3 B 2 3 3
    4 B 1 5 1
    4 B 2 7 2
    4 B 2 7 3
    5 B 1 9 1
    5 B 2 9 2
    5 B 2 9 3
  ;
run ;

proc phreg data=QOL3 covs(aggregate) ;
  class  GROUP ;
  model  END*EVENT(2) = GROUP ;
  strata STRATUM ;
  id     ID ;
run ;

ods graphics on ;
proc lifetest data=MYDATA plots=(s,lls) ;
  time   DAY * EVENT(2) ;
  strata GROUP ;
run;
ods graphics off ;

proc phreg data=MYDATA;
  class  GROUP ;
  model  DAY * EVENT(2) = GROUP / ties=exact;
  output out=OUT ressch=SCHOENFELD ;
run ;

proc corr data=OUT ;
  var DAY SCHOENFELD ;
run ;

data QOL4 ;
  input ID GROUP $ COUNT TIME ;    
  LOGT = log(TIME) ;
  cards ;
    1 A 2 4
    2 A 2 8
    3 B 0 3
    4 B 1 7
    5 B 1 9
  ;
run ;

proc genmod data=QOL4 ; 
  class GROUP ; 
  model COUNT=GROUP / link=log dist=poisson offset=LOGT ; 
run ; 

ods graphics on ;
proc phreg data=MYDATA ;
  class GROUP ;
  model DAY * EVENT(2) = GROUP ;
  bayes seed=777 ;
run ;
ods graphics off ;

quit ;

*************************************************;

*--- 3.7節 3つ以上の薬剤間の比較 ;

data MYDATA ;
  set QOL ;
run ;

proc format ;
  value EVENTF 1="Yes" 2="No" ;
run ;

title "棒グラフ(平均値±標準偏差)" ;
proc sgplot data=MYDATA ;
  hbar GROUP / response=QOL stat=mean ;
  dot  GROUP / response=QOL stat=mean numstd=1
               limitstat=stddev limits=upper ;
run ;

title "棒グラフ(平均値±標準偏差)" ;
proc sgpanel data=MYDATA ;
  panelby PREDRUG / rows=1 columns=2 ;
  vbar    GROUP   / response=QOL stat=mean numstd=1
                    limitstat=stddev limits=upper ;
  format  EVENT EVENTF. ;
run ;

title "箱ひげ図" ;
proc sgplot data=MYDATA ;
  hbox QOL / category=GROUP ;
run ;

title "箱ひげ図" ;
proc sgpanel data=MYDATA ;
  panelby PREDRUG / rows=1 columns=2 ;
  vbox    QOL / category=GROUP ;
run ;

title "棒グラフ(改善の有無)" ;
proc sgplot data=MYDATA ;
  hbar   GROUP / GROUP=EVENT ;
  format EVENT EVENTF. ;
run ;

ods output CrossTabFreqs=OUT1(where=(GROUP ne "" and EVENT ne .)) ;
proc freq data=mydata ;
  table GROUP*EVENT / nopercent nocol ;
run ;
ods output close ;

title "棒グラフ(改善の有無)" ;
proc sgplot data=OUT1 ;
  hbar   GROUP / GROUP=EVENT freq=ROWPERCENT ; 
  format EVENT EVENTF. ;
run ;

ods output CrossTabFreqs=OUT2(where=(GROUP ne "" and EVENT ne .)) ;
proc freq data=mydata ;
  table  PREDRUG*GROUP*EVENT / nopercent nocol ;
run ;
ods output close ;

title "棒グラフ(改善の有無)" ;
proc sgpanel data=OUT2 ;
  panelby PREDRUG / rows=1 columns=2 ;
  vbar    GROUP   / GROUP=EVENT freq=ROWPERCENT ;
  format  EVENT EVENTF. ;
run ;

title "";

proc means data=MYDATA nonobs n mean stddev min max fw=4;
  class GROUP ;
  var   QOL ;
run ;

proc means data=MYDATA nonobs n mean stddev min max fw=4;
  class PREDRUG GROUP ;
  var   QOL ;
run ;

proc freq data=MYDATA ;
  table  GROUP*EVENT   / nopercent nocol ;
  format EVENT EVENTF. ;
run ;

proc freq data=MYDATA ;
  table  PREDRUG*GROUP*EVENT / nopercent nocol ;
  format EVENT EVENTF. ;
run ;

proc glm data=MYDATA ;
  class GROUP ;
  model QOL = GROUP / ss3 ;
run ;

proc freq data=MYDATA ;
  table  GROUP*QOL   / nopercent nocol cmh2 scores=rank ;
run ;

proc freq data=MYDATA ;
  table  GROUP*EVENT   / nopercent nocol chisq ;
  format EVENT EVENTF. ;
run ;

proc ttest data=MYDATA ;
  where GROUP in ("A","B") ; class GROUP ; var QOL ;
proc ttest data=MYDATA ;
  where GROUP in ("A","C") ; class GROUP ; var QOL ;
proc ttest data=MYDATA ;
  where GROUP in ("B","C") ; class GROUP ; var QOL ;
run ;

proc freq data=MYDATA ;
  where GROUP in ("A","B") ; tables GROUP*EVENT / chisq ;
proc freq data=MYDATA ;
  where GROUP in ("A","C") ; tables GROUP*EVENT / chisq ;
proc freq data=MYDATA ;
  where GROUP in ("B","C") ; tables GROUP*EVENT / chisq ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution noint ;
  estimate "対比検定" GROUP 1  0 -1 / e ;
run ;

proc logistic data=MYDATA order=internal ;
  class    GROUP EVENT / param=glm ;
  model    EVENT = GROUP / noint expb ;
  contrast "対比検定" GROUP 1  0 -1 / e ;
  format   EVENT EVENTF. ;
run ;

proc freq data=MYDATA ;
  table  GROUP*EVENT / trend ;
  format EVENT EVENTF. ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  estimate "対比検定" GROUP 2 -1 -1 / e ;
  estimate "対比検定" GROUP 1  0 -1 / e ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  estimate "対比検定" INT   0 
                      GROUP 1  0 -1 / e ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  estimate "対比検定" GROUP 1  0 -1 / e ;
run ;

proc phreg data=MYDATA;
  class    GROUP ;
  model    DAY * EVENT(2) = GROUP / ties=exact;
  contrast "対比検定" GROUP 1 -1 / e ;
run ;

proc mixed data=MYDATA ;
  class    GROUP PREDRUG ;
  model    QOL = GROUP*PREDRUG / solution noint ;
  estimate "前治療なしの層"
           GROUP*PREDRUG 1 0 1 0 -2 0 / e ;
run ;

proc logistic data=MYDATA order=internal ;
  class    GROUP EVENT PREDRUG / param=glm ;
  model    EVENT = GROUP*PREDRUG / noint expb ;
  contrast "前治療なしの層"
           GROUP*PREDRUG 1 0 1 0 -2 0 / e ;
  format   EVENT EVENTF. ;
run ;

proc mixed data=MYDATA ;
  class    GROUP PREDRUG ;
  model    QOL = GROUP*PREDRUG / solution noint ;
  estimate "前治療なしの層"
           GROUP*PREDRUG 1 0 1 0 -2 0 / divisor=2 ;
run ;

proc logistic data=MYDATA order=data ;
  class    GROUP EVENT PREDRUG / param=glm ;
  model    EVENT = GROUP*PREDRUG / noint expb ;
  contrast "対数オッズ比に関する傾向性検定"
           GROUP*PREDRUG 1 -1 1 -1 -2 2 / e ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  lsmeans  GROUP / diff=control("C") ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution noint ;
  estimate "A vs C" GROUP 1  0 -1 ;
  estimate "B vs C" GROUP 0  1 -1 ;
run ;

data PVALUE ;
  input TEST $ RAW_P ;
  cards ;
    AvsC 0.0006
    BvsC 0.1794
  ;
run ;

proc multtest pdata=PVALUE bon sid out=OUTDATA ;
run ;

proc print data=OUTDATA ;
run ;

data _null_;
  call symput('bon_a', 0.05/2           );
  call symput('sid_a', 1-(1-0.05)**(1/2));
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  lsmeans  GROUP / diff=control("C") alpha=&bon_a. cl ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  lsmeans  GROUP / diff=control("C") adjust=bon cl ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  lsmeans  GROUP / diff=control("C") adjust=dunnett cl ;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP / solution ;
  lsmeans  GROUP / adjust=tukey cl ;
run ;

quit ;

ods graphics on ;
proc seqdesign plots=all ;
  Pocock1: design method=poc nstages=4 alpha=0.025 alt=upper ;
run ;
ods graphics off ;

data alpha ;
  alpha = 1-probnorm(2.36129) ;
proc print;
run ;

proc seqdesign boundaryscale=pvalue ;
  Pocock1: design method=poc nstages=4 alpha=0.025 alt=upper ;
run ;

ods graphics on ;
proc seqdesign plots=all ;
  OBrienFleming1: design method=obf nstages=4 alpha=0.025 alt=upper ;
run;
ods graphics off ;

ods graphics on ;
proc seqdesign plots=all ;
  Pocock2:        design method=poc nstages=4 alpha=0.025 alt=lower ;
  OBrienFleming2: design method=obf nstages=4 alpha=0.025 alt=lower ;
  Pocock3:        design method=poc nstages=4 alpha=0.025 ;
  OBrienFleming3: design method=obf nstages=4 alpha=0.025 ;
run;
ods graphics off ;

ods graphics on ;
proc seqdesign plots=all errspend ;
  Pocock:        design method=errfuncpoc nstages=4 info=cum(0.2,0.5,0.8,1.0) alpha=0.025 alt=upper ;
  OBrienFleming: design method=errfuncobf nstages=4 info=cum(0.2,0.5,0.8,1.0) alpha=0.025 alt=upper ;
run;
ods graphics off ;

*================================================;

*--- 3.8節 例数設計 ;

proc power;
  onesamplemeans 
  mean   = 3
  stddev = 4
  alpha  = 0.05
  power  = 0.8
  ntotal =  . ;
run ;

proc power;
  onesamplemeans 
  mean   = 3
  stddev = 4
  alpha  = 0.05
  power  =  .
  ntotal = 20 ;
run ;

proc power;
  pairedmeans
  test     = diff
  meandiff = 3
  stddev   = 4 
  alpha    = 0.05
  corr     = 0.6 
  power    = 0.8
  npairs   =  . ;
run ;

proc power ;
  twosamplemeans
  test     = diff
  meandiff = 3
  stddev   = 4
  alpha    = 0.05
  power    = 0.8
  ntotal   =  . ;
run ;

proc power ;
  twosamplemeans
  test      = diff
  meandiff  = 3
  stddev    = 4
  alpha     = 0.05
  power     = 0.8
  npergroup =  . ;
run ;

proc power ;
  twosamplemeans
  test         =  diff
  alpha        =  0.025
  sides        =  u
  groupmeans   = (2,3)
  groupweights = (1,2)
  nulldiff     = -1
  stddev       =  4
  power        =  0.8
  ntotal       =  . ;
run ;

proc power;
  onesamplefreq
  test           = z
  method         = normal
  alpha          =   0.05
  nullproportion =   0.1
  proportion     =   0.2
  power          =   0.8
  ntotal         =    . ;
run ;

proc power;
  twosamplefreq
  test               = pchi
  alpha              = 0.05
  groupproportions   = (0.1 0.2)
  nullproportiondiff = 0.00
  power              = 0.8
  npergroup          =  . ;
run ;

proc power ;
  twosamplefreq
  test               = pchi
  alpha              = 0.025
  sides              = u
  groupproportions   = (0.1 0.2)
  nullproportiondiff = -0.1
  groupweights       = (1,2)
  power              = 0.8
  ntotal             = .  ;
run ;

proc power; 
  twosamplesurvival
  test           = logrank 
  alpha          = 0.05
  curve("薬剤A") = (2):(0.9)
  curve("薬剤B") = (2):(0.8)
  groupsurvival  = "薬剤A" | "薬剤B"
  accrualtime    = 0.001 
  followuptime   = 5 
  power          = 0.8
  ntotal         =  . ; 
run ;

proc power; 
  twosamplesurvival
  test                = logrank 
  alpha               = 0.05
  groupsurvexphazards = (0.05268 0.11157)
  accrualtime         = 0.001 
  followuptime        = 5 
  power               = 0.8
  ntotal              =  . ; 
run ;

proc power;
  onewayanova
  test       = contrast
  alpha      = 0.05
  groupmeans = 0 | 10 | 20 | 30
  stddev     = 25
  power      = 0.8
  contrast   = (-3 -1 1 3)
  ntotal     = . ;
run ;

proc power;
  onewayanova
  test         = contrast
  alpha        = 0.05
  groupmeans   = 0 | 10 | 20 | 30
  groupweights = (1 2 2 2)
  stddev       = 25
  power        = 0.8
  contrast     = (-3 -1 1 3)
  ntotal       = . ;
run ;

ods output OUTPUT=MYSAMPLESIZE ;
proc power ;
  twosamplemeans
  test      = diff
  meandiff  = 1 2 3
  stddev    = 4 5 6
  alpha     = 0.05
  power     = 0.8 0.9
  npergroup =  . ;
run ;
ods output close ;