odds ratio


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.88RR = (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中的理解可以看:

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的方法

import statsmodels.api as sm
table = 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM