web-dev-qa-db-ja.com

Rのlmから標準化された係数を抽出する

愚かな質問に対する私の謝罪...しかし、私は簡単な解決策を見つけることができないようです

フィットした線形モデル(R)から標準化された係数を抽出したいのですが、それを行う簡単な方法または関数が必要です。それは何ですか?

編集(以下のコメントのいくつかに従う):私はおそらく私の質問についてより文脈的な情報を提供すべきだった。私は多くの心理学者のために入門的なRワークショップを教えていました。彼らにとって、標準化された係数を取得できない線形モデルは、モデルをまったく実行しなかったかのように見えます(これは少し誇張されていますが、ポイントは得られます)。いくつかの回帰を行ったとき、これは彼らの最初の質問でしたが、(私の悪いこと)私は予想していませんでした(私は心理学者ではありません)。もちろん、これを自分でプログラムできます。もちろん、私のためにそれを行うパッケージを探すこともできます。しかし同時に、これは線形モデルの基本的で一般的な必須機能の一種であり、その場で、より多くのパッケージをインストールすることなくそれを行う基本的な機能があるはずだと思います(初心者にとっては難しいと感じられます)。そこで私は尋ねました(そして、これは彼らが必要なときに助けを得る方法を彼らに示す機会でもありました)。

バカな質問をしたと思う人にはおaび申し上げます。時間を割いて答えてくれた人に感謝します。

31
amit

QuantPsycパッケージには、_lm.beta_と呼ばれる便利な関数があります。ただし、最も簡単な方法は、変数を標準化することです。係数は自動的に標準化された「ベータ」係数になります(つまり、標準偏差の係数)。

例えば、

_ lm(scale(your.y) ~ scale(your.x), data=your.Data)
_

標準化された係数が得られます。

それらは本当に同じですか?以下は、両方が同一であることを示しています。

_library("QuantPsyc")
mod <- lm(weight ~ height, data=women)
coef_lmbeta <- lm.beta(mod)

coef_lmbeta
> height 
  0.9955 

mod2 <- lm(scale(weight) ~ scale(height), data=women)
coef_scale <- coef(mod2)[2]

coef_scale
> scale(height) 
  0.9955 

all.equal(coef_lmbeta, coef_scale, check.attributes=F)
[1] TRUE
_

どちらも同じであるはずです。

不格好な変数名を避ける方法scale(height)などのこれらの不格好な変数名を扱いたくない場合、1つのオプションはlmデータセット自体を呼び出します。例えば、

_women2 <- lapply(women, scale) # standardizes all variables

mod3 <- lm(weight ~ height, data=women2)
coef_alt <- coef(mod3)[2]
coef_alt
> height 
  0.9955 

all.equal(coef_lmbeta, coef_alt)
[1] TRUE
_

複数の変数を便利に標準化するにはどうすればよいですか?データセット内のすべての変数を標準化したくない場合は、式で発生するすべてを選択できます。たとえば、今すぐmtcars- datasetを参照します(womenにはheightweightしか含まれていないため):

私が推定したい回帰モデルは次のとおりです:

_ modelformula <- mpg ~ cyl + disp + hp + drat + qsec
_

_all.vars_が変数名のベクトルを提供するという事実を使用できます。

_ all.vars(modelformula)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "qsec"
_

これを使用して、データセットを適宜サブセット化できます。例えば、

_mycars <- lapply(mtcars[, all.vars(modelformula)], scale) 
_

すべての変数が標準化されたデータセットを提供します。 mycarsを使用した線形回帰により、標準化されたベータが得られます。ただし、これらすべての変数を標準化することは意味があることを確認してください!

変数が1つだけの場合の潜在的な問題:モデル式に説明変数が1つしか含まれておらず、組み込みデータフレームを使用している場合(チブルではない場合)、次の調整をお勧めします(クレジットはコメントの@JerryT):

_mycars <- lapply(mtcars[, all.vars(modelformula), drop=F], scale) 
_

これは、標準データフレームから1列のみを抽出すると、Rがデータフレームではなくベクトルを再調整するためです。 _drop=F_は、これが起こらないようにします。また、これは、たとえばtibblesが使用されます。例参照.

_class(mtcars[, "mpg"])
[1] "numeric"
class(mtcars[, "mpg", drop=F])
[1] "data.frame"
library(tidyverse)
class(as.tibble(mtcars)[, "mpg"])
[1] "tbl_df"     "tbl"        "data.frame"
_

欠損値の別の問題データフレーム内(クレジットはコメントの@JerryTに再び移動します):デフォルトでは、Rのlmはすべてのrows少なくとも1つの列が欠落している場合。一方、scaleは、観測の別の列に欠損値がある場合でも、欠損していないすべての値を取ります。 lmのアクションを模倣する場合は、次のように、値が欠落しているすべての行を最初にドロップすることができます。

_all_complete <- complete.cases(df)
df[all_complete,]
_
42
coffeinjunky

colnames(data)lapplyまたはsapplyと共に使用するだけです。
例えば:

lapply(data[, colnames(data)], scale)
0
user10430359