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 stats oddsratio, 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?(可下載示例數據)
python scipy代碼如下
這里需要注意的是使用的公式是statsmodels.formula.api
中的方法
import statsmodels.formula.api as smf df = pd.read_csv("https://stats.idre.ucla.edu/wp-content/uploads/2016/02/sample.csv") lreg = smf.logit(formula='hon~female',data=df).fit() #獲取coef值 female_coef_ = res.tables[1].data[2][1].strip() #計算得到OR值 np.exp(float(female_coef_))
np.exp(lreg.params)
可以直接計算
conf = lreg.conf_int() conf['OR'] = lreg.params conf.columns = ['Lower CI','Up CI','OR'] np.exp(conf)
使用如下方法也可以得到同樣的結果
import pandas as pd from patsy import dmatrices import statsmodels.api as sm y, X = dmatrices( 'hon ~ female', data=df, return_type='dataframe') mod = sm.Logit(y, X) res = mod.fit() print (res.summary()) conf = res.conf_int() conf['OR'] = res.params conf.columns = ['Lower CI','Up CI','OR'] np.exp(conf)
下面是2x2表計算odd的方法
結果
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