18

定期的に回帰を実行するデータがあります。データの各「チャンク」は、異なる回帰に適合します。たとえば、各状態には、依存値を説明するさまざまな関数がある場合があります。これは典型的な「分割-適用-結合」タイプの問題のように思えるので、plyr パッケージを使用しています。lm()うまく機能するオブジェクトのリストを簡単に作成できます。ただし、これらのオブジェクトを後で使用して別の data.frame の値を予測する方法については、頭を悩ませることはできません。

これは、私がやろうとしていることを示す完全に不自然な例です:

# setting up some fake data
set.seed(1)
funct <- function(myState, myYear){
   rnorm(1, 100, 500) +  myState + (100 * myYear) 
}
state <- 50:60
year <- 10:40
myData <- expand.grid( year, state)
names(myData) <- c("year","state")
myData$value <- apply(myData, 1, function(x) funct(x[2], x[1]))
## ok, done with the fake data generation. 

require(plyr)

modelList <- dlply(myData, "state", function(x) lm(value ~ year, data=x))
## if you want to see the summaries of the lm() do this:  
    # lapply(modelList, summary)

state <- 50:60
year <- 50:60
newData <- expand.grid( year, state)
names(newData) <- c("year","state") 
## now how do I predict the values for newData$value 
   # using the regressions in modelList? 

lm()では、 に含まれるオブジェクトを使用modelListして、 の年と州に依存しない値を使用して値を予測するにはどうすればよいnewDataでしょうか?

4

6 に答える 6

9

これが私の試みです:

predNaughty <- ddply(newData, "state", transform,
  value=predict(modelList[[paste(piece$state[1])]], newdata=piece))
head(predNaughty)
#   year state    value
# 1   50    50 5176.326
# 2   51    50 5274.907
# 3   52    50 5373.487
# 4   53    50 5472.068
# 5   54    50 5570.649
# 6   55    50 5669.229
predDiggsApproved <- ddply(newData, "state", function(x)
  transform(x, value=predict(modelList[[paste(x$state[1])]], newdata=x)))
head(predDiggsApproved)
#   year state    value
# 1   50    50 5176.326
# 2   51    50 5274.907
# 3   52    50 5373.487
# 4   53    50 5472.068
# 5   54    50 5570.649
# 6   55    50 5669.229

JDロングエディット

adply()私はオプションを考え出すのに十分なインスピレーションを得ました:

pred3 <- adply(newData, 1,  function(x)
    predict(modelList[[paste(x$state)]], newdata=x))
head(pred3)
#   year state        1
# 1   50    50 5176.326
# 2   51    50 5274.907
# 3   52    50 5373.487
# 4   53    50 5472.068
# 5   54    50 5570.649
# 6   55    50 5669.229
于 2011-12-13T23:10:23.917 に答える
6

Rのみのソリューションbase。出力の形式は異なりますが、すべての値がそこにあります。

models <- lapply(split(myData, myData$state), 'lm', formula = value ~ year)
pred4  <- mapply('predict', models, split(newData, newData$state))
于 2011-12-14T04:43:54.150 に答える
6

mdply各関数呼び出しにモデルとデータの両方を提供するために使用する必要があります。

dataList <- dlply(newData, "state")

preds <- mdply(cbind(mod = modelList, df = dataList), function(mod, df) {
  mutate(df, pred = predict(mod, newdata = df))
})
于 2011-12-16T12:56:45.910 に答える
4

何が問題になっていますか

lapply(modelList, predict, newData)

編集:

何が悪いのか説明してくれてありがとう。どうですか:

newData <- data.frame(year)
ldply(modelList, function(model) {
  data.frame(newData, predict=predict(model, newData))
})

モデルを反復処理し、新しいデータを適用します(これは、expand.grid作成したばかりなので、各状態で同じです)。

編集2:

例のようにすべてnewDataの値が同じでない場合は、より一般的なアプローチを使用できます。これは、最初の編集での定義ではなく、の元の定義を使用することに注意してください。yearstatenewData

ldply(state, function(s) {
  nd <- newData[newData$state==s,]
  data.frame(nd, predict=predict(modelList[[as.character(s)]], nd))
})

この出力の最初の15行:

   year state  predict
1    50    50 5176.326
2    51    50 5274.907
3    52    50 5373.487
4    53    50 5472.068
5    54    50 5570.649
6    55    50 5669.229
7    56    50 5767.810
8    57    50 5866.390
9    58    50 5964.971
10   59    50 6063.551
11   60    50 6162.132
12   50    51 5514.825
13   51    51 5626.160
14   52    51 5737.496
15   53    51 5848.832
于 2011-12-13T22:43:22.913 に答える
2

難しいのは、各状態をnewData対応するモデルに一致させることだと思います。

おそらくこのようなものですか?

predList <- dlply(newData, "state", function(x) {
  predict(modelList[[as.character(min(x$state))]], x) 
})

ここでは、対応する状態モデルを抽出する「ハッキー」な方法を使用しました。as.character(min(x$state))

...おそらくもっと良い方法がありますか?

出力:

> predList[1:2]
$`50`
       1        2        3        4        5        6        7        8        9       10       11 
5176.326 5274.907 5373.487 5472.068 5570.649 5669.229 5767.810 5866.390 5964.971 6063.551 6162.132 

$`51`
      12       13       14       15       16       17       18       19       20       21       22 
5514.825 5626.160 5737.496 5848.832 5960.167 6071.503 6182.838 6294.174 6405.510 6516.845 6628.181

または、出力としてを必要とする場合data.frame

predData <- ddply(newData, "state", function(x) {
  y <-predict(modelList[[as.character(min(x$state))]], x)
  data.frame(id=names(y), value=c(y))
})

出力:

head(predData)
  state id    value
1    50  1 5176.326
2    50  2 5274.907
3    50  3 5373.487
4    50  4 5472.068
5    50  5 5570.649
6    50  6 5669.229
于 2011-12-13T22:48:33.473 に答える
1

多分私は何かが欠けているかもしれませんがlmList、ここでは理想的なツールだと思います.

library(nlme)
ll = lmList(value ~ year | state, data=myData)
predict(ll, newData)


## Or, to show that it produces the same results as the other proposed methods...
newData[["value"]] <- predict(ll, newData)
head(newData)
#   year state    value
# 1   50    50 5176.326
# 2   51    50 5274.907
# 3   52    50 5373.487
# 4   53    50 5472.068
# 5   54    50 5570.649
# 6   55    50 5669.229
于 2014-07-23T09:53:15.943 に答える