采用Haldane校正后,R语言Fisher精确检验仍返回Inf优势比的原因
问题
我的数据集部分类别存在0计数,导致优势比(OR)为Inf。我尝试使用标准Haldane校正(给表格每个条目加0.5)解决该问题,但R语言的fisher.test仍返回OR=Inf。
手动计算的优势比应为:
(1.5/387.5)/(0.5/500.5) = 3.8748
执行的代码:
rubbish = c(1,387,0,500) test_df = data.frame(rbind(rubbish[1:2],rubbish[3:4])) test_df = test_df + 0.5 fisher.test(test_df)
返回结果:
Fisher's Exact Test for Count Data data: temp_df p-value = 0.1917 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.2409358 Inf sample estimates: odds ratio Inf
为何表格已无0值,却仍得到OR=Inf?
解答
核心原因:fisher.test只接受整数型的列联表数据。你给表格加0.5后生成了小数,fisher.test会自动对这些小数向下取整,等于你的Haldane校正完全没起作用——取整后表格里还是存在0,所以依然返回OR=Inf。
解决方法有两种:
- 用
epitools包的oddsratio函数(推荐)
这个函数支持非整数列联表,能直接计算Haldane校正后的OR值:
install.packages("epitools") library(epitools) rubbish = c(1,387,0,500) test_df = matrix(rubbish, nrow=2) # 用矩阵比数据框更适合列联表操作 test_df = test_df + 0.5 oddsratio(test_df, method="wald")
运行后会得到和你手动计算一致的OR值(约3.87)。
- 调整数据适配
fisher.test
把所有数值放大2倍(抵消0.5校正,转成整数),计算后再手动推导OR:
rubbish = c(1,387,0,500) # 每个原数加0.5后乘2,等价于原数乘2加1,得到整数矩阵 test_df = matrix(rubbish * 2 + 1, nrow=2) fisher_result = fisher.test(test_df) # 手动计算校正后的OR,结果和手动值一致 calculated_or = (test_df[1,1]/test_df[1,2])/(test_df[2,1]/test_df[2,2])
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

