一. 在介绍OR值和RR值两者的区别之前 首先了解下两者的定义:
Odds Ratio(比值比, OR):在病例对照研究中,比值比指病例组中暴露与非暴露人数的比值和对照组中暴露与非暴露人数的比值的比。在队列研究中,指的是暴露组中患病与非患病者的比值和非暴露组中患病与非患病者的比值的比。比值比OR = (a/b)/(c/d)。OR值等于1时,表示该因素对疾病的发生不起作用;OR值大于1时,表示该因素是一个危险因素;OR值小于1时,表示该因素是一个保护因素。
Relative Rate(相对危险度, RR):是指暴露组累积发病率(或死亡率)/对照组累积发病率(或死亡率)。相对危险度表明暴露组发病率或死亡率是对照组发病率或死亡率的多少倍。说明暴露组发病或者死亡的危险性是非暴露组的倍数。RR值越大,表明暴露的效应越大,暴露与结局的关联的强度越大。相对危险度RR = (a/(a+b))/(c/(c+d))。当RR值为1时,表明暴露和结局不相关;RR值大于1时,表明暴露组风险高于非暴露组,呈现正相关,可能是危险因素;当RR值小于1时,表明暴露组风险低于非暴露组,呈现负相关,可能是保护因素。
二. 接下来我们来了解下病例对照研究和队列研究,以患肺癌为例。
1. 队列研究:进行前瞻的队列研究,常规的做法是分别找一群吸烟的人和不吸烟的人,随访若干年,看吸烟和不吸烟的人群中分别有多少人患了肺癌。如下图:
2. 病例对照研究:要进行病例对照研究,通常的做法是找一些肺癌患者和一些正常对照,去调查他们既往分别有多少人吸烟。如下图:
由此可以看出,病例对照研究不能计算RR,只能计算OR。而队列研究可以计算OR和RR值。
三. 那么两者之间存在有什么关系呢?
根据两者的公式可以看出,假设疾病的发病率很低(比如<10%),那么a+b ~ b,c+d ~ d,所以有:
RR = (a/(a+b))/(c/(c+d)) ~ (a/b)/(c/d) = OR
即当发病率很低时,可以用OR值近似替代RR值。
四. 使用情况
病例对照研究中只能计算OR。而队列研究可以计算RR值,其临床意义清晰(比如暴露组发病率是非暴露组发病率的多少倍)。而OR的临床意义相对模糊且不好解释,所以一般不用OR。
在一些特殊情况下也可以计算OR,比如Logistic回归中计算的“Exp(B)”就是OR。
五. 计算置信区间
在给出OR值和RR值往往是不够的,通常还需要计算其95%置信区间(95%CI)。例子如下所示:
| Allele 1 | Allele 2 |
病例 | A | B |
对照 | C | D |
Odds 值在病例和对照可以计算如下:
病例Allele 1 Odds = A (A + B)/ B (A + B) = A / B
对照Allele 1 Odds = C (C + D) / D (C + D) = C / D
那么在这一点Allele 1的OR值可以计算如下:
Odds Ratio = (A / B)/(C / D) = (A * D)/ (B * C)
同样地,95% Confidence Intervals (CI) 值可以计算如下:
ln(OR)的95%置信区间 = ln(OR)±1.96(1/A + 1/B + 1/C + 1/D)**0.5
OR的95%置信区间= e**95% CI of ln(OR)
对于调整的OR值(Adjusted OR Value),可以利用逻辑回归(LR)计算。代码如下:
# 95%CI of Adjusted OR
model = sm.Logit(target, X)
result = model.fit( )
print( result.summary2( ) )
params = result.params
conf = result.conf_int( )
conf['OR'] = params
conf.columns = ['2.5%', '97.5%', 'OR' ]
print( np.exp(conf) )