使用 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 ...
请注意,第一个和第三个变量仍然是因子。
我需要对类似于以下玩具数据集的数据集进行多重插补。
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 ...
请注意,第一个和第三个变量仍然是因子。