我想从现有的完整版本中创建一个RAR中的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。
谢谢!
答案 0 :(得分:1)
您的模拟是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 } ))