R中设置国家-行业-时间维度固定效应模型的面板数据问题
报错原因
plm包的pdata.frame函数要求索引参数仅传入两个维度:第一个为个体ID,第二个为时间维度。你传入了c("id","industry","year")三个参数时,函数会默认将第一个id(国家ID)识别为个体、第三个year识别为时间,同一个国家同一年存在多个行业的观测,自然会出现重复的个体-时间对,触发警告。
方案1:生成国家-行业联合个体ID
该方案和你Stata中的操作逻辑完全一致,你预想的ID重编码逻辑是可行的,示例代码如下:
library(dplyr) library(plm) # 生成国家+行业联合唯一ID,对应Stata的egen group操作 sampledata7_industry <- sampledata7_industry %>% mutate(country_industry = interaction(id, industry)) # 转换为面板数据,索引第一维是联合个体ID,第二维是年份 panel8 <- pdata.frame(sampledata7_industry, index = c("country_industry", "year"))
后续跑固定效应模型的示例代码:
# 个体+时间双向固定效应模型 fe_model <- plm(wage ~ gdp + import + export, data = panel8, model = "within", effect = "twoways")
方案2:直接处理多维固定效应(无需生成新ID)
你也可以选择fixest包实现相同的分析需求,不需要提前转换为pdata.frame格式,代码更简洁,大样本下运行效率也更高:
library(fixest) # 控制国家、行业、年份固定效应,标准误聚类到国家-行业层面 fe_model <- feols(wage ~ gdp + import + export | id + industry + year, data = sampledata7_industry, vcov = ~id + industry)
该方案输出的核心回归结果和方案1完全一致。
重复观测排查
如果调整后仍有报错,可运行以下代码检查原始数据是否存在同一国家、同一行业、同一年有多个观测的异常值:
library(dplyr) dup_check <- sampledata7_industry %>% count(id, industry, year) %>% filter(n > 1)
如果返回结果不为空,需要先清理重复的原始观测。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

