我有一个从 csv 文件中读取的数据框,该文件具有每日观察结果:
Date Value
2010-01-04 23.4
2010-01-05 12.7
2010-01-04 20.1
2010-01-07 18.2
Run Code Online (Sandbox Code Playgroud)
问题:缺少数据。Forecast 包需要一个ts不包含任何缺失数据的普通对象,而我的数据集在大多数周末和其他随机点都有缺失数据。
转换为ts不应该工作
ts(values, start = c(1997, 1), frequency = 1)
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一解决方案是将每日数据转换为每周数据,但 R 是一个新事物,可能存在其他更好的解决方案。
一种选择是扩展您的日期索引以包括缺失的观察值,并使用na.approxfromzoo通过插值填充缺失值。
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
Run Code Online (Sandbox Code Playgroud)
即使有缺失值,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)))
Run Code Online (Sandbox Code Playgroud)
是的,您可能需要进行汇总 - 重要的是要明智地这样做。如果您只是汇总到周级别,请使用类似lubridate将时间戳映射到周的方法,那么您最终肯定会得到 Forecast 可以使用的东西 - 但这将是具有欺骗性数据的东西,因为某些周的计数会较小,因为它们“又失踪了几天。这使得数据集对于预测建模的用处不大,因为您没有为其提供实际发生情况的模型。
我的建议是查看动物园时间序列包来处理这个问题;它有很多函数可以根据它提供的其他数据计算出缺失/NA条目的可能值。安装它并运行:
library(zoo)
ls(pattern = "^na", "package:zoo")
Run Code Online (Sandbox Code Playgroud)
要获取您可能会发现特别相关的功能列表。