![](/img/trans.png)
[英]Passing different forecasting method to hierarchical time series forecast in 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
包,我有没有对其进行控制。
有几种可能的解决方案。
你可以代替ar
与Arima
:
arf <- function(dat, ...) forecast(Arima(dat, order=c(1,0,0)), ...)
如果数据是固定的,那应该返回相同的模型(尽管参数估计会略有不同)。 由于时间序列是非平稳的,因此不会为您的问题中的示例返回相同的答案。
如果您想使用比AR(1)更通用的ARIMA模型,则可以改用auto.arima()
)。
arf <- function(dat, ...) forecast(auto.arima(dat, ...)
(基于@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.