Predict.lm plyr中的错误是否有替代mdply用于使用newdata进行预测?

时间:2013-09-04 23:42:41

标签: r plyr prediction lm

我试图找出如何使用plyr代替循环传递给predict.lm的新数据来获取预测的逻辑。有人可以帮忙吗?例如:

因为我是r的新手,而不是一个技术娴熟的程序员,我的代码会非常低效。 Stackflow社区: 感谢您建议创建问题的假代码。我希望这能帮助我解决这个问题。

我的目标是使用建立在训练数据集上的模型的系数对新的验证数据集进行预测。一旦我能够帮助解决问题,我最终将建立一个ARIMA以及一个线性模型。我正在构建24个回归模型。一天中每小时的一个模型。我的培训数据为90天,验证数据为31天。

创建一些数据

require(plyr)
# setting up some fake data
set.seed(31)
foo <- function(myHour, myDate){
   rlnorm(1, meanlog=0,sdlog=1)*(myHour) + (150*myDate) 
}
Hour <- 1:24
Day <-1:90
dates <-seq(as.Date("2012-01-01"), as.Date("2012-3-30"), by = "day")
myData <- expand.grid( Day, Hour)
names(myData) <- c("Date","Hour")

myData$Adspend <- apply(myData, 1, function(x) foo(x[2], x[1]))
myData$Date <-dates

myData$Demand <-(rnorm(1,mean = 0, sd=1)+.75*myData$Adspend)
## ok, done with the fake data generation. 

myData

#Run regression on training data
FIT <- dlply(myData, "Hour", function(x) lm(x[,4] ~ x[,3], data=x))

# Create new fake validation dataset (31days)
Hour <- 1:24
Day <- 1:31
dates <-seq(as.Date("2012-03-31"), as.Date("2012-4-30"), by = "day")

newData <- expand.grid( Day, Hour)
names(newData) <- c("Date","Hour")
set.seed(310)

fooNew <- function(myHour, myDate){
   rlnorm(1, meanlog=0,sdlog=1)*5*(myHour) + (300*myDate) 
}

newData$AdspendNew <- apply(newData, 1, function(x) fooNew(x[2], x[1]))
newData$Date <-dates

然后我尝试使用Adspend的新值

来预测需求

NewDatabyHour&lt; -dlply(newData,“Hour”)

PREDFIT <-mdply(cbind(mod=FIT, df=NewDatabyHour), function(mod,df) {
    transform(df, pred=predict(mod,df))})

我现在得到的错误如下:

Error in data.frame(list(Date = c(15430, 15431, 15432, 15433, 15434, 15435,  : 
  arguments imply differing number of rows: 31, 90
In addition: Warning message:
'newdata' had 31 rows but variables found have 90 rows 

我的问题是: 如何对新数据进行预测,其中新数据的观测值少于训练数据? 我的第二个问题是:auto.arima和LM()的过程是否相同?

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的问题出现在您构建公式的方式中,然后在predict.lm的newdata参数中没有一致的名称(同时mdply并不是您想要的)

predict.lm将在newdata中查找与模型对象中的术语名称相同的对象。您目前的定义是{x}一词x[,4]

相反,请使用名称,即

 FIT <- dlply(myData, "Hour", function(x) lm(Demand ~ Adspend, data=x))

现在,当您创建newData时,请继续使用名称Adspend

 newData$Adspend <- apply(newData, 1, function(x) fooNew(x[2], x[1]))

现在,您可以使用Mapmapply的包装,R函数而不是plyr)来遍历FIT和{{ 1}}进行预测(并结合新数据

NewDatabyHour

另一种(完全)不同的方法是使用predicted <- Map(object = FIT, newdata = NewDatabyHour, f = function(object,newdata) { newdata$predicted = predict(object, newdata) newdata}) # combine into whole data frame again predDF <- rbind.fill(predicted) nlme

  

根据分组因子g的级别对数​​据进行分区,并使用对象中定义的模型为每个数据分区获取单独的lm拟合。

lmList

(请注意,这些回归模型几乎肯定不是分析这些数据的最佳方式!)