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

plm包pdata.frame报错:同一国家-年份对存在多观测值如何处理

针对多观测同国家-年份面板数据的plm使用解决方案

报错原因

你收到的重复配对警告是因为pdata.frame()默认要求个体-时间二合一索引唯一,你用国家作为个体维度、年份作为时间维度时,同一个国家同一年有多笔贷款,自然会出现重复配对,这是你的数据结构的正常特征,不是数据错误。

索引设置的核心逻辑

很多用户存在一个误解:pdata.frame()的索引维度等于回归时要控制的固定效应维度,这是完全错误的。索引的唯一作用是标识每个观测的定位,满足plm包的数据结构要求,不会干预你回归时指定的固定/随机效应维度。

适合你场景的两种解决方案

方案1:三维索引法(最贴合你的研究设计,推荐)

你希望个体维度为国家、时间维度为年份,只需要给同一个国家-年份下的多笔贷款生成一个组内唯一序号作为第三个索引即可,不会改变你对国家/年份效应的估计:

library(dplyr)
library(plm)

# 步骤1:生成同国家-年份下的观测唯一序号
df <- df %>%
  group_by(borrower_country, year) %>%
  mutate(obs_order = row_number()) %>%
  ungroup()

# 步骤2:构造三维索引的pdata.frame,依次为[个体维度(国家)、时间维度(年份)、组内观测序号]
df_p <- pdata.frame(df, index = c("borrower_country", "year", "obs_order"))

完成构造后你可以直接按需求运行模型:

  • 国家固定效应模型:plm(y ~ 自变量, data = df_p, model = "within")
  • 国家+年份双向固定效应模型:plm(y ~ 自变量, data = df_p, model = "within", effect = "twoways")
  • 国家层面随机效应模型:plm(y ~ 自变量, data = df_p, model = "random")

方案2:贷款ID作为个体索引

如果你不需要估计贷款层面的固定效应,这种方式也可以使用,不会破坏你要加的国家/年份固定效应,只需要注意不要默认启用贷款层面的个体固定效应即可:

# 构造二维索引,个体为贷款ID,时间为年份
df_p <- pdata.frame(df, index = c("loan_id", "year"))

# 手动指定控制国家+年份固定效应,用pooling模型结合因子控制即可
fe_model <- plm(y ~ 自变量 + factor(borrower_country) + factor(year),
                data = df_p, model = "pooling")

如果你需要控制贷款层面的固定效应,直接将上述代码的model参数改为"within",并添加effect = "twoways"即可同时控制贷款+年份双向固定效应。

关于你顾虑的说明

你担心用贷款ID作为索引会破坏年份固定效应,这个顾虑完全不需要有:年份固定效应的本质是对每一年生成一个虚拟变量纳入回归,和你用什么作为pdata.frame()的索引没有任何关系,只要你在回归中正确指定了控制项,效应就会正常生效。

内容的提问来源于stack exchange,提问作者Moz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:48:00