R ts缺少值

时间:2014-12-08 22:30:08

标签: r time-series

我有一个数据框,我从csv文件中读取每日观察结果:

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

问题:缺少数据。 预测包期望一个普通的ts对象不包含任何丢失的数据,而我的数据集在大多数周末和其他随机点都缺少数据。

转换为ts不应该

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

我能想到的唯一解决方案是将每日数据转换为每周数据,但R是一个新事物,可能存在其他更好的解决方案。

4 个答案:

答案 0 :(得分:1)

你可能需要聚合,是的 - 重要的是要聪明地这样做。如果您只是简单地汇总到周级,使用类似lubridate的内容将时间戳映射到数周,那么您肯定会得到预测可以消费的内容 - 但这会带来欺骗性数据,因为几周之后会有较小的数量,因为他们错过了几天。这使得数据集对于预测建模不太有用,因为您没有给它一个实际发生的模型。

我的建议是查看动物园时间序列包来处理这个问题;它具有许多功能,可以根据其传递的其他数据计算丢失/ NA条目的可能值。安装并运行:

library(zoo)
ls(pattern = "^na", "package:zoo")

获取您可能认为特别相关的功能列表。

答案 1 :(得分:1)

一种选择是扩展日期索引以包含缺失的观察结果,并使用na.approx中的zoo通过插值填充缺失值。

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)))

答案 2 :(得分:1)

您可以使用 imputeTS zoo 预测包,它们都提供了填充缺失数据的方法。 (填补缺失缺口的过程也称为插补)

<强> imputeTS

na.interpolation(yourData)
na.seadec(yourdata)
na.kalman(yourdata)
na.ma(yourdata)

<强>动物园

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

<强>预测

na.interp(yourdata)

这些是您可以使用的软件包中的一些功能。

答案 3 :(得分: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