dxy logo
首页丁香园病例库全部版块
搜索
登录

你知道log-binomial GLM吗?OR≠RR

发布于 2020-12-05 · 浏览 2487 · IP 江苏江苏
这个帖子发布于 4 年零 148 天前,其中的信息可能已发生改变或有所发展。

在队列研究中,常以相对危险度RR(包括危险度比和率比)来说明某因素与结局事件的关联强度;在病例对照中,我们常用OR值来说明某因素与结局事件的关联强度。虽然两者代表的意义相同,但计算公式不同(OR=ad/bc,RR=Ie/I0)。那么,两者之间又有着什么样的关系呢?由于病例对照研究无法得到事件的发生率,也就无法计算RR值,所以通过计算病例组与对照组的暴露比值之比—OR值—来近似估计RR值。既然是估计,那么估计的精度或准度是否受到一些因素的影响呢?有研究表明,当事件的发生率超过15%时(也有研究人员说是超过10%),用OR值去估计或代替RR值便不再精确,或者说偏差较大。

现实情况下,在队列研究中我们也会用二元logistic回归和OR值来说明某因素与结局事件的关联。然而,当发病率超过15%时,我们不建议仍使用logistic回归/模型,而应该改用log binomial 广义线性模型 (Generalized linear models, GLM),因为该模型可以得到我们想要的RR值,而不是OR值。在这里简单的解释一下GLM,其之所以叫广义,是因为他可以对多种分布类型的因变量进行建模/回归分析,主要是通过连接函数 link和分布函数family来完成,而我们常说的二元logistic模型在GLM中对应的连接函数和分布函数分别是logit和binomial(logit binomial GLM)。关于GLM的详细知识,请大家自行百度补充,这里就不多说了。接下来,我们通过公式计算和GLM拟合的方式来说明OR和RR的差异是怎么随着发病率变化的。

我们用的是来自SEER数据库的数据,看T分期为T1b的患者发生淋巴结转移的风险是T1a的多少倍。当结局事件发生率>15%时,我们以T1a为未暴露组,T1b为暴露组, 分别用公式和R语言的广义线性模型来计算T1b组患者发生结局事件的OR值/RR值。 OR值和RR值的计算公式如下:OR=ad/bc,RR=Ie/I0

****** 导入数据 ******

dat1<-read.csv("data1.csv",sep = ",")

dat2<-read.csv("data2.csv",sep = ",")

dat3<-read.csv("data3.csv",sep = ",")

****** 结局事件的频数和发生率 ******

table(dat1$LNM)

##  0       1

## 394   111

prop.table(table(dat1$LNM))

##       0              1

## 0.780198 0.219802

****** 利用公式计算OR值和RR值 ******

table(dat1$T_stage,dat1$LNM)

##             0    1

##  T1a 162  14

##  T1b 232  97

OR1=(97*162)/(232*14)

## [1] 4.838054

RR1=(97/(232+97))/(14/(14+162))

## [1] 3.70647

img

通过OR值和RR值的计算公式,我们得到了在事件发生率为21.98%时的OR值和RR值分别为4.838054和3.70647。接下来我们通过GLM来计算这两个值。

****** 利用广义线性模型计算OR值和RR值 ******

**** 单因素广义线性模型 ****

logit_T<-glm(LNM ~ T_stage,family = binomial("logit"),data = dat1)

exp(logit_T$coefficients)

## T_stageT1b

## 4.83805419

log_T<-glm(LNM ~ T_stage,family = binomial("log"),data = dat1)

exp(log_T$coefficients)

## T_stageT1b

## 3.70646982

从上面的结果我们可以看到,通过logit-binomial GLM和log-binomial GLM得到的OR值和RR值与手动计算的一致,而OR值(4.838)和RR值(3.706)相差1.132。同样,多因素模型给出的结果也有很大差异。

**** 多因素广义线性模型 ****

logit_fit<-glm(LNM ~ tumor_size + Grade + LN_number,family = binomial("logit"),data = dat1)

summary(logit_fit) ## logit-binomial GLM

## Call:

## glm(formula = LNM ~ tumor_size + Grade + LN_number, family = binomial("logit"), data = dat1)

## Coefficients:

##                          Estimate  Std. Error  z value   Pr(>|z|)   

## (Intercept)         -4.1901    0.6310     -6.640    3.13e-11 ***

## tumor_size1-      1.3045    0.5165      2.526    0.01154 * 

## tumor_size2-      1.5155    0.5198      2.915    0.00355 **

## tumor_size3-      1.7954    0.5528      3.248    0.00116 **

## tumor_size4-      2.1820    0.5121      4.261    2.04e-05 ***

## GradeⅡ             0.8727    0.4740     1.841    0.06562 . 

## GradeⅢ             1.3398    0.4634      2.891    0.00384 **

## LN_number15-  0.7304    0.2361      3.093    0.00198 **

