ts(x) 中的错误:'ts' 对象必须具有一个或多个观察值

Error in ts(x) : 'ts' object must have one or more observations

当我使用 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))

错误return是:

Error in ts(x) : 'ts' object must have one or more observations

可能是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))

代码也 运行ning 正确。我认为这可能是 ar 函数中的一个错误,这个问题在某种程度上与范围有关。对此有什么想法吗?

问题与范围界定有关。 forecast() 尝试查找用于拟合模型的时间序列。 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))

或者,使用 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))