2013-03-28 1 views
3

안녕하세요 나는 시계열 예측을하기 위해 예측 된 패키지를 사용합니다. 최종 예측 음모에 대한 로그를 해제하는 방법을 알고 싶습니다. 예측 패키지를 통해 내 시리즈의 로그를 해제하는 방법을 알 수 없습니다. 패키지 예측을 사용하는 동안 시계열을 해제 로그

enter image description here

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 모델을 원하지만 로그되지 않은 데이터는 갖고 싶지 않습니다.

+0

지수 함수는 로그 함수의 역입니다. – ndoogan

+0

@ndoogan 사실이지만 유용하지는 않습니다. –

답변

2

이것은 약간의 해킹이지만 원하는대로 할 수 있습니다. 당신의 장착 모델 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) 

지금 @ ndoogan의 대답과는

plot(fc) 

enter image description here

+0

정말 고마워요. 정확히 내가 원했던 것. ;) – S12000

+1

log (E (y))는 E (log (y))와 같지 않다는 점에 유의하십시오. 위의 변환을 사용하면 예측에 약간의 편향이 있습니다. –

+0

@hemmo SO의 정신으로 OP를 위해 새롭고 더 나은 답변을 제공해 주시겠습니까? 또는 내가 게시 한 것을 편집하십시오. 또한 log (exp (y))! = exp (log (y))가 의미하는 바를 제공 할 수 있습니까? 그것은 정밀한 것입니까? 더 깊은 무엇인가? – ndoogan

7

문제 플롯은 대수 선형 변환되지 않는 것입니다. 즉, E [exp (y)]! = exp (E [y])를 의미합니다. Jensen's inequality 실제로 그 E [exp (y)]> = exp (E [y])를 제공합니다.

  • 모델에 맞게

    1. : 또한 일반적인 의미에서 문제에 대한 솔루션을 제공이

      # 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 
      

      : 여기

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

      예측에 관한 사건 : 다음은 간단한 데모입니다 해당 모델의 여러 샘플을 시뮬레이트합니다 (예 : 위와 같이 한 단계 앞으로 예측).

    2. 각 시뮬레이션 된 샘플에 대해 역 변형을 수행하여 원래 눈금의 값을 얻습니다.
    3. 이러한 시뮬레이션 된 샘플에서 예상 평균값을 평균으로 계산하거나 신뢰 구간이 필요한 경우 경험적 분위를 계산할 수 있습니다.
  • 6

    @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) 
    

    참고이 작업을 수행 할 forecast 패키지에서 Arima 기능을 사용할 필요가 , stats 패키지의 arima 기능이 아닙니다.

    @Hemmo는이 역 변환이 예측 분포의 평균을 제공하지 않으므로 올바른 MSE 예측은 아닙니다. 그러나 예측 분포의 중앙값을 제공하므로 최적의 MAE 예측을 제공합니다.

    마지막으로 @ Swiss12000에서 사용하는 가짜 모델은 계절성 부분의 빈도가 1이므로 의미가 없으므로 비 계절성 부분과 혼동됩니다. 아마 위의 코드에서 사용한 모델을 의미했을 것입니다.

    +0

    여기에 좋은 답변이 있는지 잘 모르겠습니다. ARIMA 예측은 원래 규모의 예측을 반환합니다. 따라서 ARIMA에 전달 된 것이므로 로그 (Airline Passengers)에 대한 예측이 반환됩니다. 문제는 로그 (Airline Passengers)의 예상을 Airline 승객에게 다시 돌려주는 방법입니다. 나는 그것을 exp (logAirlinepassengers)와 똑같은 것으로 생각했을 것이다. 그러나 당신 중 일부가 지적했듯이 그것이 옳다고 나는 생각하지 않는다. 나는이 문제에 지금 당장 직면 해있다. 누군가가 추가 통찰력을 가지고 있다면 나는 그것을 감사 할 것입니다. – Windstorm1981

    +1

    예측 패키지의 v7에서 평균값을 반환하는 옵션이 제공됩니다 (현재 github에 있음). –

    관련 문제