R中的缺失值处理

7

我有一个数据框,是从CSV文件中读取的,其中包含每天观察到的数据:

Date        Value 
2010-01-04  23.4
2010-01-05  12.7
2010-01-04  20.1
2010-01-07  18.2

问题:数据缺失。

Forecast包期望使用一个不含任何缺失数据的普通ts对象进行操作,但我的数据集在大多数周末和其他随机点存在缺失数据。

将其转换为ts对象可能会出现问题。

ts(values, start = c(1997, 1), frequency = 1)

我能想到的唯一解决办法是将日数据转换为周数据,但R语言是个新东西,可能存在其他更好的解决方案。


这实际上是一个统计学问题(如何处理时间序列中的缺失值),而你还没有提供足够的信息(缺失值与现有值的比率以及缺失值的连续长度)。建议迁移到CrossValidated.com,这样你就可以在回来提出完整的编码问题之前进行一些自己的搜索。 - IRTFM
预测包中的许多函数允许存在缺失值。 - Rob Hyndman
@BondedDust 这更像是如何使用R执行必要的程序来处理缺失数据。 - Gavello
4个回答

7

一个选择是扩展您的日期索引,以包括丢失的观察值,并使用zoo中的na.approx通过插值来填充缺失的值。

allDates <- seq.Date(
  min(values$Date),
  max(values$Date),
  "day")
##
allValues <- merge(
  x=data.frame(Date=allDates),
  y=values,
  all.x=TRUE)
R> head(allValues,7)
        Date      Value
1 2010-01-05 -0.6041787
2 2010-01-06  0.2274668
3 2010-01-07 -1.2751761
4 2010-01-08 -0.8696818
5 2010-01-09         NA
6 2010-01-10         NA
7 2010-01-11 -0.3486378
##
zooValues <- zoo(allValues$Value,allValues$Date)
R> head(zooValues,7)
2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 2010-01-10 2010-01-11 
-0.6041787  0.2274668 -1.2751761 -0.8696818         NA         NA -0.3486378 
##
approxValues <- na.approx(zooValues)
R> head(approxValues,7)
2010-01-05 2010-01-06 2010-01-07 2010-01-08 2010-01-09 2010-01-10 2010-01-11 
-0.6041787  0.2274668 -1.2751761 -0.8696818 -0.6960005 -0.5223192 -0.3486378

即使存在缺失值,zooValues 仍是一个合法的 zoo 对象。例如,plot(zooValues) 将可以工作(在缺失值处存在间断),但如果您打算对数据拟合某种模型,则最好使用 na.approx 替换缺失值。 数据:
library(zoo)
library(lubridate)
##
t0 <- "2010-01-04"
Dates <- as.Date(ymd(t0))+1:120
weekDays <- Dates[!(weekdays(Dates) %in% c("Saturday","Sunday"))]
##
set.seed(123)
values <- data.frame(Date=weekDays,Value=rnorm(length(weekDays)))

谢谢,我会按照你的指示去做。 - Gavello

4
您可以使用imputeTSzooforecast软件包,它们提供了填补缺失数据的方法。(填补缺失数据的过程也称为插补)
na_interpolation(yourData)
na_seadec(yourdata)
na_kalman(yourdata)
na_ma(yourdata)

动物园

na.approx(yourdata)
na.locf(yourdata)
na.StructTS(yourdata)

预测

na.interp(yourdata)

以下是一些您可以使用的包中的函数。


1
您可能需要进行聚合,是的 - 重要的是要聪明地进行聚合。如果您只是简单地按周级别进行聚合,使用类似于lubridate将时间戳映射到周,您肯定会得到一些Forecast可以使用的内容 - 但这将是具有欺骗性数据的内容,因为某些周由于缺少天数而具有较小的计数。这使数据集对于预测建模变得不太有用,因为您没有给它一个实际发生情况的模型。
我的建议是查看zoo时间序列包以处理此问题;它有很多函数可用于根据其它数据来确定缺失/NA条目的可能值。安装它并运行:
library(zoo)
ls(pattern = "^na", "package:zoo")

获取一份您可能特别关注的函数列表。

谢谢,我正在研究zoo包;你有什么资源可以建议我开始吗? - Gavello
http://cran.r-project.org/web/packages/zoo/index.html 上的小故事非常不错。 - Oliver Keyes

0

来自 {padr} 的另一个解决方案:

显式区间

require(padr)
require(magrittr)
df <- data.frame(day = as.Date(c('2016-04-01', '2016-04-03')), y = c(3,4))
pad(df, interval = "day") %>% fill_by_value(y)
#>          day y
#> 1 2016-04-01 3
#> 2 2016-04-02 0
#> 3 2016-04-03 4

推断区间

df <- data.frame(day = as.Date(c('2016-04-01', '2016-04-02', '2016-04-04')), y = c(3,4,6))
pad(df) %>% fill_by_value(y)
#> pad applied on the interval: day
#>          day y
#> 1 2016-04-01 3
#> 2 2016-04-02 4
#> 3 2016-04-03 0
#> 4 2016-04-04 6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接