R的plm包pgmm函数运行系统GMM时出现system is exactly singular错误求助
报错核心原因
你遇到的矩阵奇异报错本质是短面板(T=5)下模型滞后阶数设置不合理、工具变量设定不符合数据维度、缺失值导致样本/工具变量矩阵共线三个问题共同导致的,和变量本身相关性无关,解决方案如下:
具体修复步骤
第一步:简化模型滞后阶数
T=5的短面板最多支持被解释变量1阶滞后,你当前设置的lag(log(GDP), 1:2)会直接损失2期初始观测,每个个体仅剩3期有效观测,自由度严重不足;同时控制变量Humancapital的0-2阶滞后也会进一步压缩有效样本,建议仅保留被解释变量1阶滞后,控制变量最多用到1阶滞后。第二步:修正工具变量设定
你当前只指定了log(GDP)的滞后作为工具变量,未纳入Stations、Humancapital的工具变量;同时lag(log(GDP), 2:5)的设置完全不符合你的数据维度:T=5的情况下最多存在3阶滞后,4、5阶滞后会生成全空的工具列,直接导致矩阵奇异。建议工具变量滞后阶数最高设置到3阶,同时补充所有内生/前定变量的工具,额外添加collapse = TRUE参数压缩工具数量,避免工具过多导致的共线问题。第三步:处理缺失值
你的样本中1870年的Humancapital全为缺失值,做滞后转换时会进一步损失大量有效样本,建议先按个体对人力资本做线性插值补全缺失值,或直接剔除观测不足4期的个体。第四步:调整估计参数
短面板下两步GMM估计对样本要求更高,建议先使用model = "onestep"跑通基础模型,再逐步尝试两步估计和双向固定效应;初始测试阶段先使用effect = "individual",避免时间效应占用过多自由度。
修复后参考代码
# 加载缺失值处理包,按个体补全人力资本缺失值 library(dplyr) library(zoo) Bachelor_DF <- Bachelor_DF %>% group_by(id) %>% mutate(Humancapital = na.approx(Humancapital, na.rm = FALSE)) %>% ungroup() # 简化后的GMM估计代码 gmm_estimator <- pgmm(log(GDP) ~ lag(log(GDP), 1) + lag(Stations, 0:1) + lag(Humancapital, 0:1) | lag(log(GDP), 2:3) + lag(Stations, 2:3) + lag(Humancapital, 2:3), data = Bachelor_DF, effect = "individual", model = "onestep", collapse = TRUE)
模型跑通后可再逐步调整滞后阶数、换成两步估计、添加双向效应验证稳健性。
内容的提问来源于stack exchange,提问作者DLTS

