Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在forecast()和ar()中传递参数时,R中出现预测错误_R_Time Series_Forecasting - Fatal编程技术网

在forecast()和ar()中传递参数时,R中出现预测错误

在forecast()和ar()中传递参数时,R中出现预测错误,r,time-series,forecasting,R,Time Series,Forecasting,当尝试使用Rob Hyndman的预测库从较小的函数组成函数时,如下所示: > library('forecast') > arf <- function(data, ...) forecast(ar(data, order.max=1, method="ols"), ...) 但是,直接使用arf的主体非常有效: > forecast(ar(ts(1:100, start=c(2000,1), frequency=4), order.max=1,method="ols

当尝试使用Rob Hyndman的预测库从较小的函数组成函数时,如下所示:

> library('forecast')
> arf <- function(data, ...) forecast(ar(data, order.max=1, method="ols"), ...)
但是,直接使用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不能正常工作?

问题是S3方法predict for
ar
类中有一个bug
predict.ar
尝试使用
ar
对象计算新数据参数。显示
getS3method('predict','ar')的第一行

函数(对象,新数据,n.ahead=1L,se.fit=TRUE,…)
{
如果(正前方<1L)
停止(“'n.ahead'必须至少为1”)
如果(缺少(新数据)){
newdata这是
forecast.ar()
中的一个问题(并非真正的错误)。所有
forecast.xxx()
函数都会尝试存储用于估计时间序列模型的数据,因为这是绘图和精度计算所需的数据。但是,
ar()
不会返回数据,因此
forecast.ar()
尝试在调用环境或父环境中查找数据。直接调用
forecast(ar(…)
时,函数会设法查找数据,但
arf()
会调用
ar()
更深一层,使得
forecast
更难找出正在使用的数据

我可以修改函数,使其更难查找数据(即,也可以查看祖父母环境),但是构造仍然会失败,因为
predict.ar()
(属于
stats
包的一部分)将导致类似的错误。如果
ar()
返回数据会更好,但是
ar()
stats
包的一部分,我无法控制它

有几种可能的解决办法

  • 您可以将
    ar
    替换为
    Arima

    arf <- function(dat, ...) forecast(Arima(dat, order=c(1,0,0)), ...)
    
  • (基于@agstudy的建议)。解决方法是确保数据存储在
    ar
    对象中:

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

    arf这确实很奇怪。它看起来像是
    forecast.ar
    方法中的一个bug,因为我能够用
    forecast.Arima
    方法运行它,同时用
    auto.Arima
    替换
    ar
    方法。让我们等待@RobHyndman11小时后,我们在4分钟内互相回答了,直到我看到这个问题完成我的回答。@RobHyndman mee也是!我也没有看到你的答案!我是说你可以在假期,所以也许我可以帮你:)我想我会删除我的答案,因为这是一种变通方法,不是真正的解决方案……我们把它们结合起来怎么样,因为如果OP真的想将
    ar()
    method=“ols”一起使用,你的解决方案很有用
    @RobHyndman当然,教授,你可以随意使用我的答案。最好是我用你的答案来修改我的答案(更好的英语和更好的“你的”科目知识)。不幸的是,我使用的是非平稳数据@RobHyndman。你的第三个建议(变通方法)对我非常有效。
     newdata <- eval.parent(parse(text = object$series))
    
    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)
    
    arf <- function(dat, ...) forecast(Arima(dat, order=c(1,0,0)), ...)
    
    arf <- function(dat, ...) forecast(auto.arima(dat, ...)
    
    arf <- function(dat, ...) 
    {
      object <- ar(dat, order.max=1, method="ols")
      object$x <- dat
      forecast(object,...)
    }