r - ts(x) : 'ts' object must have one or more observations 错误

标签 r dplyr forecasting

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

错误返回为:

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))

代码也能正常运行。我认为这可能是 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))

关于r - ts(x) : 'ts' object must have one or more observations 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42432595/

相关文章:

R:将曲线拟合到点:使用什么线性/非线性模型?

r - 使用 F# R 类型提供程序和 ggplot2“没有为 Deedle.Frame 类型注册转换器”

在 RStudio 中调用 C 导致崩溃

r - STL .series 中的错误不是周期性的

python - 在 Python 中使用 Holt-Winters 进行预测

多级别 R Markdown 项目符号列表

引用另一个表中的列名以插入共享 ID 中的值

r - 如何使用 dplyr 计算与 rowmean 的比率

R、dplyr 和雪 : how to parallelize functions which use dplyr

r - 用于生成预测的 Plyr