Автоматическое проведение t-тестов и тестов хи-квадрат для нескольких переменных в кадре данных в R - PullRequest
0 голосов
/ 15 декабря 2018

Вот некоторые примеры данных:

set.seed(1234)    # Make the results reproducible

count <- 100
cs1 <- round(rchisq(count, 1), 2)
cs2 <- round(rchisq(count, 2), 2)
c(rep("Present", 30), rep("Absent", 30), rep("NA", 40)) -> temp
temp[temp == "NA"] <- NA
as.factor(temp) -> temp
temp1 <- round(rnorm(count, 3), 2)
temp1[7] <- NA
temp2 <- round(rnorm(count, 7), 2)
temp2[54] <- NA
c(rep("Yes", 30), rep("No", 30), rep("Maybe", 30), rep("NA", 10)) -> temp3
temp3[temp3 == "NA"] <- NA
as.factor(temp3) -> temp3
c(rep("Group A", 55), rep("Group B", 45)) -> temp4
as.factor(temp4) -> temp4
mydata <- data.frame(cs1, cs2, temp, temp1, temp2, temp3, temp4)
mydata$cs2[56:100] <- NA ; mydata

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

by(mydata, mydata$temp4, summary)

Тем не менее, я также хотел бы рассчитать t.test или chisq.test для каждой переменной, стратифицированной на temp4.Я попытался просто изменить приведенный выше код, чтобы сделать это, но это всегда дает мне ошибкуКажется, ошибка связана с тем, что некоторые переменные в фрейме данных являются числовыми (и, следовательно, потребуется t.test), в то время как другие являются факторами (и, таким образом, потребуется chisq.test).

Есть ли простой способ сказать R проверить переменную, чтобы увидеть, что это за вид, а затем запустить соответствующий тест, и все сразу?И все равно распечатывать все результаты, даже если они обнаружат ошибку?

Меня не беспокоит целесообразность этого (например, я знаю о рисках многократного тестирования и т. Д.), А скорее простонужно знать как это сделать.Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вы можете использовать lapply для циклического перебора переменных и определения внутри анонимной функции, какой тест проводить.
При возникновении ошибки она перехватывается tryCatch и вместо результата теста окончательный список будет иметьсообщение об ошибке в качестве участника.

tests_list <- lapply(mydata[-ncol(mydata)], function(x){
  tryCatch({
    if(is.numeric(x)){
      if(length(levels(mydata$temp4)) == 2){
        t.test(x ~ temp4, data = mydata)
      }else{
        aov(x ~ temp4, data = mydata)
      }
    }else{
      tbl <- table(x, mydata$temp4)
      chisq.test(tbl)
    }
  }, error = function(e) e)
})

err <- sapply(tests_list, inherits, "error")

tests_list$cs1
tests_list$temp3

tests_list[[err]]
0 голосов
/ 15 декабря 2018

Да, вы можете перебирать обозначенные столбцы, сохраняя temp4 в качестве фактора, и проверять класс каждого столбца (с именем x в анонимной функции).Вы можете использовать sapply или apply(X, MARGIN = 2, FUN ...).Обратите внимание, что я явно подмножество mydata, потому что я считаю его более явным и читабельным.

sapply(mydata[, c("cs1", "cs2", "temp", "temp1", "temp2", "temp3")], FUN = function(x, group) {
  if (class(x) == "numeric") {
    # perform t-test, e.g. t.test(x ~ group)
    return(result_of_t_test)
  }

  if (class(x) == "factor") {
    # perform chi-square test
    return(result_of_chisq_test)
  }
}, group = mydata$temp4)
...