# ←この記号の後は次の改行までコメントになります。

# データフレームにアクセスして記述統計量を求める(名義変数)。
# まずはデータ空間をクリアしておいてから、
rm(list=ls())

# ここから43行目まではサンプルデータセットの作成です。
set.seed(1111)
Dataset.0<-
  data.frame(
    Sex=factor(rnorm(n=800,mean=0.5,sd=1)>0,labels=c("Male","Female")),
    Age=50+rpois(n=800,lambda=25)+round(rnorm(n=800,mean=0,sd=5),0),
    Severity=rpois(n=800,lambda=3))
Dataset.0$Comorbidity=
  rpois(n=800,lambda=1)+round(Dataset.0$Age*rnorm(n=800,mean=0.03,sd=0.08)^2,0)
Dataset.0$UnknownConfounder=
  factor(
    with(Dataset.0,
         rnorm(n=800,mean=0)+
           I(Sex=="Male")*rnorm(n=800,mean=0.02)*0.01+
           I(Age-80)*rnorm(n=800,mean=0.002)*0.001+
           I(Severity>3)*rnorm(n=800,mean=0.05)*0.01)>1,
    labels=c("No","Yes"))
Dataset.0$Intervention<-
  factor(
    with(Dataset.0,
         rnorm(n=800,mean=0)+
           I(Sex=="Female")*rnorm(n=800,mean=0.2)+
           I(Age-80)*rnorm(n=800,mean=-0.1)*0.1+
           I(Severity-2)*rnorm(n=800,mean=0.4)+
           I(Comorbidity-1)*rnorm(n=800,mean=-1.2)*0.6+
           I(UnknownConfounder=="Yes")*rnorm(n=800,mean=0.2)*0.2)>0,
    labels=c("No","Yes"))
Dataset.0$Outcome<-
  factor(
    with(Dataset.0,
         rnorm(n=800,mean=0)*10+
           I(Sex=="Male")*rnorm(n=800,mean=0.01)+
           I(Age-75)*rnorm(n=800,mean=0.3)*5+
           I(Severity-1)*rnorm(n=800,mean=0.7)*6+
           I(Comorbidity-1)*rnorm(n=800,mean=0.9)*5+
           I(Intervention=="Yes")*rnorm(n=800,mean=-0.6)*4+
           I(UnknownConfounder=="Yes")*rnorm(n=800,mean=0.3)*0.7)>20,labels=c("No","Yes"))
Dataset.0$UnknownConfounder<-NULL

# Dataset.0というデータフレームが出来上がっているはずです。
# RStudioを使っている方は、右上のウィンドウのEnvironmentタグに表示されています。
# いつものごとく、中身を見てみましょう。
nrow(Dataset.0) #サンプル数
## [1] 800
head(Dataset.0,20) #先頭から20行を見ます。
##       Sex Age Severity Comorbidity Intervention Outcome
## 1  Female  77        0           1          Yes      No
## 2  Female  64        0           3          Yes     Yes
## 3  Female  84        3           0          Yes     Yes
## 4  Female  67        3           0           No      No
## 5  Female  70        2           4           No      No
## 6    Male  87        3           0          Yes      No
## 7  Female  82        4           0          Yes      No
## 8  Female  79        5           1           No     Yes
## 9  Female  64        5           0           No     Yes
## 10 Female  80        6           3          Yes     Yes
## 11   Male  61        1           3           No      No
## 12 Female  76        4           4          Yes      No
## 13   Male  72        3           2           No      No
## 14   Male  83        3           1          Yes      No
## 15 Female  77        2           0           No      No
## 16 Female  77        0           3           No      No
## 17 Female  78        2           0          Yes      No
## 18   Male  86        0           2           No     Yes
## 19 Female  77        3           2          Yes     Yes
## 20 Female  76        3           0          Yes      No
summary(Dataset.0) #データセット全体の要約
##      Sex           Age            Severity      Comorbidity   Intervention
##  Male  :254   Min.   : 53.00   Min.   :0.000   Min.   :0.00   No :371     
##  Female:546   1st Qu.: 70.00   1st Qu.:2.000   1st Qu.:1.00   Yes:429     
##               Median : 75.00   Median :3.000   Median :1.00               
##               Mean   : 75.02   Mean   :3.027   Mean   :1.48               
##               3rd Qu.: 80.00   3rd Qu.:4.000   3rd Qu.:2.00               
##               Max.   :107.00   Max.   :9.000   Max.   :8.00               
##  Outcome  
##  No :511  
##  Yes:289  
##           
##           
##           
## 
# すでにsummary関数でおよその推測統計量は出ていますね。

