1

我在试图弄清楚如何使用传递给 predict.lm 的新数据使用 plyr 代替循环来获得预测的逻辑时迷失了方向。任何人都可以帮忙吗?例子:

因为我是 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 <-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() 的过程是否相同?

再次感谢您的帮助。

4

1 回答 1

0

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

predict.lm将在 newdata 中查找与模型对象中的术语同名的对象。您当前的定义x[,4]是您的“x”术语。

相反,使用名称,即

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

现在您可以使用Map(它是 的包装器mapply,而不是基本R功能plyr)来移动FITNewDatabyHour进行预测(并与新数据相结合

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 lmList

数据根据分组因子 g 的级别进行分区,并使用 object.

library(nlme)
# fit the model to each subset
FITS <- lmList(Demand ~ Adspend | Hour, data = myData)
# make the predictions
newData$predicted <- predict(FITS, newdata = newData)

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

于 2013-09-05T00:15:54.480 回答