面板数据集双重差分(Diff in Diff)R实现:独立性假设与处理疑问
面板数据DID回归的GLM设置问题
1. 你的代码是否默认假设观测独立?
是的,glm()属于普通广义线性模型框架,默认所有观测值相互独立,它不会自动识别面板数据中同一个体/群组内重复观测的相关性。直接运行这段代码会导致标准误计算偏误,因为忽略了面板数据的聚类结构。
2. 如何让R识别面板数据?
核心有两种思路:修正标准误以适配聚类结构,或者使用专门的面板模型工具。具体实现如下:
方法一:保留GLM模型,计算聚类稳健标准误
用sandwich和lmtest包,针对面板的聚类单元(比如你的stateicp或个体ID)计算稳健标准误,修正原模型的统计推断:
# 安装并加载依赖包 install.packages(c("sandwich", "lmtest")) library(sandwich) library(lmtest) # 拟合原GLM模型(注意不要用df$变量名的写法,直接用变量名即可) fit3 <- glm(empstat ~ factor(year) + factor(stateicp) + migrant_category + treated*post + treated*migrant_category + post*migrant_category + treated*post*migrant_category + race + educ + age + marst, data = df, weights = perwt, family = 'gaussian') # 计算聚类到stateicp的稳健标准误(如果是个体面板,替换成你的个体ID变量) coeftest(fit3, vcov = vcovCL, cluster = ~stateicp)
方法二:使用专门的面板模型包(更推荐)
用fixest包(适配DID与固定效应,高效简洁)
fixest支持直接加入双向固定效应,且默认支持聚类标准误,是当前DID分析的常用工具:
install.packages("fixest") library(fixest) # 拟合双向固定效应+三重交互项的DID模型,聚类到stateicp fit3_fe <- feols(empstat ~ treated*post*migrant_category + race + educ + age + marst | year + stateicp, data = df, weights = perwt, vcov = ~stateicp) # 查看结果 summary(fit3_fe)
这里| year + stateicp等价于你原代码中的factor(year)和factor(stateicp),但写法更简洁,且模型拟合效率更高。
用lme4包(混合效应模型,适合随机效应场景)
如果你的面板是个体追踪数据,可以拟合包含个体随机效应的模型:
install.packages("lme4") library(lme4) # 假设你有个体ID变量为id,加入个体随机效应(1|id) fit3_lme <- lmer(empstat ~ factor(year) + migrant_category + treated*post + treated*migrant_category + post*migrant_category + treated*post*migrant_category + race + educ + age + marst + (1|id), data = df, weights = perwt) # 查看结果 summary(fit3_lme)
注意:如果是短面板(时间维度T小,个体/群组维度N大),优先选择fixest的双向固定效应+聚类标准误方案,这是DID分析的标准做法;长面板可考虑混合效应模型。
内容的提问来源于stack exchange,提问作者Min Nguyen
相关产品推荐
相关产品推荐

