ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

対象者背景表Table1作成(tableoneパッケージ)[R]

ここではsurvivalパッケージに入っているMayo Clinicの原発性胆汁性肝硬変(Primary Biliary Cirrhosis, PBC)のデータを使う。

> library(survival)
> str(pbc)
'data.frame':  418 obs. of  20 variables:
 $ id      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ time    : int  400 4500 1012 1925 1504 2503 1832 2466 2400 51 ...
 $ status  : int  2 0 2 2 1 2 0 2 2 2 ...
 $ trt     : int  1 1 1 1 2 2 2 2 1 2 ...
 $ age     : num  58.8 56.4 70.1 54.7 38.1 ...
 $ sex     : Factor w/ 2 levels "m","f": 2 2 1 2 2 2 2 2 2 2 ...
 $ ascites : int  1 0 0 0 0 0 0 0 0 1 ...
 $ hepato  : int  1 1 0 1 1 1 1 0 0 0 ...
 $ spiders : int  1 1 0 1 1 0 0 0 1 1 ...
 $ edema   : num  1 0 0.5 0.5 0 0 0 0 0 1 ...
 $ bili    : num  14.5 1.1 1.4 1.8 3.4 0.8 1 0.3 3.2 12.6 ...
 $ chol    : int  261 302 176 244 279 248 322 280 562 200 ...
 $ albumin : num  2.6 4.14 3.48 2.54 3.53 3.98 4.09 4 3.08 2.74 ...
 $ copper  : int  156 54 210 64 143 50 52 52 79 140 ...
 $ alk.phos: num  1718 7395 516 6122 671 ...
 $ ast     : num  137.9 113.5 96.1 60.6 113.2 ...
 $ trig    : int  172 88 55 92 72 63 213 189 88 143 ...
 $ platelet: int  190 221 151 183 136 NA 204 373 251 302 ...
 $ protime : num  12.2 10.6 12 10.3 10.9 11 9.7 11 11 11.5 ...
 $ stage   : int  4 3 4 4 3 3 3 3 2 4 ...

dput( )で変数名を書き出す

変数名を書き写すのが面倒なのでdput()を使う。

> dput(names(pbc))
c("id", "time", "status", "trt", "age", "sex", "ascites", "hepato", "spiders", "edema", "bili", "chol", "albumin", "copper", "alk.phos", "ast", "trig", "platelet", "protime", "stage")

表示された結果を次にコピペで使う。

表示したい変数名を指定する

all_vars <- c("time", "status", "age", "sex", "ascites", "hepato", "spiders", "edema", "bili", "chol", "albumin", "copper", "alk.phos", "ast", "trig", "platelet", "protime", "stage")

患者IDは不要なのでidを除外した。治療別に集計するのでtrtも除外。

カテゴリー変数として扱いたいものを指定する

  • 文字列は自動的にカテゴリー変数扱いされる。
cat_vars <- c("status", "sex", "ascites", "hepato", "spiders", "edema", "stage")

表データを作成する

以下の引数を指定する。

  • vars:表示する変数
  • factorVars:カテゴリー変数として扱いたい変数
  • strata:比較したい群
  • includeNA:TRUEとすると、カテゴリー変数で欠測も1つのカテゴリーとして扱う
  • testApprox:カテゴリー変数でサンプル数が多い時に用いる近似を使った検定方法を指定。デフォルトはchisq.test(= カイ2乗検定)
  • argsApprox:上記の検定を行うときの設定。デフォルトはlist(correct = TRUE)となっており、カイ2乗検定で連続値補正を行う。
  • testExact:カテゴリー変数でサンプル数が少ないときに用いる正確な検定方法を指定。デフォルトはfisher.test(= Fisher正確検定)
  • testNormal:正規分布を仮定したときに用いられる検定方法。デフォルトはoneway.test(= 一元配置分散分析)で、これは2群比較ならばt.test(= t検定)に相当
  • argsNormal:上記の検定を行うときの設定。デフォルトはlist(var.equal = TRUE)となっており、等分散を仮定した検定を行う。
  • testNonNormal:正規分布を仮定しないときに用いられる検定方法。デフォルトはkruskal.test(= Kruskal-Wallis検定)で、これは2群比較ならばwilcox.test(= Mann-Whitney U検定)に相当
library(tableone)
table1 <- CreateTableOne(vars=all_vars, 
                         factorVars=cat_vars,
                         strata="trt",
                         data=pbc,
                         includeNA=TRUE,
                         argsNormal=list(var.equal=FALSE))

連続変数の比較では等分散を仮定しない方がいいかも。

