如何为单列生成唯一行名以解决R语言plm回归重复行名报错
报错核心原因
你修改原数据行名的操作无法解决问题,pdata.frame报错的核心是你指定的两个索引列NAME和DATE存在重复的组合值,plm要求面板数据的每一条观测对应唯一的个体+时间配对,该校验逻辑和原data.frame的行名无关。
另外你给出的示例数据本身存在笔误:
NAME列定义时缺少逗号:c("A", "G", "N", "L",'L' "L")应为c("A", "G", "N", "L","L", "L")- 各列长度不一致:DATE、NAME、LCR列是6个元素,MWFR和reg列是8个元素,真实数据的核心问题仍为
NAME+DATE组合重复。
解决步骤
方案1:直接去重(适用于重复观测为冗余数据的场景)
保留每个NAME+DATE组合的第一条观测即可:
# 方法1:dplyr实现 library(dplyr) data_clean <- data %>% distinct(NAME, DATE, .keep_all = TRUE) # 方法2:基础R实现 data_clean <- data[!duplicated(data[,c("NAME", "DATE")]), ]
方案2:聚合重复观测(适用于重复观测为有效数据的场景)
如果重复的观测需要纳入统计,先按NAME+DATE分组聚合后再做回归,常见聚合方式包括求均值、求和、取中位数等,以下是按均值聚合的示例:
library(dplyr) data_clean <- data %>% group_by(NAME, DATE) %>% summarise( # 可根据业务需求调整为sum/median等聚合函数 LCR = mean(LCR, na.rm = TRUE), MWFR = mean(MWFR, na.rm = TRUE), reg = mean(reg, na.rm = TRUE), .groups = "drop" )
运行回归
处理完数据后再运行面板回归即可,另外你的回归公式写法可以简化:MWFR*reg会自动生成主效应和交互项,无需重复声明:
library(plm) pdata <- pdata.frame(data_clean, index = c("NAME", "DATE")) regmodelfix <- plm(LCR ~ MWFR*reg, model ='within', data=pdata, effect = 'twoways')
内容的提问来源于stack exchange,提问作者Marzieh Karimi
相关产品推荐
相关产品推荐

