1

Rのdynライブラリを使用して、単純な遅延時系列回帰を予測しようとして います。この質問は有用な出発点でしたが、誰かが説明できることを期待している奇妙な動作が発生しています。

これが最小限の実例です。

library(dyn)

# Initial data
y.orig <- arima.sim(model=list(ar=c(.9)),n=10)
x1.orig <- rnorm(10)
data <- cbind(y=y.orig, x1=x1.orig)

# This model, with a single lag term, predicts from t=2
mod1 <- dyn$lm(y ~ lag(y, -1), data)
y.new <- window(y.orig, end=end(y.orig) + c(5,0), extend=TRUE)
newdata1 <- cbind(y=y.new)
predict(mod1, newdata1)

# This one, with a lag plus another predictor, predicts from t=1 on
mod2 <- dyn$lm(y ~ lag(y, -1) + x1, data)
y.new <- window(y.orig, end=end(y.orig) + c(5,0), extend=TRUE)
x1.new <- c(x1.orig, rnorm(5))
newdata2 <- cbind(y=y.new, x1=x1.new)
predict(mod2, newdata2)

なぜ2つの違いがあるのですか?誰かがdynを使用して私の「mod1」を予測する方法を提案できますか?前もって感謝します。

4

1 に答える 1

1

両方mod1とでmod2予測を開始しt=2ます。の予測ベクトルはでmod2始まりますt=1が、そのNA。一方が2で始まり、もう一方が1で始まる理由についてpredictは、式の右辺の変数をマージすることに注意してください。この場合、 t = 1で始まるので、t=2で始まることがmod1わかります。一方、マージしてt = 1で始まる系列を取得する場合(t = 1で始まるため)。dynを含まないこれを試してください:lag(y, -1)ymod2lag(y, -1)x1x1

> start(with(as.list(newdata1), merge.zoo(lag(y, -1))))
[1] 2
> start(with(as.list(newdata2), merge.zoo(lag(y, -1), x1)))
[1] 1

t = 1から開始したい場合はpredict(mod1, newdata1)、独自の切片列を追加し、デフォルトの切片を削除して重複を避けることができます。これで、RHSには1から始まるシリーズがあるため、1から開始するように強制されます。

data.b <- cbind(y=y.orig, x1=x1.orig, Intercept = 1)
mod.b <- dyn$lm(y ~ Intercept + lag(y, -1) - 1, data.b)

newdata.b <- cbind(Intercept = 1, y = y.new)
predict(mod.b, newdata.b)

2番目の質問に関しては、予測するmod1場合はを使用しますfitted(mod1)

それが基本的にすべてどのように機能するかについていくつかの3番目の質問が潜んでいるようですので、おそらくこれはそれを明らかにします。dynが行うのは、数式の時系列を揃えてから、通常どおりlmpredict実行できるようにすることだけです。たとえば、を使用して位置合わせされたモデルフレームを作成する場合、dyn$model.frame他のすべては通常lmおよび通常predictを使用して実行できdyn、それ以降は関与しません。以下は、位置合わせされたモデルフレームで通常の動作を実行することを除いて、質問mod1aと同様です。あなたがとその時とを理解しているなら、そして似ています。mod1lmmod1a lmpredictmod1predict

## mod1 and mod1a are similar

# from code in the question
mod1 <- dyn$lm(y ~ lag(y, -1), data = data)
mod1

# redo it using a plain lm by applying dyn to model.frame
mf <- dyn$model.frame(y ~ lag(y, -1), data = data)
mod1a <- lm(y ~ `lag(y, -1)`, mf)
mod1a

## the two predicts below are similar

# the 1 ensures its an mts rather than ts but is otherwise not used
newdata1 <- cbind(y=y.new, 1) 
predict(mod1, newdata1)

newdata1a <- cbind(1, `lag(y, -1)` = lag(y.new, -1))
predict(mod1a, newdata1a)
于 2012-06-27T00:05:28.447 に答える