> table1
                      Stratified by trt
                       1                 2                 p      test
  n                        158               154                      
  time (mean (SD))     2015.62 (1094.12) 1996.86 (1155.93)  0.883     
  status (%)                                                0.894     
     0                      83 (52.5)         85 (55.2)               
     1                      10 ( 6.3)          9 ( 5.8)               
     2                      65 (41.1)         60 (39.0)               
  age (mean (SD))        51.42 (11.01)     48.58 (9.96)     0.018     
  sex = f (%)              137 (86.7)        139 (90.3)     0.421     
  ascites (%)                                                 NaN     
     0                     144 (91.1)        144 (93.5)               
     1                      14 ( 8.9)         10 ( 6.5)               
     NA                      0 ( 0.0)          0 ( 0.0)               
  hepato (%)                                                  NaN     
     0                      85 (53.8)         67 (43.5)               
     1                      73 (46.2)         87 (56.5)               
     NA                      0 ( 0.0)          0 ( 0.0)               
  spiders (%)                                                 NaN     
     0                     113 (71.5)        109 (70.8)               
     1                      45 (28.5)         45 (29.2)               
     NA                      0 ( 0.0)          0 ( 0.0)               
  edema (%)                                                 0.877     
     0                     132 (83.5)        131 (85.1)               
     0.5                    16 (10.1)         13 ( 8.4)               
     1                      10 ( 6.3)         10 ( 6.5)               
  bili (mean (SD))        2.87 (3.63)       3.65 (5.28)     0.133     
  chol (mean (SD))      365.01 (209.54)   373.88 (252.48)   0.747     
  albumin (mean (SD))     3.52 (0.44)       3.52 (0.40)     0.874     
  copper (mean (SD))     97.64 (90.59)     97.65 (80.49)    0.999     
  alk.phos (mean (SD)) 2021.30 (2183.44) 1943.01 (2101.69)  0.747     
  ast (mean (SD))       120.21 (54.52)    124.97 (58.93)    0.460     
  trig (mean (SD))      124.14 (71.54)    125.25 (58.52)    0.886     
  platelet (mean (SD))  258.75 (100.32)   265.20 (90.73)    0.554     
  protime (mean (SD))    10.65 (0.85)      10.80 (1.14)     0.199     
  stage (%)                                                   NaN     
     1                      12 ( 7.6)          4 ( 2.6)               
     2                      35 (22.2)         32 (20.8)               
     3                      56 (35.4)         64 (41.6)               
     4                      55 (34.8)         54 (35.1)               
     NA                      0 ( 0.0)          0 ( 0.0)               

連続変数の詳細結果を表示する

summary(table1$ContTable)

strata別に以下の項目:

  • n:観察数
  • miss:欠測数
  • p.miss:欠測割合
  • mean, sd, median:平均, 標準偏差, 中央値
  • p25, p75:第1四分位, 第3四分位
  • min, max:最小値, 最大値
  • skew:歪度(skewness)=分布の非対称性を示す指標
  • kurt:尖度(kurtosis)=分布のピークの鋭さの指標

strata間を比較したときの以下の項目:

  • p-values:P値
    • pNormal:正規分布が仮定できるときの検定結果
    • pNonNormal:正規分布を仮定しないときの検定結果
  • Standardized mean difference:標準化平均差

カテゴリー変数の詳細結果を表示する

summary(table1$CatTable)

strata別に以下の項目(連続変数と重複している項目は省略):

  • level:カテゴリー内の水準
  • freq:度数
  • percent:割合
  • cum.percent:累積割合

strata間を比較したときの以下の項目:

  • p-values:P値
    • pApprox:サンプル数が大きいときに行う検定
    • pExact:サンプル数が小さいときに行う検定

体裁を整えて結果を表示する

以下の引数を指定する。

  • cramVars:2値変数で両方のレベルについて表示したい変数を指定。
  • exact:正確検定の結果を表示したいカテゴリー変数を指定
  • nonnormal:正規分布に従わない変数を指定。正規分布を仮定しない検定で求められたP値が用いられるほか、mean(SD)ではなくmedian[IQR]で記述要約される。
  • test:FALSEとすると検定結果(つまりP値)が表示されない
  • dropEqual:TRUEとすると、2値変数で2番目のレベル名が表示されない
  • minMax:TRUEとするとnonnormalに指定した変数でIQRではなく最小-最大が表示される。
q <- print(table1,
           cramVars="sex",
           exact=c("ascites","hepato","spiders","stage"),
           nonnormal=c("time","alk.phos"))

csv形式で書き出すことも可能。

write.csv(q, "table1.csv")

おわりに

  • dput(names(data))を知って変数名を抽出すると便利だと知りました。
  • キャットタワーが部屋を占拠しはじめてます。

参考資料

  • パッケージ開発者の吉田 和樹先生の解説ページ(英語) cran.r-project.org