*--- 3.1節 使用するデータセット ;
data QOL ;
  input GROUP $ QOL EVENT DAY PREDRUG $ DURATION ;
  cards ;
    A  15  1    50  NO    1
    A  13  1   200  NO    3
    A  11  1   250  NO    2
    A  11  1   300  NO    4
    A  10  1   350  NO    2
    A   9  1   400  NO    2
    A   8  1   450  NO    4
    A   8  1   550  NO    2
    A   6  1   600  NO    5
    A   6  1   100  NO    7
    A   4  2   250  NO    4
    A   3  2   500  NO    6
    A   3  2   750  NO    3
    A   3  2   650  NO    7
    A   1  2  1000  NO    8
    A   6  1   150  YES   6
    A   5  1   700  YES   5
    A   4  2   800  YES   7
    A   2  2   900  YES  12
    A   2  2   950  YES  10
    B  13  1   380  NO    9
    B  12  1   880  NO    5
    B  11  1   940  NO    2
    B   4  2    20  NO    7
    B   4  2   560  NO    2
    B   5  1   320  YES  11
    B   5  1   940  YES   3
    B   4  2    80  YES   6
    B   3  2   140  YES   7
    B   3  2   160  YES  13
    B   3  2   240  YES  15
    B   2  2   280  YES   9
    B   2  2   440  YES   8
    B   2  2   520  YES   7
    B   2  2   620  YES   9
    B   2  2   740  YES   8
    B   2  2   860  YES   2
    B   1  2   880  YES  10
    B   0  2   920  YES   8
    B   0  2   960  YES   4
    C   9  1   170  NO    1
    C   7  1   290  NO    4
    C   5  1   430  NO    2
    C   3  2   610  NO    4
    C   2  2   110  NO    5
    C   2  2   410  NO    2
    C   1  2   530  NO    7
    C   1  2   580  NO    2
    C   0  2   810  NO    3
    C   0  2   990  NO   10
    C   6  1    30  YES   1
    C   5  1   830  YES   6
    C   3  2    70  YES  16
    C   2  2   310  YES   9
    C   2  2   370  YES  18
    C   1  2   490  YES   7
    C   1  2   690  YES  10
    C   0  2   730  YES   3
    C   0  2   770  YES  12
    C   0  2   910  YES   8
  ;
run ;

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

*--- 3.2節 SASによる統計解析の流れ ;

data MYDATA ;
  set   QOL ;
  where GROUP="A" ;
run ;

proc print data=MYDATA ;
  var QOL ;   *--- 出力する変数名 ;
run ;

title "ヒストグラムと密度推定" ;
proc sgplot data=MYDATA ;
  histogram QOL ;               *--- ヒストグラム ;
  density   QOL / type=kernel ; *--- 密度推定曲線 ;
run ;

title "棒グラフ";
proc sgplot data=MYDATA ;
  vbar PREDRUG ;
run ;
title "" ;      *--- タイトルを初期化 ;

proc univariate data=MYDATA ;
  var QOL ;  *--- 要約統計量を求める変数名 ;
run ;

proc univariate data=MYDATA ;
  class PREDRUG ; *--- カテゴリ変数名 ;
  var   QOL ;     *--- 要約統計量を求める変数名 ;
run ;

title "箱ひげ図" ;
proc sgplot data=MYDATA ;
  vbox QOL ;    *--- hbox にすると横向きになる ;
run ; 
title "" ;      *--- タイトルを初期化 ;

proc univariate data=MYDATA mu0=3 ;  *--- 平均が 3 かどうか ;
  var QOL ;                          *--- 検定の対象とする変数 ;
run ;

ods html file="C:\temp\ファイル名.html" ;   *--- html ;
title "要約統計量" ;
proc univariate data=MYDATA ;
    var QOL ;
run;
ods html close;

ods rtf file="C:\temp\ファイル名.rtf" ;     *--- rtf(WORD) ;
title "要約統計量" ;
proc univariate data=MYDATA ;
    var QOL ;
run;
ods rtf close ;

ods pdf file="C:\temp\ファイル名.pdf" ;     *--- pdf ;
title "要約統計量" ;
proc univariate data=MYDATA ;
    var QOL ;
