5

最近の宿題で、変数を追加するたびに 27 の線形モデルを実行するように指示されました (目標は、R 2の変化と調整済み R 2の変化をプロットすることでした)。このような数式をアルゴリズムで作成するのは難しいと思いました。私が最終的に使用したコードは次のようになりました (データ フレームの最初の列は従属変数であり、残りはすべて将来の独立変数であることに注意してください。

 make.formula <- function(howfar) {
  formula <- c()
  for (i in 1:howfar) {
    if (i == 1) {
      formula <- paste(formula, names(d)[i], '~')}
    else if (i == howfar) {
      formula <- paste(formula, names(d)[i], '')
    }
    else {
      formula <- paste(formula, names(d)[i], '+')}
  }
  return(formula)
}

formulas <- lapply(seq(2, length(d)), make.formula)
formulas <- lapply(formulas, as.formula)
fits <- lapply(formulas, lm, data = d)

これは機能しますが、理想とはほど遠いようです。私の印象では、R で for ループを使用して行っていることは、おそらく最善の方法で行われているわけではありません。特定のデータ フレームの数式をアルゴリズムで構築する簡単な方法はありますか?

4

2 に答える 2

10

reformulate()は、文字ベクトルから式を作成するための気の利いた関数です。これが何をするかの例です:

reformulate(response="Y", termlabels=c("X1", "X2", "X3"))
# Y ~ X1 + X2 + X3

そして、これを実際に使用する方法を次に示します。(ここでは、lm()呼び出しの中で数式を作成していることに注意してください。オブジェクトは、作成された環境に関する情報を保持しているため、実際にそれらを使用したい呼び出しのformulaそれらを作成するのは少しためらわれます。 ):lm()

evars <- names(mtcars)[2:5]
ii <- lapply(1:4, seq_len)

lapply(ii, 
       function(X) {
          coef(lm(reformulate(response="mpg", termlabels=evars[X]), data=mtcars))
})
# [[1]]
# (Intercept)         cyl 
#    37.88458    -2.87579 
# 
# [[2]]
# (Intercept)         cyl        disp 
# 34.66099474 -1.58727681 -0.02058363 
# 
# [[3]]
# (Intercept)         cyl        disp          hp 
# 34.18491917 -1.22741994 -0.01883809 -0.01467933 
# 
# [[4]]
# (Intercept)         cyl        disp          hp        drat 
# 23.98524441 -0.81402201 -0.01389625 -0.02317068  2.15404553 
于 2013-08-27T20:18:03.903 に答える