如何处理R中的多种缺失?

Ari*_*man 19 r survey missing-data stata data-structures

许多调查都有不同类型缺失的代码.例如,代码簿可能表明:

0-99数据

-1没问的问题

-5不知道

-7拒绝回应

-9模块没问

Stata有一个很好的设施来处理这些多种缺失,因为它允许你分配一个通用的.丢失数据,但也允许更具体的缺失类型(.a,.b,.c,...,.z).所有查看缺失的命令都会报告所有缺失条目的答案,但是您可以稍后对各种缺失进行排序.当您认为拒绝回应对归责策略的影响与未提出的问题不同时,这尤其有用.

我从未在R中遇到过这样的设施,但我真的很想拥有这种能力.有没有办法标记几种不同类型的NA?我可以想象创建更多的数据(包含缺失类型的长度为nrow(my.data.frame)的向量,或者哪些行具有哪种类型的缺失的更紧凑的索引),但这看起来非常笨拙.

Jor*_*eys 11

我知道你在寻找什么,而这在R中没有实现.我不知道实现的包,但是自己编写代码并不困难.

一种可行的方法是将数据框添加到包含代码的属性中.为了防止整个数据帧加倍并节省空间,我将在该数据帧中添加索引,而不是重建完整的数据帧.

例如:

NACode <- function(x,code){
    Df <- sapply(x,function(i){
        i[i %in% code] <- NA
        i
    })

    id <- which(is.na(Df))
    rowid <- id %% nrow(x)
    colid <- id %/% nrow(x) + 1
    NAdf <- data.frame(
        id,rowid,colid,
        value = as.matrix(x)[id]
    )
    Df <- as.data.frame(Df)
    attr(Df,"NAcode") <- NAdf
    Df
}
Run Code Online (Sandbox Code Playgroud)

这允许:

> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don't know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA NA NA 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3
Run Code Online (Sandbox Code Playgroud)

也可以调整该函数以添加一个额外的属性,为您提供不同值的标签,另请参阅此问题.您可以通过以下方式进行回溯:

ChangeNAToCode <- function(x,code){
    NAval <- attr(x,"NAcode")
    for(i in which(NAval$value %in% code))
        x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]

    x
}

> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA -2 -3 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3
Run Code Online (Sandbox Code Playgroud)

如果需要,这允许仅更改所需的代码.该函数可以适用于在没有给出参数时返回所有代码.可以构造类似的函数来根据代码提取数据,我猜你可以自己解决这个问题.

但是在一行中:使用属性和索引可能是一种很好的方式.

  • 你一定要抓住一些空闲时间并写一个包!=) (6认同)

csg*_*pie 6

最明显的方式似乎是使用两个向量:

  • 向量1:数据向量,其中使用表示所有缺失值NA.例如,c(2, 50, NA, NA)
  • 向量2:因子向量,表示数据类型.例如,factor(c(1, 1, -1, -7))factor 1表示正确回答的问题.

拥有这种结构可以为您提供创建灵活性,因为所有标准na.rm参数仍然适用于您的数据向量,但您可以使用更复杂的概念和因子向量.

更新@ gsk3中的以下问题

  1. 数据存储将大幅增加:数据存储将翻倍.但是,如果尺寸加倍会导致真正的问题,那么可能值得考虑其他策略.
  2. 程序不会自动处理它.这是一个奇怪的评论.默认情况下,某些函数以合理的方式处理NA.但是,您希望以不同方式处理NAs,这意味着您必须做一些定制的事情.如果您只想分析NA"未提问"的数据,那么只需使用数据帧子集.
  3. 现在你必须在每次想要概念操作变量时操纵两个向量我想我设想了两个向量的数据帧.我将基于第二个向量对数据帧进行子集化.
  4. 没有标准的实现,所以我的解决方案可能与其他人不同.真正.但是,如果现成的包装不能满足您的需求,那么(几乎)根据定义您想要做一些不同的事情.

我应该声明我从未分析调查数据(尽管我已经分析了大型生物数据集).我上面的答案看起来很防守,但这不是我的意图.我认为你的问题很好,我对其他回答很感兴趣.