2013-07-25 2 views
3

Я хочу применить 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])))) 
} 

Кроме того, можно ли извлечь значения из результата Т-теста (например две группы означает, р-значение), так что цикл будет производить аккуратную таблицу баланса по переменным ? Другими словами, конечный результат я хочу, это не куча футболок тестов друг на друга, но стол так:

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

ответ

5

Вы можете использовать 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 

If вы хотите извлечь таблицу, вы можете продолжить как этот

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 
+1

as.formula является ключевым элементом, что я не знал о том! Благодаря! – Heisenberg

2

Вот это изменить/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 
0

Используйте sapply применять Стьюдента для всех имён переменных и извлекать необходимые данные по Подменю «оценка» и «p.value». Проверьте names(with(d, t.test(var1~group))), если вы хотите извлечь другую информацию,

t(with(d, sapply(varnames, function(x) unlist(t.test(get(x)~group)[c("estimate", "p.value")])))) 
Смежные вопросы