2

Hadley の plyr パッケージ ddply 関数のおかげで、データフレームを取得し、それを要因別にサブデータフレームに分割し、それぞれを関数に送信してから、各サブデータフレームの関数結果を新しいデータフレームに結合できます。

しかし、関数が glm のようなクラスのオブジェクトを返す場合、または私の場合は ac("glm", "lm") の場合はどうなるでしょうか。では、これらをデータフレームに結合することはできませんか? 代わりにこのエラーが発生します

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : cannot coerce class 'c("glm", "lm")' into a data.frame

関数呼び出しのすべての複雑な glm クラスの結果に対応し、データフレームのサブセットに関する情報を保持する、より柔軟なデータ構造はありますか?

それとも、これはまったく別の方法で行う必要がありますか?

4

1 に答える 1

6

私のコメントを拡張するだけです:plyr入力と出力のタイプを組み合わせる関数のセットがあります。したがって、関数が変換できないものを返すdata.frame場合は、出力として使用する必要がありlistます。ddplyしたがって、 useを使用する代わりにdlply.

各モデルで何かを実行し、結果を変換したい場合がdata.frameldplyです。

を使用していくつかのモデルを作成しましょうdlply

list_of_models <- dlply(warpbreaks, .(tension), function(X) lm(breaks~wool, data=X))
str(list_of_models, 1)
# List of 3
#  $ L:List of 13
#   ..- attr(*, "class")= chr "lm"
#  $ M:List of 13
#   ..- attr(*, "class")= chr "lm"
#  $ H:List of 13
#   ..- attr(*, "class")= chr "lm"
#  - attr(*, "split_type")= chr "data.frame"
#  - attr(*, "split_labels")='data.frame':        3 obs. of  1 variable:

list3つのlmモデルを提供します。

あなたを使用して、例えば ldplyを作成できますdata.frame

  • 各モデルの予測:

    ldply(list_of_models, function(model) {
        data.frame(fit=predict(model, warpbreaks))
    })
    #     tension     fit
    # 1         L 44.5556
    # 2         L 44.5556
    # 3         L 44.5556
    
  • 各モデルへの統計:

    ldply(list_of_models, function(model) {
      c(
        aic = extractAIC(model),
        deviance = deviance(model),
        logLik = logLik(model),
        confint = confint(model),
        coef = coef(model)
      )
    })
    # tension aic1    aic2 deviance   logLik confint1  confint2 confint3 confint4 coef.(Intercept) coef.woolB
    # 1       L    2 98.3291  3397.78 -72.7054  34.2580 -30.89623  54.8531 -1.77044          44.5556  -16.33333
    # 2       M    2 81.1948  1311.56 -64.1383  17.6022  -4.27003  30.3978 13.82559          24.0000    4.77778
    # 3       H    2 76.9457  1035.78 -62.0137  18.8701 -13.81829  30.2411  2.26273          24.5556   -5.77778
    
于 2010-06-06T22:49:27.247 に答える