添加变量后R中polr模型VIF报'下标越界'错误的解决方法
polr有序logit模型VIF计算报"subscript out of bounds"的解决办法
错误原因
这个报错本质是模型存在完全多重共线性:你的模型里同时放入了连续变量(age、income)和对应的分组虚拟变量(比如age20_29等年龄组、lowincome等收入组),或者某类虚拟变量包含了所有类别(比如收入组的lowincome+avgincome+highincome覆盖所有样本,触发虚拟变量陷阱)。这种情况下模型的设计矩阵是奇异的,vif()在计算时无法处理奇异矩阵的逆运算,就会抛出下标越界的错误。
具体解决步骤
1. 二选一:连续变量OR分组虚拟变量
你不能同时把连续变量和它的分组虚拟变量都放进模型,比如:
- 要么保留
age(用连续年龄的线性效应),删掉所有ageXX_XX虚拟变量 - 要么保留
age20_29等分组虚拟变量,删掉age连续变量 - 收入变量同理:选
income连续变量,或者选分组虚拟变量(二者只能留一个)
2. 虚拟变量组必须留基准类别
对于分类变量生成的虚拟变量,不能把所有类别都纳入模型,必须去掉一个作为基准组:
- 比如教育组的
noeducation+loweducation+higheducation,要删掉其中一个(比如删noeducation,以无教育为基准组) - 收入组如果三个类别全覆盖,也要删掉一个基准类别
修正后的模型代码示例
假设你想保留分组效应,修正后的代码如下:
myorderedmodel = polr(factor(lifesatisfied, ordered = TRUE) ~ maritalstatus + gender + age20_29 + age30_39 + age40_49 + age50_59 + avgincome + highincome + loweducation + higheducation + health + child + religion + workless + workmuch, data = mydata, method = "logistic", Hess = TRUE)
这里做了这些调整:
- 删除了连续变量
age和income - 教育组删掉了
noeducation(以无教育为基准) - 收入组删掉了
lowincome(以低收入为基准)
验证共线性(可选)
修正后可以先检查设计矩阵的秩,确认没有完全共线性:
X <- model.matrix(myorderedmodel) rankMatrix(X)
如果返回的秩等于模型自变量的个数(不含有序logit的阈值参数),说明没问题,此时再运行vif(myorderedmodel)就能正常输出结果。
内容的提问来源于stack exchange,提问作者rr19
相关产品推荐
相关产品推荐

