plyr +预测多个回归量

时间:2013-12-18 23:57:25

标签: r plyr xts

进一步考虑this thread中的内容:我尽可能地走了,但终于碰到了一堵墙。我希望使用 PLYR 来创建一些具有外部回归量的 ARIMA 模型。我一直在使用的过程的高级概述(代码示例数据如下)

1)我有一个包含业务,地区,收入和订单的数据框,所有这些都是按日期

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

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


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)
    })

然后我将该列表应用于forecast.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)
    })

...但似乎在预测功能中,我应该做的事情是以我通常使用的方式来考虑x回归模型.Arima()具有多个回归量;类似的东西:

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

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

1 个答案:

答案 0 :(得分: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来实现这一点,但现在可以使用......