2014-09-14 3 views
5

을 : 나는 오류가예측 R의 오류 예측에 인수 주위에 전달()와 AR()과 같이 롭 Hyndman의 예측 라이브러리를 사용하여 작은 것에서 함수 구성하려고 할 때

> library('forecast') 
> arf <- function(data, ...) forecast(ar(data, order.max=1, method="ols"), ...) 

시도 일부 데이터를 연결하기 :

> arf(ts(1:100, start=c(2000,1), frequency=4)) 
Error in ts(x, frequency = 1, start = 1) : object is not a matrix 

그러나, ARF의 몸을 사용하여 직접 완벽하게 작동합니다 :

> forecast(ar(ts(1:100, start=c(2000,1), frequency=4), order.max=1,method="ols")) 
     Point Forecast Lo 80 Hi 80 Lo 95 Hi 95 
2025 Q1   101 101 101 101 101 
2025 Q2   102 102 102 102 102 
2025 Q3   103 103 103 103 103 
2025 Q4   104 104 104 104 104 
2026 Q1   105 105 105 105 105 
2026 Q2   106 106 106 106 106 
2026 Q3   107 107 107 107 107 
2026 Q4   108 108 108 108 108 
2027 Q1   109 109 109 109 109 
2027 Q2   110 110 110 110 110 

arf가 정상적으로 작동하지 않는 이유는 무엇입니까?

+1

이 매우 참으로 weired된다. 'predict.Arima' 메소드로'ar '을'auto.arima'로 대체하면서 이것을 실행할 수 있었기 때문에'forecast.ar' 메소드의 버그처럼 보입니다. @RobHyndman –

답변

3

forecast.ar() 문제 (정말 버그)입니다 :이 솔루션으로도 사용할 수 있습니다. 모든 forecast.xxx() 함수는 플롯 및 정확도 계산에 필요하므로 시계열 모델을 추정하는 데 사용되는 데이터를 저장하려고합니다. 그러나 ar()은 데이터를 반환하지 않으므로 forecast.ar()은 호출 환경 또는 상위 환경에서 데이터를 찾으려고 시도합니다. forecast(ar(...))을 직접 호출하면이 함수가 데이터를 찾지 만 arf()ar()에 전화를 한 단계 더 깊게 호출하여 forecast에서 어떤 데이터가 사용되었는지 파악하는 것이 훨씬 어려워집니다.

데이터를 더 잘 보일 수 있도록 기능을 수정할 수는 있지만 (예 : 조부모 환경에서도 마찬가지 임) predict.ar() (stats 패키지의 일부) 유사한 오류가 발생하기 때문에 구성이 계속 실패합니다. 이 더 좋을 경우 ar()이 데이터를 반환하지만 ar()stats 패키지의 일부이며 제어 할 수 없습니다.

가능한 해결책은 여러 가지가 있습니다.

  1. 당신은 Arimaar을 대체 할 수있는 : 데이터 (매개 변수 추정이 약간 다를 수 있지만) 고정 경우 같은 모델을 반환해야

    arf <- function(dat, ...) forecast(Arima(dat, order=c(1,0,0)), ...) 
    

    합니다. 시계열이 고정적이지 않기 때문에 질문에있는 예제에 대해 동일한 대답을 반환하지 않습니다.

  2. AR (1)보다 일반적인 ARIMA 모델을 사용하려는 경우 auto.arima()을 대신 사용할 수 있습니다.

    arf <- function(dat, ...) forecast(auto.arima(dat, ...) 
    
  3. (@agstudy의 제안에 기반 함). 해결 방법은 데이터가 ar 객체에 저장되어 있는지 확인하는 것입니다

    arf <- function(dat, ...) 
    { 
        object <- ar(dat, order.max=1, method="ols") 
        object$x <- dat 
        forecast(object,...) 
    } 
    
+0

불행히도, 저는 비 정적 데이터 @RobHyndman을 사용하고 있습니다 .3 번째 제안 (해결 방법)은 완벽하게 작동했습니다. – CrystalCuckoo

2

문제는 ar 클래스를 예측하는 S3 방법의 버그입니다. predict.arar 개체를 사용하여 newdata 매개 변수를 평가 해보십시오. getS3method('predict','ar')

function (object, newdata, n.ahead = 1L, se.fit = TRUE, ...) 
{ 
    if (n.ahead < 1L) 
     stop("'n.ahead' must be at least 1") 
    if (missing(newdata)) { 
     newdata <- eval.parent(parse(text = object$series)) 
     if (!is.null(nas <- object$call$na.action)) 
      newdata <- eval.parent(call(nas, newdata)) 
    } 

    ..... 
} 

관련/도청 라인의 첫 번째 라인을 표시하는 것입니다 :

newdata <- eval.parent(parse(text = object$series)) 

그러나 객체 $ 시리즈가 올바른 표현/문자가 없습니다. 래퍼 함수 arf의 새로운 레벨에 의해 숨겨지기 때문입니다. 다음은이 용어에 맞는 표현식을 설정하는 것입니다.

arf <- function(dat, ...) 
    { 
    object <- ar(dat, order.max=1, method="ols") 
    object$series <- as.character(as.expression(as.list(match.call())$dat)) 
    forecast(object,...) 
} 
arf(ts(1:100, start=c(2000,1), frequency=4) 

참고 :

aa <- ts(1:100, start=c(2000,1), frequency=4) 
arf(aa) 
+0

질문 후 11 시간이 지난 후에 우리는 서로 4 분 이내로 대답했습니다. 답을 마칠 때까지 저는 이것을 보지 못했습니다. –

+0

@RobHyndman mee 너무! 나는 너의 대답도 보지 못했다! 나는 공휴일에있을 수 있으므로 어쩌면 내가 도울 수 있다고 말하고있다. 나는 해결 방법이며 실제 해결책이 아니기 때문에 나는 나의 대답을 삭제할 것이라고 생각한다. ... – agstudy

+0

당신의 솔루션은 유용하다. OP는'ar()'을'method = "ols"'와 함께 사용하려고합니다. –