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

时间:2011-03-17 06:43:12

标签: r data-structures stata survey missing-data

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

  

0-99数据

     

-1问题未被问及

     

-5不知道

     

-7拒绝回复

     

-9模块未被问及

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

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

6 个答案:

答案 0 :(得分:10)

我知道你在寻找什么,而这在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
}

这允许:

> 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

也可以调整该函数以添加一个额外的属性,为您提供不同值的标签,另请参阅this question。您可以通过以下方式进行转换:

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

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

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

答案 1 :(得分:6)

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

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

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

更新以下来自@ gsk3的问题

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

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

答案 2 :(得分:4)

这不仅仅是一个“技术”问题。您应该具有缺失值分析和估算的全面统计背景。一种解决方案需要使用R和ggobi。您可以为几种类型的NA分配极端负值(将NAs放入边距),并“手动”进行一些诊断。你应该记住有三种类型的NA:

  • MCAR - 随机完全丢失,其中P(缺失|未观察到,未观察到)= P(缺失)
  • MAR - 随机丢失,其中P(缺失,观察,未观察到)= P(缺失|观察)
  • MNAR - 不是随机丢失(或不可忽略),其中P(缺失,观察到,未观察到)无法以任何方式量化。

恕我直言,这个问题更适合CrossValidated

但是这里有来自SO的链接,你可能会发现它很有用:

Handling missing/incomplete data in R--is there function to mask but not remove NAs?

答案 3 :(得分:4)

您可以完全免除NA并只使用编码值。然后,您还可以将它们转换为全局缺失值。我经常更喜欢没有NA的代码,因为NA会导致编码问题,我希望能够准确控制分析的内容。如果还使用字符串“NA”来表示NA,这通常会使事情变得更容易。

-Ralph Winters

答案 4 :(得分:1)

我经常使用它们作为值,正如拉尔夫已经建议的那样,因为缺失值的类型似乎是数据,但在一两次我主要想要文档的情况下我使用了值的属性,例如< / p>

> a <- NA
> attr(a, 'na.type') <- -1
> print(a)
[1] NA
attr(,"na.type")
[1] -1

这样我的分析很干净,但我仍然保留文档。但正如我所说:通常我保留价值观。

阿伦。

答案 5 :(得分:1)

我想在这里添加“统计背景组件”。 Statistical analysis with missing data对此非常了解。