繁体   English   中英

处理R中缺失/不完整的数据是否有掩盖但不删除NA的功能?

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

正如您期望的DSL用于数据分析,R很好地处理丢失/不完整的数据,例如:

许多R函数都有一个na.rm标志,当设置为TRUE时 ,删除NA:

>>> v = mean( c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T)
>>> v
      (5, 6, 12, 87, 9, 43, 67)

但是如果你想在函数调用之前处理NA,你需要做这样的事情:

从矢量中删除每个'NA':

vx = vx[!is.na(a)]

从矢量中删除每个'NA'并将其替换为'0':

ifelse(is.na(vx), 0, vx)

从数据框中删除包含“NA”的整个行:

dfx = dfx[complete.cases(dfx),]

所有这些功能都会永久删除 “NA”或其中带有“NA”的行。

有时候这并不是你想要的 - 在工作流程的下一步可能需要为数据帧的“NA”删除副本,但在后续步骤中,你经常需要这些行(例如,计算一个由于先前调用“完整案例”而导致缺少行的列的列式统计信息,但该列中没有“NA”值。

尽可能清楚我正在寻找的东西:python / numpy有一个类, 蒙面数组 ,有一个掩码方法,它允许你在函数调用期间隐藏 -但不删除 - NA。 R中是否有类似的功能?

究竟如何处理丢失的数据 - 如果我们知道它丢失可能被标记为NA - 可能会因域而异。

举一个与时间序列相关的例子,你可能想要跳过,填充,插入或插入不同的..., 只是 (非常有用和受欢迎的) 动物园具有与NA处理相关的所有这些功能:

zoo::na.approx  zoo::na.locf    
zoo::na.spline  zoo::na.trim    

允许近似(使用不同的算法),前进或后退,使用样条插值或修剪。

另一个例子是CRAN上众多缺失的归责包 - 通常提供特定领域的解决方案。 [所以如果你把R称为DSL,这是什么? “针对特定领域语言的子域特定解决方案”或SDSSFDSL? 相当满口:)]

但是对于你的具体问题:不,我不知道基数R中的位级标志允许你将观察标记为“被排除”。 我认为大多数R用户会使用na.omit()等函数或使用你提到的na.rm=TRUE选项。

查看数据是一个很好的做法,因此推断出缺失值的类型:是MCAR(缺失完整和随机),MAR(随机丢失)还是MNAR(缺失不随机)? 基于这三种类型,您可以研究缺失值的基本结构,并得出归责是否完全适用(如果不是MNAR,那么你很幸运,因为在这种情况下,缺失的值被认为是不可忽略的,并且是与某些未知的潜在影响,因素,过程,变量......无关)。

Di CookDeborah Swayne“使用R和GGobi的数据分析师的交互式和动态图形”中的第3章是关于该主题的很好的参考。

您将在本章中看到norm包的实际应用,但Hmisc包具有数据插补例程。 另见Ameliacat (用于分类缺失插补), mimitoolsVIMvmv (用于缺失数据可视化)。

老实说,我仍然不太明白你的统计数据问题,还是关于R缺失数据插补能力的问题? 我认为我在第二个方面提供了很好的参考,关于第一个:你可以用集中趋势(平均值,中位数或类似值)替换你的NA,从而减少变异性,或随机常数“拉出”观察(记录)案例,或者您可以使用包含NA作为标准的变量进行回归分析,将其他变量用作预测变量,然后将残差分配给NA ...这是处理NA的优雅方式,但通常不会在你的CPU上轻松一点(我在1.1GHz上有Celeron,所以我必须要温和)。

这是一个优化问题......没有明确的答案,你应该决定什么/为什么你坚持使用某种方法。 但是查看数据总是好的做法! =)一定要查看Cook&Swayne - 这是一本出色的,精心编写的指南。 Faraway的 “带R的线性模型”还包含一个关于缺失值的章节。

所以那里。

祝好运! =)

函数na.exclude()听起来像你想要的,虽然它只是一些(重要)函数的选项。

在拟合和使用模型的上下文中,R有一系列用于处理NA的泛型函数: na.fail()na.pass()na.omit()na.exclude() 反过来,这些是R的一些关键建模函数的参数,例如lm()glm()nls()以及MASS,rpart和survival包中的函数。

所有四个通用函数基本上都充当过滤器。 如果没有NA, na.fail()只传递数据,否则失败。 na.pass()通过所有案件。 na.omit()na.exclude()都会遗漏具有NA的案例并通过其他案例。 na.exclude()有一个不同的属性,告诉处理结果对象的函数考虑到NA。 如果你做了attributes(na.exclude(some_data_frame))你可以看到这个属性。 这里有一个如何示范na.exclude()改变的行为predict()的线性模型的情况下。

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40))

## We can tell the modeling function how to handle the NAs
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata)

predict(r_omitted)
#        1        2        4 
# 1.115385 1.846154 4.038462 
predict(r_excluded)
#        1        2        3        4 
# 1.115385 1.846154       NA 4.038462 

顺便说一句,你的默认na.action由options("na.action")决定,并以na.omit()开头,但你可以设置它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM