You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

采用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。

解决方法有两种:

  1. 用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)。

  1. 调整数据适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 12:28:13