ts(x) 中的错误:“ts”对象必须有一个或多个观察结果

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”对象必须有一个或多个观察结果

可能是由arar.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功能上的一个错误,问题在某种程度上与范围有关。对此有什么想法吗?

Rob*_*man 5

问题与范围界定有关。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)