首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >传递预报()和ar()中的参数时R中的预测错误

传递预报()和ar()中的参数时R中的预测错误
EN

Stack Overflow用户
提问于 2014-09-14 11:39:45
回答 2查看 4.3K关注 0票数 6

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

代码语言:javascript
运行
复制
> library('forecast')
> arf <- function(data, ...) forecast(ar(data, order.max=1, method="ols"), ...)

当我试图插入一些数据时,会出现一个错误:

代码语言:javascript
运行
复制
> arf(ts(1:100, start=c(2000,1), frequency=4))
Error in ts(x, frequency = 1, start = 1) : object is not a matrix

然而,直接使用arf的主体是完美的:

代码语言:javascript
运行
复制
> 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不能正常工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-14 22:59:19

这是forecast.ar()中的一个问题(实际上不是一个bug)。所有forecast.xxx()函数都试图存储用于估计时间序列模型的数据,因为它是绘图和精确计算所需的。但是,ar()不返回数据,因此forecast.ar()试图在调用环境或父环境中查找数据。当您直接调用forecast(ar(...))时,函数成功地找到了数据,但是arf()将对ar()的调用放在了一个更深的层次,这使得forecast很难知道正在使用什么数据。

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

有几种可能的解决办法。

  1. 您可以将ar替换为Arima: arf <-函数(dat,.)预报(Arima(dat,order=c(1,0,0)),.) 如果数据是平稳的,这应该返回相同的模型(尽管参数估计会略有不同)。对于问题中的例子,它不会返回相同的答案,因为时间序列是非平稳的。
  2. 如果您愿意使用比AR(1)更通用的ARIMA模型,您可以使用auto.arima()。 arf <-函数(dat,.)预报(auto.arima(dat,.)
  3. (根据@agstudy的建议)。解决方法是确保数据存储在ar对象中: arf <- function( dat,.){ object <- ar(dat,order.max=1,method="ols")对象$x <- dat预测(object,.)}
票数 4
EN

Stack Overflow用户

发布于 2014-09-14 22:55:14

问题是S3方法对ar类的预测存在缺陷。predict.ar尝试使用ar对象计算新数据参数。显示getS3method('predict','ar')的第一行

代码语言:javascript
运行
复制
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))
    }

  .....
}

有关/窃听的线路是:

代码语言:javascript
运行
复制
 newdata <- eval.parent(parse(text = object$series))

但是对象$series没有正确的表达式/字符。因为它是隐藏在新级别的包装函数arf。这里有一个解决办法,就是为这个术语设置正确的表达式:

代码语言:javascript
运行
复制
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)

请注意;此解决方案还适用于:

代码语言:javascript
运行
复制
aa <- ts(1:100, start=c(2000,1), frequency=4)
arf(aa)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25832817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档