log_fit<-glm(LNM ~ tumor_size + Grade + LN_number,family = binomial("log"),data = dat1)

summary(log_fit) ## log-binomial GLM

## Call:

## glm(formula = LNM ~ tumor_size + Grade + LN_number, family = binomial("log"), data = dat1)

## Coefficients:

##                           Estimate    Std. Error   z value   Pr(>|z|)   

## (Intercept)          -3.9135      0.5602      -6.986     2.83e-12 ***

## tumor_size1-      1.1655       0.4687       2.487     0.012896 * 

## tumor_size2-      1.3179       0.4682       2.815     0.004875 **

## tumor_size3-      1.4891       0.4818      3.091     0.001995 **

## tumor_size4-      1.7381       0.4552      3.818     0.000134 ***

## GradeⅡ             0.6994       0.4081      1.714     0.086534 . 

## GradeⅢ             1.0494       0.3973      2.641     0.008255 **

## LN_number15-  0.5058      0.1748       2.894     0.003803 **

当结局事件的发生率<15%时,结果是怎样的呢?我们接下来仍以公式和拟合GLM的形式来分别计算OR值和RR值。在原数据的基础上,我们人为地调低了结局事件的频数,其他内容与前面的数据一致。

****** 利用公式计算OR值和RR值 ******

table(dat2$LNM) ## 结局事件的频数

##  0    1

## 435 70

prop.table(table(dat2$LNM)) ## 结局事件的发生率

##        0               1

## 0.8613861  0.1386139

table(dat2$T_stage,dat2$LNM) ## 暴露组和对照组结局事件的频数

##            0       1

##  T1a 164   12

##  T1b 271   58

prop.table(table(dat2$T_stage,dat2$LNM),1) ## 暴露组和对照组结局事件的发生率

##               0                    1

##  T1a 0.93181818   0.06818182

##  T1b 0.82370821   0.17629179

OR2=(58*164)/(12*271)

## [1] 2.924969

RR2=(58/(58+271))/(12/(12+164)) = 0.17629179/0.06818182

## [1] 2.585613

****** 利用广义线性模型计算OR值和RR值 ******

logit_T<-glm(LNM ~ T_stage,family = binomial("logit"),data = dat2)

exp(logit_T$coefficients)

## T_stageT1b

## 2.92496925

log_T<-glm(LNM ~ T_stage,family = binomial("log"),data = dat2)

exp(log_T$coefficients)

## T_stageT1b

## 2.58561297

从上面的结果我们得知,OR=2.9250,RR=2.5856,差值为0.3394,差值变小了。接下来,我们接着调整事件的频数,看看OR值和RR值的差值是否会继续变小。

****** 利用公式计算OR值和RR值 ******

table(dat3$LNM) ## 结局事件的频数

##  0    1

## 458 47

prop.table(table(dat3$LNM)) ## 结局事件的发生率

##         0                 1

## 0.90693069   0.09306931

table(dat3$T_stage,dat3$LNM) ## 暴露组和对照组结局事件的频数

##        0         1

##  T1a 164   12

##  T1b 294   35

prop.table(table(dat3$T_stage,dat3$LNM),1) ## 暴露组和对照组结局事件的发生率

##               0                     1

##  T1a 0.93181818    0.06818182

##  T1b 0.89361702    0.10638298

OR3=(35*164)/(12*294)

## [1] 1.626984

RR3=(35/(35+294))/(12/(12+164))

## [1] 1.560284

****** 利用广义线性模型计算OR值和RR值 ******

logit_T<-glm(LNM ~ T_stage,family = binomial("logit"),data = dat3)

exp(logit_T$coefficients)

##  T_stageT1b

##   1.62698413

log_T<-glm(LNM ~ T_stage,family = binomial("log"),data = dat3)

exp(log_T$coefficients)

## T_stageT1b

## 1.56028369

通过上面的结果我们可以看到,随着事件发生率的较低,OR值和RR值的差值(0.0667)在变小,也就是说当事件发生的率较低时用OR值近似估计RR值比较合适。那么,我们来粗糙地下个结论,当事件发生率较大时(>10%或15%),建议适用log-binomial GLM,以精确估计研究因素与结果的统计学关联。

最后留下一个问题。通过上面一系列的模拟,我们可以看到使用log binomial GLM得到的RR值与公式计算所得的RR值是一样的。那么,在队列研究中,是不是可以直接用log binomial GLM,无论结局事件发生率为多大?欢迎各位留言讨论。尊重数据,助力科研,我一直在路上!


img
你知道log-bimomial GLM吗.docx (51.4 KB)
data1.csv (16.4 KB)
data2.csv (16.4 KB)
data3.csv (16.4 KB)

最后编辑于 2022-06-08 · 浏览 2487

4 24 18

全部讨论0

默认最新
avatar
4
分享帖子
share-weibo分享到微博
share-weibo分享到微信
认证
返回顶部