[英]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 Cook和Deborah Swayne在“使用R和GGobi的数据分析师的交互式和动态图形”中的第3章是关于该主题的很好的参考。
您将在本章中看到norm
包的实际应用,但Hmisc
包具有数据插补例程。 另见Amelia
, cat
(用于分类缺失插补), mi
, mitools
, VIM
, vmv
(用于缺失数据可视化)。
老实说,我仍然不太明白你的统计数据问题,还是关于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.