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