Przepraszam, jeśli to pytanie jest trochę podstawowe.
Chciałbym użyć selekcji zmiennych LASSO dla modelu wielokrotnej regresji liniowej w R. Mam 15 predyktorów, z których jeden jest kategoryczny (czy to spowoduje problem?). Po ustawieniu mojego i Y używam następujące polecenia:
model = lars(x, y)
coef(model)
Mój problem polega na tym, kiedy używam coef(model)
. Zwraca macierz z 15 wierszami, z każdym dodatkowym predyktorem dodawanym za każdym razem. Jednak nie ma sugestii, który model wybrać. Czy coś przeoczyłem? Czy istnieje sposób, aby uzyskać pakiet Larsa, aby zwrócił tylko jeden „ najlepszy ” model?
Istnieją inne posty sugerujące użycie glmnet
zamiast tego, ale wydaje się to bardziej skomplikowane. Próba jest następujący, przy użyciu tego samego i y . Czy coś tu przegapiłem ?:
cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")
Ostatnie polecenie zwraca listę moich zmiennych, większość ze współczynnikiem, chociaż niektóre mają wartość = 0. Czy to właściwy wybór „ najlepszego ” modelu wybranego przez LASSO? Jeśli następnie dopasuję model liniowy ze wszystkimi moimi zmiennymi, które miały współczynniki not=0
, otrzymam bardzo podobne, ale nieco inne, oszacowania współczynników. Czy jest powód tej różnicy? Czy akceptowalny byłby remont modelu liniowego z tymi zmiennymi wybranymi przez LASSO i uznanie go za mój ostateczny model? W przeciwnym razie nie widzę żadnych wartości p dla istotności. Czy coś przeoczyłem?
Robi
type.gaussian="covariance"
upewnić się, że glmnet
używa wielu regresji liniowej?
Czy automatyczna normalizacja zmiennych wpływa w ogóle na współczynniki? Czy jest jakiś sposób na uwzględnienie warunków interakcji w procedurze LASSO?
Chciałbym użyć tej procedury bardziej jako demonstracji tego, jak można użyć LASSO, niż w jakimkolwiek modelu, który faktycznie zostanie użyty do każdego ważnego wnioskowania / prognozy, jeśli to cokolwiek zmieni.
Dziękujemy za poświęcenie czasu na przeczytanie tego. Wszelkie ogólne uwagi na temat LASSO / lars / glmnet będą również mile widziane.
źródło
Odpowiedzi:
Korzystanie
glmnet
jest bardzo łatwe, gdy się go zrozumie, dzięki doskonałej winiecie w http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (możesz również sprawdzić stronę pakietu CRAN). Jeśli chodzi o najlepszą lambdaglmnet
, zasadą jest użyciezamiast
lambda.min
.Aby zrobić to samo
lars
, musisz to zrobić ręcznie. Oto moje rozwiązaniePamiętaj, że nie jest to dokładnie to samo, ponieważ zatrzymuje się na węźle lasso (gdy wchodzi zmienna) zamiast w dowolnym punkcie.
Należy pamiętać, że
glmnet
jest to teraz preferowany pakiet, jest on aktywnie utrzymywany, bardziej niżlars
, i że wcześniej pojawiły się pytania dotyczące odpowiedziglmnet
vslars
(stosowane algorytmy różnią się).Jeśli chodzi o twoje pytanie o użycie lasso do wyboru zmiennych, a następnie dopasowania OLS, jest to ciągła debata. Google for OLS po Lasso i jest kilka artykułów na ten temat. Nawet autorzy Elements of Statistics Learning przyznają, że jest to możliwe.
Edycja : Oto kod do dokładniejszego odtwarzania tego, co
glmnet
działalars
źródło
Powracam do tego pytania jakiś czas temu, ponieważ myślę, że rozwiązałem właściwe rozwiązanie.
Oto replika korzystająca z zestawu danych mtcars:
„zmienne” daje listę zmiennych, które rozwiązują najlepsze rozwiązanie.
źródło
nfolds=5
ialpha=0.5
?Być może porównanie z regresją stopniową wyboru do przodu pomoże (patrz poniższy link do strony jednego z autorów http://www-stat.stanford.edu/~tibs/lasso/simple.html). Takie podejście zastosowano w rozdziale 3.4.4 elementów uczenia statystycznego (dostępne online za darmo). Pomyślałem, że rozdział 3.6 tej książki pomógł zrozumieć związek między najmniejszymi kwadratami, najlepszym podzbiorem i lasso (plus kilka innych procedur). Przydaje mi się również transpozycja współczynnika t (coef (model)) i write.csv, dzięki czemu mogę otworzyć go w programie Excel wraz z kopią wykresu (model) z boku. Możesz posortować według ostatniej kolumny, która zawiera oszacowanie najmniejszych kwadratów. Następnie możesz wyraźnie zobaczyć, w jaki sposób każda zmienna jest dodawana na każdym kroku i jak w rezultacie zmieniają się współczynniki. Oczywiście to nie jest cała historia, ale mam nadzieję, że to będzie początek.
źródło
lars
iglmnet
działają na surowych matrycach. Aby uwzględnić warunki interakcji, musisz sam zbudować macierze. Oznacza to jedną kolumnę na interakcję (która jest na poziom na czynnik, jeśli masz czynniki). Sprawdź,lm()
jak to robi (ostrzeżenie: są smoki).Aby zrobić to teraz, zrób coś takiego: Aby ręcznie dokonać określenie interakcji, to może (ale może nie powinienem , bo to spowalnia) zrobić:
Następnie użyj tego w Larach (zakładając, że masz do czynienia z
y
kopaniem):Chciałbym pomóc Ci w przypadku innych pytań. Znalazłem ten, ponieważ lars sprawia mi ból, a dokumentacja w nim i w Internecie jest bardzo cienka.
źródło
model.matrix()
.LARS rozwiązuje CAŁĄ ścieżkę rozwiązania. Ścieżka rozwiązania jest fragmentarycznie liniowa - istnieje skończona liczba punktów „wycięcia” (tj. Wartości parametru regularyzacji), w których zmienia się rozwiązanie.
Zatem macierz otrzymywanych rozwiązań to wszystkie możliwe rozwiązania. Na liście, którą zwraca, powinien również podać wartości parametru regularyzacji.
źródło