使用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
相关产品推荐
相关产品推荐