run;
ods pdf close ;

ods rtf file="C:\temp\ファイル名.rtf" ;     *--- pdfも同様に出力可 ;
title "密度推定" ;
  proc sgplot data=MYDATA ;
    density QOL / type=kernel ;
  run ;
ods rtf close;

filename mygraph "c:\temp\ファイル名.emf" ; *--- emf ファイル;
goptions reset=all gsfname=mygraph device=emf ;
  title "密度推定" ;
  proc sgplot data=MYDATA ;
    density QOL / type=kernel ;
  run ;
filename mygraph clear ;

ods graphics on / imagefmt=emf ;

title "" ;      *--- タイトルを初期化 ;

ods output Moments=MYOUTPUT ;
  proc univariate data=MYDATA ; 
    var QOL ;
  run;
ods output close ;

ods trace on /listing;        *--- 統計量のラベルを出力する命令 ;
proc univariate data=MYDATA ;
  var QOL ;
run ;

ods trace off ;

ods output TestsForLocation=TTEST(where=(Test="Student の t 検定")) ;
  proc univariate data=MYDATA ; 
    var QOL ;
  run;
ods output close ;

proc ttest data=MYDATA h0=3 sides=2 ;   *--- sides=2(両側) ;
  var QOL ;
run ;

proc ttest data=MYDATA h0=3 sides=l ;   *--- sides=l(下側) ;
  var QOL ;
run ;

proc ttest data=MYDATA h0=3 sides=u ;   *--- sides=u(上側) ;
  var QOL ;
run ;

quit ;

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

*--- 3.3節 散布図,回帰直線,相関係数 ;

data MYDATA ;
  set   QOL ;
  where GROUP="A" ;
run ;

proc means data=MYDATA nonobs ;
  class GROUP ;
  var   DURATION QOL ;
run ;

title "散布図と相関係数" ;
proc sgplot data=MYDATA ;
  scatter x=DURATION y=QOL ; *--- 散布図   ;
  reg     x=DURATION y=QOL ; *--- 回帰直線 ;
run ;

proc reg data=MYDATA ;
  model QOL = DURATION ;
run ;

proc corr data=MYDATA pearson spearman ;
  var DURATION QOL ;
run ;

quit ;

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

*--- 3.4節 平均値の比較と回帰分析 ;

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

title "棒グラフ(平均値)" ;
proc sgplot data=MYDATA ;
  vbar GROUP / response=QOL stat=mean ;
run ;

title "棒グラフ(平均値±標準偏差)" ;
proc sgplot data=MYDATA ;
  hbar 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 ;
run ;

title "" ;

proc summary data=MYDATA print ;
  class GROUP ;
  var   QOL ;
run ;

/*
proc means data=MYDATA NONOBS N MEAN STDDEV ;
  class GROUP ; 
  var   QOL ;
run ;
*/

ods graphics on / imagefmt=emf ;
proc ttest data=MYDATA ;
  class GROUP ;
  var   QOL ;
run ;

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

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

ods graphics on / imagefmt=emf ;
proc freq data=MYDATA ;
  table GROUP*PREDRUG / nocol nopercent ;
run ;

proc glm data=MYDATA ;
  class   GROUP PREDRUG ;
  model   QOL = GROUP PREDRUG GROUP*PREDRUG / solution ss3 ;
  lsmeans GROUP ;
run ;

proc glm data=MYDATA ;
  class   GROUP ;
  model   QOL = GROUP DURATION GROUP*DURATION / solution ss3 ;
  lsmeans GROUP ;
run ;

proc means data=MYDATA NONOBS N MEAN STDDEV ;
  class GROUP ;
  var   DURATION ;
run ;

proc means data=MYDATA NONOBS N MEAN STDDEV ;
  var DURATION;
run ;

proc mixed data=MYDATA ;
  class    GROUP ;
  model    QOL = GROUP DURATION GROUP*DURATION / solution ;
  lsmeans  GROUP / at DURATION=10 ; *--- 10 を代入 ;
  lsmeans  GROUP / at means ;       *--- 全体の平均を代入 ;
run ;

