我在试图弄清楚如何使用传递给 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() 的过程是否相同?
再次感谢您的帮助。