R高维数据模拟缺失数据集生成及ampute函数报错问题咨询
R高维数据缺失模拟ampute报错修复方案
报错核心原因
你触发的错误是ampute默认配置和高维场景不匹配导致的:默认缺失模式为每个模式仅缺失1个变量,同时你设置了bycases=FALSE按单元格计算缺失率,100样本、120维变量的前提下,40%的单元格缺失率在默认模式下无法实现,因此触发报错。
可行的参数调整方案
通过自定义缺失模式矩阵和权重矩阵即可适配三种缺失机制的需求,参考代码如下:
library(mice) # 构造自定义缺失模式矩阵:1表示变量不缺失,0表示变量缺失 # 示例设置10种随机缺失模式,每种模式缺失30%的变量,可按需调整 n_pattern <- 10 p <- ncol(X) patterns <- matrix(1, nrow = n_pattern, ncol = p) for (i in 1:n_pattern) { miss_cols <- sample(1:p, size = round(0.3*p)) patterns[i, miss_cols] <- 0 } # -------------------------- # 1. MCAR缺失机制生成代码 # -------------------------- # MCAR权重规则:所有变量权重一致,缺失概率和任何变量无关 weights_mcar <- matrix(1, nrow = n_pattern, ncol = p) result_mcar_5p <- ampute(X, prop = 0.05, mech = "MCAR", patterns = patterns, weights = weights_mcar, bycases = TRUE) result_mcar_25p <- ampute(X, prop = 0.25, mech = "MCAR", patterns = patterns, weights = weights_mcar, bycases = TRUE) result_mcar_40p <- ampute(X, prop = 0.4, mech = "MCAR", patterns = patterns, weights = weights_mcar, bycases = TRUE) # -------------------------- # 2. MAR缺失机制生成代码 # -------------------------- # MAR权重规则:仅非缺失变量有权重,缺失概率和观测到的变量值相关 weights_mar <- matrix(0, nrow = n_pattern, ncol = p) for (i in 1:n_pattern) { obs_cols <- which(patterns[i,] == 1) weights_mar[i, obs_cols] <- runif(length(obs_cols), 0.5, 2) } result_mar_5p <- ampute(X, prop = 0.05, mech = "MAR", patterns = patterns, weights = weights_mar, bycases = TRUE) result_mar_25p <- ampute(X, prop = 0.25, mech = "MAR", patterns = patterns, weights = weights_mar, bycases = TRUE) result_mar_40p <- ampute(X, prop = 0.4, mech = "MAR", patterns = patterns, weights = weights_mar, bycases = TRUE) # -------------------------- # 3. MNAR缺失机制生成代码 # -------------------------- # MNAR权重规则:仅待缺失变量有权重,缺失概率和变量自身未观测到的值相关 weights_mnar <- matrix(0, nrow = n_pattern, ncol = p) for (i in 1:n_pattern) { miss_cols <- which(patterns[i,] == 0) weights_mnar[i, miss_cols] <- runif(length(miss_cols), 0.5, 2) } result_mnar_5p <- ampute(X, prop = 0.05, mech = "MNAR", patterns = patterns, weights = weights_mnar, bycases = TRUE) result_mnar_25p <- ampute(X, prop = 0.25, mech = "MNAR", patterns = patterns, weights = weights_mnar, bycases = TRUE) result_mnar_40p <- ampute(X, prop = 0.4, mech = "MNAR", patterns = patterns, weights = weights_mnar, bycases = TRUE)
注:如果需要按单元格计算缺失率,将bycases改为FALSE,同时适当调低prop的数值即可。
变量选择建议
做插补方法对比的场景下,推荐使用全部120个变量生成缺失,更贴合高维数据的测试场景,能更准确验证不同插补方法在p>n场景下的性能。如果担心计算量过大,也可以仅在前50个变量中生成缺失,剩余变量作为辅助变量参与插补过程。
是否需要更换其他函数
不需要更换其他函数,ampute是R生态中专门为缺失机制模拟设计的标准化工具,上述参数调整方案完全可以满足你三种缺失机制、多梯度缺失率的模拟需求。如果有非常个性化的缺失规则需求,也可以自行编写逻辑生成缺失,但标准化程度和可复现性不如ampute。
内容的提问来源于stack exchange,提问作者Bugra Varol
相关产品推荐
相关产品推荐

