4

こんにちは、時系列の予測を行うためにパッケージ予測を使用しています。最終予測プロットでシリーズのログを取り消す方法を知りたいです。予測パッケージでは、シリーズのログを解除する方法がわかりません。次に例を示します。

library(forecast)
data <- AirPassengers
data <- log(data) #with this AirPassengers data not nessesary to LOG but with my private data it is...because of some high picks...
ARIMA <- arima(data, order = c(1, 0, 1), list(order = c(12,0, 12), period = 1)) #Just a fake ARIMA in this case... 
plot(forecast(ARIMA, h=24)) #but my question is how to get a forecast plot according to the none log AirPassenger data

ここに画像の説明を入力

したがって、画像はログに記録されます。同じ ARIMA モデルが必要ですが、ログに記録されたデータはありません。

4

3 に答える 3

11

@ndoogan によって提案されたハックを使用する必要はありません。forecast.Arima変換を元に戻す機能が組み込まれています。次のコードは、必要なことを行います。

fc <- forecast(ARIMA, h=24, lambda=0)

さらに良いことに、変換をモデル自体に組み込みます。

ARIMA <- Arima(data, order=c(1,0,1), list(order=c(1,0,1),period=12)), lambda=0)
fc <- forecast(ARIMA, h=24)

これを行うには、パッケージの関数ではなく、パッケージのArima関数を使用する必要があることに注意してください。forecastarimastats

@Hemmo は、この逆変換が予測分布の平均を与えないことは正しいため、最適な MSE 予測ではありません。ただし、予測分布の中央値が得られるため、最適な MAE 予測が得られます。

最後に、@Swiss12000 が使用する偽のモデルは、季節部分の頻度が 1 であるためほとんど意味がなく、非季節部分と混同されます。おそらく、上記のコードで使用したモデルを意味していると思います。

于 2013-03-31T00:11:03.210 に答える
8

@ndooganの答えの問題は、対数が線形変換ではないことです。つまり、E[exp(y)] != exp(E[y]) です。ジェンセンの不等式は、実際には E[exp(y)] >= exp(E[y]) を与えます。簡単なデモンストレーションを次に示します。

set.seed(1)
x<-rnorm(1000)
mean(exp(x))
[1] 1.685356
exp(mean(x))
[1] 0.9884194

予測に関するケースは次のとおりです。

# Simulate AR(1) process
set.seed(1)
y<-10+arima.sim(model=list(ar=0.9),n=100)

# Fit on logarithmic scale
fit<-arima(log(y),c(1,0,0))

#Simulate one step ahead
set.seed(123)
y_101_log <- fit$coef[2]*(1-fit$coef[1]) + 
             fit$coef[1]*log(y[100]) + rnorm(n=1000,sd=sqrt(fit$sigma2))

y_101<-exp(y_101_log) #transform to natural scale

exp(mean(y_101_log)) # This is exp(E(log(y_101)))
[1] 5.86717          # Same as exp(predict(fit,n.ahead=1)$pred) 
                     # differs bit because simulation

mean(y_101)          # This is E(exp(log(y_101)))=E(y_101)
[1] 5.904633

# 95% Prediction intervals:

#Naive way:
pred<-predict(fit,n.ahead=1)
c(exp(pred$pred-1.96*pred$se),exp(pred$pred+1.96*pred$se))
pred$pred pred$pred 
 4.762880  7.268523 

# Correct ones:
quantile(y_101,probs=c(0.025,0.975))
    2.5%    97.5% 
4.772363 7.329826 

これは、一般的な意味での問題の解決策も提供します。

  1. モデルに合わせる
  2. そのモデルから複数のサンプルをシミュレートします (たとえば、上記の 1 ステップ先の予測)
  3. シミュレートされたサンプルごとに、逆変換を行って元のスケールの値を取得します
  4. これらのシミュレートされたサンプルから、期待値を通常の平均として計算するか、信頼区間が必要な場合は経験的分位数を計算できます。
于 2013-03-28T13:47:42.960 に答える
3

これはちょっとしたハックですが、やりたいことができるようです。適合モデルに基づくARIMA:

fc<-forecast(ARIMA,h=24)
fc$mean<-exp(fc$mean)
fc$upper<-exp(fc$upper)
fc$lower<-exp(fc$lower)
fc$x<-exp(fc$x)

今それをプロット

plot(fc)

ここに画像の説明を入力

于 2013-03-28T04:46:52.923 に答える