You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用mice包插补缺失值时遇mice.impute.polyreg维度不匹配错误

解决mice包中mice.impute.polyreg的维度不匹配错误

你碰到的这个dims do not match the length of the object错误,几乎肯定和有序因子的处理逻辑以及预测矩阵的设置脱不了干系——毕竟polyreg是mice里专门用来插补有序因变量的方法,对输入的维度和变量类型要求很严格。下面给你几个一步步排查和解决的思路:

  • 先排查最容易犯的笔误
    看你代码里初始化了pred<-init$predictorMatrix,但调用mice的时候用的是predictorMatrix = predmat,这明显是变量名写错了!把predmat改成pred先试试,这种低级错误经常会引发莫名其妙的维度报错。

  • 检查有序因子的水平是否有效
    polyreg需要有序因子有至少2个有观测值的水平,如果某列有序因子只有1个水平,或者某个水平全是缺失值,就会触发维度不匹配。你可以用这段代码快速查看所有有序因子的分布:

    lapply(mydata, function(x) {
      if (is.ordered(x)) table(x, useNA = "always")
    })
    

    如果发现有无效水平,用droplevels()清理,比如mydata$your_ordered_col <- droplevels(mydata$your_ordered_col)

  • 手动指定插补方法,避免自动分配的bug
    有时候init$method自动给变量分配的方法会出错,比如把普通因子当成了有序因子,或者反过来。你可以手动给不同类型的变量指定对应方法:

    # 给有序因子指定polyreg
    methods[sapply(mydata, is.ordered)] <- "polyreg"
    # 数值型变量用pmm(预测均值匹配,适合多数场景)
    methods[sapply(mydata, is.numeric)] <- "pmm"
    # 普通因子用logreg
    methods[sapply(mydata, is.factor) & !sapply(mydata, is.ordered)] <- "logreg"
    
  • 排查极端缺失模式
    如果某列的缺失比例极高(比如超过90%),或者某一行几乎全是缺失,也会让polyreg拟合时出现维度问题。用md.pattern(mydata)可以直观看到缺失分布,对于极端缺失的列,要么删除,要么在预测矩阵里把它从预测变量里去掉(把对应位置设为0)。

  • 先简化模型做测试
    先拿一小部分数据(比如前100行),或者减少插补链数(m=2)来运行,看是否还会报错。如果小数据集能正常运行,说明是全量数据里存在某个特殊的变量水平或者缺失情况,再针对性排查。

最后给你一个修正后的代码示例:

# 初始化获取默认设置
init <- mice(mydata, max=0, print=FALSE)
pred <- init$predictorMatrix
methods <- init$method

# 手动修正各变量的插补方法
methods[sapply(mydata, is.ordered)] <- "polyreg"
methods[sapply(mydata, is.numeric)] <- "pmm"
methods[sapply(mydata, is.factor) & !sapply(mydata, is.ordered)] <- "logreg"

# 先小批量测试,没问题再调回m=10
imp_data <- mice(mydata, predictorMatrix = pred, meth=methods, m=2, diagnostics=TRUE, print=TRUE)

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

火山引擎 最新活动