繁体   English   中英

R:霍尔特 Model。 无法 plot 时间序列预测(预测)

[英]R: Holt Model. Unable to plot timeseries prediction (predict)

我已经能够对 model 使用lm poly模型并预测一些时间序列数据。 但是,当我更改为使用holt model 时,我在 R 控制台中收到错误消息。

这是我正在尝试做的事情:

library(ggplot2)
library(matrixStats)
library(forecast)

df_input <- read.csv("postprocessed.csv")

x <- df_input$time
y <- df_input$value
df <- data.frame(x, y)

#poly4model <- lm(y~poly(x, degree=4), data=df)
holtmodel <- holt(df$y) # might need df$value here ?
v <- seq(1, 44)
v2 <- seq(44, 55)
    
pdf("postprocessed_holts.pdf")
plot(df, xlim=c(0, 55))
##lines(v, predict(poly4model, data.frame(x=v)), col="blue", pch=20, lwd=3)
##lines(v2, predict(poly4model, data.frame(x=v2)), col="red", pch=20, lwd=3)
lines(v, predict(holtmodel, data.frame(x=v)), col="blue", pch=20, lwd=3)
lines(v2, predict(holtmodel, data.frame(x=v2)), col="red", pch=20, lwd=3)
dev.off()

这是出现的错误

Error in xy.coords(x, y) : 'x' and 'y' lengths differ

我对xy在这里指的是什么感到有点困惑。 环境(R Studio 环境)中的对象xy的长度均为 44。

该代码似乎在以lines开头的两行上都出错。

这是输入数据的副本...

"","time","value"
"1",1,2.61066016308988
"2",2,3.41246054742996
"3",3,3.8608767964033
"4",4,4.28686048552237
"5",5,4.4923132964825
"6",6,4.50557049744317
"7",7,4.50944447661246
"8",8,4.51097373134893
"9",9,4.48788748823809
"10",10,4.34603985656981
"11",11,4.28677073671406
"12",12,4.20065901625172
"13",13,4.02514194962519
"14",14,3.91360194972916
"15",15,3.85865748409081
"16",16,3.81318053258601
"17",17,3.70380706527433
"18",18,3.61552922363713
"19",19,3.61405310598722
"20",20,3.64591327503384
"21",21,3.70234435835577
"22",22,3.73503970503372
"23",23,3.81003078640584
"24",24,3.88201196162666
"25",25,3.89872518158949
"26",26,3.97432743542362
"27",27,4.2523675144599
"28",28,4.34654855854847
"29",29,4.49276038902684
"30",30,4.67830892029687
"31",31,4.91896819673664
"32",32,5.04350767355202
"33",33,5.09073406942046
"34",34,5.18510849382162
"35",35,5.18353176529036
"36",36,5.2210776270173
"37",37,5.22643491929207
"38",38,5.11137006553725
"39",39,5.01052467981257
"40",40,5.0361056705898
"41",41,5.18149486951409
"42",42,5.36334869132276
"43",43,5.43053620818444
"44",44,5.60001072279525

编辑

我也尝试了另一种方法。 我注意到 object holtmodel包含两个可能有用的对象。 他们很fitted ,很mean 据我所知,这是接下来 10 个步骤/预测的拟合时间序列和平均时间序列。

我试着用

lines(holtmodel$fitted, col="orange", lwd=2)
lines(holtmodel$mean, col="blue", lwd=2)

然而,尽管控制台中没有产生错误,但其中的第二个未能 plot 任何东西。 第一行按预期绘制了橙色时间序列。

你的问题

您尝试添加为行的对象的长度不同:

length(predict(holtmodel, data.frame(x=v)))
# 10
length(v)
# 44
length(predict(holtmodel, data.frame(x=v2)))
# 10
length(v2)
# 12

这意味着您不能将它们添加为新行。

此外,您无法通过使用旧数据作为准备 model 的点来真正预测与线性回归相同的方式。 指数平滑方法使用历史数据点来构建未来的数据点,您不能真正将它们显示为过去的事件。

此外,您没有指定要预测的周期数( h )的参数,我会让您参考holt function 上的文档 它已经是对未来事件的预测,即 output,因此在其上使用predict()不会改变结果:

holt_predict <- predict(holtmodel)
length(setdiff(holt_predict, holtmodel))
# 0 which means they are the same objects

解决方案

您可以做的是直接使用均值和拟合和 plot 它们与线条,还将区域扩展到 plot 与xlimylim聊天以查看预测值。 您可以直接在图表上使用 plot holtmodel$fittedholtmodel$mean ,因为它们是时间序列对象:

plot(df, xlim=c(0, 60), ylim=c(2.5, 10))
lines(holtmodel$fitted, col="blue", pch=20, lwd=3)
lines(holtmodel$mean, col="red", pch=20, lwd=3)

结果:

在此处输入图像描述

简单的替代品

为了省去您必须通过这种解决方案使用 go 的麻烦,有一些更简单的方法。 您是否尝试过autoplot forecast中包含的自动绘图 function ? 它来自 ggplot2,会直接给你你想要的(除非你不想要置信区间)。 它非常简单,可能会产生接近您想要的结果:

autoplot(holtmodel)

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM