4

バックグラウンド

R を使用して系列の次の値を予測します。

問題

次のコードは、一定のノイズを含む曲線のモデルを生成してプロットします。

slope = 0.55
offset = -0.5
amplitude = 0.22
frequency = 3
noise = 0.75
x <- seq( 0, 200 )
y <- offset + (slope * x / 100) + (amplitude * sin( frequency * x / 100 ))
yn <- y + (noise * runif( length( x ) ))

gam.object <- gam( yn ~ s( x ) + 0 )
plot( gam.object, col = rgb( 1.0, 0.392, 0.0 ) )
points( x, yn, col = rgb( 0.121, 0.247, 0.506 ) )

予想通り、このモデルは傾向を示しています。問題は、後続の値を予測することです。

p <- predict( gam.object, data.frame( x=201:210 ) )

プロットすると予測が正しく見えない:

df <- data.frame( fit=c( fitted( gam.object ), p ) )
plot( seq( 1:211 ), df[,], col="blue" )
points( yn, col="orange" )

予測値 (201 以降) が低すぎるようです。

質問

  1. 示されているように、予測値は実際に最も正確な予測ですか?
  2. そうでない場合、どのように精度を向上させることができますか?
  3. fitted.values( gam.object )2 つのデータセット (とp)を連結するより良い方法は何ですか?
4

1 に答える 1

3
  1. 「真」に追加するすべてのエラーがy0 より大きいため、シミュレートされたデータは奇妙です (ではなくrunifに数値を作成します)。[0,1][-1,1]
  2. モデル内の切片項が許可されると、問題はなくなります。

例えば:

gam.object2 <- gam( yn ~ s( x ))
p2 <- predict( gam.object2, data.frame( x=201:210 ))
points( 1:211, c( fitted( gam.object2 ), p2), col="green")

切片のないモデルで系統的に過小評価される理由はgam、推定された平滑化関数で合計がゼロになるという制約を使用している可能性があります。ポイント2は、最初と2番目の質問に答えると思います。

gam-object は ではないため、3 番目の質問を明確にする必要がありdata.frameます。2 つのデータ型が混在することはありません。

より完全な例:

slope = 0.55
amplitude = 0.22
frequency = 3
noise = 0.75
x <- 1:200
y <- (slope * x / 100) + (amplitude * sin( frequency * x / 100 ))
ynoise <- y + (noise * runif( length( x ) ))

gam.object <- gam( ynoise ~ s( x ) )
p <- predict( gam.object, data.frame( x = 1:210 ) )

plot( p, col = rgb( 0, 0.75, 0.2 ) )
points( x, ynoise, col = rgb( 0.121, 0.247, 0.506 ) )
points( fitted( gam.object ), col = rgb( 1.0, 0.392, 0.0 ) )
于 2010-12-28T09:58:12.130 に答える