2

季節ダミー変数を持つ線形モデルでCVを実行しようとしているため、ランダムサンプルを取得できません。

y = rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12) 
x = months(ISOdate(2012,1:12,1))
reg.data = data.frame(y, x)
model = lm(y ~ x, data = reg.data)

私のCV機能は次のとおりです。

cross.valid = function(model, min.fit = as.integer(nrow(model$model)*0.7), h = 1)
{
  dados = model$model
  n.rows = nrow(dados)

  results = data.frame(pred = numeric(), actual = numeric())

  for (i in seq(1, n.rows - min.fit - h + 1, by = h))
  {
   dados.train = dados[1:(i + min.fit - 1), ]
   model <- update(model, data = dados.train)

   dados.pred = dados[(i + min.fit):(i + min.fit + h - 1), -1, drop = FALSE]

   predic = predict(model, newdata = dados.pred, interval = 'prediction')
   actual = dados[(i + min.fit):(i + min.fit + h - 1), 1]
   results = rbind(results, data.frame(pred = predic[1:h, 'fit'], actual = actual))
  }

  results
}

例:

cv1 = cross.valid(model, h = 1)
mae = with(cv1, mean(abs(actual - pred )))
print(mae)

さまざまな範囲( h )のMAE値が近すぎます。コード自体は有効ですか?これを行うためのより良いソリューション/パッケージはありますか?

ありがとう!

4

1 に答える 1

3

あなたの機能に何か問題はないと思います。forecastパッケージを調査します。それはあなたが必要とする多くの機能を提供すると思います。

私はあなたの関数を簡潔に書き直しました:

set.seed(1)
y = rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12) 
x = months(ISOdate(2012,1:12,1))
reg.data = data.frame(y, x)

pred.set<-function(i,h) {
  train<-reg.data[1:(i + min.fit - 1),]
  test<-reg.data[(i + min.fit):(i + min.fit + h - 1),]
  pred<-predict(lm(y~x, data=train), newdata=test)
  abs(test$y - pred)
}

pred.by.horiz<-function(h) 
               mean(sapply(seq(1, nrows - min.fit - h + 1, by = h),pred.set,h=h))

pred.by.horiz関数(および後処理)の出力と正確に一致します。

あなたが言ったように、地平線はMAEに影響を与えていないようです:

mae.by.h<-sapply(seq(nrows-min.fit),pred.by.horiz)
plot(mae.by.h,type='l',col='red',lwd=2,xlab='Horizon',ylab='Mean absolute error')

地平線によるMAE

おそらく、予測期間が長くなるにつれて平均誤差が大きくなると予想していました。多くの時系列モデルの場合、これは当てはまりますが、月の線形モデルでは、データを追加しても、シリーズの次のポイントを予測するのに役立ちません(12か月以上追加しない限り)。

たとえば、hが1の場合に何が起こるかを考えます。84か月のデータ、各月に7ポイントのデータから始めます。ここで、次の1月になる1つのデータポイントを追加し、2月の結果を予測しようとします。ただし、追加のデータポイントは、次の1月を予測するのに役立つだけです。つまり、線形関数がどのように機能するかです。モデルの概要を見てください。

lm(y ~ x, data = reg.data)
Coefficients:
(Intercept)      xAugust    xDecember    xFebruary     xJanuary  
   17.11380    -32.74962    -17.81076     -0.03235     -6.63998  
      xJuly        xJune       xMarch         xMay    xNovember  
  -26.69203    -17.41170      2.96735     -7.11166    -25.43532  
   xOctober   xSeptember  
  -33.56517    -36.93474 

各予測は、切片と予測月の2つの変数のみに基づいて行われます。したがって、1ポイント先を予測することは、5ポイント先を予測することよりも簡単ではありません。これが、地平線が増加してもMAEが上昇しない理由です。問題は、MAE関数ではなく、データのモデル化方法にあります。

私があなたの関数について完全に理解していなかったことの1つは、h反復ごとに設定された列車のサイズをインクリメントすることにした理由です。1ずつインクリメントしようとするとどうなるかを見るとわかります。

# Code to increment by 1
pred.by.horiz2<-
  function(h) mean(sapply(seq(1, nrows - min.fit - h + 1, by = 1),pred.set,h=h))
mae.by.h2<-sapply(seq(nrows-min.fit),pred.by.horiz2)
plot(mae.by.h2,type='l',col='red',lwd=2,xlab='Horizon',ylab='Mean absolute error')

hを1ずつインクリメントするときの地平線によるMAE

ここでのパターンは複雑ですが、次のポイントを使用できるように地平線が十分に大きい場合、MAEは12で減少し始めることに注意してください。

于 2012-12-31T05:14:04.813 に答える