在某些疾病有这样的现象,A和B两种危险因素都和疾病呈正相关,人们理所当然地想,同时暴露于A和B的人群的风险,肯定比仅暴露于A或仅暴露于B的人群要高。好像没毛病,但问题是有时候前者比后者高太多了,是不是略显诡异?
于是人们做出推测,A和B不是独立作用的。如果A作用于某条通路,B独立地作用于另一条通路,那么同时暴露于两个因素时,其风险在数学上可以解释为A+B或A×B。不幸的是,观察到的数据脱离了这个轨道,那只能认为,另外至少还有一条通路,需要A和B同时参与。所以当同时暴露于两个因素时,除了他们各管各的,还打开了其他的通路。
这就是交互作用,最常见的研究就是某个基因异常与某个环境因素的交互作用,还有基因-基因交互作用的研究。当我们有了怀疑,就可以从统计上做个交互分析来检验。
上边的A+B和A×B,指代统计学上的两种交互模型,一个是相加尺度交互模型,一个相乘尺度交互模形。分析危险因素时最常用的logistic回归,本质上是相乘模型。但近年来有不少学者提倡使用相加模型,因为相加模型的意义更明确。
Eur J Epidemiol. 2005;20(7):575-9.
如图,U表是未暴露,纵坐标表示风险,第二和第三根柱子分别是单独暴露于基因突变和吸烟时的风险,第四根柱子就是同时暴露于两因素时,风险竟然比叠加要高这么多。
如果想要通过logistic回归找到有统计学意义的危险因素,再检测它们在相加尺度上的交互作用,就需要经过一些变换。
要知道两因素在相加尺度上是否发生了交互作用,就需要知道三个值:
交互作用相对超额危险度(Relative Excess Risk of Interaction,RERI)
归因比(Attributable Proportion,AP)
协同指数(Synergy Index,S)
如果没有发生交互作用,那么RERI和AP等于0,S等于1。更准确地说,是RERI和AP的置信区间包含0,S的置信区间包含1。反之则可认为发生了交互作用。
计算这三个值在不同的软件中有不同的方法,我当然还是要介绍最简便的R。
就用一份模拟的数据来演示吧:
Group是疾病分组,1为病例组,0为对照组;A因素,1为暴露,0为不暴露;B同理。可见按照暴露情况,可以把人群分为4类,即A0B0,A1B0,A0B1,A1B1。就是要比较这四类人与疾病风险的关系。
## 先从File→Import Dataset导入数据(本例中命名为Data),然后
library(Matrix)
library(survival)
library(epiR)
setwd('D://Interaction')
# 载入需要用到的包,设置工作路径
## 构造虚拟变量Dum,把两个因素整合成上面说的那四类
Data$Dum
Data$Dum[Data$A ==0 & Data$B ==0]
Data$Dum[Data$A ==1 & Data$B ==0]
Data$Dum[Data$A ==0 & Data$B ==1]
Data$Dum[Data$A ==1 & Data$B ==1]
Data$Dum
# 看起来厚厚一段其实很简单,在Data表中建立Dum变量,先设为NULL(空值),然后填数字。“[ ]”表示条件,“&”表示“且”,NULL之后的第一行就表示,当A=0,且B=0时,Dum赋值为0,后面依此类推。这样我们就有了一个Dum变量,共有0、1、2、3这四个值。
# 最后一句千万别漏了,是把Dum变量的类型转化为分类变量(factor)。
## 构建广义线性模型
Data.glm
summary(Data.glm)
# 这是先把我们想用的logistic回归推广到广义线性模型(generalized linear model, GLM)里,因为logistic是GLM的一个特例,而计算REPI等指标的计算本来就是适用于线性模型的。再通过Family参数选择binomial,将其特化成logistic模型。Data选择数据集。
# 用summary()函数查看模型的一些特征,在输出的一堆结果中,注意这个表:
刚才的Dum变量有0、1、2、3这四个变量,现在以0为参照,列出了其他三个值的参数。其实你只需要记住三个Dum在表中的位置就行了,即第2、3、4行。
## 计算相加模型指标
epi.interaction(model = Data.glm, coeff = c(2,3,4), type = "RERI", conf.level = 0.95)
epi.interaction(model = Data.glm, coeff = c(2,3,4), type = "APAB", conf.level = 0.95)
epi.interaction(model = Data.glm, coeff = c(2,3,4), type = "S", conf.level = 0.95)
# model选择刚才建好的广义线性模型,coeff就是三个Dum在Coefficients表中的位置,type指定需要计算的统计量,conf.level指定置信区间。
然后就得到了三个结果:
Est是估计值,lower和upper是置信区间的两端,在报告上就写成“RERI: 3.56, 95% CI: 0.47–6.65。”后两个类推。
可见RERI的和AP都为正值,置信区间都不包含0,而S>1,置信区间不包含1,说明在相加尺度上,二者发生了交互作用,且为协同作用。(如果RERP和AP小于0,S小于1,则为拮抗作用)。
要注意的地方主要是下结论时。首先明确一点,这个“交互作用”是指统计学上的交互作用,不能直接说它们具有生物学意义上的交互作用。因为统计模型又不止一种,你会看到有些研究中,相乘模型有统计学意义,相加模型没有统计学意义,或者相乘模型为拮抗作用,相加模型为协同作用。所以这才有了谁更合理的争论。
所以只能说,“A因素和B因素在相加尺度上具有交互作用”,可以推测有生物学交互,而不能直接写“具有生物交互作用”。同样,没检测到统计学上的交互作用,也不能说明没有生物学交互作用,因为生物学是复(keng)杂(die)的。所以,你就有了申请下一个课题的理由。
接下来,我们简单看一下那些统计学家用公式堆积起来的战场(非战斗人员请迅速撤离)。
刚才把人群按暴露情况分为四组了是吧,他们的相对危险度(Relative Risk)也一样编码,记作RR00,RR10,RR01,RR11。
如果没有相加交互作用,那么RR11 - RR00=(RR10 - RR00) + (RR01 - RR00) —— (1)
因为未暴露于我们研究的两个因素时也有人发病,所以RR00其实代表研究之外的其他因素,或说其他通路,它们在A1B1、A1B0和A0B1三种情况下,都是暴露的,你来或不来,我就在这里,所以要减去它们的干扰。
于是把公式整理一下得到:RR11-RR10-RR01+RR00=0。因为RR=暴露组累积患病率/对照组累积患病率,所以可以认为RR00=1,代进去,就得于了RERI公式:
RERI = RR11-RR10-RR01+1 —— (2)
知道为什么RERI要跟0对比了吧。RERI偏离0,说明前方有敌情,另一条需要A和B通时参与的通路打开,使得患病风险超过了模型的预测。从名字看就知道RERI是指超过的部分。
另外两个指标AP和S,有些文献中都不报。也来看一下吧:
AP=RERI/RR11,显然是指同时暴露于两因素时,超过的部分占总体的比例。所以它也是跟0比较。
S=(RR11-1)/[(RR10-1)+(RR01-1)],这个要稍微推导一下。回到刚才RERI的原始公式(1),把RR00=1代入,得到:RR11 - 1 = (RR10 – 1) + (RR01 -1),一比不就是S=1了嘛,所以S要跟1对比。
相乘模型也类似,不过把(1)公式中的+号变×号,-号变÷号,于是:
RR11/RR00 = (RR10/RR00) × (RR01/RR00),则RR11×RR00 = RR10 × RR01,所以相乘模型是用RR11/RR10 · RR01 —— (3) 与1比较,大于1为协同,小于1为拮抗。
设想一下,如果(3)大于1时,即RR11 > RR10 · RR01,两因素是协同作用,套到RERI公式中仍然是协同作用。
可是(3)小于1时,即RR11 < RR10 · RR01,RERI那边的情况就不一定了,协同、拮抗、无交互作用三种情况都可能发生。
参考资料:
1.Interaction: A word with two meanings creates confusion
2.Calculating measures of biological interaction
3.流行病学研究中相加和相乘尺度交互作用的分析
4.Logistic回归模型中交互作用的分析及评价
5.Epi Vignettes: Interaction and effect modification - Neal D. Goldstein, PhD, MBI
6.https://www.rdocumentation.org/packages/epiR/versions/0.9-82/topics/epi.interaction