19

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

0-99 数据

-1 未提出问题

-5 不知道

-7 拒绝回应

-9 未询问模块

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

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

4

6 回答 6

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
}

这允许这样做:

> 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

还可以调整该函数以添加一个额外的属性,该属性为您提供不同值的标签,另请参见此问题。您可以通过以下方式进行反向转换:

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

如果有必要,这允许只更改您想要的代码。当没有给出参数时,该函数可以适用于返回所有代码。可以根据代码构造类似的函数来提取数据,我想你可以自己弄清楚。

但总而言之:使用属性和索引可能是一种不错的方式。

于 2011-03-17T15:32:14.350 回答
6

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

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

拥有这种结构会给您带来很大的灵活性,因为所有标准na.rm参数仍然适用于您的数据向量,但您可以使用更复杂的概念与因子向量。

更新来自@gsk3 的以下问题

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

我应该声明我从未分析过调查数据(尽管我分析过大型生物数据集)。我上面的回答似乎很有防御性,但这不是我的意图。我认为您的问题是一个很好的问题,我对其他回答很感兴趣。

于 2011-03-17T10:57:44.443 回答
4

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

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

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

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

处理 R 中丢失/不完整的数据——是否有屏蔽但不删除 NA 的功能?

于 2011-03-17T12:00:29.740 回答
4

您可以完全省去 NA 而只使用编码值。然后,您还可以将它们汇总到全局缺失值。我通常更喜欢在没有 NA 的情况下进行编码,因为 NA 会导致编码出现问题,并且我希望能够准确控制分析中的内容。如果还使用字符串“NA”来表示 NA,这通常会使事情变得更容易。

——拉尔夫·温特斯

于 2011-03-17T13:32:54.627 回答
2

正如 Ralph 已经建议的那样,我通常将它们用作值,因为缺失值的类型似乎是数据,但在一两次我主要希望它用于文档的情况下,我在值上使用了一个属性,例如

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

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

艾伦。

于 2011-03-19T15:23:26.790 回答
1

我想在这里添加“统计背景组件”。缺失数据的统计分析是一个很好的读物。

于 2011-11-11T13:08:43.293 回答