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
を削除します。一方、観測の別の列に欠損値がある場合でも、欠損値ではないすべての値を取ります。のアクションを模倣したい場合は、次のように、最初に値が欠落しているすべての行を削除することをお勧めします。scale
lm
all_complete <- complete.cases(df)
df[all_complete,]