使用 R 进行数据插补

Data imputation using R

我需要对类似于以下玩具数据集的数据集进行多重插补。

x1=rbinom(20,1,0.5)
x2=rnorm(20,100,2)
x2=x2/max(x2)
x3=rbinom(20,3,0.4)
x4=rnorm(20,0,0.5)

data=data.frame(x1,x2,x3,x4)
data[1,2]=NA
data[10,2]=NA
data[15,2]=NA
data[2,1]=NA
data[12,1]=NA
data[12,3]=NA
data[19,3]=NA
data[20,3]=NA

> data
   x1        x2 x3           x4
1   0        NA  2  0.103982689
2  NA 0.9599301  1 -0.153152527
3   1 0.9563003  0 -0.783492651
4   0 0.9974261  1  0.325931603
5   1 0.9515747  3 -0.769568378
6   1 0.9431853  0  0.336488307
7   0 0.9637072  1  0.383011575
8   0 0.9937089  0 -0.575941420
9   1 0.9357041  3 -0.648096345
10  0        NA  3  0.213382349
11  0 0.9454354  1  0.111094020
12 NA 0.9330617 NA -0.256448985

其中x1是二进制变量,x2是0到1之间的变量,x3是序数级变量。我使用 Amelia 包中的 amelia 函数进行了插补。但似乎估算值不在所需范围内。

require(Amelia)

imp=amelia(data,m=2)
imp1=imp$imputations[[1]]
imp2=imp$imputations[[2]]

例如,我得到的 x1 和 x2 的值大于 1。此外,x1 和 x3 的值不保留数据的分类性质。

是否可以使用R对涉及分类变量(包括二进制和有序变量)和一定范围内的连续变量的数据集进行插补?

Amelia 程序包以一位著名的失踪人员的名字命名,可将值归因于缺失数据。 mice 包“使用链式方程进行多重插补”,也可以将值插补到缺失数据,并且可以处理分类数据。首先,我们需要创建一些可重现的数据以使用 dput(data) 共享。我将值四舍五入以使其更紧凑:

data <- structure(list(x1 = structure(c(2L, NA, 1L, 2L, 2L, 2L, 2L, 1L, 
1L, 1L, 1L, NA, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L), .Label = c("0", 
"1"), class = "factor"), x2 = c(NA, 0.962, 0.951, 0.964, 0.968, 
0.948, 0.96, 0.944, 1, NA, 0.956, 0.944, 0.975, 0.965, NA, 0.928, 
0.975, 0.948, 0.968, 0.958), x3 = structure(c(2L, 2L, 3L, 3L, 
1L, 2L, 2L, 1L, 1L, 1L, 3L, NA, 2L, 1L, 2L, 3L, 3L, 2L, NA, NA
), .Label = c("0", "1", "2"), class = "factor"), x4 = c(0.433, 
0.29, -0.01, -0.092, -0.29, 0.2, 0.284, 0.206, 0.132, -0.024, 
-0.188, 0.57, 0.092, -0.624, 0.241, -0.262, -0.621, -0.888, 0.346, 
-0.043)), row.names = c(NA, -20L), class = "data.frame")

str(data)
# 'data.frame': 20 obs. of  4 variables:
#  $ x1: Factor w/ 2 levels "0","1": 2 NA 1 2 2 2 2 1 1 1 ...
#  $ x2: num  NA 0.962 0.951 0.964 0.968 0.948 0.96 0.944 1 NA ...
#  $ x3: Factor w/ 3 levels "0","1","2": 2 2 3 3 1 2 2 1 1 1 ...
#  $ x4: num  0.433 0.29 -0.01 -0.092 -0.29 0.2 0.284 0.206 0.132 -0.024 ...

可以看到第一个和第三个变量是factors/categorical.

data.imp <- mice(data)

列表 data.imp 包含生成 5 组数据的信息,其中缺失值已估算。获得第一套:

data.imp1 <- complete(data.imp, 1)
str(data.imp1)
# 'data.frame': 20 obs. of  4 variables:
#  $ x1: Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 1 1 1 ...
#  $ x2: num  0.965 0.962 0.951 0.964 0.968 0.948 0.96 0.944 1 0.962 ...
#  $ x3: Factor w/ 3 levels "0","1","2": 2 2 3 3 1 2 2 1 1 1 ...
#  $ x4: num  0.433 0.29 -0.01 -0.092 -0.29 0.2 0.284 0.206 0.132 -0.024 ...

请注意,第一个和第三个变量仍然是因子。