当 R 中的卡方检验生成警告时,如何执行 Fisher 精确检验`fisher.test()`?
How to perform a Fisher's exact test `fisher.test()` when a warning is generated by the Chi square test in 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 精确检验 fisher.test()
?我不确定如何让代码在发生警告时识别。谢谢!
使用 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
})
我在 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 精确检验 fisher.test()
?我不确定如何让代码在发生警告时识别。谢谢!
使用 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
})