作为我项目的一部分,我正在尝试使用 R 中的 MatchIt 包来实现 PSM-DiD 模型。我对此非常陌生,因此无法弄清楚代码到底哪里出了问题,因为在运行初始 Logit 模型以及随后的匹配模型之后,我得到了错误的倾向得分结果。
我的数据的简要描述:
变量:14 岁以下(治疗期;1 代表年龄 < 14, 0 otherwise), Post1986 (post-term; 1 for year <= 1986, 0 otherwise), LIT (outcome), additional covariates - AGE, SEX, FAMSIZE, NCHILD, URBAN, YEAR, STATE (last 2 variables are not very relevant).
据我了解,倾向得分是条件概率,因此该模型应该正确给出输出(倾向变量)。然而,处理单元 (2.22e-16) 的倾向得分接近 0,而控制单元的倾向得分接近 1,这(对我来说)没有意义。
这是我用来计算倾向得分的代码:
# Step 1: Assign groups (Treated or Control) based on the 'Under14' variable
temp$group <- with(temp, ifelse(Under14 == 1, "Treated", "Control"))
temp$group <- factor(temp$group, levels = c("Treated", "Control"))
# Step 2: Fit a logistic regression model to estimate propensity scores
logit_model <- glm(group ~ URBAN + AGE + SEX + NCHILD + FAMSIZE, family = binomial, data = temp)
summary(logit_model)
# Step 3: Calculate predicted probabilities (propensity scores)
temp$propensity <- predict(logit_model, type = "response")
并对匹配模型执行此操作:
# Step 4: Perform matching using propensity scores with Nearest neighbor matching
psm <- matchit(group ~ URBAN + AGE + SEX + NCHILD + FAMSIZE, method = "nearest", distance = temp$propensity, data = temp)
# Step 5: Extract matched data
matched_data <- match.data(psm)
# Step 6: Fit the DiD model on matched data
# Group: Treated or Control
# Post1986: Post-treatment indicator
# Interaction term: group * Post1986
did_model <- lm(LIT ~ group * Post1986, data = matched_data, weights = weights)
summary(did_model)
这是DiD的输出(系数表示groupControl,由于某种原因我不明白,就是缺少了处理过的):
所有单位的权重均为 1;因此,最终的 DiD 模型没有给出期望的输出。 0 和 1 值也出现在最终数据集中,匹配数据。我对我的方法可能有什么问题感到困惑。如果有人能指出错误,那将非常有帮助。
此外,我还想制作倾向得分匹配前后的核密度图,如下所示:
对此的任何帮助也将不胜感激。我知道我的问题很长,但我完全被困住了。谢谢!
假设
Under14
与AGE
相关,这是因为AGE
完美地预测了group
。当您有完美的预测时,您的倾向得分将为 0 或 1。您可能已经看到,如果您在按照 MatchIt
小插图中的说明进行匹配之前检查了倾向得分模型并平衡了协变量和倾向得分。您在执行此分析时跳过了结论有效所需的许多步骤。在验证匹配成功之前,您不应估计效果。
在这种情况下,您需要确定
AGE
作为需要调整的混杂因素是否有意义。如果我对group
的完美预测是错误的,那么你需要弄清楚为什么你对group
有完美的预测。关键协变量可能存在根本性的不平衡,无法使用匹配进行调整;你需要决定如何解决这个问题。
另一个问题是,看起来您正在使用整个数据集进行匹配,而您应该仅匹配接受治疗之前的数据集(即仅匹配前期)。通常,您可以通过在前期进行匹配,然后将面板数据合并到匹配的数据集中,以便仅保留面板中的匹配单位来实现此目的。
不过,我建议您使用专门为您的场景设计的方法和包,而不是执行所有这些操作,例如
did
包。它使用更复杂的方法来调整协变量,但不需要您执行多个步骤,每个步骤都可能容易出错。