You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面板数据集双重差分(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:55:12