# 名義変数
# 論文に名義変数の記述統計量を書く場合(例えばTable 1.)、通常はカウントと割合が
# 要求されます。性別(Sex)を対象としてやってみます。
table(Dataset.0$Sex) # カウント数
## 
##   Male Female 
##    254    546
table(Dataset.0$Sex)/sum(table(Dataset.0$Sex)) # sum関数で総数を求めて割合を出した。
## 
##   Male Female 
## 0.3175 0.6825
# 結果を代入しておくと何かと便利です。
tab<-table(Dataset.0$Sex)
tab
## 
##   Male Female 
##    254    546
tab/sum(tab)
## 
##   Male Female 
## 0.3175 0.6825
# 群分けしたカウントデータ(2X2表)を作ってみます。
# 治療介入で群分けし、性別のカウントデータを求めます。
table(Dataset.0$Sex,Dataset.0$Intervention)
##         
##           No Yes
##   Male   115 139
##   Female 256 290
# xtabs関数(Cross tablesの意)を使って同じ動作ができます。
# 引数の渡し方がtable関数と少し異なることに注意。
# xtabs(~名義変数1+名義変数2,data=データセット)という書式です。
xtabs(~Sex,data=Dataset.0)
## Sex
##   Male Female 
##    254    546
xtabs(~Sex+Intervention,data=Dataset.0)
##         Intervention
## Sex       No Yes
##   Male   115 139
##   Female 256 290
# そのまま2X2表の検定をすることもできます。
# カイ二乗検定にはchisq.testを、Fisherの正確検定にはfisher.testを使います。
chisq.test(xtabs(~Sex+Intervention,data=Dataset.0))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  xtabs(~Sex + Intervention, data = Dataset.0)
## X-squared = 0.12191, df = 1, p-value = 0.727
fisher.test(xtabs(~Sex+Intervention,data=Dataset.0))
## 
##  Fisher's Exact Test for Count Data
## 
## data:  xtabs(~Sex + Intervention, data = Dataset.0)
## p-value = 0.7036
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.6870372 1.2774363
## sample estimates:
## odds ratio 
##  0.9373191
# table関数でも同様のことができます。
chisq.test(table(Dataset.0$Sex,Dataset.0$Intervention))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(Dataset.0$Sex, Dataset.0$Intervention)
## X-squared = 0.12191, df = 1, p-value = 0.727
fisher.test(table(Dataset.0$Sex,Dataset.0$Intervention))
## 
##  Fisher's Exact Test for Count Data
## 
## data:  table(Dataset.0$Sex, Dataset.0$Intervention)
## p-value = 0.7036
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.6870372 1.2774363
## sample estimates:
## odds ratio 
##  0.9373191
# xtabs関数とtable関数の動作はほとんど同じです。使いやすい方を憶えておけばよいです。

# Table1の一行を作ってみましょう。ちょっと難しいですが、頑張って読み解いて下さい。
# 治療介入で群分けして、それぞれ女性の割合を求めてみます。
# ~名義変数1+名義変数2 のうち、名義変数2を群分け変数とみなしましょう。
tab<-xtabs(~Sex+Intervention,data=Dataset.0) #クロス集計表の作成
tab #集計表の内容確認
##         Intervention
## Sex       No Yes
##   Male   115 139
##   Female 256 290
row.sex<-              # 性別のカウントと割合を群分けした1行を作ります。
  c("Female sex",      # 行の最初の要素は変数のタイトルです
    paste(       # 文字列を結合するpaste関数を使っています。
      
      tab[2,1],      # 2番めの要素は治療なし群の女性のカウントと割合。
      " (",            # 割合は括弧で囲む
      round(tab[2,1]/sum(tab[,1])*100,0), 
               # 割合を計算しround関数で四捨五入
      ")",       # 割合は括弧で囲む
      sep=""),     # paste関数のの区切りは、なしを指定
    
    paste(       # 3番目の要素は治療あり群の女性のカウントと割合。以下同様。
      tab[2,2],    
      " (",
      round(tab[2,2]/sum(tab[,2])*100,0),
      ")",
      sep=""),
    
    format(            # 4番目の要素はP-valueです。chisq.testの結果から
      round(           # 取り出して、小数点以下3桁までを丸めて(round)
        chisq.test(tab)$p.value,3),
      nsmall=3))       # 小数点以下3桁までの表示を指定しています(format)
# コメント行無しでもう一度やってみます。スクリプトの視認性はこちらが良い
row.sex<-
  c("Female sex",
    paste(tab[2,1]," (",round(tab[2,1]/sum(tab[,1])*100,0),")",sep=""),
    paste(tab[2,2]," (",round(tab[2,2]/sum(tab[,2])*100,0),")",sep=""),
    format(round(chisq.test(tab)$p.value,3),nsmall=3))

# タイトル、2群のカウントデータと割合、P-valueが、長さ4のベクターに
# 格納されています。
row.sex
## [1] "Female sex" "256 (69)"   "290 (68)"   "0.727"
# さらにrbind関数(行を繋げる関数)を使って、表の一番上の部分を作ってみましょう。
Table1<-
  rbind(
    c("Variables","Control","Active","P-value"),
    row.sex)
# オブジェクトTable1は2行4列のマトリックスです。
Table1
##         [,1]         [,2]       [,3]       [,4]     
##         "Variables"  "Control"  "Active"   "P-value"
## row.sex "Female sex" "256 (69)" "290 (68)" "0.727"
# このように1行ずつ集計していくことで記述統計の表を作ることができます。

# 次回は連続変数の集計にチャレンジします。