2014-06-19 26 views
19

moje przeprosiny za pytanie głupi ... ale nie wydaje się znaleźć proste rozwiązaniewydobywania standaryzowanych współczynników z LM w R

chcę wyodrębnić standaryzowanych współczynników z pomocą dopasowanego modelu liniowego (w R) musi istnieć prosta metoda lub funkcja, która to robi. czy możesz mi powiedzieć, co to jest?

EDYCJA (zgodnie z niektórymi komentarzami poniżej): Prawdopodobnie powinienem podać więcej informacji kontekstowych na temat mojego pytania. Uczyłem wstępnego warsztatu R dla grupy psychologów. Dla nich model liniowy bez możliwości uzyskania standaryzowanych współczynników jest taki, jakby w ogóle nie uruchamiał modelu (ok, to jest trochę przesada, ale dostajesz punkt). Kiedy zrobiliśmy pewne regresje, było to pierwsze pytanie, które (moje złe) nie przewidywałem (nie jestem psychologiem). Oczywiście, mogę sam to zaprogramować i oczywiście mogę szukać pakietów, które to dla mnie zrobią. Ale jednocześnie uważam, że jest to rodzaj podstawowej i powszechnej, wymaganej cechy modeli liniowych, które na miejscu, myślałem, że powinna istnieć podstawowa funkcja, która robi to bez potrzeby instalowania coraz większej liczby pakietów (który jest postrzegany jako trudność dla początkujących). Zapytałem więc (i była to okazja, aby pokazać im, jak uzyskać pomoc, kiedy jej potrzebują).

Moje przeprosiny dla tych, którzy myślą, że zadałem głupie pytanie i wielkie podziękowania dla tych, którzy poświęcili czas na odpowiedź.

+1

wypróbuj tę funkcję '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)} 'gdzie' MOD' to twój model utworzony przez funkcję 'lm', więc użyjesz go jako' stdcoeff (lm (...)) '(nie napisałem tego, tylko znalazłem na sieć, więc nie publikuj jako odpowiedź) –

+2

grrr .... Czy nie pojawia się * nikt * do czytania plików pomocy przed wysłaniem? –

+1

Podobało mi się [to podejście] (http://www.stat.columbia.edu/~gelman/research/published/standardizing7.pdf). Przeskalowuje zmienne wejściowe o dwukrotność odchylenia standardowego dla łatwej interpretacji. Jego 'standaryzacja'funkcja znajduje się w pakiecie' arm'. – BlankUsername

Odpowiedz

31

Istnieje funkcja wygody w pakiecie QuantPsyc dla tego, o nazwie lm.beta. Myślę jednak, że najprościej jest po prostu ujednolicić swoje zmienne. Współczynniki będą wówczas automatycznie standardowymi współczynnikami "beta" (tj. Współczynnikami w zakresie odchyleń standardowych).

Na przykład

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

daje standaryzowany współczynnik.

Czy są naprawdę takie same? Poniżej przedstawiono, że są one identyczne:

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 

co wskazuje, że są one identyczne, jak powinny.

Jak uniknąć nieporęcznych nazw zmiennych? W przypadku, gdy nie chcesz zajmować się tymi niezdarnymi nazwami zmiennych, takimi jak scale(height), jedną z opcji jest standaryzacja zmiennych spoza wywołania lm w samym zestawie danych. Na przykład,

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 

Jak standaryzacji wielu zmiennych wygodnie? Jeśli nie chcesz standaryzować wszystkich zmiennych w zestawie danych, możesz wybrać wszystkie, które występują w formule. Na przykład, odnosząc się do mtcars -dataset teraz (od women zawiera tylko height i weight):

Wypowiedz się następujący model regresji chcę oszacować:

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

Możemy wykorzystać fakt, że all.vars daje mi wektor nazw zmiennych.

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

Możemy użyć tego do odpowiedniego podziału zbioru danych. Na przykład:

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

da mi zestaw danych, w którym wszystkie zmienne zostały ustandaryzowane. Liniowe regresje z użyciem mycars będą teraz dawały znormalizowane bety. Upewnij się jednak, że standaryzacja wszystkich tych zmiennych ma sens!

+2

Zauważ, że jest to mniej więcej to, co robi 'arm :: standaryzacja' (choć oferuje pewną elastyczność co do tego, czy odpowiedź jest skalowana czy nie, i robi coś bardziej wyszukanego/niestandardowego z manekinami dla predyktorów jakościowych). Zaletą podejścia 'lm.beta' jest to, że nie wymaga on ponownego dopasowania modelu. –

+2

Alternatywą 'dplyr' do standaryzacji wielu zmiennych byłoby:' mycars <- mtcars %>% mutate_each_ (funs (scale), all.vars (model.formula)) ', jak sądzę. –