许多调查都有不同类型缺失的代码。例如,代码簿可能表示:
0-99数据
-1问题未被问及
-5不知道
-7拒绝回复
-9模块未被问及
Stata拥有处理这些多种缺失的漂亮设施,因为它允许您分配通用。丢失数据,但也允许更具体的缺失类型(.a,.b,.c,...,。z)。所有查看缺失的命令都会报告所有缺失条目的答案,但是您可以稍后对各种缺失进行排序。当您认为拒绝回应对归责策略的影响不同于未提出的问题时,这尤其有用。
我从未在R中遇到过这样的设施,但我真的很想拥有这种能力。有没有办法标记几种不同类型的NA?我可以想象创建更多数据(包含缺失类型的长度为nrow(my.data.frame)的向量,或者哪些行具有哪种类型的缺失的更紧凑的索引),但这看起来非常笨拙。
答案 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)
最明显的方式似乎是使用两个向量:
NA
表示。例如,c(2, 50, NA, NA)
factor(c(1, 1, -1, -7))
其中因素1
表示正确回答的问题。拥有这种结构可以为您提供创建灵活性,因为所有标准na.rm
参数仍然适用于您的数据向量,但您可以使用更复杂的概念和因子向量。
更新以下来自@ gsk3的问题
我应该声明我从未分析调查数据(尽管我已经分析过大型生物数据集)。我上面的答案看起来很防守,但这不是我的意图。我认为你的问题很好,我对其他回复感兴趣。
答案 2 :(得分:4)
这不仅仅是一个“技术”问题。您应该具有缺失值分析和估算的全面统计背景。一种解决方案需要使用R和ggobi。您可以为几种类型的NA分配极端负值(将NAs放入边距),并“手动”进行一些诊断。你应该记住有三种类型的NA:
恕我直言,这个问题更适合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对此非常了解。