繁体   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