【问题标题】:How do I handle multiple kinds of missingness in R?如何处理 R 中的多种缺失?
【发布时间】:2011-07-17 04:25:07
【问题描述】:

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

0-99 数据

-1 未提出问题

-5 不知道

-7 拒绝回应

-9 未询问模块

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

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

【问题讨论】:

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


    【解决方案1】:

    我想在这里添加“统计背景组件”。 Statistical analysis with missing data 是一本很好的读物。

    【讨论】:

      【解决方案2】:

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

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

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

      艾伦。

      【讨论】:

        【解决方案3】:

        我知道你在寻找什么,但它没有在 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
        

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

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

        【讨论】:

        • 你一定要找点空闲时间写一个包! =)
        • 这太棒了...自 3 月以来有关于此主题的任何消息吗?
        • 我有一个小评论:当您开始编写您的 NA 时,很可能一种 NA 已经是 NA(例如,读取数据过程的原因)。因此,如果code 列表接受 NA 而不仅仅是负整数和正整数,那就太好了。
        • @ran2 没有关于该主题的新闻,但一旦我找出数据表,我可能会将其包装在一个包中。这可能是一个很好的扩展。
        • 基于属性的方法唯一令人讨厌的地方是许多命令会剥离属性,因此您必须做一些工作才能保留它们。
        【解决方案4】:

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

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

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

        更新来自@gsk3 的以下问题

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

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

        【讨论】:

        • 这肯定行得通,但我发现它存在三个问题:1) 数据存储需求显着增加(在具有数百个变量的调查中,这是不平凡的),2) 程序没有t 自动处理它(现在你必须在每次你想在概念上操纵一个变量时一起操纵两个向量),并且 3)没有标准的实现,所以我的解决方案可能与其他人的不同。可能值得编写一个包含向量和索引的新类,但是每个有趣的函数都必须有一个方法。
        • 感谢您的更新。我已经将其设想为一个大型 data.frame,并且 data.frames 不能存储其他 data.frames。因此,如果不使用列表来保存变量的 data.frames,就很难实现。今天晚些时候,我将尝试更清楚地说明我正在寻找的内容。
        • @cgillespie:如果您使用稀疏向量或矩阵,则无需显着增加存储空间。
        【解决方案5】:

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

        -拉尔夫·温特斯

        【讨论】:

        • 这行得通。但是,通常我更喜欢重新编码而不是 NA,这样当我无法正确解释丢失的数据时,分析就会失败。当我将丢失的数据存储为普通数据时,我发现很容易出错。
        【解决方案6】:

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

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

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

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

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

        【讨论】:

        • 我同意正确解释缺失涉及适当处理分析中的值,如鲁宾。我在不同的研究中以不同的方式处理了这个问题(例如多重插补或更多的临时解决方案),但它们都是从确定存在不同类型的缺失开始的。我的问题是关于在数据集中跟踪这些不同类型的缺失的技术方面。
        • 在这种情况下,您根本不应该使用NA——就像@Ralph 建议的那样。
        • @aL3xa:但正如我在 Ralph 的建议中指出的那样,NA 有一些不错的特性,它不允许您意外忽略丢失的数据。
        • 好吧,按照@Joris 的建议将attr 添加到您的数据中是最终的解决方案(尽管它仍然是一种解决方法)......男孩,我的答案是无用的还是什么?! =)
        • 我在编写代码时总是在查看我的数据,所以我从不会偶然忽略它。在您解决问题后,我认为转到“真正的 NA”是个好主意,因为您可能(并且可能会)处理您以前从未见过的数据,其中包含您需要捕获的“新”缺失值。跨度>
        猜你喜欢
        • 2014-04-27
        • 1970-01-01
        • 2021-12-23
        • 2015-10-23
        • 2021-11-03
        • 1970-01-01
        • 2019-10-01
        • 2023-03-16
        • 2020-02-07
        相关资源
        最近更新 更多