Как сочетать lapply, t.test, leveneTest, if и else - PullRequest
0 голосов
/ 09 мая 2020

Я хочу создать список результатов t-теста, к которому были применены соответствующие поправки на неравные дисперсии, если тест levene показал, что они были необходимы. Вот несколько примеров данных.

#create dataset
set.seed(555)
data<- data.frame(group = rep(letters[1:2], each = 5),
                  var1 = rnorm(n = 10, mean = 1.2, sd = 1),
                  var2 = rnorm(n = 10, mean = 2.8, sd = .50))

>data
   group       var1     var2
1      a 1.89686907 2.696915
2      a 1.66000554 2.650026
3      a 0.03941319 2.932389
4      a 2.47693939 2.674999
5      a 0.14176879 2.650867
6      b 1.24219445 2.889152
7      b 1.87350165 2.576014
8      b 1.10712963 3.082120
9      b 1.00297421 2.502752
10     b 2.64126704 2.314156
> 

Я узнал, как создавать списки результатов левен-теста и результатов t-теста (в этом примере я предполагаю равные дисперсии для всех t-тестов).

levene.tests<-lapply(data[,c("var1","var2")],
                     function(x) leveneTest(x ~ data$group))
t.tests<-lapply(data[,c("var1","var2")],
                function(x) t.test(x ~ data$group, var.equal = TRUE))

И мне также удалось использовать if и else, поэтому R выберет для меня правильный тип теста в зависимости от того, равны ли дисперсии для одиночных переменных.

#if else statement for var1 only
if (levene.tests$"var1"$"Pr(>F)"[1]<.05) {
  t.test(data$var1 ~ data$group, var.equal = FALSE)
} else {
  t.test(data$var1 ~ data$group, var.equal = TRUE)
}

Сейчас я пытаюсь собрать эти коды вместе, чтобы получить соответствующий результат t-теста для всех переменных (в данном случае var1 и var2) в объекте типа списка. Кто-нибудь может помочь?

Ответы [ 2 ]

3 голосов
/ 09 мая 2020

Вот один из вариантов, в котором мы l oop поверх names из 'levene.tests', извлекаем 'p.value', проверяем, больше ли оно или равно 0,05, и используем это логическое значение в ' var.equal of t.test

library(car)
out <- lapply(names(levene.tests), function(nm) {
    i1 <- levene.tests[[nm]]$"Pr(>F)"[1] >= 0.05
    t.test(data[[nm]]~ data$group, var.equal = i1)
   })
0 голосов
/ 26 мая 2020
Это то, что я обнаружил, что может помочь, используя функцию sapply для проведенного вами теста levene (извлечение «Pr (> F)» из leveneTest):
levene.r <- sapply(levene.tests, `[`, c("Pr(>F)"))

levene.r
при необходимости транспонируйте levene.r
t(levene.r)

Он также должен работать для ttest (просто нужно посмотреть на str, чтобы извлечь то, что вы хотите из этого объекта).

...