在医学研究中,我们常常面临一个核心挑战:如何从观察性数据中得出可靠的因果推断?随机对照试验(RCT)虽然是金标准,但在实际临床环境中往往难以实施。这时,倾向得分方法就成为了观察性研究中控制混杂变量的重要工具。
我从事医学统计分析工作多年,发现很多临床医生对倾向得分方法存在误解。最常见的误区就是认为"倾向得分匹配就是倾向得分分析的全部"。事实上,倾向得分加权(IPTW)在很多场景下可能比匹配更优,这一点在最近发表在《Clinical Infectious Diseases》上的研究中得到了验证。
倾向得分可以理解为:给定观察到的协变量情况下,个体接受某种治疗的概率。数学表达式为:
e(X) = P(T=1|X)
其中T是处理变量(如是否转为口服治疗),X是协变量向量。这个概率通常通过逻辑回归模型来估计。
在实际操作中,我发现有几个关键点需要注意:
确定处理变量和协变量:明确要比较的处理组别,收集所有相关协变量
构建逻辑回归模型:
r复制ps_model <- glm(treatment ~ age + sex + severity + comorbidities,
data = df, family = binomial())
r复制df$ps <- predict(ps_model, type = "response")
IPTW的核心思想是通过加权创建一个"伪人群",其中治疗分配与协变量独立。权重计算如下:
这种加权方式放大了那些"不太可能接受当前治疗"的个体的贡献,从而平衡了协变量分布。
r复制df$weight <- ifelse(df$treatment == 1, 1/df$ps, 1/(1-df$ps))
r复制# 去除极端权重
upper <- quantile(df$weight, 0.99)
df$weight_trimmed <- pmin(df$weight, upper)
r复制# 计算标准化均数差
library(tableone)
tabWeighted <- CreateTableOne(vars = covariates,
strata = "treatment",
data = df,
weights = "weight_trimmed")
r复制library(survey)
design <- svydesign(ids = ~1, weights = ~weight_trimmed, data = df)
model <- svyglm(outcome ~ treatment, design = design)
根据我的经验,匹配在以下情况可能更合适:
让我们以原文中的静脉转口服抗生素研究为例,比较四种方法:
r复制glm(death30 ~ oral_switch + age + severity + ..., data = df, family = binomial)
r复制library(MatchIt)
match_model <- matchit(oral_switch ~ age + severity + ...,
data = df, method = "nearest",
caliper = 0.2)
matched_data <- match.data(match_model)
r复制# 如3.2节所示
r复制df$strata <- cut(df$ps, breaks = quantile(df$ps, probs = seq(0,1,0.2)))
strat_model <- glm(death30 ~ oral_switch + strata, data = df, family = binomial)
结合倾向得分和结局模型的优势:
r复制# 倾向得分模型
ps_model <- glm(treatment ~ covariates, data = df, family = binomial)
df$ps <- predict(ps_model, type = "response")
# 结局模型
outcome_model <- glm(outcome ~ treatment + covariates, data = df, family = binomial)
# 双重稳健估计
library(drgee)
dr_model <- drgee(outcome ~ treatment, oformula = ~covariates,
eformula = ~covariates, data = df, link = "logit")
现代方法开始将机器学习引入倾向得分估计:
r复制library(SuperLearner)
sl_lib <- c("SL.glm", "SL.ranger", "SL.nnet", "SL.gam")
ps_model_sl <- SuperLearner(Y = df$treatment,
X = df[covariates],
SL.library = sl_lib,
family = binomial())
df$ps_sl <- ps_model_sl$SL.predict
机器学习优势在于自动捕捉复杂关系,但需注意:
在实际操作中,我发现很多研究忽略了权重分布的展示和解释,这是需要特别注意的。一个好的做法是提供权重分布的箱线图或直方图,并说明任何修剪或调整的具体参数。