ループの代わりに plyr を使用して、predict.lm に渡された新しいデータを使用して予測を取得する方法のロジックを理解しようとして途方に暮れています。誰でも助けることができますか?例:
私は r を初めて使用し、熟練したプログラマーではないため、私のコードは非常に非効率的です。Stackflow コミュニティ: 問題の偽のコードを作成するための提案に感謝します。この頭痛の解消に少しでもお役に立てれば幸いです。
私の目標は、トレーニング データセットで構築されたモデルの係数を使用して、新しい検証データセットで予測を行うことです。問題解決の助けが得られたら、最終的に ARIMA と線形モデルを構築する予定です。24 個の回帰モデルを構築しています。1 日の 1 時間ごとに 1 つのモデル。トレーニング データは 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
私の質問は次のとおりです。新しいデータの観測値がトレーニング データより少ない場合、新しいデータを予測するにはどうすればよいですか? 2 番目の質問は、auto.arima と LM() のプロセスは同じですか?
助けてくれてありがとう。