R谐波预测失败-新的数据结构



我使用谐波回归来预测时间序列,创建如下:

(使用的包裹:tseries,prediction,TSA,plyr)

airp <- AirPassengers
TIME <- 1:length(airp)
SIN <- COS <- matrix(nrow = length(TIME), ncol = 6,0)
for (i in 1:6){
  SIN[,i] <- sin(2*pi*i*TIME/12)
  COS[,i] <- cos(2*pi*i*TIME/12)
}
SIN <- SIN[,-6]
decomp.seasonal <- decompose(airp)$seasonal
seasonalfit <- lm(airp ~ SIN + COS)

这个配件很好用。预测时会出现问题。

TIME.NEW <- seq(length(TIME)+1, length(TIME)+12, by=1)
SINNEW <- COSNEW <- matrix(nrow=length(TIME.NEW), ncol = 6, 0)
for (i in 1:6) {
  SINNEW[,i] <- sin(2*pi*i*TIME.NEW/12)
  COSNEW[,i] <- cos(2*pi*i*TIME.NEW/12)
}
SINNEW <- SINNEW[,-6]
prediction.harmonic.dataframe <- data.frame(TIME = TIME.NEW, SIN = SINNEW, COS = COSNEW)
seasonal.predictions <- predict(seasonalfit, newdata = prediction.harmonic.dataframe)

这会导致警告:

Warning message:
'newdata' had 12 rows but variables found have 144 rows

我查了一下,发现名字是SIN.1SIN.2等,而不是SIN1SIN2。。。所以我手动更改了这些,但它仍然不起作用。我还手动删除了SIN.6,因为出于某种原因,它仍然存在。

帮助?

编辑:我也看过类似的帖子,这些问题的答案并没有解决我的问题。

在用不在数据框架内的变量(尤其是矩阵)拟合lm模型后,尝试用数据框架进行预测并不有趣。如果你总是根据数据帧中的数据来拟合你的模型,那会更好。

例如,如果你做了

seasonalfit <- lm(airp ~ ., data.frame(airp=airp,SIN=SIN,COS=COS))

那么你的预测就会奏效。

或者,您可以尝试将矩阵填充到data.frame中,但这通常是个坏主意。你会做

prediction.harmonic.dataframe <- data.frame(TIME = TIME.NEW, 
    SIN = I(SINNEW), COS = I(COSNEW))

I()(或AsIs函数)将它们保持为矩阵。

最新更新