it-swarm.com.de

extraktion standardisierter Koeffizienten aus lm in R

Ich entschuldige mich für die dumme Frage ... aber ich finde keine einfache Lösung

Ich möchte die standardisierten Koeffizienten aus einem angepassten linearen Modell (in R) extrahieren. Es muss einen einfachen Weg oder eine einfache Funktion geben, die dies tut. Kannst du mir sagen, was ist das?

EDIT (folgt einigen Kommentaren unten): Ich hätte wahrscheinlich mehr kontextbezogene Informationen zu meiner Frage liefern sollen. Ich unterrichtete einen einleitenden R-Workshop für eine Reihe von Psychologen. Für sie ist ein lineares Modell ohne die Fähigkeit, standardisierte Koeffizienten zu erhalten, so, als ob Sie das Modell überhaupt nicht ausgeführt hätten (ok, das ist ein bisschen übertrieben, aber Sie bekommen den Punkt). Nachdem wir einige Regressionen durchgeführt hatten, war dies ihre erste Frage, mit der ich nicht gerechnet hatte (ich bin keine Psychologin). Natürlich kann ich das selbst programmieren und natürlich nach Paketen suchen, die es für mich tun. Aber gleichzeitig denke ich, dass dies eine Art grundlegendes und übliches Erfordernis linearer Modelle ist, dass ich vor Ort dachte, dass es eine grundlegende Funktion geben sollte, die es erfordert, ohne immer mehr Pakete installieren zu müssen ( was für Anfänger als Schwierigkeit empfunden wird). Also fragte ich (und dies war auch eine Gelegenheit, ihnen zu zeigen, wie man Hilfe bekommt, wenn sie Hilfe brauchen).

Ich entschuldige mich für diejenigen, die glauben, ich hätte eine dumme Frage gestellt, und vielen Dank für diejenigen, die sich die Zeit genommen haben, um sie zu beantworten.

26
amit

Im Paket QuantPsyc gibt es eine praktische Funktion namens lm.beta. Ich denke jedoch, dass der einfachste Weg ist, Ihre Variablen zu standardisieren. Die Koeffizienten sind dann automatisch die standardisierten "Beta" -Koeffizienten (d. H. Koeffizienten in Form von Standardabweichungen). 

Zum Beispiel, 

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

gibt Ihnen den standardisierten Koeffizienten.

Sind sie wirklich gleich? Das Folgende zeigt, dass beide identisch sind:

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

was zeigt, dass beide identisch sind, wie sie sein sollten.

Wie vermeide ich ungeschickte Variablennamen? Falls Sie nicht mit diesen unbeholfenen Variablennamen wie scale(height) umgehen möchten, können Sie die Variablen außerhalb des lm-Aufrufs in der Datenmenge selbst standardisieren. Zum Beispiel, 

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

Wie standardisiere ich bequem mehrere Variablen? In dem wahrscheinlichen Fall, dass Sie nicht alle Variablen in Ihrer Datenmenge standardisieren möchten, können Sie alle in Ihrer Formel vorkommenden Werte auswählen. Zum Beispiel wird jetzt auf die Variable mtcars Bezug genommen (da women nur height und weight enthält):

Das folgende ist das Regressionsmodell, das ich schätzen möchte:

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

Wir können die Tatsache verwenden, dass all.vars mir einen Vektor der Variablennamen gibt.

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

Wir können dies verwenden, um den Datensatz entsprechend zu subsetieren. Zum Beispiel,

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

gibt mir einen Datensatz, in dem alle Variablen standardisiert wurden. Lineare Regressionen mit mycars ergeben jetzt standardisierte Betas. Bitte stellen Sie sicher, dass die Standardisierung all dieser Variablen sinnvoll ist!

Mögliches Problem mit nur einer Variablen: Wenn Ihre Modellformel nur eine erklärende Variable enthält und Sie mit den eingebauten Datenrahmen arbeiten (und nicht mit Halbblöcken), ist die folgende Anpassung ratsam (Credits gehen an @JerryT in die Kommentare):

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

Wenn Sie nur eine Spalte aus einem Standarddatenrahmen extrahieren, führt R einen Vektor statt eines Datenrahmens zurück. drop=F verhindert dies. Dies ist auch kein Problem, wenn z. tibbles wird verwendet. Siehe z. 

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"

Ein weiteres Problem mit fehlenden Werten im Dataframe (Credits gehen in den Kommentaren erneut an @JerryT): Standardmäßig entfernt Rs lm alle Zeilen, in denen mindestens eine Spalte fehlt. scale würde dagegen alle Werte übernehmen, die nicht fehlen, auch wenn eine Beobachtung einen fehlenden Wert in einer anderen Spalte hat. Wenn Sie die Aktion von lm nachahmen möchten, möchten Sie möglicherweise zuerst alle Zeilen mit fehlenden Werten löschen:

all_complete <- complete.cases(df)
df[all_complete,]
38
coffeinjunky

verwenden Sie einfach Colnames (Daten) mit lapply oder sapply als: lapply (Daten [ Colnames (Daten)], scale)

0
user10430359