おめでとうございます。バグを見つけました。dynlm
遅延変数が使用されている場合、新しいデータを使用したの予測が壊れます。の出力を見る理由を確認するには
predict(model)
predict(model,newdata=data)
結果は同じになるはずですが、同じではありません。newdata
引数がない場合、predict
関数は基本的model
にdynlm
出力から要素を取得します。newdata
引数predict
から新しいモデルマトリックスを形成しようとしますnewdata
。これにはdynlm
、に供給された式の解析が含まれ、式にはfunction L
があり、function 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ステップ先の予測が含まれています。
dynlm
パッケージのみを使用しても、従属変数の予測は提供されません。従属変数の予測を提供するには、それらを説明するモデルと、おそらく追加のデータが必要になります。JohnsonとWichernによる「Applied Multivariate Statistical Analysis」のような多変量回帰についての何かを読むことをお勧めします。または予測に関するコース:duke.edu/~rnau/411home.htm