使用dplyr和do将数据传递给forecast.lm

4

我在使用 dplyr do 时,向 forecast.lm 传递数据时遇到了一些问题。我想基于一个因素 - hour - 建立多个模型,并使用新数据对这些模型进行预测。

在之前的优秀示例的基础上,这是我的数据示例:

require(dplyr)
require(forecast)

# Training set
df.h <- data.frame( 
  hour     = factor(rep(1:24, each = 100)),
  price    = runif(2400, min = -10, max = 125),
  wind     = runif(2400, min = 0, max = 2500),
  temp     = runif(2400, min = - 10, max = 25)  
)

# Forecasting set
df.f <- data.frame(
  hour     = factor(rep(1:24, each = 10)),
  wind     = runif(240, min = 0, max = 2500),
  temp     = runif(240, min = - 10, max = 25)  
)

# Bind training & forecasting
df <- rbind(df.h, data.frame(df.f, price=NA))

# Do a training model and then forecast using the new data
df <- rbind(df.h, data.frame(df.f, price=NA))
res <- group_by(df, hour) %>% do({
  hist <- .[!is.na(.$price), ]
  fore <- .[is.na(.$price), c('hour', 'wind', 'temp')]
  fit <- Arima(hist$price, xreg = hist[,3:4], order = c(1,1,0))
  data.frame(fore[], price=forecast.Arima(fit, xreg = fore[ ,2:3])$mean)
})
res

这个方法在时间序列模型中表现出色,但是使用lm模型时,在传递数据到预测部分时遇到了问题。

我的相应lm示例如下:

res <- group_by(df, hour) %>% do({
  hist <- .[!is.na(.$price), ]
  fore <- .[is.na(.$price), c('hour', 'wind', 'temp')]
  fit <- lm(hist$price ~ wind + temp, data = hist)
  data.frame(fore[], price = forecast.lm(fit, newdata = fore[, 2:3])$mean)
})

问题在于我无法将数据输入到newdata =函数中。如果在拟合部分添加hist$,则无法引用预测数据,而且出于某种原因,如果添加data = fore,它会找不到它 - 但是在时间序列示例中可以找到它。
1个回答

3
问题在于forecast.lm期望fit有一个data组件。如果你使用glmtslm,那是正确的。但是lm对象通常没有data组件。因此,您需要手动添加fit$data <- hist以使forecast.lm正常工作。
res <- group_by(df, hour) %>% do({
  hist <- .[!is.na(.$price), ]
  fore <- .[is.na(.$price), c('hour', 'wind', 'temp')]
  fit <- lm(price ~ wind + temp, data = hist)
  fit$data <- hist # have to add data manually
  data.frame(fore[], price = forecast.lm(fit, newdata = fore[, 2:3])$mean) 
})

实际上,这是一个已知问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接