我的目标是在每次改变时拟合模型并产生预测 y和x变量。这将使我的代码更简洁。
当我尝试预测测试时间序列时 R抛出一个错误: eval(expr,envir,enclos)中的错误:object' train'未找到 但是火车是在当地环境中产生的 如果我将火车移动到全球环境,则没有错误
我需要做什么才能将所有语句都包含在函数中?
library(fpp)
y <- (1:60)
z <- y + rnorm(60)
my.df <- data.frame(y,z)
NFcst <- 30
my.fcast <- fcast('y','z',my.df,NFcst)
fcast <- function(a,b,df,h) {
model <- paste(a,'~',b)
x <- ts(data=df)
train.end <- time(x)[nrow(x)-h]
test.start <- time(x)[nrow(x)-h+1]
train <- window(x,end=train.end)
test <- window(x,start=test.start)
fit <- lm(model, data=train)
my.fcast <- forecast(fit,test) #error object 'train' not found
}
#If I move train to the global environment, there is no error
x <- ts(data=my.df)
train.end <- time(x)[nrow(x)-NFcst]
train <- window(x,end=train.end)
my.fcast <- fcast2('y','z',my.df,NFcst)
fcast2 <- function(a,b,df,h) {
model <- paste(a,'~',b)
test.start <- time(x)[nrow(x)-h+1]
test <- window(x,start=test.start)
fit <- lm(model, data=train)
my.fcast <- forecast(fit,test) #no error
}
答案 0 :(得分:5)
forecast.lm
中的错误似乎来自此表达式:
if (!is.null(object$data))
origdata <- object$data
else if (!is.null(object$call$data))
origdata <- object$data <- eval(object$call$data)
else origdata <- as.data.frame(fitted(object) + residuals(object))
如eval
中所述,?sys.parent
来电似乎做了一些奇怪的事情:
严格来说,sys.parent和parent.frame引用了上下文 父解释功能。所以内部功能(可能或可能 没有设置上下文,因此可能会或可能不会出现在调用堆栈上) 不计算,S3方法也可以做出令人惊讶的事情。
对您的函数进行快速修复是将数据设置为lm对象以避免eval
调用:
fcast <- function(a,b,df,h) {
model <- paste(a,'~',b)
x <- ts(data=df)
train.end <- time(x)[nrow(x)-h]
test.start <- time(x)[nrow(x)-h+1]
train <- window(x,end=train.end)
test <- window(x,start=test.start)
fit <- lm(model, data=train)
fit$data <- train
my.fcast <- forecast(fit,test)
}
答案 1 :(得分:3)
除了@James的回答。您的模型未正确定义。参数model <- paste(a,'~',b)
在数据集中的所有数字之间放置~
。
将model
简单地定义为函数中的争论可能更好。如:
fcast <- function(model,df,h) { #define model outside of the function
#model <- paste(a,'~',b) #commented out
x <- ts(data=df)
train.end <- time(x)[nrow(x)-h]
test.start <- time(x)[nrow(x)-h+1]
train <- window(x,end=train.end)
test <- window(x,start=test.start)
fit <- lm(model, data=train)
my.fcast <- forecast(fit,test) #error object 'train' not found -> see @James' answer
}
这意味着您的功能如下:
fcast(a~b,df,h)