当尝试使用Rob的预测库从较小的函数组合函数时,如下所示:
> 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不能正常工作?
发布于 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
包的一部分,我无法控制它。
有几种可能的解决办法。
ar
替换为Arima
:
arf <-函数(dat,.)预报(Arima(dat,order=c(1,0,0)),.)
如果数据是平稳的,这应该返回相同的模型(尽管参数估计会略有不同)。对于问题中的例子,它不会返回相同的答案,因为时间序列是非平稳的。auto.arima()
。
arf <-函数(dat,.)预报(auto.arima(dat,.)ar
对象中:
arf <- function( dat,.){ object <- ar(dat,order.max=1,method="ols")对象$x <- dat预测(object,.)}发布于 2014-09-14 22:55:14
问题是S3方法对ar
类的预测存在缺陷。predict.ar
尝试使用ar
对象计算新数据参数。显示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))
但是对象$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)
https://stackoverflow.com/questions/25832817
复制相似问题