簡體   English   中英

當在Forecast()和ar()中傳遞參數時,R中的預測誤差

[英]Forecasting error in R when passing around arguments in forecast() and ar()

當嘗試使用Rob 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無法正常工作?

這是forecast.ar()的問題(不是真正的錯誤forecast.ar() 所有forecast.xxx()函數都會嘗試存儲用於估計時間序列模型的數據,這是繪圖和精度計算所需的。 但是, ar()不會返回數據,因此forecast.ar()嘗試在調用環境或父環境中查找數據。 當您直接調用forecast(ar(...)) ,該函數設法查找數據,但是arf()將對ar()的調用更深一層,這使得forecast很難弄清楚正在查詢的數據是什么。用過的。

我可以修改該函數以使其看起來更難讀取數據(即,也可以在祖父母環境中查看),但是構造仍將失敗,因為predict.ar()stats包的一部分)會導致類似的錯誤。 這將是好得多 ,如果ar()返回的數據,但ar()是部分stats包,我有沒有對其進行控制。

有幾種可能的解決方案。

  1. 你可以代替arArima

     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,...) } 

問題是用於ar類的S3方法預測中的錯誤。 predict.ar嘗試使用ar對象評估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))

但是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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM