我有一个数据框,我从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是一个新事物,可能存在其他更好的解决方案。
答案 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