条件逻辑回归中的假设检验与变量选择
时间:2026-05-29 14:36
条件逻辑回归(conditional logistic regression)是一种专门用于分析配对数据的统计方法,广泛应用于病例-对照研究(case-control study)中。在这类研究中,研究者通常会将病例与对照按照年龄、性别等关键混杂因素进行匹配,形成多个匹配组(matched sets
条件逻辑回归(conditional logistic regression)是一种专门用于分析配对数据的统计方法,广泛应用于病例-对照研究(case-control study)中。在这类研究中,研究者通常会将病例与对照按照年龄、性别等关键混杂因素进行匹配,形成多个匹配组(matched sets)。每个匹配组内的病例数和对照数可以不相等,其中最常见的为1:M配对设计,通常M不超过3。
本文以孙振球主编《医学统计学》(第4版)中的例16-3为例,完整演示条件逻辑回归的分析流程。该数据源自中国北方城市一项关于喉癌发病危险因素的1:2配对病例-对照研究,共纳入6个潜在危险因素,收集了25对匹配数据。

首先查看数据的基本结构与格式:
data16_3 <- foreign::read.spss("datasets/例16-03.sa v",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 3 3 3 2 2 2 2 2 1 ...
## $ x6: num 0 0 0 0 0 0 0 0 0 1 ...
变量`i`代表配对组编号,无需转换为因子类型。可以看到前三行同属第一组:第一行为病例(y=1),后两行为对照(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::stepAIC`进行逐步回归,变量筛选依据为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
AIC逐步回归筛选出了x1、x2、x3、x4、x6这五个变量,与原书结果存在差异——原因在于采用了不同的筛选统计量。目前R语言中尚无现成包可直接基于Wald卡方进行逐步回归,除非自行编写筛选函数。
参照原书最终模型,保留x2、x3、x4、x6这四个变量。利用它们重新拟合条件逻辑回归模型,即可得到与表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.50330 13.0158
## x3 6.79812 0.14710 1.06796 43.2737
## x4 0.02319 43.12280 0.00065 0.8295
## x6 37.79254 0.02646 0.97567 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值一应俱全。
假设检验与模型评价
关于模型整体的假设检验,上述输出末尾三行已提供了三种检验方法的结果:
- 似然比检验:统计量为38.82,P值远小于0.05,表明模型整体具有高度统计学显著性。
- Wald检验:统计量为8.96,P=0.06,按此结果模型似乎未显著优于空模型——但需谨慎解读。注意变量x6的回归系数高达3.63,OR值达到37.79,而其置信区间从0.97跨越至1463.89,宽度极大,几乎失去实际意义。这提示数据可能存在稀疏性(sparsity)或分离现象(separation),导致标准误膨胀,进而使Wald检验效力下降。
- 计分检验(logrank检验):统计量为28.4,P<0.05,同样支持模型整体显著。
似然比检验也可以手动计算进行验证,结果完全一致:
# 建立空模型
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 ***
P<0.05,表明模型具有统计学意义。
需要特别说明的是:条件逻辑回归模型无法直接套用常规的Hosmer-Lemeshow拟合优度检验、伪R²或混淆矩阵来评估模型性能,因为这些指标均依赖于截距项或整体概率预测,而条件逻辑回归模型并不估计截距项。若需评估模型的预测区分能力,推荐使用Harrell's C-index(一致性指数),本文结果中已给出:
Concordance=0.9,表明模型区分能力相当优秀。