偶然间发现R在计算患病风险比值比(OR, odds ratio)的结果输出中存在一个难以理解的“
错误”:
OR值检验的P值<0.05 (说明暴露与不暴露发生疾病的风险存在显著差异),但是置信区间却跨1(说明暴露与不暴露发生疾病的风险不存在显著差异)
具体程序如下:
输出的普通卡方及精确卡方检验的P值分别为0.039及0.046,OR值及置信区间为:
1.65(95%CI:0.96-2.68),采用glm的logisitc回归得到的结果与上述一样(具体输出省略):
简单的思考之后怀疑可能是R程序包有问题,因为R程序包的bug问题不是少见,于是采用SAS程序进行验证:
结论不论是列联表,还是logisitic回归,输出的普通卡方及Fisher精确卡方检验的P值均与R的输出一致,但是OR及95%CI均为:
1.6512(95%CI: 1.0197 - 2.6739)(其他详细输出省略),这个置信区间与P值=0.039是对应的。所以一时间还是觉得SAS靠谱,R有时候真的需要谨慎。
但是后来重新思考,觉得应该不至于R连这种简单的统计都会出问题,难道是SAS和R在计算OR值的置信区间上采用了不同的方法。于是翻阅现今流行病学最权威的书籍
Modern Epidemiology (3rd edition),
希望找到OR值的置信区间的计算上是否存在校正的置信区间的算法。但是似乎并没有找到。
然后想想R中经常存在不同程序包计算同一指标的方法,于是查阅可计算OR置信区间的不同程序包的输出,是否均是相同的问题。结果发现
fmsb程序包输出的OR置信区间与SAS的输出结果一致。具体如下:
于是进一步明确不是R的程序包存在bug,而是方法的不同导致了SAS与R的输出结果存在差异。进一步回过头查看cci 函数的输出结果,结果发现OR的置信区间输出的说明为
Exact 95% CI,于是查看cci 函数的选项中默认:
exact.ci.or = TRUE,于是果断将该选项修改为:
exact.ci.or = FALSE,结果与SAS输出结果一致。
于是最终想明白三件事:
(1)R的简单程序包(如fmsb,功能仅类似与计算器)通常计算的都是OR值普通的置信区间,R的高级程序包(如epicalc,stat等)通常默认输出的是OR精确的置信区间,但epicalc也可以提供OR值普通的置信区间,而stat只能提供OR精确的置信区间。
(2)只知道P值有精确检验的方法,原来OR值也有精确置信区间一说
(3)SAS的proc logisitic过程只能提供OR值普通的置信区间,不能提供OR值精确的置信区间,因此,从某种角度上来说,SAS其实并没有R精细
同时在二楼跟帖中补充了STATA中关于OR值的相关问题讨论,欢迎大家讨论,^_^