使用polr()做有序逻辑回归时遇svd(X)错误:数据含缺失/无穷值
解决polr()模型summary报错问题
第一步:修正变量名大小写错误
R语言对变量名大小写敏感,你的代码中先创建了dataW,但后续生成data_new时误用了Data_W,直接修正为一致变量名:
data_new <- dataW |> mutate(los = case_when( length_of_stay < 50 ~ "< 50", between(length_of_stay, 50, 100) ~ "50 - 100", length_of_stay > 100 ~ "> 100" )) |> mutate(los = factor(los, ordered = TRUE))
第二步:清理数据中的缺失/无限值
错误核心是数据存在缺失或无限值,执行以下检查和处理:
- 检查关键变量的缺失与无限值情况:
# 查看缺失值数量 colSums(is.na(data_new[, c("los", "total_payment_amount", "payer_grouping")])) # 检查是否存在无限值 sum(is.infinite(data_new$total_payment_amount))
- 过滤异常数据行:
data_clean <- data_new |> filter(!is.na(los), !is.na(total_payment_amount), !is.infinite(total_payment_amount))
第三步:检查分组合理性与样本量
- 确认
los分组无空组:
table(data_clean$los)
若某组样本量为0,调整case_when的分组逻辑(比如合并组或修正区间边界)。
- 检查
payer_grouping类别样本量,若某类别样本量极小(如少于5个),考虑合并同类别:
table(data_clean$payer_grouping)
第四步:重新拟合模型并生成摘要
用清理后的数据重新运行模型:
polr2 <- polr(los ~ total_payment_amount + payer_grouping, data = data_clean) summary(polr2)
可选优化:数值缩放
如果total_payment_amount取值范围极大,可能引发数值计算问题,可先标准化处理:
data_clean <- data_clean |> mutate(total_payment_scaled = scale(total_payment_amount)) polr2 <- polr(los ~ total_payment_scaled + payer_grouping, data = data_clean) summary(polr2)
内容的提问来源于stack exchange,提问作者John Mathews
相关产品推荐
相关产品推荐

