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
相关产品推荐
相关产品推荐