ods graphics on / imagefmt=emf ;
proc glm data=MYDATA ;
  class PREDRUG GROUP ;
  model QOL = GROUP PREDRUG GROUP*PREDRUG ;
run ;

ods graphics on / imagefmt=emf ;
proc glm data=MYDATA ;
  class GROUP ;
  model QOL = GROUP DURATION GROUP*DURATION ;
run ;

proc glm data=MYDATA ;   *--- モデル1 ;
  class   GROUP ;
  model   QOL = GROUP DURATION / solution ss1 ss2 ss3 ;
run ;

proc glm data=MYDATA ;   *--- モデル2 ;
  class   GROUP ;
  model   QOL = DURATION GROUP / solution ss1 ss2 ss3 ;
run ;

proc glm data=MYDATA ;   *--- モデル3 ;
  class   GROUP ;
  model   QOL = GROUP DURATION GROUP*DURATION / solution ss1 ss2 ss3 ;
run ;

ods graphics on / imagefmt=emf ;
proc glm data=MYDATA ;
  class   PREDRUG GROUP ;
  model   QOL = GROUP PREDRUG / solution ss3 ;
  lsmeans GROUP ;
run ;

ods graphics on / imagefmt=emf ;
proc glm data=MYDATA ;
  class   GROUP ;
  model   QOL = GROUP DURATION / solution ss3 ;
  lsmeans GROUP ;
run ;

proc npar1way hl wilcoxon data=MYDATA correct=no ;
  class GROUP ; 
  var   QOL ;
  exact wilcoxon ; 
run ;

data QOL1 ; 
  input GROUP $ X R ; 
  cards ; 
    A    3   1 
    B    5   2 
    A    6   3 
    A    8   4 
    B   11   5 
  ; 
run ; 

proc npar1way data=QOL1 correct=no ; 
  class  GROUP ; 
  var    X  ; 
  exact  wilcoxon ; 
run ;

proc npar1way data=QOL1 correct=yes ; 
  class  GROUP ; 
  var    X  ; 
  exact  wilcoxon ; 
run ;

proc ttest data=MYDATA h0=-1 side=u ;
  class GROUP ;
  var   QOL ;
run ;

proc mixed data=MYDATA ;
  class   GROUP PREDRUG ;
  model   QOL = GROUP / solution ;
  random  PREDRUG ;
run ;

data QOL0 ;
  input PATIENT GROUP TREAT $ PERIOD QOL ;
  cards ;
    1  1  A  1  1
    1  1  B  2  3
    2  1  A  1  2
    2  1  B  2  4
    3  2  B  1  5
    3  2  A  2  4
    4  2  B  1  7
    4  2  A  2  4
  ;
run ;

proc mixed data=QOL0 ;
  class   PATIENT GROUP TREAT PERIOD ;
  model   QOL = GROUP TREAT PERIOD ;
  random  PATIENT(GROUP) ;
  lsmeans TREAT / pdiff;
run ;

proc glm data=QOL0 ;
  class   PATIENT GROUP TREAT PERIOD ;
  model   QOL = GROUP PATIENT(GROUP) TREAT PERIOD / SS3 ;
  test    H=GROUP  E=PATIENT(GROUP) ;
  lsmeans TREAT / pdiff ;
run ;

ods graphics on / imagefmt=emf ;
proc genmod data=MYDATA ;
  class GROUP ;
  model QOL = GROUP / dist=normal ;
  bayes seed=777 ;
run;
ods graphics off ;

quit ;

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

*--- 3.5節 2値データの比較とロジスティック回帰 ;

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

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

title "棒グラフ" ;
proc sgplot data=MYDATA ;
  hbar   GROUP / GROUP=EVENT ;
  format EVENT EVENTF. ;
run ;

title "棒グラフ" ;
proc sgpanel data=MYDATA ;
  panelby PREDRUG / rows=2 columns=1 ;
  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 ;

title "" ;

proc freq data=MYDATA ;
  tables GROUP*EVENT / riskdiff relrisk nocol nopercent ;
  exact  or ;
  format EVENT EVENTF. ;
run ;

