MCAR缺失机制
MCAR missingness mechanism
我想在 R 中从现有的完整数据库创建一个 MCAR 数据库。
我只想使用一些具有 NA 观测值的变量,这是我使用的代码:
data <-master
set.seed(685)
prop.m = .15
mcar = runif(length(data[,1]), min=0, max=1)
diabetes.mcar = ifelse(mcar<prop.m, NA, data$diabetes)
hypertension.mcar = ifelse(mcar<prop.m, NA, data$hypertension)
antic_therapy.mcar = ifelse(mcar<prop.m, NA, data$antic_therapy)
years.mcar = ifelse(mcar<prop.m, NA, data$years)
data_mcar <- cbind(subset(data), diabetes.mcar, hypertension.mcar, antic_therapy.mcar, years.mcar)
这里的问题是:设置种子我获得了每个变量的 NA 缺失值,只是为了相同的观察:
diabetes.mcar
[1] 0 0 0 0 0 0 0 0 0 0 0 NA NA 0 1 1 0 0 0 0 0 0 NA 0 0 NA 0 0 0 0
[31] 0 0 0 NA 0 NA 1 0 0 0 1
hypertension.mcar
[1] 1 1 0 1 0 1 1 0 0 1 0 NA NA 0 1 1 1 0 1 1 0 1 NA 0 0 NA 0 0 1 0
[31] 1 0 1 NA 1 NA 1 1 1 0 1
antic_therapy.mcar
[1] 0 1 0 1 0 0 0 0 1 0 0 NA NA 0 0 0 1 0 0 0 0 1 NA 0 1 NA 0 0 0 0
[31] 0 0 0 NA 0 NA 0 0 1 0 1
years.mcar
[1] 69 77 70 75 68 73 68 66 71 51 75 NA NA 74 71 71 71 70 55 80 74 73 NA 78 73 NA 70 69 74 76
[31] 70 78 72 NA 77 NA 78 72 75 67 79
这根本不是 MCAR!
我该如何解决?
我必须为每个变量定义不同的种子?
我也试过这种方法:
mymatrix <- as.matrix(data)
mcar <- MCAR(db.complete = mymatrix, perc.miss = 0.15, setseed = 11)
但我获得了一个 s4 对象,但我不知道如何将其转换为数据框或将其导出为 csv。
谢谢!
从 行 完全随机缺失的意义上说,您的模拟是 MCAR。要在每列中随机观察缺失,您可以使用类似
的东西
data <- airquality # data is maybe not the best name
m.prop <- 0.15
as.data.frame(lapply(data, function(i) { i[runif(length(i))<m.prop] <- NA ; i } ))
想法是 运行 遍历每一列 (lapply
),使用与您使用的相同方法随机分配缺失值,然后将它们全部组合回 data.frame
。
要仅更新一些变量,您可以使用以下方法
data <- airquality # data is maybe not the best name
m.prop <- 0.15
cols <- c(1, 2) # Columns to select
data[,cols] <- as.data.frame(lapply(data[,cols], function(i) { i[runif(length(i))<m.prop] <- NA ; i } ))
我想在 R 中从现有的完整数据库创建一个 MCAR 数据库。 我只想使用一些具有 NA 观测值的变量,这是我使用的代码:
data <-master
set.seed(685)
prop.m = .15
mcar = runif(length(data[,1]), min=0, max=1)
diabetes.mcar = ifelse(mcar<prop.m, NA, data$diabetes)
hypertension.mcar = ifelse(mcar<prop.m, NA, data$hypertension)
antic_therapy.mcar = ifelse(mcar<prop.m, NA, data$antic_therapy)
years.mcar = ifelse(mcar<prop.m, NA, data$years)
data_mcar <- cbind(subset(data), diabetes.mcar, hypertension.mcar, antic_therapy.mcar, years.mcar)
这里的问题是:设置种子我获得了每个变量的 NA 缺失值,只是为了相同的观察:
diabetes.mcar [1] 0 0 0 0 0 0 0 0 0 0 0 NA NA 0 1 1 0 0 0 0 0 0 NA 0 0 NA 0 0 0 0 [31] 0 0 0 NA 0 NA 1 0 0 0 1
hypertension.mcar [1] 1 1 0 1 0 1 1 0 0 1 0 NA NA 0 1 1 1 0 1 1 0 1 NA 0 0 NA 0 0 1 0 [31] 1 0 1 NA 1 NA 1 1 1 0 1
antic_therapy.mcar [1] 0 1 0 1 0 0 0 0 1 0 0 NA NA 0 0 0 1 0 0 0 0 1 NA 0 1 NA 0 0 0 0 [31] 0 0 0 NA 0 NA 0 0 1 0 1
years.mcar [1] 69 77 70 75 68 73 68 66 71 51 75 NA NA 74 71 71 71 70 55 80 74 73 NA 78 73 NA 70 69 74 76 [31] 70 78 72 NA 77 NA 78 72 75 67 79
这根本不是 MCAR!
我该如何解决? 我必须为每个变量定义不同的种子?
我也试过这种方法:
mymatrix <- as.matrix(data)
mcar <- MCAR(db.complete = mymatrix, perc.miss = 0.15, setseed = 11)
但我获得了一个 s4 对象,但我不知道如何将其转换为数据框或将其导出为 csv。
谢谢!
从 行 完全随机缺失的意义上说,您的模拟是 MCAR。要在每列中随机观察缺失,您可以使用类似
的东西data <- airquality # data is maybe not the best name
m.prop <- 0.15
as.data.frame(lapply(data, function(i) { i[runif(length(i))<m.prop] <- NA ; i } ))
想法是 运行 遍历每一列 (lapply
),使用与您使用的相同方法随机分配缺失值,然后将它们全部组合回 data.frame
。
要仅更新一些变量,您可以使用以下方法
data <- airquality # data is maybe not the best name
m.prop <- 0.15
cols <- c(1, 2) # Columns to select
data[,cols] <- as.data.frame(lapply(data[,cols], function(i) { i[runif(length(i))<m.prop] <- NA ; i } ))