Как выполнить точный тест Фишера `fisher.test()`, когда тест хи-квадрат генерирует предупреждение в R?

У меня есть фрейм данных в R с именем df. Для каждой переменной во фрейме данных, которая является фактором, я хочу выполнить критерий хи-квадрат, стратифицированный по полу субъекта, и сохранить полученное значение p. Для этого я написал код, показанный ниже.

sapply(df, function(x) if(class(x) == "factor") { chisq.test(table(df$Sex, x))$p.value } )

Проблема в том, что когда я запускаю этот код, я получаю следующее:

There were 50 or more warnings (use warnings() to see the first 50)
warnings()
Warning messages:
1: In chisq.test(table(df$Sex, x)) : Chi-squared approximation may be incorrect

Как я могу изменить свой исходный код, чтобы вместо него выполнялся точный тест Фишера fisher.test(), когда критерий хи-квадрат генерирует предупреждение? Я не уверен, как заставить код распознавать появление предупреждения. Спасибо!


person Alexander    schedule 18.03.2015    source источник
comment
использовать фишеры все время?   -  person rawr    schedule 18.03.2015


Ответы (1)


Использование tryCatch чего-то в этом роде может помочь:

dat = data.frame(x=c(1,0,1,0,1,0,1,1),y=c("A","B","B","A","A","B","A","A"))

#this table is sure to throw a warning
tab = table(dat)
chisq.test(tab)
fisher.test(tab)


#Important part
tryCatch({
  chisq.test(tab)$p.value
}, warning = function(w) {
  fisher.test(tab)$p.value
})

Изменить: если кто-то также хочет обойти ошибки, выбрасывая NA, приведенное выше может быть изменено:

tryCatch({
  chisq.test(tab)$p.value
}, warning = function(w) {
  fisher.test(tab)$p.value
}, error = function(e) {
  NA
})
person Pewi    schedule 18.03.2015
comment
Этот код кажется отличным. Теперь я столкнулся с другой проблемой... Error in fisher.test(table(df$Sex, x)) : FEXACT error 40. Out of workspace. Я полагаю, из-за характера моих данных? Есть ли способ игнорировать это и просто поставить NA в качестве значения p для этих переменных? - person Alexander; 18.03.2015
comment
Возможно, добавление некоторого рабочего пространства (по умолчанию 200000) fisher.test(table(df$Sex, x),workspace=1000000) поможет. - person Pewi; 18.03.2015