24

私は時系列で lm を使用していますが、これは実際には非常にうまく機能し、超高速です。

私のモデルは次のとおりです。

> formula <- y ~ x

これをトレーニング セットでトレーニングします。

> train <- data.frame( x = seq(1,3), y = c(2,1,4) )
> model <- lm( formula, train )

...そして、新しいデータの予測を行うことができます:

> test <- data.frame( x = seq(4,6) )
> test$y <- predict( model, newdata = test )
> test
  x        y
1 4 4.333333
2 5 5.333333
3 6 6.333333

これは非常にうまく機能し、本当に高速です。

ラグ変数をモデルに追加したいと考えています。ここで、元のトレーニング セットを拡張することでこれを行うことができます。

> train$y_1 <- c(0,train$y[1:nrow(train)-1])
> train
  x y y_1
1 1 2   0
2 2 1   2
3 3 4   1

式を更新します。

formula <- y ~ x * y_1

...そしてトレーニングはうまくいきます:

> model <- lm( formula, train )
> # no errors here

ただし、問題は、バッチ方式でテスト セットに y_1 を入力する方法がないため、「予測」を使用する方法がないことです。

さて、他の多くの回帰については、式で表現するための非常に便利な方法がありpoly(x,2)、これらは変更されていないトレーニング データとテスト データを直接使用して機能します。

それで、数式でラグ変数を表現する方法があるのではないかと思っています。それをpredict使用できますか?理想的には:

formula <- y ~ x * lag(y,-1)
model <- lm( formula, train )
test$y <- predict( model, newdata = test )

...トレーニングとテストのデータセットを拡張する必要がなく (それが正しい言葉かどうかはわかりません)、predict直接使用できるだけですか?

4

4 に答える 4

17

たとえば、ラグ演算子を提供するdynlmパッケージを見てください。より一般的には、計量経済学と時系列のタスク ビューには、さらに多くの情報が表示されます。

これがその例の始まりです -- 1 か月と 12 か月の遅れです。

R>      data("UKDriverDeaths", package = "datasets")
R>      uk <- log10(UKDriverDeaths)
R>      dfm <- dynlm(uk ~ L(uk, 1) + L(uk, 12))
R>      dfm

Time series regression with "ts" data:
Start = 1970(1), End = 1984(12)

Call:
dynlm(formula = uk ~ L(uk, 1) + L(uk, 12))

Coefficients:
(Intercept)     L(uk, 1)    L(uk, 12)  
      0.183        0.431        0.511  

R> 
于 2012-10-27T02:53:26.893 に答える
6

に関する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

于 2012-10-27T09:28:03.090 に答える
1

ここに考えがあります:

新しいデータ フレームを作成しませんか? 必要なリグレッサーをデータ フレームに入力します。必要な変数のすべてのラグに対して L1、L2、...、Lp などの列を作成すると、断面タイプの回帰とまったく同じように関数を使用できます。

フィッティング関数と予測関数を呼び出すたびにデータを操作する必要はなく、データを 1 回変換するので、かなり高速になります。私は、Eviews と Stata が遅延演算子を提供していることを知っています。便利なところがあるのも事実です。しかし、「lm」計算などのすべての関数が必要でない場合は、非効率的です。実行する反復が数十万回あり、予測だけが必要な場合、または予測と BIC や AIC などの情報基準の値が必要な場合は、実行しない計算を行わないようにすることで、速度で「lm」を打ち負かすことができます。使用 -- 関数に OLS 推定器を記述するだけで、準備完了です。

于 2017-12-03T14:35:11.210 に答える