R语言plm包purtest非平衡面板IPS单位根检验报错求解
报错根因
该报错和非平衡面板属性、IPS检验逻辑无关,是purtest()函数入参格式不符合要求导致的。purtest不支持直接通过数据框$列名的方式传入待检验变量:这种写法传入的是无面板索引属性的原子向量,函数无法识别数据对应的个体维度、时间维度,在按SIC准则筛选最优滞后期做子集切片时,会生成无效的负下标,最终触发运算错误。
修复方法
按以下两步调整代码即可正常运行:
- 先将普通数据框转换为plm包可识别的面板结构,明确指定个体标识列、时间标识列(把代码里的
id、year替换为你自己数据中对应的列名):
library(plm) pD1 <- pdata.frame(D1, index = c("id", "year"))
- 改用公式格式传入待检验变量,不要使用
$取列的写法,重新调用检验函数:
ips_result <- purtest(~ int_rate, data = pD1, test = "ips", lags = "SIC", pmax = 2, exo = "trend")
排查补充
如果调整格式后仍报错,按以下优先级排查:
- 检查面板索引是否存在重复:同一个体+同一时间维度下存在多条重复观测会导致pdata.frame结构失效,可运行
any(table(index(pD1)) > 1)快速检测,结果为TRUE说明存在重复索引,先去重再做检验。 - 检查个体观测长度:如果存在个体的有效连续观测数小于你设置的
pmax=2,内部计算滞后项时也会出现下标错误,这类情况要么剔除观测时长过短的个体,要么根据最短序列长度适当调小pmax取值。 - IPS检验原生支持非平衡面板,不需要提前把数据裁剪为平衡面板,裁剪反而会损失有效样本信息。
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

