恭喜,你发现了一个错误。如果使用滞后变量,对新数据的预测dynlm
就会被打破。看看为什么看看输出
predict(model)
predict(model,newdata=data)
结果应该是相同的,但事实并非如此。没有newdata
参数,该predict
函数基本上model
从dynlm
输出中获取元素。Withnewdata
参数predict
试图从 形成新的模型矩阵newdata
。由于这涉及解析提供给dynlm
的公式,并且公式具有函数L
,它仅在函数内部定义dynlm
,因此形成了不正确的模型矩阵。如果您尝试调试,您将看到,在newdata
提供参数的情况下,滞后因变量没有滞后。
您可以做的是滞后因变量并将其包含在newdata
. 这是说明这种方法的代码。我使用set.seed
它很容易重现。
library(dynlm)
set.seed(1)
y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable
A<-rnorm(10) #Create independant variables
B<-rnorm(10)
C<-rnorm(10)
y<-y+.5*A+.2*B-.3*C #Add relationship to independant variables
data=cbind(y,A,B,C)
#Fit linear model
model<-dynlm(y~A+B+C+L(y,1),data=data)
这是错误的行为:
> predict(model)
2 3 4 5 6 7 8 9 10
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738
> predict(model,newdata=data)
1 2 3 4 5 6 7 8 9 10
2.1628335 3.7063579 2.9781417 2.1374301 3.2582376 1.9534558 1.3670995 2.4547626 0.8448223 1.8762437
形成newdata
#Forecast fix.
A<-c(A,rnorm(1)) #Assume we already have 1-step forecasts for A,B,C
B<-c(B,rnorm(1))
C<-c(C,rnorm(1))
newdata<-ts(cbind(A,B,C),start=start(y),freq=frequency(y))
newdata<-cbind(lag(y,-1),newdata)
colnames(newdata) <- c("y","A","B","C")
比较预测与模型拟合:
> predict(model)
2 3 4 5 6 7 8 9 10
3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738
> predict(model,newdata=newdata)
1 2 3 4 5 6 7 8 9 10 11
NA 3.500667 2.411196 2.627915 2.813815 2.468595 1.733852 2.114553 1.423225 1.470738 1.102367
正如您在历史数据中看到的那样,预测是一致的,最后一个元素包含提前 1 步的预测。