2013-12-18 43 views
2

this thread中的内容稍微进一步说明:我尽可能地走了,但最后碰壁了。我正在寻找使用PLYR创建一些ARIMA模型与规模的外生回归。我已经使用的方法的高级概览(带有示例数据代码如下)plyr +预测多个回归因子

1)I具有与企业,区域,收入和订单数据帧,所有由日期

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()为多个回归器进行预测有深入的了解?

回答

2

我很确定我明白了这一点,以防有人绊倒这个问题。这只是一个让函数通过所有这些参数,然后通过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,但是现在这个工作...