2014-06-19 24 views
19

Le mie scuse per la domanda stupida ... ma non riesco a trovare una soluzione sempliceestrarre i coefficienti standardizzati da LM in R

Voglio estrarre i coefficienti standardizzati da un modello lineare montato (in R) ci deve essere un modo semplice o una funzione che lo fa. puoi dirmi di cosa si tratta?

EDIT (seguendo alcuni dei commenti seguenti): Probabilmente avrei fornito più informazioni contestuali sulla mia domanda. Stavo insegnando un workshop introduttivo per un gruppo di psicologi. Per loro, un modello lineare senza la possibilità di ottenere coefficienti standardizzati è come se non si fosse eseguito il modello (ok, questo è un po 'esagerato, ma si ottiene il punto). Quando abbiamo fatto alcune regressioni questa è stata la loro prima domanda, che (il mio male) non avevo previsto (non sono uno psicologo). Certo che posso programmarlo da solo, e ovviamente posso cercare pacchetti che lo facciano per me. Ma allo stesso tempo, penso che questa sia una caratteristica basilare e comune dei modelli lineari, che sul momento ho pensato che ci fosse una funzione di base che lo facesse senza la necessità di installare un numero sempre maggiore di pacchetti (che è percepito come una difficoltà per i principianti). Così ho chiesto (e questa è stata anche l'occasione per mostrare loro come ottenere aiuto quando ne hanno bisogno).

Le mie scuse per coloro che pensano di aver fatto una domanda stupida e molte grazie per coloro che hanno avuto il tempo di rispondere.

+1

provare questa funzione 'stdcoeff <- function (MOD) {b <- summary (MOD) $ coef [-1, 1]; sx <- sd (MOD $ model [-1]); sy <- sd (MOD $ model [1]); beta <- b * sx/sy; return (beta)} 'dove' MOD' è il tuo modello prodotto dalla funzione 'lm', quindi lo userai come' stdcoeff (lm (...)) '(non l'ho scritto, appena trovato la rete, quindi non postare come risposta) –

+2

grrr .... Non si verifica * nessuno * per leggere i file della guida prima di postare? –

+1

Mi è piaciuto [questo approccio] (http://www.stat.columbia.edu/~gelman/research/published/standardizing7.pdf). Ridimensiona le variabili di input di due volte la deviazione standard per una facile interpretazione. La sua funzione 'standardize' può essere trovata nel pacchetto' arm'. – BlankUsername

risposta

31

Nel pacchetto QuantPsyc esiste una funzione comfort, denominata lm.beta. Tuttavia, penso che il modo più semplice sia semplicemente la standardizzazione delle variabili. I coefficienti saranno quindi automaticamente i coefficienti "beta" standardizzati (cioè i coefficienti in termini di deviazioni standard).

Per esempio,

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

vi darà il coefficiente standardizzato.

Sono davvero uguali? Quanto segue illustra che entrambi sono identici:

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 

che dimostra che entrambi sono identici, come dovrebbero essere.

Come evitare nomi di variabili impacciati? Nel caso in cui non si desideri gestire questi nomi di variabili impacciate come scale(height), un'opzione è di standardizzare le variabili all'esterno della chiamata lm nello stesso set di dati. Per esempio,

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 

Come faccio a standardizzare più variabili comodamente? Nel probabile evento che non si desidera standardizzare tutte le variabili nel set di dati, è possibile selezionare tutto ciò che si verifica nella formula. Per esempio, riferendosi alla mtcars -dataset ora (dal women contiene solo height e weight):

dire quanto segue è il modello di regressione che voglio valutare:

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

possiamo utilizzare il fatto che all.vars mi dà un vettore dei nomi delle variabili.

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

Possiamo usarlo per suddividere il set di dati di conseguenza. Per esempio,

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

mi darà un insieme di dati in cui sono state standardizzate tutte le variabili. Le regressioni lineari che usano mycars daranno ora delle beta standardizzate. Per favore assicurati che la standardizzazione di tutte queste variabili abbia senso, comunque!

+2

nota che questo è più o meno ciò che 'arm :: standardize' fa (anche se offre una certa flessibilità sul fatto che la risposta sia ridimensionata o meno, e fa cose più fantasiose/non standard con i manichini per i predittori categoriali). Il vantaggio dell'approccio 'lm.beta' è che non richiede il re-fitting del modello. –

+2

L'alternativa 'dplyr' alla standardizzazione di più variabili sarebbe:' mycars <- mtcars %>% mutate_each_ (funs (scale), all.vars (model.formula)) ', credo. –