R运行mlogit模型报Lapack routine dgesv系统完全奇异错误
错误产生原因
你遇到的Error in solve.default(H, g[!fixed]): Lapack routine dgesv: system is exactly singular: U[57,57] = 0是mlogit包估计多项Logit模型时的典型数值计算错误,本质是求解系数过程中需要对海森矩阵求逆,但输入的自变量矩阵存在完全共线性,生成的奇异矩阵(行列式为0)无法完成逆运算。
结合你移除所有Q23*开头字段后代码可正常运行的测试结果,问题完全出在这组Q23字段上,常见触发场景如下:
- Q23字段中存在取值无变异的常数列:比如某列所有观测值完全相同(全为0、全为某固定选项值),这类变量会和模型自带的截距项完全共线
- Q23字段组存在完全线性依赖:最常见的是同多选题生成的一组哑变量全部放入模型、未设置参照组,导致同组哑变量求和对所有样本都等于固定值;也可能出现两个字段取值完全一致、一个字段是另一个字段的固定倍数的情况
- Q23字段在选择肢维度无变异:如果将Q23设为随选择肢变动的变量,只要某字段在任意一个选择肢的所有观测中取值完全一致,就会触发局部共线性
- 长宽表转换过程中Q23字段处理错误:比如长表转换时个体层面的Q23字段被错误填充为同值,和其他变量生成完全线性关系
可行解决方法
按排查成本从低到高依次操作即可:
- 第一步做基础共线性排查
提取所有将进入模型的自变量(含全部Q23*字段),运行cor(your_model_data, use = "complete.obs")查找相关系数绝对值为1的变量对;同时计算每个字段的方差,方差为0的字段直接删除,无任何解释价值。如果Q23是多选题生成的哑变量组,必须保留一个选项作为参照组,不能将同题所有哑变量同时放入模型。 - 第二步检查选择肢维度的变量变异
对构建好的dfidx对象,按选择肢分组计算每个Q23字段的方差,若某字段在任意选择肢分组下方差为0,要么将其调整为不随选择肢变动的个体层面变量,要么直接移除。 - 第三步逐步回归定位问题字段
不要一次性将所有Q23字段放入模型,从单个Q23字段开始逐个加入模型运行,当加入某字段触发报错时,即可定位到具体问题字段/字段组,针对性做删除、合并类别、设置参照组的处理。 - 第四步规避数值计算问题
若排查后未发现完全共线性,检查Q23字段的量纲差异:如果不同字段取值范围差超过100倍,先做标准化处理再入模;如果Q23是类别变量,合并样本量过少的稀有水平(某水平观测数少于总样本的1%),避免因稀疏值触发矩阵奇异。
内容的提问来源于stack exchange,提问作者Wahab Aftab
相关产品推荐
相关产品推荐

