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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:03