web-dev-qa-db-fra.com

extraire des coefficients standardisés de lm dans R

Mes excuses pour la question idiote ... mais je n'arrive pas à trouver une solution simple

Je veux extraire les coefficients normalisés d'un modèle linéaire ajusté (en R) Il doit y avoir un moyen simple ou une fonction qui le fait. pouvez-vous me dire qu'est-ce que c'est?

EDIT (suite à certains des commentaires ci-dessous): J'aurais probablement dû fournir des informations plus contextuelles sur ma question. J'enseignais un atelier d'initiation à la R pour un groupe de psychologues. Pour eux, un modèle linéaire sans possibilité d'obtenir des coefficients normalisés est comme si vous n'aviez pas exécuté le modèle du tout (d'accord, c'est un peu exagéré, mais vous comprenez le point). Après quelques régressions, c’était leur première question, à laquelle (ma mauvaise) je n’avais pas prévu (je ne suis pas psychologue). Bien sûr, je peux programmer cela moi-même, et bien sûr, je peux rechercher des paquets qui le font pour moi. Mais en même temps, je pense qu’il s’agit là d’une caractéristique essentielle et commune des modèles linéaires. J’ai donc pensé qu’il devrait exister une fonction de base permettant de le faire sans avoir à installer de plus en plus de paquets qui est perçu comme une difficulté pour les débutants). Alors j'ai demandé (et c'était aussi l'occasion de leur montrer comment obtenir de l'aide quand ils en ont besoin).

Je m'excuse pour ceux qui pensent que j'ai posé une question stupide et je remercie beaucoup ceux qui ont pris le temps d'y répondre.

26
amit

Il existe une fonction de commodité dans le package QuantPsyc pour cela, appelée lm.beta. Cependant, je pense que le moyen le plus simple consiste simplement à standardiser vos variables. Les coefficients seront alors automatiquement les coefficients «bêta» normalisés (c’est-à-dire les coefficients en termes d’écarts-types). 

Par exemple, 

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

vous donnera le coefficient normalisé.

Sont-ils vraiment les mêmes? Ce qui suit montre que les deux sont identiques:

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

ce qui montre que les deux sont identiques, comme il se doit.

Comment éviter les noms de variable maladroits? Si vous ne souhaitez pas traiter ces noms de variables maladroits tels que scale(height), vous pouvez également normaliser les variables en dehors de l'appel lm dans l'ensemble de données lui-même. Par exemple, 

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

Comment normaliser facilement plusieurs variables? Dans l'éventualité probable où vous ne voudriez pas normaliser toutes les variables de votre jeu de données, vous pourriez choisir tout ce qui se produit dans votre formule. Par exemple, en faisant référence à l'ensemble de données mtcars- maintenant (puisque women ne contient que height et weight):

Dites ce qui suit est le modèle de régression que je veux estimer:

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

Nous pouvons utiliser le fait que all.vars me donne un vecteur des noms de variables.

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

Nous pouvons l'utiliser pour sous-définir l'ensemble de données en conséquence. Par exemple,

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

me donnera un ensemble de données dans lequel toutes les variables ont été normalisées. Les régressions linéaires utilisant mycars donneront maintenant des bêta standardisées. Assurez-vous cependant que la normalisation de toutes ces variables a du sens!

Problème potentiel lié à une seule variable: Si la formule du modèle ne contient qu'une seule variable explicative et que vous travaillez avec les cadres de données intégrés (et non avec tibbles), l’ajustement suivant est conseillé (les crédits sont attribués à @JerryT dans les commentaires):

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

En effet, lorsque vous extrayez une seule colonne d'un cadre de données standard, R réexécute un vecteur au lieu d'un cadre de données. drop=F empêchera que cela se produise. Cela ne posera pas non plus de problème si, par exemple, tibbles sont utilisés. Voir par exemple 

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"

Un autre problème avec les valeurs manquantes dans le cadre de données (les crédits reviennent à @JerryT dans les commentaires): Par défaut, la variable lm de R supprime tous les rows où au moins une colonne est manquante. scale, en revanche, prendrait toutes les valeurs non manquantes, même si une observation a une valeur manquante dans une colonne différente. Si vous voulez imiter l'action de lm, vous voudrez peut-être d'abord supprimer toutes les lignes avec des valeurs manquantes, comme ceci:

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

utilisez simplement colnames (data) avec lapply ou sapply:

0
user10430359