odds ratio

发布时间:2025-12-09 11:49:59 浏览次数:1

Odds ratio(OR)从字面上可看出,是两个odds的ratio,其用于:

在病例对照研究(case-control study)中,分析暴露风险因素与疾病(或者用药)的关联程度;主要是反映暴露与疾病之间关联强度的指标,OR常适用于病例对照研究,也可以运用于前瞻性的研究(当观察时间相等时)

与其相似的有个指标relative risk(RR),其可以理解为risk ratio,用于:

在队列研究(cohort study)中,分析暴露因素与发病的关联程度;主要是反映暴露与发病(死亡)关联强度的最有用的指标,RR适用于队列研究或随机对照试验。

以一个例子来说明两者的区别,数据表格如下(Mutated gene对应暴露风险因素,Cancer对应疾病):

Cancer Normal Total
Mutated gene 23 117
No mutated gene 6 210
Total 29 327

OR = (23/117) / (6/210) = 6.88,RR = (23/140) / (6/216) = 5.91

从上可看出,OR表明暴露组的疾病风险程度是非暴露组的6.88倍,RR表明暴露组发病的风险是非暴露组的5.91倍

OR值的统计学意义:

  • OR>1,暴露与疾病的危险度增加,两者呈正相关
  • OR<1,暴露与疾病的危险度减少,两者呈负相关
  • OR=1,暴露与疾病的危险度无关,两者呈不相关

RR值的统计学意义:

  • OR>1,暴露因素是疾病的危险因素,两者呈正相关
  • OR<1,暴露因素是疾病的保护因素,两者呈负相关
  • OR=1,暴露因素与疾病无关,两者呈不相关

注意点:

当疾病的incidence rate较低时,OR近似于RR,故当疾病很罕见时,常用OR来作为RR的近似值;然而当incidence rate高于10%的时候,OR与RR的差距会变得越来越大,从而使得在这些情况下使用OR就变得并不那么合适了(OR会倾向于给出一个暴露 vs. 非暴露间差距更明显的值,因此导致临床意义不足)

为什么在病例对照研究(case-control study)中无法计算RR值?来自Relative Risk和Odds Ratio

因为我们一开始选定的人群是基于他们发没发生event来定的,所以这时候我们这个研究群体里的的incidence rate并不是target population里真实的incidence rate (事实上,case-control study里的incidence rate一般会远大于实际的incidence rate,因为做case-control study的初衷就是因为target population里的event rate太低),所以我们没法计算RR

计算odds的方法

  • fisher检验

Pearson 卡方检验要求二维列联表只允许 20% 以下格子的期望数小于5,对于 2×2 列联表,应当用 Fisher 精确检验法

A 和 B 两种药物的二维列联表数据,问 A 和 B 两种药物的治疗效果是否相同?显著性水平为
0.05

疗效 有效 无效
A 8 2
B 7 23
import scipy.stats as statsoddsratio, pvalue = stats.fisher_exact([[8, 2], [1, 5]])
  • 卡方检验
    见卡方检验的文章
  • 逻辑回归

logistic regression,即假设error terms服从binomial distribution,并使用logit作为link function;然后通过model计算出变量对应的logit(p),即logodds,odds则是等于exp(logodds),而p(predict probabilities )则是odds/(1+odds)

对于Odd Ratios在Logistic regression中的理解可以看:

  • Interpreting Odd Ratios in Logistic Regression 或者 FAQ: HOW DO I INTERPRET ODDS RATIOS IN LOGISTIC REGRESSION?(可下载示例数据)
  • R: Calculate and interpret odds ratio in logistic regression
  • LOGIT REGRESSION | R DATA ANALYSIS EXAMPLES

通过glm函数对数据进行拟合(观察female变量与hon之间的影响)

import statsmodels.api as smdata = sm.datasets.ccard.load_pandas().datadata['OWNRENT'] = data['OWNRENT'].astype(int)model = sm.Logit(endog = data['OWNRENT'], exog = data[['AVGEXP','AGE','INCOME','INCOMESQ']]).fit()model.summary()

odds优势比可以对coef值进行np.exp(coef)得到

import pandas as pdfrom patsy import dmatricesimport statsmodels.api as sm y, X = dmatrices( 'label ~ age + gender', data=df, return_type='dataframe')mod = sm.Logit(y, X)res = mod.fit()print res.summary()
mport statsmodels.api as smtable = sm.stats.Table2x2(np.array([[73, 756], [14, 826]]))table.summary(method='normal')

结果

  Estimate          SE          LCB   UCB      p-value  Odds ratio        5.697       3.189 10.178   0.000  Log odds ratio    1.740 0.296 1.160  2.320   0.000  Risk ratio        5.283       3.007  9.284   0.000  Log risk ratio    1.665 0.288 1.101  2.228   0.000
oddsratio
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477