如何用plm实现非面板索引变量的固定效应(替代fixest模型)
用plm复现fixest的多层级固定效应模型
我需要运行面板固定效应模型,面板索引为county-year层级,但要在更高的state层级设置固定效应。已经能用fixest轻松实现该模型,却不清楚如何用plm复现。
示例数据
df <- data.frame(year= rep(c(2000, 2001, 2003, 2000, 2002, 2004), each=10), county= rep(c("c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10"), times=6), state= rep(c("s1", "s2", "s3", "s4", "s5"), each=2, times=6), temperature= runif(60, min=40, max=80), trade= runif(60, min=10, max=20), policy.outcome= runif(60, min=0, max=100))
目标fixest模型
library(fixest) m1.fixest <- feols(policy.outcome ~ temperature + trade|state+year, panel.id= ~county+year, data=df) summary(m1.fixest)
plm复现方法
由于plm默认的面板结构是个体-时间,而我们需要控制更高层级的state固定效应,同时保留county-year的面板聚类标准误,可以按照以下步骤操作:
1. 加载plm包并处理数据
先构造county-year的聚类标识,再将数据转换为plm可识别的面板格式:
library(plm) # 构造county-year聚类变量 df$county_year <- interaction(df$county, df$year) # 转换为面板数据,以county_year为索引 pdata <- pdata.frame(df, index = "county_year")
2. 运行包含state和year固定效应的模型
在plm的pooling模型中加入state和year的虚拟变量,对应fixest中|state+year的固定效应逻辑:
# 运行模型,去掉截距(固定效应已包含截距信息) m1.plm <- plm(policy.outcome ~ 0 + temperature + trade + factor(state) + factor(year), data = pdata, model = "pooling")
3. 设置county-year层级的聚类标准误
使用vcovHC函数设置聚类标准误,匹配fixest中panel.id=~county+year的标准误计算方式:
# 生成聚类标准误 cluster_vcov <- vcovHC(m1.plm, cluster = "group") # 查看最终结果 summary(m1.plm, vcov = cluster_vcov)
结果验证
你可以对比summary(m1.fixest)和summary(m1.plm, vcov = cluster_vcov)的系数估计值与标准误,确认两者结果一致。
内容的提问来源于stack exchange,提问作者YouLocalRUser
相关产品推荐
相关产品推荐

