t-тест через все комбинации всех факторов всех уровней - PullRequest
0 голосов
/ 06 марта 2020

У меня есть фрейм данных со следующей структурой:

> str(data_l)
'data.frame':   800 obs. of  5 variables:
 $ Participant: int  1 2 3 4 5 6 7 8 9 10 ...
 $ Temperature: Factor w/ 4 levels "35","37","39",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ Region     : Factor w/ 5 levels "Eyes","Front",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ Time       : Factor w/ 5 levels "0","15","30",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Rating     : num  5 5 5 4 5 5 5 5 5 5 ...

Я хочу запустить t-тест с одной выборкой для каждой комбинации всех факторов всех уровней, всего 4 * 5 * 5 = 100 t-тестов с рейтингом в качестве зависимых переменных или y.

Я застрял в цикле по комбинациям и выполнении t-теста в каждом комбо.

Я попытался разбить данные по факторам, затем lapply t.test() по списку, но безрезультатно.

У кого-нибудь есть лучший подход? Ура!

Редактировать

Мое конечное намерение состоит в том, чтобы вычислить доверительный интервал для массивов по всем факторам всех уровней. Например, я смог сделать это:

subset1 <- data_l$Rating[data_l$Temperature == 35 & data_l$Region == "Front" & data_l$Time == 0]

Затем

t.test(subset1)$conf.int

Но проблема в том, что мне придется делать это 100 раз.

Изменить 2

Я воссоздаю фрейм данных.

Temperature <- rep(seq(35, 41, 2), 10)
Region <- rep(c("Front", "Back", "Eyes", "Left", "Right"), 8)
Time <- rep(seq(0, 60, 15), 8)
Rating <- sample(1:5, 40, replace = TRUE)
data_l <- data.frame(Region = factor(Region), Temperature = factor(Temperature), Time = factor(Time), Rating = as.numeric(Rating))

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Две вещи.

  1. Можно ли это сделать? Безусловно. Должно ли это? Многие из ваших комбинаций могут иметь недостаточно данных, чтобы найти разумный доверительный интервал. Хотя выборка данных, безусловно, сокращена и упрощена, у меня нет уверенности в том, что ваши комбинации факторов будут достаточно заполнены.

    table(sapply(split(data_l$Rating, data_l[,c("Temperature","Region","Time")]), length))
    #  0  2 
    # 80 20 
    

    (существует 80 «пустых» комбинаций ваших уровней факторов.)

  2. Давайте попробуем это:

    outs <- aggregate(data_l$Rating, data_l[,c("Temperature","Region","Time")],
                      function(x) if (length(unique(x)) > 1) t.test(x)$conf.int else c(NA, NA))
    nrow(outs)
    # [1] 20
    head(outs)
    #   Temperature Region Time        x.1        x.2
    # 1          35  Front    0         NA         NA
    # 2          37  Front    0  -9.706205  15.706205
    # 3          39  Front    0  -2.853102   9.853102
    # 4          41  Front    0 -15.559307  22.559307
    # 5          35   Back   15 -15.559307  22.559307
    # 6          37   Back   15  -4.853102   7.853102
    

    Поймите, что это не пять столбцов; четвертая - это матрица, встроенная в столбец кадра:

    head(outs$x)
    #            [,1]      [,2]
    # [1,]         NA        NA
    # [2,]  -9.706205 15.706205
    # [3,]  -2.853102  9.853102
    # [4,] -15.559307 22.559307
    # [5,] -15.559307 22.559307
    # [6,]  -4.853102  7.853102
    

    Достаточно просто извлечь:

    outs$conf1 <- outs$x[,1]
    outs$conf2 <- outs$x[,2]
    outs$x <- NULL
    head(outs)
    #   Temperature Region Time      conf1     conf2
    # 1          35  Front    0         NA        NA
    # 2          37  Front    0  -9.706205 15.706205
    # 3          39  Front    0  -2.853102  9.853102
    # 4          41  Front    0 -15.559307 22.559307
    # 5          35   Back   15 -15.559307 22.559307
    # 6          37   Back   15  -4.853102  7.853102
    

    (Если вам интересно, почему у меня есть условие на length(unique(x)) > 1, а затем посмотрите, что происходит без него:

    aggregate(data_l$Rating, data_l[,c("Temperature","Region","Time")],
              function(x) t.test(x)$conf.int)
    # Error in t.test.default(x) : data are essentially constant
    

    Это потому, что существуют комбинации с пустыми данными. Скорее всего, вы увидите нечто подобное с не пустыми, но все еще инвариантными данными.)

0 голосов
/ 06 марта 2020

Я застрял в цикле между комбинациями и выполнении t-теста в каждом комбо.

Я не уверен, что это то, что вы хотели.

N <- 800
df <- data.frame(Participant=1:N,
                 Temperature=gl(4,200),
                 Region=sample(1:5, 800, TRUE),
                 Time=sample(1:5, 800, TRUE),
                 Rating=sample(1:5, 800, TRUE))
head(df)

t_test <- function(data, y, x){
  x <- eval(substitute(x), data)
  y <- eval(substitute(y), data)

  comb <- combn(levels(x), m=2)  # this gives all pair-wise combinations
  n <- dim(comb)[2]
  t <- vector(n, mode="list")

  for(i in 1:n){
    xlevs <- comb[,i]
    DATA <- subset(data, subset=x %in% xlevs)
    x2 <- factor(x, levels=xlevs)
    tt <- t.test(y~x2, data=DATA)
    t[[i]] <- tt
    names(t)[i] <- toString(xlevs)
  }
  t
}

T.test <- t_test(df, Rating, Temperature)

T.test[1]
$`1, 2`

    Welch Two Sample t-test

data:  y by x2
t = -1.0271, df = 396.87, p-value = 0.305
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.4079762  0.1279762
sample estimates:
mean in group 1 mean in group 2 
           2.85            2.99 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...