具有有序分类的 R 插补

R Imputation with Ordered Categorical

DATA=data.frame(x1 = c(sample(c(letters[1:5], NA), 1000, r = T)),
                       x2 = runif(1000),
                       x3 = runif(1000),
                       x4 = sample(letters[20:23], 1000, r = T))

library(mice)
DATAIMPUTE <- complete(mice(DATA,m=5,maxit=50,meth='pmm',seed=500))

我有 'DATA' 并希望从 'x1' 中估算 NA 值,它是从 a、b、c、d、e 分类排序的。我希望使用 'x2' 和 'x4' 进行估算,但是您如何指定要使用哪些变量进行估算,在此之前,请参阅当我尝试创建 DATAIMPUTE 时,我在 x1 中仍然有 'NA' 值。 ..你能帮忙吗?

miceFastdata.table 的解决方案:

DATA=data.frame(x1 = c(sample(c(letters[1:5], NA), 1000, r = T)),
                x2 = runif(1000),
                x3 = runif(1000),
                x4 = sample(letters[20:23], 1000, r = T))

library(miceFast)
library(data.table)
setDT(DATA)

DATA[, x1_imp := fill_NA(x = .SD, model = "lda", 1, c(2,4))]
DATA
#>         x1        x2        x3 x4 x1_imp
#>    1:    c 0.5008937 0.5243911  v      c
#>    2:    e 0.5962688 0.0934651  w      e
#>    3:    d 0.7137371 0.8820708  u      d
#>    4:    b 0.6072431 0.5465608  v      b
#>    5:    c 0.6145810 0.5505094  v      c
#>   ---                                   
#>  996:    c 0.4813571 0.2091526  w      c
#>  997:    a 0.1862372 0.8401363  t      a
#>  998:    a 0.4391520 0.2364032  u      a
#>  999:    b 0.4673802 0.8268595  v      b
#> 1000: <NA> 0.1752227 0.9582994  t      d

reprex package (v0.3.0)

于 2021-02-04 创建

.SD 是整个 data.frame 的 data.table 快捷方式。 1 是 posix_y 参数(因变量)的索引值。考虑到我使用的是 lda 模型,而不是你想在小鼠中使用的 pmm。

您的“分类”变量似乎是字符格式。您可能希望在估算之前将它们强制转换为因子。否则 mice() 将忽略该变量。做:

DATA[sapply(DATA, is.character)] <- lapply(DATA[sapply(DATA, is.character)], as.factor)

str(DATA)
# 'data.frame': 1000 obs. of  4 variables:
#  $ x1: Factor w/ 5 levels "a","b","c","d",..: 2 2 NA NA 3 3 4 NA NA 4 ...
#  $ x2: num  0.932 0.87 0.886 0.925 0.984 ...
#  $ x3: num  0.292 0.734 0.764 0.943 0.806 ...
#  $ x4: Factor w/ 4 levels "t","u","v","w": 1 3 1 3 4 3 1 4 3 2 ... 
head(DATA)
#     x1        x2        x3 x4
# 1    b 0.9315629 0.2916144  t
# 2    b 0.8695138 0.7338165  v
# 3 <NA> 0.8863894 0.7642693  t
# 4 <NA> 0.9248280 0.9427943  v
# 5    c 0.9844646 0.8062173  w
# 6    c 0.6200558 0.7354498  v

此外,对有序分类数据使用比例优势模型 ("polr") 而不是部分均值匹配 ("pmm") 可能是更好的主意。

library(mice)
IMP <- mice(DATA, m=5, maxit=50, meth=c("polr", "", "", ""), seed=500)
DATAIMPUTE <- complete(IMP)
head(DATAIMPUTE)
#   x1        x2        x3 x4
# 1  b 0.9315629 0.2916144  t
# 2  b 0.8695138 0.7338165  v
# 3  a 0.8863894 0.7642693  t
# 4  a 0.9248280 0.9427943  v
# 5  c 0.9844646 0.8062173  w
# 6  c 0.6200558 0.7354498  v

重要说明: 如果您认为 complete() 函数为您提供了有效的估算数据集(它只是 action=1 作为默认值,那么您似乎误解了该方法returns 只是第一个完整的数据集——根本没有 多重 插补!)。您可能应该咨询统计学家并更彻底地阅读文档。周围有一个很好的 answer,它简要总结了最重要的一点。


数据:

set.seed(74)
DATA=data.frame(x1=c(sample(c(letters[1:5], NA), 1000, r=T)), 
                x2=runif(1000), 
                x3=runif(1000), 
                x4=sample(letters[20:23], 1000, r=T))