1

ループの代わりに 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() のプロセスは同じですか?

助けてくれてありがとう。

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 のレベルに従ってデータが分割され、データ分割ごとに個別の lm 適合が取得されます。

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 に答える