尝试在dygraphs中绘制每周ts对象时,无法将索引转换为适当的类型

时间:2015-03-25 16:57:48

标签: r xts dygraphs

我正在尝试从每周时间序列中创建一个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

1 个答案:

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

dygraph output