使用数据UKDriverDeaths
尝试使用Holt-Winters预测功能& ggplot()
。
基本上以置信区间(2)重现ggplot
(1)中的数据。
这是数据:
data('UKDriverDeaths')
past <- window(UKDriverDeaths, end = c(1982, 12))
hw <- HoltWinters(past)
pred <- predict(hw, n.ahead = 10)
plot(hw, pred, ylim = range(UKDriverDeaths))
lines(UKDriverDeaths)
这是在ggplot()
中创建它的解决方案(1):
library(xts)
ts_pred <- ts(c(hw$fitted[, 1], pred), start = 1970, frequency = 12)
df <- merge(as.xts(ts_pred), as.xts(UKDriverDeaths))
names(df) <- c("predicted", "actual")
ggplot(df, aes(x=as.POSIXct(index(df)))) +
geom_line(aes(y=predicted), col='red') +
geom_line(aes(y=actual), col='black') +
theme_bw() +
geom_vline(xintercept=as.numeric(as.POSIXct("1982-12-01")), linetype="dashed") +
labs(title="Holt-Winters filtering\n", x="Time", y="Observed / Fitted") +
theme(plot.title = element_text(size=18, face="bold"))
我正在为冬季预测寻找置信区间(2)。
答案 0 :(得分:2)
通常,您会为预测和预测间隔调用置信区间&#34;。如果您使用predict.HoltWinters
要求,prediction.interval=T
函数会向您提供这些功能。所以你可以做到
pred <- predict(hw, n.ahead = 10, prediction.interval = TRUE)
现在这将改变返回值的形状。你得到一个矩阵,而不是一个简单的向量,所以你需要调整一些其他的转换代码来处理这个问题。尝试
ts_pred <- ts(rbind(cbind(hw$fitted[, 1],upr=NA,lwr=NA), pred),
start = 1970, frequency = 12)
df <- merge(as.xts(UKDriverDeaths), as.xts(ts_pred))
names(df)[1:2] <- c("actual", "predicted")
这会尝试确保所有列都正确排列并在观察值和预测值之间进行标记。
现在我们可以在图中添加两行
ggplot(df, aes(x=as.POSIXct(index(df)))) +
geom_line(aes(y=predicted), col='red') +
geom_line(aes(y=actual), col='black') +
geom_line(aes(y=upr), col='blue') +
geom_line(aes(y=lwr), col='blue') +
theme_bw() +
geom_vline(xintercept=as.numeric(as.POSIXct("1982-12-01")),
linetype="dashed") +
labs(title="Holt-Winters filtering\n", x="Time", y="Observed / Fitted") +
theme(plot.title = element_text(size=18, face="bold"))