在forecast()和ar()中传递参数时,R中出现预测错误
当尝试使用Rob Hyndman的预测库从较小的函数组成函数时,如下所示:在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
> 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
类中有一个bugpredict.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,...)
}