使用R的mi包插补三级数据集:多级结构与边界设置问题
解决R语言
mi包三级数据缺失值插补的两类问题 一、修复multilevel_missing_data.frame创建失败的错误
报错Error in getClass(Class, where = topenv(parent.frame())): “NA” is not a defined class,核心原因是分组变量类型不对或变量声明不规范,按以下步骤处理:
- 先把三级(school)、二级(class)分组变量转成因子类型:
dat$school <- as.factor(dat$school) dat$class <- as.factor(dat$class) - 创建多级缺失数据框时,
subclass明确设为"multilevel",groups按层级从高到低传入分组变量名:
若仍报错,需检查数据中是否有未正确识别类型的变量,可先通过library(mi) # 先检查变量类型,确保分组变量是因子 str(dat) # 创建多级缺失数据对象 md <- missing_data.frame(dat, subclass = "multilevel", groups = c("school", "class"))missing_variable()逐个定义变量再整合。
二、给连续变量设边界并整合进缺失数据框
要实现x变量0-10的区间限制,同时保证聚类变量插补值统一,需逐个定义变量再合并:
- 定义带边界的
bounded-continuous变量:x_bounded <- missing_variable(dat$x, type = "bounded-continuous", lower = 0, upper = 10) - 定义聚类变量(指定对应分组,确保同一组插补值统一):
# 二级变量z:同一class内插补值一致 z_multilevel <- missing_variable(dat$z, type = "continuous", group = "class") # 三级变量w:同一school内插补值一致 w_multilevel <- missing_variable(dat$w, type = "continuous", group = "school") # 其他常规变量按实际类型定义 y_regular <- missing_variable(dat$y, type = "continuous") - 把所有变量整合到多级缺失数据框:
md <- missing_data.frame(x_bounded, z_multilevel, w_multilevel, y_regular, subclass = "multilevel", groups = c("school", "class"))
三、完整可运行示例(满足你的需求)
假设你的数据集dat包含所需变量,按以下代码执行即可实现目标:
library(mi) # 预处理分组变量为因子 dat$school <- as.factor(dat$school) dat$class <- as.factor(dat$class) # 逐个定义变量 x_var <- missing_variable(dat$x, type = "bounded-continuous", lower = 0, upper = 10) z_var <- missing_variable(dat$z, type = "continuous", group = "class") w_var <- missing_variable(dat$w, type = "continuous", group = "school") y_var <- missing_variable(dat$y, type = "continuous") # 其他变量示例 # 创建多级缺失数据框 md <- missing_data.frame(x_var, z_var, w_var, y_var, subclass = "multilevel", groups = c("school", "class")) # 执行插补(迭代次数和链数按需调整) imp <- mi(md, n.chains = 3, n.iter = 100) # 验证结果 imputed_dat <- complete(imp) # 检查同一class的z是否唯一 aggregate(z ~ class, data = imputed_dat, function(x) length(unique(x))) # 检查同一school的w是否唯一 aggregate(w ~ school, data = imputed_dat, function(x) length(unique(x))) # 检查x的范围是否在0-10之间 range(imputed_dat$x, na.rm = TRUE)
排查小技巧
- 若仍有类定义错误,确保所有变量都通过
missing_variable()声明类型,不要直接传入原始数据框中未处理的变量。 - 聚类变量的
group参数必须和groups里的分组变量名完全匹配,且分组变量必须是因子类型。
内容的提问来源于stack exchange,提问作者Pål Bjartan
相关产品推荐
相关产品推荐

