9

Rのパッケージを使用してベクトル自己回帰モデルを学習しようとしていvarsます。このパッケージには、返されたモデルの精度を測定する方法がありません。

accuracy具体的には、Rのパッケージの関数で定義されているように MASE を使用してforecast、VAR を使用した予測と、各コンポーネントの時系列での Arima モデルを使用した予測を比較したいと考えています (相関する可能性のある 4 つの時系列を使用しています)。によって返されたオブジェクトaccuracyを認識しません。各予測コンポーネントの MASE を取得するにはどうすればよいですか? サンプル内精度とサンプル外精度の両方を計算したいvarestvars

コード例:

library(vars)
library(forecast)
data(Canada)
v<- VAR(window(Canada, end=c(1998,4)), p=2)
accuracy(v$varresult[[1]])

の引数accuracyは lm オブジェクトであり、シリーズ 1 のトレーニング精度を次のように返します。

                       ME      RMSE       MAE           MPE      MAPE       MASE
Training set 1.536303e-15 0.3346096 0.2653946 -1.288309e-05 0.0281736 0.03914555

次のようなものを使用してサンプル外のテスト精度を取得したい (予測期間を指定する必要があるため、正確にはこれとは異なる):

 accuracy(v$varresult[[1]], window(Canada[,1], start=c(1999,1)))

ただし、これは lm オブジェクトではサポートされておらず、エラーが返されます

 Error in testaccuracy(f, x, test) : Unknown list structure

また、次のように値を直接使用すると、トレーニング セットに関する情報を必要とする MASE を取得できません。tsこれは、オブジェクトではなく値が使用されるため、off-by-one エラーが発生しやすくaccuracy、保存された時間と直接一致します。

 p<-predict(v, n.ahead=8)
 accuracy(p$fcst[[1]][,"fcst"],window(Canada[,1], start=c(1999,1)))

             ME      RMSE       MAE         MPE       MAPE      ACF1 Theil's U
Test set -0.1058358 0.8585455 0.7385238 -0.01114099 0.07694492 0.5655117  1.359761

理想的には、次のように予測する必要があります。

fr<-forecast(v$varresult[[1]], h=8)

しかし、予測のために他のシリーズが必要なため、これは機能しません。

Error in eval(expr, envir, enclos) : object 'datamat' not found

etcの機能をコピーしてパッケージを作成することもできますが、もっと簡単な方法はありますか?forecast.Arimaforecast.varresult

4

1 に答える 1

13

ドキュメントを読んでみませんか。最初の引数については次のとおりfです。

クラス「予測」のオブジェクト、または予測を含む数値ベクトル。x が省略されている場合、Arima、ets、および lm オブジェクトでも機能します。この場合、サンプル内の精度測定値が返されます。

VARクラス "forecast" のオブジェクトは返されませんが、forecasts を含む数値ベクトルを計算できます。

次に、2 番目の引数 について読んでくださいx

object と同じ長さの実際の値を含むオプションの数値ベクトル、または f の時間と重なる時系列。

OK、それはとても簡単です。の実際の値xと の予測値を指定するだけfです。

しかし、ヘルプページのさらに下にあるように、MASE 計算は、非季節時系列のサンプル内ナイーブ予測、季節時系列のサンプル内ナイーブ予測の MAE を使用してスケーリングされ、非時系列データのサンプル平均予測。」したがって、履歴データがなければその計算を行うことはできず、「予測」クラスのオブジェクトを渡さない限り、それらについてはわかりません。

ただし、それをだましてあなたが望むものを与えることは難しくありません。これを行うコードを次に示します。

trainingdata <- window(Canada, end=c(1998,4))
testdata <- window(Canada, start=c(1999,1))
v <- VAR(trainingdata, p=2)
p <- predict(v, n.ahead=8)
res <- residuals(v)
fits <- fitted(v)
for(i in 1:4)
{
  fc <- structure(list(mean=p$fcst[[i]][,"fcst"], x=trainingdata[,i],
     fitted=c(NA,NA,fits[,i])),class="forecast")
  print(accuracy(fc,testdata[,i]))
}
于 2013-08-18T10:44:00.263 に答える