Zaczynam bawić sięglmnet
za pomocą regresji LASSO, gdzie moje wyniki zainteresowania są dychotomiczne. Poniżej utworzyłem małą próbną ramkę danych:
age <- c(4, 8, 7, 12, 6, 9, 10, 14, 7)
gender <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow",
"red", "yellow")
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)
Kolumny (zmienne) w powyższym zestawie danych są następujące:
age
(wiek dziecka w latach) - ciągłygender
- binarny (1 = męski; 0 = żeński)bmi_p
(Percentyl BMI) - ciągłym_edu
(najwyższy poziom wykształcenia matki) - zwykły (0 = niższy niż liceum; 1 = dyplom ukończenia szkoły średniej; 2 = licencjat; 3 = licencjat)p_edu
(najwyższy poziom wykształcenia ojca) - porządkowy (taki sam jak m_edu)f_color
(ulubiony kolor podstawowy) - nominalny („niebieski”, „czerwony” lub „żółty”)asthma
(stan astmy dziecięcej) - dwójkowy (1 = astma; 0 = brak astmy)
Celem tego przykładu jest wykorzystanie Lasso do stworzenia modelu prognozowania stanu astmy dziecko z listy 6 potencjalnych zmiennych objaśniających ( age
, gender
, bmi_p
, m_edu
, p_edu
, i f_color
). Oczywiście wielkość próby jest tutaj problemem, ale mam nadzieję uzyskać lepszy wgląd w sposób obsługi różnych typów zmiennych (tj. Ciągły, porządkowy, nominalny i binarny) w glmnet
ramach, gdy wynik jest binarny (1 = astma ; 0 = bez astmy).
W związku z tym, czy ktoś byłby skłonny dostarczyć przykładowy R
skrypt wraz z objaśnieniami dla tego fałszywego przykładu, używając LASSO z powyższymi danymi do przewidzenia stanu astmy? Chociaż bardzo prosty, wiem, że i prawdopodobnie wielu innych na CV, bardzo by to docenił!
źródło
dput
o rzeczywistej obiektu R; nie każ czytelnikom nakładać szronu na wierzch, a także upiec ci ciasto! Jeśli wygenerujesz odpowiednią ramkę danych w R, powiedzmyfoo
, następnie edytuj w pytaniu wynikdput(foo)
.glmnet
działania z podwójnym wynikiem.Odpowiedzi:
Zmienne jakościowe są zwykle najpierw przekształcane w czynniki, a następnie tworzona jest sztuczna macierz zmiennych predyktorów i wraz z predyktorami ciągłymi przekazywana jest do modelu. Pamiętaj, że glmnet stosuje zarówno kary kalenicowe, jak i lasso, ale można ustawić je oddzielnie.
Niektóre wyniki:
Współczynniki można uzyskać z glmmod. Tutaj pokazano z wybranymi 3 zmiennymi.
Wreszcie, do wyboru lambda można również użyć krzyżowej weryfikacji.
źródło
f_color
zmienną? Czy współczynnik poziomu 1–4 jest uważany za większy krok niż 1–2, czy też wszystkie są jednakowo ważone, bezkierunkowe i kategoryczne? (Chcę zastosować to do analizy ze wszystkimi nieuporządkowanymi predyktorami.)xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]
koduje zmienną kategorialną f_kolor (zadeklarowaną przezas.factor
w poprzednich wierszach). Powinien używać domyślnego kodowania zmiennych fikcyjnych R, chyba żecontrasts.arg
podano argument. Oznacza to, że wszystkie poziomy f_kolor są jednakowo ważone i bezkierunkowe, z wyjątkiem pierwszego, który jest używany jako klasa referencyjna i wchłaniany do przecięcia.model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]
dałby takiego samego wyniku jak dwie powyższe linie? Dlaczego warto skorzystać z dodatkowego kroku, aby połączyć zmienne ciągłedata.frame
?Użyję pakietu enet, ponieważ jest to moja preferowana metoda. Jest trochę bardziej elastyczny.
źródło
elasticnet
; nie wiem jednak, co sądzić o wynikach powyższegoR
skryptu. Czy możesz wyjaśnić? Z góry dziękuję!Aby rozwinąć doskonały przykład dostarczony przez pat. Pierwotny problem stanowiły zmienne porządkowe (m_edu, p_edu) z nieodłączną kolejnością między poziomami (0 <1 <2 <3). W pierwotnej odpowiedzi Pata myślę, że zostały one potraktowane jako nominalne zmienne kategorialne bez kolejności między nimi. Mogę się mylić, ale uważam, że te zmienne powinny być kodowane w taki sposób, aby model szanował ich naturalną kolejność. Jeśli są one zakodowane jako czynniki uporządkowane (a nie jako czynniki nieuporządkowane jak w odpowiedzi Pata), to glmnet daje nieco inne wyniki ... Myślę, że poniższy kod poprawnie zawiera zmienne porządkowe jako czynniki uporządkowane i daje nieco inne wyniki:
źródło