使用R语言plspm包遇solve中奇异矩阵'a'错误求助
分析plspm包中奇异矩阵错误的可能原因及解决办法
我来帮你拆解这个问题~ 你遇到的solve.qr(qr(X[, blockinds == j]), Z[, j]) : singular matrix 'a' in 'solve'错误,除了全0列之外,还有几个更隐蔽的原因,结合你的情况来看,大概率是以下情况:
最可能的原因:同block内变量存在完全线性依赖
虽然Q2D列本身同时有0和100,但当它和同block的第6、7列放在一起时,三者之间可能存在完全线性相关的关系。比如:
- Q2D的值刚好是100减去Q6的值(或者其他固定线性组合)
- Q2D和Q6/Q7完全互补(比如Q6为100时Q2D必为0,Q6为0时Q2D必为100)
这种线性依赖会导致plspm计算时生成的矩阵不可逆,触发奇异矩阵错误。
排查与解决步骤
1. 检查变量间的相关性
先计算第6-8列的相关矩阵,看看有没有绝对值为1的相关系数:
cor(df[, 6:8])
如果某两个变量的相关系数是±1,那就说明它们完全线性相关,这就是问题根源。
2. 验证线性组合关系
用线性回归来检验Q2D是否能被Q6和Q7完全拟合:
fit <- lm(Q2D ~ Q6 + Q7, data = df) summary(fit)
如果回归的R²等于1,且残差全为0,说明三者存在完美的线性关系,必须调整变量组合。
3. 调整二元变量编码
plspm对二元变量的默认处理更适配0/1编码,你可以把Q2D的100改成1试试:
df$Q2D <- ifelse(df$Q2D == 100, 1, 0) # 重新运行plspm代码 t_pls <- plspm(df, t_path, t_blocks, modes = t_modes)
缩放后的编码可能会消除和其他变量的线性依赖问题。
4. 检查block的变量与样本量比例
虽然你的样本量看起来足够(至少75条),但如果某个block的变量数大于样本量,也可能触发奇异矩阵错误。可以确认下:
nrow(df) # 样本量 length(t_blocks[[2]]) # 第二个block的变量数
如果变量数≥样本量,需要减少block内的变量。
总结
结合你去掉第8列就正常运行的情况,90%以上是第8列和同block的6、7列存在完全线性依赖。按照上面的步骤排查,应该能快速定位并解决问题~
内容的提问来源于stack exchange,提问作者AToe
相关产品推荐
相关产品推荐

