4

一連の変数に t 検定を適用したいと考えています。以下はいくつかのモックデータです

d <- data.frame(var1=rnorm(10), 
                var2=rnorm(10), 
                group=sample(c(0,1), 10, replace=TRUE))

# Is there a way to do this in some sort of loop?
with(d, t.test(var1~group))
with(d, t.test(var2~group))

# I tried this but the loop did not give a result!?
varnames <- c('var1', 'var2')
for (i in 1:2) {
  eval(substitute(with(d, t.test(variable~group)),
                  list(variable=as.name(varnames[i]))))  
}

また、t 検定の結果 (たとえば、2 つのグループ平均、p 値) から値を抽出して、ループが変数全体のきちんとしたバランス テーブルを生成することは可能ですか? 言い換えれば、私が望む最終結果は、相互に t 検定を重ねたものではなく、次のような表です。

Varname   mean1   mean2   p-value
Var1        1.1    1.2     0.989
Var2        1.2    1.3     0.912
4

3 に答える 3

6

あなたはこれを使用formulaしてlapply好きにすることができます

set.seed(1)
d <- data.frame(var1 = rnorm(10), 
                var2 = rnorm(10), 
                group = sample(c(0, 1), 10, replace = TRUE))


varnames <- c("var1", "var2")
formulas <- paste(varnames, "group", sep = " ~ ")
res <- lapply(formulas, function(f) t.test(as.formula(f), data = d))
names(res) <- varnames

テーブルを抽出したい場合は、次のように進めることができます

t(sapply(res, function(x) c(x$estimate, pval = x$p.value)))
     mean in group 0 mean in group 1     pval
var1         0.61288        0.012034 0.098055
var2         0.46382        0.195100 0.702365
于 2013-07-25T15:52:17.797 に答える
3

reshape/plyr ソリューションは次のとおりです。foo関数は主力であり、t 検定を実行し、平均値と p 値を抽出します。

d <- data.frame(var1=rnorm(10), 
                var2=rnorm(10), 
                group=sample(c(0,1), 10, replace=TRUE))

require(reshape2)
require(plyr)

dfm <- melt(d, id = 'group')

foo <- function(x) {
  tt <- t.test(value ~ group, data = x)
  out <- data.frame(mean1 = tt$estimate[1], mean2 = tt$estimate[2], P = tt$p.value)
  return(out)
}

ddply(dfm, .(variable), .fun=foo)
#  variable      mean1      mean2         P
#1     var1 -0.2641942  0.3716034 0.4049852
#2     var2 -0.9186919 -0.2749101 0.5949053
于 2013-07-25T15:54:19.853 に答える