Chcę wykonać następujące czynności:
1) Regresja OLS (bez kary), aby uzyskać współczynniki beta ; oznacza zmienne użyte do regresji. Robię to przez
lm.model = lm(y~ 0 + x)
betas = coefficients(lm.model)
2) Regresja Lasso z terminem karnym, kryteriami wyboru są Bayesowskie Kryteria Informacyjne (BIC), podane przez
gdzie oznacza numer zmiennej / regresora, oznacza liczbę obserwacji, a dla początkowych bet uzyskanych w kroku 1). Chcę uzyskać wyniki regresji dla tej konkretnej wartości , która jest inna dla każdego zastosowanego regresora. Dlatego jeśli są trzy zmienne, będą trzy różne wartości .
Problem optymalizacji OLS-Lasso jest następnie podawany przez
Jak mogę to zrobić w R z pakietem lars lub glmnet? Nie mogę znaleźć sposobu na określenie lambda i nie jestem w 100% pewien, czy otrzymam prawidłowe wyniki po uruchomieniu
lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")
Doceniam każdą pomoc tutaj.
Aktualizacja:
Użyłem teraz następującego kodu:
fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin = as.numeric(fits.cv[9]) #lambda.min
fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef = coef(fits, s = lmin)
W wierszu 1 używam weryfikacji krzyżowej z moim określonym współczynnikiem kary ( ), który jest inny dla każdego regresora . Wiersz 2 wybiera „lambda.min” z fits.cv, który jest lambda dającym minimalny średni błąd walidacji krzyżowej. Linia 3 wykonuje dopasowanie lasso ( ) na danych. Ponownie użyłem współczynnika kary . Wiersz 4 wyodrębnia współczynniki z dopasowań, które należą do „optymalnego” wybranego w wierszu 2.λλalpha=1
Teraz mam współczynniki beta dla regresorów, które przedstawiają optymalne rozwiązanie problemu minimalizacji
z czynnikiem karnym . Optymalny zestaw współczynników jest najprawdopodobniej podzbiorem regresorów, które początkowo stosowałem, jest to konsekwencja metody Lasso, która zmniejsza liczbę używanych regresorów.
Czy moje rozumienie i kod są poprawne?
źródło
$\alpha$
staje się . Proszę, zrób to, ponieważ dzięki temu ludzie łatwiej zrozumieją twoje pytanie, a zatem odpowiedzą na nie.Odpowiedzi:
Z
glmnet
dokumentacji (?glmnet
) wynika, że możliwe jest wykonanie skurczu różnicowego. To pozwala nam przynajmniej częściowo odpowiedzieć na pytanie OP.Aby jednak w pełni odpowiedzieć na pytanie, uważam, że dostępne są dwa podejścia, w zależności od tego, co chcesz osiągnąć.
Twoje pytanie brzmi: jak zastosować kurczenie różnicoweλ λ bj ϕj=logTT|b∗j| ϕj bj Cϕj=ϕ′j m=C∑mj=1logTT|b∗j| ϕ′j zastępuje w poniższym wyrażeniu optymalizacyjnym. więc dla , podaj wartości do , a następnie wyodrębnij współczynniki dla . Poleciłbym użyć .ϕj C ϕ′j λ=1
glmnet
i odzyskać współczynniki dla określonej wartości . Podanie st niektórych wartości nie 1 powoduje różnicowy skurcz przy dowolnej wartości . Aby osiągnąć skurcz, skurcz dla każdego wynosi , po prostu musimy wykonać algebrę. Niech będzie czynnikiem karnym dla , co zostanie dostarczone . Z dokumentacji wynika, że te wartości są ponownie skalowane o współczynnik st . Oznacza to, żepenalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
Drugi to „standardowy” sposób użyciak λ λ=0 b λ λ
glmnet
: jeden przeprowadza wielokrotne sprawdzanie poprawności -krotnie, aby wybrać tak aby zminimalizować MSE poza próbą. To właśnie opisuję bardziej szczegółowo. Powodem, dla którego używamy CV i sprawdzamy MSE poza próbą, jest to, że MSE w próbce zawsze będzie zminimalizowane dla , tj. jest zwykłym MLE. Używanie CV podczas zmieniania pozwala nam oszacować wydajność modelu na danych poza próbą i wybrać optymalną (w pewnym sensie) .Toλ λ λ λ
glmnet
wywołanie nie określa (również nie powinno, ponieważ domyślnie oblicza całą trajektorię ze względu na wydajność). powróci współczynniki dla wartości . Ale bez względu na wybór który podasz, wynik będzie odzwierciedlał karę różnicową zastosowaną w wezwaniu do dopasowania modelu.λ λ λcoef(fits,s=something)
something
Standardowym sposobem wyboru optymalnej wartości jest użycie zamiast . Walidacja krzyżowa służy do wyboru stopnia skurczu, który minimalizuje błąd poza próbą, podczas gdy specyfikacja skurczy niektóre funkcje bardziej niż inne, zgodnie z twoim schematem ważenia.λ
cv.glmnet
glmnet
penalty.factor
Ta procedura jest optymalizowana
gdzie jest czynnikiem karnym dla funkcji (co podajesz w argumencie). (Różni się to nieco od wyrażenia optymalizacyjnego; zwróć uwagę, że niektóre indeksy dolne są różne.) Zauważ, że termin jest taki sam we wszystkich funkcjach, więc jedynym sposobem, aby niektóre funkcje były zmniejszone bardziej niż inne, jest . Co ważne, i nie są takie same; to skalar, a to wektor! W tym wyrażeniu jest stałe / zakłada się, że jest znane; to znaczy optymalizacja wybierze optymalne , a nie optymalneϕj jth λ ϕj λ ϕ λ ϕ λ b λ .
penalty.factor
Jest to w zasadzie motywacja,
glmnet
jak rozumiem: stosowanie regresji karnej w celu oszacowania modelu regresji, który nie jest nadmiernie optymistyczny w odniesieniu do jego wydajności poza próbą. Jeśli to jest twój cel, być może jest to w końcu właściwa metoda.źródło
pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
jak wyodrębnić beta regresora, które odpowiadają określonej przeze mnie lambdzie, ponieważ lambda jest inna dla każdego czynnika ryzyka?glmnet
. Zobacz moją poprawioną odpowiedź.