50

ばかげた質問で申し訳ありません...しかし、簡単な解決策が見つからないようです

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

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

私がばかげた質問をしたと思う人には申し訳ありません。時間を割いて答えてくれた人に感謝します。

4

3 に答える 3

70

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

これは、両方が同一であることを示しています。

不器用な変数名を避けるには? などの不器用な変数名を扱いたくない場合、1 つのオプションは、データセット自体の呼び出しのscale(height)外側で変数を標準化することです。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のみが含まれheightているためweight):

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

 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は少なくとも 1 つの列が欠落しているすべてのlmを削除します。一方、観測の別の列に欠損値がある場合でも、欠損値ではないすべての値を取ります。のアクションを模倣したい場合は、次のように、最初に値が欠落しているすべての行を削除することをお勧めします。scalelm

all_complete <- complete.cases(df)
df[all_complete,]
于 2014-06-19T11:51:13.603 に答える
0

またはと一緒に使用colnames(data)してください。 例えば: lapplysapply

lapply(data[, colnames(data)], scale)
于 2018-09-28T16:00:10.380 に答える