![](/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.