You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用polr模型预测时出现non-conformable arguments错误的求助

问题原因与解决方法

你遇到的 non-conformable arguments 错误主要来自两个核心原因:一是完全分离(complete separation)导致模型系数出现无穷值,二是新数据中因子水平与原模型不匹配。以下是具体的解决步骤:

1. 解决完全分离问题

当某些 grupo 和 respuesta 的组合没有数据(计数为0)时,polr 会生成无穷大的系数,导致预测时矩阵乘法维度不兼容。解决方法是给所有缺失的组合添加极小的伪计数(pseudo-counts),避免模型出现极端系数:

# 生成所有grupo和respuesta的组合,添加极小计数
all_combinations <- expand.grid(
  grupo = levels(var_tab$grupo),
  respuesta = levels(var_tab$respuesta),
  count = 0.001  # 极小值,不会影响模型结果
)
# 合并原数据和伪计数数据,填补缺失组合
var_tab_adj <- merge(var_tab, all_combinations, 
                     by = c("grupo", "respuesta"), 
                     all = TRUE)
var_tab_adj$count <- ifelse(is.na(var_tab_adj$count.x), 
                            var_tab_adj$count.y, 
                            var_tab_adj$count.x)
var_tab_adj <- var_tab_adj[, c("grupo", "respuesta", "count")]

# 重新拟合模型
polr_both <- MASS::polr(respuesta ~ grupo, data = var_tab_adj, weight = count)

2. 确保新数据的因子水平与原模型一致

原模型的 grupo 因子包含 pos、neg、neutral 三个水平,即使 pos 在训练数据中没有出现,它仍是模型的参考水平。创建新数据时,必须保证 grupo 因子保留所有原水平:

n_opcs <- 4
# 使用原数据的所有grupo水平,而非仅出现过的水平
target_groups <- levels(var_tab$grupo)[1:2]  # 选择pos和neg作为预测目标

# 创建新数据并设置正确的因子水平
df_both <- data.frame(
  grupo = rep(target_groups, each = n_opcs),
  var = rep(1:n_opcs, length(target_groups))
)
df_both$grupo <- factor(df_both$grupo, levels = levels(var_tab$grupo))

# 现在预测可以正常运行
both_probs <- cbind(df_both, predict(polr_both, newdata = df_both, 
                                     type = "probs", se = TRUE))

3. 调整循环处理代码

在循环处理多个量表条目时,不要仅提取出现过的因子水平,而是保留所有预设水平(pos、neg、neutral):

# 替换原循环中获取grupos的代码
grupos <- lapply(it_cols, function(i) levels(df[[i]]))  # 获取所有预设水平

# 如果需要重新排序水平(确保pos为参考)
grupos <- lapply(grupos, fct_relevel, c("pos", "neg"))

这样处理后,每个条目对应的模型和新数据都会保持一致的因子水平,彻底避免预测时的维度错误。


内容的提问来源于stack exchange,提问作者dsaizt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:47:03