こちらの方の解決法。
おそらくこのブログを書いておられる方。 https://blog.goo.ne.jp/r-de-r
同じグループ間(治療群対プラセボ群)で異なる変数(年齢、身長、体重、罹病期間、疾患など)について複数のt検定(またはウィルコクソン検定)を行う必要があることがよくある。しかし、私の知る限り、これを補助する機能はない。
なぜかRは基礎分析に弱いのである。
サンプルデータ
library(survival) data(kidney)
データ。
id time status age sex disease frail 1 1 8 1 28 1 Other 2.3 2 1 16 1 28 1 Other 2.3 3 2 23 1 48 2 GN 1.9 4 2 13 0 48 2 GN 1.9 5 3 22 1 32 1 Other 1.2
lapplyを使った方法
lapply(kidney[,c("time", "age", "frail")], function(x) t.test(x ~ kidney$sex, var.equal = TRUE))
結果。
$time Two Sample t-test data: x by kidney$sex t = -1.706, df = 74, p-value = 0.09221 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -124.551228 9.651228 sample estimates: mean in group 1 mean in group 2 59.30 116.75 $age Two Sample t-test data: x by kidney$sex t = -0.069294, df = 74, p-value = 0.9449 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -7.970091 7.434376 sample estimates: mean in group 1 mean in group 2 43.50000 43.76786 $frail Two Sample t-test data: x by kidney$sex t = 0.95032, df = 74, p-value = 0.345 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: -0.1872248 0.5286533 sample estimates: mean in group 1 mean in group 2 1.310000 1.139286
ややややこしいな、という印象がある。
自作関数を作っての方法
下記が作成された自作の関数。
multi.tests <- function(fun = t.test, df, vars, group.var, ...) { sapply(simplify = FALSE, # sapply(simplify=T) better, elements named vars, # loop on vector of outcome variable names function(var) { formula <- as.formula(paste(var, "~", group.var))# create a formula with outcome and grouping var. fun(data = df, formula, ...) # perform test with a given fun, default t.test } ) }
まとめてT検定を行う
res.multi.t.tests <- multi.tests(fun = t.test, df = kidney, vars = c("time","age","frail"), group.var = "sex", var.equal = TRUE) res.multi.t.tests
P値だけ取り出す
data.frame(p.value = sapply(res.multi.t.tests, getElement, name = "p.value"))
p.value time 0.09221072 age 0.94494267 frail 0.34504459