data MYFREQ ; 
  input GROUP $ YN ; 
  cards ; 
    A 2
    A 1
    A 1
    B 1
    B 2
  ; 
run ;

proc format ;
  value YNF 1="Male"
            2="Female" ;
run ;

proc freq data=MYFREQ order=data ;
  tables GROUP*YN;
  format YN YNF. ;
run ;

proc freq data=MYDATA order=formatted ;
  tables GROUP*EVENT / riskdiff relrisk nocol nopercent ;
  exact  or ;
  format EVENT EVENTF. ;
run ;

proc freq data=MYDATA ;
  tables GROUP*EVENT / chisq ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ;
  class  GROUP / ref=last param=ref ;
  model  EVENT = GROUP / expb ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ;
  class  GROUP / param=glm ;
  model  EVENT = GROUP / expb noint ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ;
  model  EVENT = DURATION / expb ;
  units  DURATION=5 ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ;
  class  GROUP PREDRUG / ref=last param=ref ;
  model  EVENT = GROUP PREDRUG / expb ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ; 
  class  GROUP / ref=last param=ref ;
  model  EVENT = GROUP DURATION / expb ;
  format EVENT EVENTF. ;
run ;

proc sort data=MYDATA ;
  by PREDRUG ;
run ;

proc freq data=MYDATA order=internal ;
  by     PREDRUG ;
  tables GROUP*EVENT / riskdiff relrisk nocol nopercent ;
  exact  or ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ;
  class  GROUP PREDRUG / ref=last param=ref ;
  model  EVENT = GROUP PREDRUG GROUP*PREDRUG / expb ;
  format EVENT EVENTF. ;
run ;

proc freq data=MYDATA order=data ;
  tables PREDRUG*GROUP*EVENT / nocol nopercent chisq cmh ;
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA order=internal ; 
  class  GROUP / ref=last param=ref ;
  model  EVENT = GROUP DURATION GROUP*DURATION / expb ;
  format EVENT EVENTF. ;
run ;

data MYFREQ2 ;
  input GROUP $ EVENT $ ;
  cards ;
    A Y
    A N
    A N
    A N
    A N
    B Y
    B Y
    B N
    B N
    B N
  ;
run ;

data MYFREQ3 ;
  input GROUP $ EVENT $ N ;
  cards ;
    A Y 1
    A N 4
    B Y 2
    B N 3
  ;
run ;

proc freq data=MYFREQ3 ;
  weight N ;
  tables GROUP*EVENT ;
run ;

data MYFREQ4 ;
  input PREDRUG $ GROUP $
        EVENT     NTOTAL ;
  cards ; 
    Y A  2  5
    Y B  2 13
    N A 10 15
    N B  3  5
  ;
run ;

proc logistic data=MYFREQ4 order=data ;
  class GROUP / ref=last param=ref ;
  model EVENT/NTOTAL = GROUP / expb ;
run ;

data MYFREQ5 ;
  input PREDRUG $  GROUP $
        EVENTYN $ N    ;
  cards ; 
    Y A Y  2
    Y A N  3
    Y B Y  2
    Y B N 13
    N A Y 10
    N A N  5
    N B Y  3
    N B N  2
  ;
run ;

proc logistic data=MYFREQ5 order=data ;
  freq  N ;
  class GROUP / ref=last param=ref ;
  model EVENTYN = GROUP / expb ;
run ;

proc freq data=MYDATA ;
  tables GROUP*EVENT / riskdiff(margin=0.1 method=FM noninf column=1)
                       alpha=0.025 ; 
  format EVENT EVENTF. ;
run ;

proc logistic data=MYDATA descending ;
  model GROUP = QOL / outroc=ROC ;
run ;

data ROC (keep=X Y) ;
  set ROC ;
  X = 100*_1MSPEC_ ; *--- 1-特異度 ;
  Y = 100*_SENSIT_ ; *--- 感度 ;
run ;

proc sgplot data=ROC ;
  series x=X y=Y ;
run ;

ods graphics on ;
proc genmod data=MYDATA order=internal ;
  class GROUP ;
  model EVENT = GROUP / dist=bin link=logit ;
  bayes seed=777 ;
run;
ods graphics off ;

quit ;

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