に関するDirkの提案に従ってdynlm
、予測する方法を完全に理解することはできませんでしたが、それを検索すると、https://stats.stackexchange.com/questions/6758/1-step-ahead-predictions-with-dynlmdyn
からパッケージ化することになりました。 -r-パッケージ
それから数時間の実験の後、私は予測を処理するために次の関数を思いつきました。途中でかなりの数の「落とし穴」がありました。たとえば、時系列に見えない場合rbind
、予測の結果はそのstart
ようなものによって相殺されます。したがって、この回答は、単に名前を付ける場合と比較して大幅に追加されると思います。パッケージ、私はダークの答えに賛成しましたが。
したがって、機能するソリューションは次のとおりです。
dyn
パッケージを使用する
- 予測には次の方法を使用します
ForecastDynメソッド:
# 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] <- as.numeric(test[,dependentvarname])
testtraindata <- rbind( train, test )
testtraindata[,dependentvarname] <- ts( as.numeric( testtraindata[,dependentvarname] ) )
for( i in 1:Ntest ) {
result <- predict(model,newdata=testtraindata,subset=1:(Ntrain+i-1))
testtraindata[Ntrain+i,dependentvarname] <- result[Ntrain + i + 1 - start(result)][1]
}
return( testtraindata[(Ntrain+1):(Ntrain + Ntest),] )
}
使用例:
library("dyn")
# size of training and test data
N <- 6
predictN <- 10
# create training data, which we can get exact fit on, so we can check the results easily
traindata <- c(1,2)
for( i in 3:N ) { traindata[i] <- 0.5 + 1.3 * traindata[i-2] + 1.7 * traindata[i-1] }
train <- data.frame( y = ts( traindata ), foo = 1)
# create testing data, bunch of NAs
test <- data.frame( y = ts( rep(NA,predictN) ), foo = 1)
# fit a model
model <- dyn$lm( y ~ lag(y,-1) + lag(y,-2), train )
# look at the model, it's a perfect fit. Nice!
print(model)
test <- predictDyn( model, train, test, "y" )
print(test)
# nice plot
plot(test$y, type='l')
出力:
> model
Call:
lm(formula = dyn(y ~ lag(y, -1) + lag(y, -2)), data = train)
Coefficients:
(Intercept) lag(y, -1) lag(y, -2)
0.5 1.7 1.3
> test
y foo
7 143.2054 1
8 325.6810 1
9 740.3247 1
10 1682.4373 1
11 3823.0656 1
12 8686.8801 1
13 19738.1816 1
14 44848.3528 1
15 101902.3358 1
16 231537.3296 1
編集:うーん、これは非常に遅いです。subset
内のデータをデータセットの一定の数行に制限したとしても、予測ごとに約24ミリ秒かかります。または、私のタスクの場合、 0.024*7*24*8*20*10/60/60
= 1.792 hours
:-O