请选择 进入手机版 | 继续访问电脑版
楼主: moonstone
21653 8

[程序分享] R及SAS计算患病风险比值比(OR, odds ratio)的差异比较 [推广有奖]

讲师

74%

还不是VIP/贵宾

-

威望
0
论坛币
10442 个
通用积分
336.3055
学术水平
160 点
热心指数
169 点
信用等级
124 点
经验
262826 点
帖子
237
精华
1
在线时间
520 小时
注册时间
2007-4-27
最后登录
2024-4-11

moonstone 发表于 2016-1-27 13:29:01 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
偶然间发现R在计算患病风险比值比(OR, odds ratio)的结果输出中存在一个难以理解的“错误”:OR值检验的P值<0.05 (说明暴露与不暴露发生疾病的风险存在显著差异),但是置信区间却跨1(说明暴露与不暴露发生疾病的风险不存在显著差异

具体程序如下:
  1. library(epicalc)
  2. cci(18, 20050,205,377054)
复制代码
输出的普通卡方及精确卡方检验的P值分别为0.039及0.046,OR值及置信区间为:1.65(95%CI:0.96-2.68),采用glm的logisitc回归得到的结果与上述一样(具体输出省略):
  1. library(stats)
  2. temp <- data.frame (
  3.   exp <- c(1,1,0,0),
  4.   outcome <- c(1,0,1,0),
  5.   freq <- c(18, 20050,205,377054)
  6.   )

  7. model <- glm(outcome ~ exp ,
  8.              data = temp,
  9.              family = binomial(),
  10.              weights =freq)
  11. summary(model)
  12. exp(coef(model))
  13. exp(confint(model))
复制代码
简单的思考之后怀疑可能是R程序包有问题,因为R程序包的bug问题不是少见,于是采用SAS程序进行验证:
  1. data temp;
  2. input exp outcome freq;
  3. cards;
  4. 1 1 18
  5. 1 0 20050
  6. 0 1 205
  7. 0 0 377054
  8. ;

  9. proc freq data=temp;
  10. table outcome * exp/chisq nocol norow risk;
  11. weight freq;
  12. run;

  13. proc logistic data=temp descending;
  14. model outcome=exp;
  15. weight freq;
  16. run;
复制代码
结论不论是列联表,还是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的输出结果一致。具体如下:
  1. library(fmsb)
  2. oddsratio(18, 20050,205,377054)
复制代码
于是进一步明确不是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值的相关问题讨论,欢迎大家讨论,^_^
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Odds Ratio ratio odds odd dds

已有 3 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
falseform + 2 + 1 + 1 + 1 精彩帖子
李会超 + 60 + 40 精彩帖子
oliyiyi + 100 + 100 + 5 精彩帖子

总评分: 经验 + 160  论坛币 + 142  学术水平 + 6  热心指数 + 1  信用等级 + 1   查看全部评分

maybecry 发表于 2016-1-27 15:12:50 来自手机 |显示全部楼层 |坛友微信交流群
moonstone 发表于 2016-1-27 13:29
偶然间发现R在计算患病风险比值比(OR, odds ratio)的结果输出中存在一个难以理解的“错误”:OR值检验的P值
谢谢分享,之前也遇到类似问题,没细究~但对于这样敏感的p值,建议下结论的时候也要甚慎重,结合专业多角度分析吧

使用道具

moonstone 发表于 2016-1-27 16:18:39 |显示全部楼层 |坛友微信交流群
补充一下,STATA的关于OR计算的常规方法cci 默认输出的也是精确置信区间,但是P值为普通卡方检验的P值
  1. cci 18 20050 205 377054
复制代码
加上exact选项之后可输出精确检验的P值
  1. cci 18 20050 205 377054, exact
复制代码
加载exactcci函数后可以同时输出普通的及精确调整的置信区间,但采用的调整方法为Yates
  1. exactcci 18 20050 205 377054
复制代码
加上exact选项后可输出Fisher精确调整的置信区间
  1. exactcci 18 20050 205 377054, exact
复制代码


使用道具

还真没注意到这个事,SAS的OR置信区间应该是用的woof法,还有一个常用方法是Miettinen法,这个精确置信区间的算法,可能只有问包的作者了。

使用道具

whaij 发表于 2016-12-15 23:08:14 |显示全部楼层 |坛友微信交流群
我也在困惑R和SAS结果的不一致,看完很受启发!

使用道具

山楂树431 发表于 2017-12-18 16:25:27 |显示全部楼层 |坛友微信交流群
请问Odds Ratio是P/1-P吗?我想要求的各自变量的发生比率,怎么计算?软件可以操作码?

使用道具

falseform 发表于 2017-12-18 17:39:22 |显示全部楼层 |坛友微信交流群
厉害了,我就喜欢这种认真研究的人

使用道具

这个包已经不能用了,怎么处理啊

使用道具

yyyaaarrr 在职认证  发表于 2021-10-4 10:40:47 |显示全部楼层 |坛友微信交流群
不错不错,真好

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-18 15:37