发布时间: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值的统计学意义:
RR值的统计学意义:
注意点:
当疾病的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
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中的理解可以看:
通过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