范围问题; R无法在函数环境中找到对象

时间:2015-04-13 14:11:36

标签: r

我的目标是在每次改变时拟合模型并产生预测 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
}

2 个答案:

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