我正在尝试从每周时间序列中创建一个Holt-Winters预测,然后使用dygraph绘制原始系列和预测。我有144周的周末结束数据。为了我的目的,我忽略了有些年有53周。数据结构可以通过以下方式模拟:
## create data similar to what I have
week_date <- seq.Date(from = as.Date("2012/05/11"),
by = "week",
length.out = 144)
set.seed(1)
var1 <- diffinv(rnorm(143))
df <- data.frame(cbind(week_date, var1))
## convert to ts object then
## create Holt Winters forecast
dfts <- ts(df[,2],freq=52, start=c(2012,19))
hw <- HoltWinters(dfts)
p <- predict(hw, 4)
all <- cbind(dfts, p)
## create plots
dygraph(all, "time series dygraph") %>%
dySeries("var1", label = "Actual") %>%
dySeries(c("p.lwr", "p.fit", "p.upr"), label = "Predicted")
这会产生以下错误:
Error in as.xts.ts(data) : could not convert index to appropriate type
我尝试了提出的解决方案here,但我遇到了同样的错误:
> all <- cbind(dfts = as.xts(dfts), p = as.xts(p))
Error in as.xts.ts(dfts) : could not convert index to appropriate type
答案 0 :(得分:7)
这里有一些事情发生。该问题的根源是data
的{{1}}参数需要&#34;时间序列数据(必须是xts对象或可转换为xts的对象)&#34; (见dygraph
)。
正如您所发现的,将?dygraph
转换为xts对象失败:
dfts
如果您尝试直接创建xts对象:
> library(xts)
> dfts <- as.xts(dfts)
Error in as.xts.ts(dfts) : could not convert index to appropriate type
这是因为默认> dfts <- xts(dfts)
Error in xts(dfts) : order.by requires an appropriate time-based object
使用xts
作为index(x)
参数。来自order.by
:
?xts
如果您查看order.by a corresponding vector of unique times/dates -
must be of a known time-based class
...
Currently acceptable classes include: ‘Date’, ‘POSIXct’, ‘timeDate’,
as well as ‘yearmon’ and ‘yearqtr’ where the index values remain unique.
上的索引:
dfts
索引是数字,而> str(index(dfts))
num [1:148] 2012 2012 2012 2012 2012 ...
> head(index(dfts))
[1] 2012.346 2012.365 2012.385 2012.404 2012.423 2012.442
需要某种类型的日期对象,因此您需要转换它。
首先,我通过将每个对象转换为xts
对象然后合并来创建all
对象:
zoo
然后,您可以通过将十进制索引转换为日期将其强制转换为> library(zoo)
> # You'll need prediction.interval=TRUE to get the bounds:
> p <- predict(hw, 4, prediction.interval=TRUE)
> all <- merge(actual=as.zoo(dfts), predicted=as.zoo(p))
> head(all)
actual fit upr lwr
2012(19) 0.0000000 NA NA NA
2012(20) -0.6264538 NA NA NA
2012(21) -0.4428105 NA NA NA
2012(22) -1.2784391 NA NA NA
2012(23) 0.3168417 NA NA NA
2012(24) 0.6463495 NA NA NA
对象。有几种方法可以做到这一点,但最简单的方法是使用xts
包中的date_decimal
函数:
lubridate
现在,调整dygraph函数中的参数:
> library(lubridate)
> all.xts <- xts(all, date_decimal(index(all)))