2015-01-13 2 views
0

У меня есть кадр данных R с переменной фазой с 8 уровнями (упорядоченный). Я хочу сделать t-тест между уровнем 1 & 2, 3 & 4, 5 & 6 и 7 & 8. Хотя я могу подмножать данные для извлечения каждой пары категорий, мне интересно, есть ли более простой способ сделать Это. Не могу понять. Пробовал следующее, но он жалуется на разной длины (каждый уровень имеет различное число наблюдений):R: Выполнение t-теста между парами факторов

t.test(var1 ~ levels(factorvar)[1:2], data = mydf) 

ответ

1

Я думаю, что ошибка, вероятно, потому, что levels(factorvar)[1:2] возвращает только два значения «1» и «2», но t.test ожидает длина векторов с обеих сторон от ~ должна быть одинаковой. Другими словами, речь не идет о том, чтобы на каждом уровне фактора было различное количество наблюдений. Скорее, если, например, у вас есть 40 значений var1 для factorvar = 1 и 50 значений var1 для factorvar = 2, вам понадобится вектор длины 90 по обе стороны от ~.

Попробуйте вместо этого:

t.test(var1 ~ factorvar, data=mydf[mydf$factorvar %in% c(1,2),]) 

Вы также можете создать функцию, так что вам не придется набирать весь этот код для каждой комбинации факторов:

# Function to return p-values from t-test between two factor levels 
my.t = function(fac1, fac2){ 
    t.test(mydf$var1[mydf$factorvar==fac1], 
     mydf$var1[mydf$factorvar==fac2])$p.value 
} 

# Run the function on factor levels 1 and 2 
my.t(1,2) 

# Do all four at once 
mapply(my.t, seq(1,7,2), seq(2,8,2)) 

Если вы хотите верните весь результат t-теста для каждой пары уровней факторов (а не только p-значения), затем удалите $p.value из функции выше и запустите mapply с добавлением SIMPLIFY=FALSE.

Это сайт кодирования, а не сайт статистических консультаций, но также остерегайтесь multiple comparisons.

1
pairs <- list(c(1, 2), c(3, 4), c(5, 6), c(7, 8)) 
lapply(pairs, function(pr) { 
     t.test(var1 ~ factorvar, 
       data=dat[dat$factorvar %in$ pr, c("var1", "factorvar")]) 
          } 
     ) 

Я не на дополнительные (непредставленные) уровни должны вызвать проблемы с t.test.formula поскольку факторы будут получать принуждают mumeric. Можно также попробовать:

lapply(pairs, function(pr) { 
     t.test(var1 ~ factorvar, 
       data=dat[ , c("var1", "factorvar")], 
       subset= factorvar %in% pr) 
          }) 

Примечание: Испытано с:

dat <- data.frame(var1=rnorm(100), 
        factorvar=factor(sample(1:8, 100, rep=TRUE))) 

Пример вывода:

[[1]] 

    Welch Two Sample t-test 

data: var1 by factorvar 
t = -1.2077, df = 8.419, p-value = 0.26 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-1.3597432 0.4197142 
sample estimates: 
mean in group 1 mean in group 2 
    -0.1819342  0.2880802 


[[2]] 

    Welch Two Sample t-test 

data: var1 by factorvar 
t = -0.8141, df = 20.676, p-value = 0.4249 
#--------- rest of output snipped-------