条件逻辑回归(conditional logistic regression)是针对配对数据资料分析的一种方法。在一些病例-对照研究中,把病例和对照按照年龄、性别等进行配对,形成多个匹配组,各匹配组的病例数和对照数是任意的,并不是1个对1个,常用的是每组中有一个病例和多个对照,即1:M配对研究(一般M≤3)。
使用孙振球《医学统计学》第4版例16-3的数据。某北方城市研究喉癌发病的危险因素,用1:2配对研究,现选取了6个可能的危险因素并记录了25对数据,试做条件logistic回归。

data16_3 <- foreign::read.spss("datasets/例16-03.sav",to.data.frame = T)
head(data16_3)
## i y x1 x2 x3 x4 x5 x6
## 1 1 1 3 5 1 1 1 0
## 2 1 0 1 1 1 3 3 0
## 3 1 0 1 1 1 3 3 0
## 4 2 1 1 3 1 1 3 0
## 5 2 0 1 1 1 3 2 0
## 6 2 0 1 2 1 3 2 0
str(data16_3)
## 'data.frame': 75 obs. of 8 variables:
## $ i : num 1 1 1 2 2 2 3 3 3 4 ...
## $ y : num 1 0 0 1 0 0 1 0 0 1 ...
## $ x1: num 3 1 1 1 1 1 1 1 1 1 ...
## $ x2: num 5 1 1 3 1 2 4 5 4 4 ...
## $ x3: num 1 1 1 1 1 1 1 1 1 1 ...
## $ x4: num 1 3 3 1 3 3 3 3 3 2 ...
## $ x5: num 1 3 3 3 2 2 2 2 2 1 ...
## $ x6: num 0 0 0 0 0 0 0 0 0 1 ...i是配对的组号,不需要变成因子型。以前3航为例解释下这个数据的结构,前3行都是第1组的,其中第1行是病例(y=1),第2和3行是对照(y=0)。
使用survival::clogit进行条件逻辑回归,先建立全模型:
library(survival)
full_model <- clogit(y ~ x1+x2+x3+x4+x5+x6+strata(i),
data = data16_3, method = "breslow")
#summary(full_model)然后使用MASS包进行逐步回归法筛选变量,依据的统计量是AIC(而不是书中的wald卡方值):
library(MASS)
stepAIC(full_model,direction = "both",trace = F)
## Call:
## coxph(formula = Surv(rep(1, 75L), y) ~ x1 + x2 + x3 + x4 + x6 +
## strata(i), data = data16_3, method = "breslow")
##
## coef exp(coef) se(coef) z p
## x1 2.72788 15.30037 2.86273 0.953 0.3406
## x2 1.63294 5.11889 0.64090 2.548 0.0108
## x3 2.19644 8.99295 1.15872 1.896 0.0580
## x4 -4.09625 0.01663 1.94949 -2.101 0.0356
## x6 3.78580 44.07080 2.09677 1.806 0.0710
##
## Likelihood ratio test=42.03 on 5 df, p=5.811e-08
## n= 75, number of events= 25这一步得到的变量是x1,x2,x3,x4,x6,和书里不一致,因为依据的统计量不一样。目前并没有现成的R包可以依据wald卡方进行逐步回归法筛选变量,除非自己写函数。
按照书中最终留下x2,x3,x4,x6这4个变量,然后再使用这4个变量建立条件逻辑回归,即可得到与表16-8一致的结果:
fit <- clogit(y ~ x2+x3+x4+x6+strata(i),
data = data16_3, method = "breslow")
summary(fit)
## Call:
## coxph(formula = Surv(rep(1, 75L), y) ~ x2 + x3 + x4 + x6 + strata(i),
## data = data16_3, method = "breslow")
##
## n= 75, number of events= 25
##
## coef exp(coef) se(coef) z Pr(>|z|)
## x2 1.48691 4.42343 0.55065 2.700 0.00693 **
## x3 1.91665 6.79812 0.94435 2.030 0.04240 *
## x4 -3.76405 0.02319 1.82510 -2.062 0.03917 *
## x6 3.63211 37.79254 1.86572 1.947 0.05156 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## x2 4.42343 0.22607 1.5032983 13.0158
## x3 6.79812 0.14710 1.0679561 43.2737
## x4 0.02319 43.12280 0.0006483 0.8295
## x6 37.79254 0.02646 0.9756664 1463.8982
##
## Concordance= 0.9 (se = 0.068 )
## Likelihood ratio test= 38.82 on 4 df, p=8e-08
## Wald test = 8.96 on 4 df, p=0.06
## Score (logrank) test = 28.4 on 4 df, p=1e-05结果非常齐全,β值,OR值,z值,P值等信息都有了。
上述结果的最后3行已经给出了模型整体的假设检验结果,依次是:
似然比检验也可以自己做,结果是一样的:
# 建立空模型
model_0 <- clogit(y ~ 1+strata(i),
data = data16_3, method = "breslow")
# 进行似然比检验
anova(model_0,fit,test = "chisq")
## Analysis of Deviance Table
## Cox model: response is Surv(rep(1, 75L), y)
## Model 1: ~ 1 + strata(i)
## Model 2: ~ x2 + x3 + x4 + x6 + strata(i)
## loglik Chisq Df Pr(>|Chi|)
## 1 -27.465
## 2 -8.056 38.819 4 7.594e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1P<0.05,说明原模型有意义。
条件逻辑回归不能直接使用普通的Hosmer-Lemeshow检验、伪R2或传统的混淆矩阵来评价模型,因为这些指标通常依赖于截距项或整体概率预测,而条件逻辑回归不估计截距。
因此条件逻辑回归不能用以上方法评价拟合优度,如果非要评价模型预测准确性,可以计算Harrell’s C-index(一致性指数),因为条件逻辑回归等价于分层Cox模型。结果中的Concordance=0.9就是一致性指数。