Kat*_*ern 3 r forecasting dplyr
当我使用forecast库进行预测时,我注意到以下代码没有按预期运行:
library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
get <- function (df1){
ts1 <- ts((df1%>%filter(gp==2))$dt)
as.numeric(forecast(ar(ts1),15)$mean)
}
print(get(df1))
Run Code Online (Sandbox Code Playgroud)
错误返回是:
ts(x) 中的错误:“ts”对象必须有一个或多个观察结果
可能是由ar或ar.burg功能引起的。因为如果您将功能更改为ets或其他功能,则该功能运行良好。
更奇怪的是,如果把代码改成:
library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)
get <- function (ts1){
as.numeric(forecast(ar(ts1),15)$mean)
}
print(get(ts1))
Run Code Online (Sandbox Code Playgroud)
代码也运行正常。我认为这可能是ar功能上的一个错误,问题在某种程度上与范围有关。对此有什么想法吗?
问题与范围界定有关。forecast()尝试找到用于拟合模型的时间序列。来自预测包的函数(例如ets)将这些信息存储在模型对象中,因此很容易forecast()找到它。但是ar()来自 stats 包,它不存储用于拟合模型的时间序列。于是forecast()去寻找它。如果你在get()函数之外运行你的代码,它工作正常,因为forecast()设法ts1在本地环境中找到对象。但在get()函数内它会导致错误。
一个简单的解决方法是在调用之前将信息添加到拟合模型中forecast:
library(forecast)
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)
get <- function (ts1){
fit <- ar(ts1)
fit$x <- ts1
as.numeric(forecast(fit,15)$mean)
}
print(get(ts1))
Run Code Online (Sandbox Code Playgroud)
或者,使用predict代替forecast:
library(dplyr)
df1 <- data.frame(gp=gl(20,5), dt=seq(1:100))
ts1 <- ts((df1%>%filter(gp==2))$dt)
get <- function (ts1){
fit <- ar(ts1)
as.numeric(predict(fit,n.ahead=15)$pred)
}
print(get(ts1))
Run Code Online (Sandbox Code Playgroud)