针对只是多行有缺失而不是整行缺失的情况,适合用回归而不是预测的方法去插补,毕竟同行内有值可供参考,能将插补的值限制在合理的范围内。而MI的方法是分别对不同的数据进行插补,效果上还会更好一些。
以下是一个例子:
# 加载必要的包
library(mice)
# 生成模拟数据(100行,3列:x1, x2, y)
set.seed(123) # 确保可重复性
n <- 100
x1 <- rnorm(n, mean = 5, sd = 1) # 连续变量
x2 <- rbinom(n, size = 1, prob = 0.5) # 二分类变量
y <- 2 * x1 + 3 * x2 + rnorm(n, sd = 1.5) # 因变量
# 组合成数据框
data <- data.frame(x1, x2, y)
# 人为制造缺失值(MCAR,随机缺失)
data_missing <- data
data_missing$x1[sample(1:n, 20)] <- NA # x1 缺失 20%
data_missing$x2[sample(1:n, 15)] <- NA # x2 缺失 15%
data_missing$y[sample(1:n, 10)] <- NA # y 缺失 10%
# 查看缺失情况
summary(data_missing)
# 进行多重插补(默认使用PMM,预测均值匹配)
imputed_data <- mice(data_missing, m = 5, method = "pmm", seed = 456)
# 查看插补结果(例如第一个插补数据集)
complete(imputed_data, 1) # 查看第1个插补数据集
# 对每个插补数据集拟合线性回归模型
model <- with(imputed_data, lm(y ~ x1 + x2))
# 合并所有模型的结果(Rubin's Rules)
pooled_results <- pool(model)
summary(pooled_results)
plot(imputed_data)
输出:
term estimate std.error statistic df p.value
1 (Intercept) 0.9845119 0.8903949 1.105703 53.024646 2.738470e-01
2 x1 1.8049757 0.1776012 10.163082 39.734901 1.304444e-12
3 x2 3.0808768 0.4275619 7.205686 9.609725 3.588320e-05
输出中x1和x2的p都小于0.001,说明结果具有显著性,而截距的p是0.27,说明不太需要关注截距,函数是过原点的线;而图像显示均值和std在插补的过程中波动较小,稳定在一个小的区间内,走势大致一致,说明插补的效果好。