【问题标题】:plyr + forecasting multiple regressorsplyr + 预测多个回归器
【发布时间】:2013-12-18 23:57:25
【问题描述】:

this thread 中的内容再进一步:我已经尽力了,但最终还是碰壁了。我希望使用 PLYR 来创建一些具有大规模外生回归量的 ARIMA 模型。我一直在使用的过程的高级概述(带有示例数据的代码如下)

1) 我有一个数据框,其中包含业务、地区、收入和订单,全部按日期进行

2) 对于业务 + 地区的每种组合,我想根据以前的收入值 + 以前的订单值创建收入预测。

3) 我想使用 ARIMA 模型(使用 auto.arima() )来计算收入和订单的最佳订单,然后将该信息应用于 预测 em> 函数


4) 我遇到的问题似乎归结为无法将多个列表传递给 PLYR 参数以进行操作,这很可能反过来归结为我没有完全了解如何llply 有效(希望这是一项简单的任务)


这是我正在处理的一些示例数据:

library(plyr)
library(xts)
library(forecast)

data <- data.frame(
    biz = sample(c("telco","shipping","tech"), 100, replace = TRUE),
    region = sample(c("mideast","americas","asia"), 100, replace = TRUE),
    date = rep(seq(as.Date("2010-02-01"), length=10, by = "1 day"),10),
    revenue = sample(1:100),
    orders = sample(1:100)
)

编辑:首先通过ddply重新组织数据,去掉重复的条目:

dataframe <- ddply(data, c("biz","region","date"), function(df) {
    c(revenue = sum(df[,4]),
        orders = sum(df[,5]))
})

第 1 步:创建一个列表,其中包含每个业务 + 区域组合的时间序列信息:

list1 <- dlply(dataframe, .(biz,region), identity)

第 2 步:将该列表转换为 XTS 对象,以便我们可以将其用于时间序列分析:

xtsobject <- llply(list1, function(list) {
    xts(x=list[,c("revenue","orders")], order.by=list[,"date"])
})

这就是我遇到麻烦的地方。我想从 auto.arima() 函数中列出订单以传递给 forecast.Arima() 函数。如果我只做一个没有外生回归变量的变量,这将很简单:

arimamodel1 <- llply(xtsobject, function(list) {
    fity <- auto.arima(list$revenue)
    })

然后我会将该列表应用到 f​​orecast.Arima() 函数:

forecast1 <- llply(arimamodel1, function(model) {
    forecast.Arima(model, h=2)
    })

结果很好。我已尝试更改参数以包含一些额外回归变量的空间,但我不确定预测是否实际上拉入了 x 值:

arimamodel2 <- llply(xtstest, function(list) {
    fity <- auto.arima(list$revenue, xreg=list$orders)
    fitx <- auto.arima(list$orders)
    })

以及预测:

forecast2 <- llply(arimamodel2, function(model) {
    forecast.Arima(model, h=2)
    })

...但似乎在预测函数中,我应该按照我通常使用具有多个回归量的 Forecast.Arima() 的方式来解释 x 回归模型;类似:

forecast.Arima(model,h=2, xreg=forecast(model,h=2)$mean)

但这不起作用。是否有人对如何使用 PLYR 基于 auto.arima() 对多个回归量进行预测有任何见解?

【问题讨论】:

    标签: r plyr xts


    【解决方案1】:

    我很确定我已经弄清楚了,以防有人偶然发现这个问题。只需创建一个传递所有这些参数的函数,然后通过 lapply 或 llply 传递该函数(问题中的数据不适用于 auto.arima,因为它的创建方式,但它适用于我正在使用的实际数据):

    arimafunc <- function(list) {
        fity <- auto.arima(list$revenue, xreg=list$orders)
        fitx <- auto.arima(list$orders)
        forecast <- forecast.Arima(fity,h=2,xreg=forecast(fitx,h=2)$mean)
        return(forecast)
    }
    

    然后通过列表申请:

    forecasts <- lapply(xtsobject,FUN=arimafunc)
    

    我确信有一种方法可以使用诸如 llply 之类的内置功能或从基本命令之一 mapply 执行此操作,但现在可以使用...

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2019-07-29
      • 2021-11-27
      • 2021-10-03
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多