如何仅插补时间序列数据中的间断缺失值(intermittent missing),保留单调缺失值?
问题描述
我有一个时间有序的数据集,缺失值分为两类:
- 单调缺失值(monotone missing):连续缺失序列且包含最终值
- 间断缺失值(intermittent missing):与最终值之间至少有一个非缺失值隔开的缺失值
我需要通过多重插补生成多个数据集版本,仅对间断缺失值进行插补,单调缺失值保持缺失状态,后续再用其他策略处理。但使用mice包运行代码后,只有第二行的间断缺失被插补,第一、三行标记的间断缺失未被处理。
复现代码
library(dplyr) library(mice) set.seed(2024) df <- tribble( ~v1, ~v2, ~v3, ~v4, ~v5, 5, NA, 3, 9, NA, 6, 6, NA, 1, 1, 2, NA, 2, NA, NA, 4, 8, 7, NA, NA, 7, 4, 2, 5, 4 ) mask <- tribble( ~v1, ~v2, ~v3, ~v4, ~v5, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) mi <- mice(data = df, where = mask) complete(mi, action = "long")
当前输出
.imp .id v1 v2 v3 v4 v5 1 1 1 5 NA 3 9 NA 2 1 2 6 6 3 1 1 3 1 3 2 NA 2 NA NA 4 1 4 4 8 7 NA NA 5 1 5 7 4 2 5 4 6 2 1 5 NA 3 9 NA 7 2 2 6 6 3 1 1 8 2 3 2 NA 2 NA NA 9 2 4 4 8 7 NA NA 10 2 5 7 4 2 5 4
预期输出
.imp .id v1 v2 v3 v4 v5 1 1 1 5 2 3 9 NA 2 1 2 6 6 3 1 1 3 1 3 2 4 2 NA NA 4 1 4 4 8 7 NA NA 5 1 5 7 4 2 5 4 6 2 1 5 5 3 9 NA 7 2 2 6 6 3 1 1 8 2 3 2 7 2 NA NA 9 2 4 4 8 7 NA NA 10 2 5 7 4 2 5 4
解决方案
问题根源是mice默认的自动插补逻辑会跳过存在其他缺失值的行中目标位置的插补。需要明确指定插补方法,确保标记的间断缺失值被处理:
library(dplyr) library(mice) set.seed(2024) df <- tribble( ~v1, ~v2, ~v3, ~v4, ~v5, 5, NA, 3, 9, NA, 6, 6, NA, 1, 1, 2, NA, 2, NA, NA, 4, 8, 7, NA, NA, 7, 4, 2, 5, 4 ) mask <- tribble( ~v1, ~v2, ~v3, ~v4, ~v5, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ) # 仅对需要插补的v2、v3指定pmm插补方法,其余变量设为空字符串表示不插补 method <- c("", "pmm", "pmm", "", "") mi <- mice(data = df, where = mask, method = method, m = 2) # 指定生成2个插补数据集 complete(mi, action = "long")
关键调整说明
method参数:明确指定哪些变量需要插补,避免mice自动判断时跳过有其他缺失值的行where掩码:精准定位需要插补的单元格,确保仅处理标记的间断缺失值m参数:指定生成的插补数据集数量,这里设为2匹配预期输出
运行上述代码后,第一行v2、第三行v2的间断缺失值会被正常插补,而单调缺失值(如第一行v5、第三行v4/v5)保持缺失,符合预期需求。
内容的提问来源于stack exchange,提问作者Esben Mølgaard
相关产品推荐
相关产品推荐

