MCAR缺失机制

时间:2018-06-18 17:13:05

标签: r missing-data

我想从现有的完整版本中创建一个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。

谢谢!

1 个答案:

答案 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 } ))