dynlm Rパッケージによる1ステップ先の予測


11

dynlmパッケージを使用して、いくつかの独立変数を持つモデルを適合させました。そのうちの1つは従属変数のラグです。

独立変数の1ステップ先の予測があると仮定すると、従属変数の1ステップ先の予測を取得するにはどうすればよいですか?

次に例を示します。

library(dynlm)

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)

#Forecast
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))
y=window(y,end=end(y)+c(1,0),extend=TRUE)
newdata<-cbind(y,A,B,C)
predict(model,newdata)

そして、これが機能するdynパッケージの使用例です。

library(dyn)

#Fit linear model
model<-dyn$lm(y~A+B+C+lag(y,-1),data=data)

#Forecast
predict(model,newdata)the dyn packages, which works:

dynlmパッケージのみを使用しても、従属変数の予測は提供されません。従属変数の予測を提供するには、それらを説明するモデルと、おそらく追加のデータが必要になります。JohnsonとWichernによる「Applied Multivariate Statistical Analysis」のような多変量回帰についての何かを読むことをお勧めします。または予測に関するコース:duke.edu/~rnau/411home.htm
deps_stats

1
@deps_stats従属変数は私が予測したいものです。私はすでに独立変数の予測を持っていると想定しています。私のサンプルコードでは、yは予測しようとしている従属変数であり、A、B、Cはすでに予測されている独立変数です。私が投稿したサンプルコードを実行すると、私の問題の性質を理解できます。
Zach

@ザック:素敵なカグル評価!(私はあなたのマウスオーバープロファイルのリンクをクリックしました)
Hugh Perkins

回答:


13

おめでとうございます。バグを見つけました。dynlm遅延変数が使用されている場合、新しいデータを使用したの予測が壊れます。の出力を見る理由を確認するには

predict(model)
predict(model,newdata=data)

結果は同じになるはずですが、同じではありません。newdata引数がない場合、predict関数は基本的modeldynlm出力から要素を取得します。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ステップ先の予測が含まれています。


同じ数式に2つのラグがある場合をどのように処理できますか? lag(y,-1)+lag(y,-2)
ヒューパーキンス

1
さて、このソリューションは機能しません。独自の予測関数を作成する必要があります。
mpiktas 2012年

ああ、それは私が実際にやったことです:-P
ヒュー・パーキンス

1
Dynlmの作者に提出することを検討しましたか?dynlmの使用を予測できないのは、奇妙な状況です。
mpiktas 2012年

うーん、魔法のようにスタックオーバーフローを監視してバグを修正するつもりはないと言っているのですか。それはおそらく本当だと思います!
ヒューパーキンス

2

@ md-azimul-haqueのリクエストに従って、4歳のソースコードを調べたところ、適切に名前が付けられた次の関数が見つかりました。これが@ md-azimul-haqueが探しているものかどうかわかりませんか?

# pass in training data, test data,
# it will step through one by one
# need to give dependent var name, so that it can make this into a timeseries
predictDyn <- function( model, train, test, dependentvarname ) {
    Ntrain <- nrow(train)
    Ntest <- nrow(test)
    # can't rbind ts's apparently, so convert to numeric first
    train[,dependentvarname] <- as.numeric(train[,dependentvarname])
    test[,dependentvarname] <- NA
    testtraindata <- rbind( train, test )
    testtraindata[,dependentvarname] <- ts( as.numeric( testtraindata[,dependentvarname] ) )
    for( i in 1:Ntest ) {
       cat("predicting i",i,"of",Ntest,"\n")
       result <- predict(model,newdata=testtraindata,subset=1:(Ntrain+i-1))
       testtraindata[Ntrain+i,dependentvarname] <- result[Ntrain + i + 1 - start(result)][1]
    }
    testtraindata <- testtraindata[(Ntrain+1):(Ntrain + Ntest),dependentvarname]
    names(testtraindata) <- 1:Ntest
    return( testtraindata )
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.