Variabelselektion: Att inkludera rätt variabler
Syftet med en prediktionsmodell kan vara att antingen (1) estimera effekten (associationen) mellan en eller flera prediktorer (\(X\)) och utfallet \(Y\), eller (2) att skapa en modell med maximal prediktionsförmåga. I det första scenariot, dvs när syftet är att estimera prediktorernas effekter, blir slutresultatet givetvis en prediktionsmodell men den har sannolikt inte maximal prediktionsförmåga. För att effektestimera behöver en modell inte ha maximal prediktionsförmåga; fokus bör istället vara att generera lätttolkade och tillförlitliga resultat. I detta scenario kan variabelselektion göras utifrån kunskap om området. Med sakkunskap kan man skapa en modell som inbegriper nödvändiga kovariater och specificera modellen på ett förnuftigt vis. Det innebär att variabelselektion kan baseras på sakkunskap om syftet med modellen är effektestimering. I det andra scenariot, dvs när syftet är maximal prediktionsförmåga, är variabelselektion något mer komplicerat och detta kapitel berör främst sådana modeller.
Prediktionsmodeller bör uppvisa hög prediktionsförmåga samtidigt som de är sparsamma avseende antalet variabler som behövs i modellen. Den engelska termen för den sparsmakade modell (avseende antalet prediktorer) är the parsimonious model. Ju fler prediktorer en modell innehåller, desto svårare är det för andra att använda modellen, i synnerhet om modellen inbegriper svåråtkomliga prediktorer. Dessutom kan overfitting uppstå om antalet prediktorer är för många.
Variabelselektion (eng. variable selection, feature selection) innebär att man på ett metodiskt vis eliminerar onödiga variabler. Detta innebär att man startar med ett större antal variabler, så kallade kandidatvariabler (eng. candidate predictors), som successivt elimineras tills de viktigaste kvarstår. Det finns flera metoder för att göra variabelselektion. Nedan diskuteras dessa metoder.
Stepwise variable selection: backward & forward stepwise selection
Stepwise (stegvis) variabelselektion är en automatiserad process som innebär att mjukvaran bestämmer vilka variabler som skall ingå i en regressionsmodell. Detta kan antingen göras med forward stepwise selection eller backward stepwise selection.
- Forward stepwise selection innebär att modellen startar med 0 (noll) variabler och därefter adderas en variabel åt gången. Den adderade variabeln får kvarstanna i modellen om den leder till en bättre modell.
- Backward stepwise selection innebär att alla kandidatvariablerna är med i modellen från början. Därefter elimineras en variabel åt gången. Den variabel vars eliminering påverkar modellen minst blir exkluderad (eftersom eliminering av den variabeln har minst inverkan på modellen). Detta upprepas tills inga variabler kan elimineras utan att modellen blir signifikant sämre.
- Bidirectional stepwise elimination är en kombination av båda ovanstående.
För att bedöma om modellen blir bättre eller sämre måste ett kriterium användas. I de flesta fall används Akaike information criterion (AIC). AIC är ett mått på balansen mellan modellens komplexitet (antal prediktorer) och goodness-of-fit (prediktionsförmåga). Ju lägre AIC, desto bättre modell.
Dessa metoder skall i princip aldrig användas. Dessa metoder strider nämligen mot flera principer för statistisk inferens. Konsekvenser av att använda stepwise selection är som följer (Harrell):
- R2 värden är biased (för höga)
- Själva selektionen av variabler baseras på P-värden (signifikanstester) vilket egentligen kräver en pre-specificerad hypotes.
- Standard error (SE) är biased (för små).
- Konfidensintervaller är biased (för snäva).
- P-värden blir falskt för små och det finns problem med multipel testning.
- Regressionskoefficienterna är biased (koefficienterna, och därmed effekten, är falskt för stora).
Trots detta skall vi demonstrera hur stepwise variable selection utförs i R. Börja med att installera paketet olsrr
och aktivera det. I nedanstående exempel skapar vi en linjär modell med mpg
data. Vi predicerar hwy
genom att specificera hwy ~.
, där .
betyder "alla variabler" i mpg. Du kan sedan använda funktionen tidy()
från broom
för att se resultatet. Därefter används ols_step_forward_aic()
för att göra forward stepwise selection. Resultatet visualiseras sedan. Vi skriver även ut resultaten så att information om \(R^2\) kan erhållas. Motsvarande funktion för backward stepwise selection är ols_step_backward_aic()
.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
print(forward)
Selection Summary
-------------------------------------------------------------------
Variable AIC Sum Sq RSS R-Sq Adj. R-Sq
-------------------------------------------------------------------
cty 930.567 7549.302 712.360 0.91378 0.91340
model 745.249 8026.474 235.189 0.97153 0.96598
fl 721.367 8056.430 205.232 0.97516 0.96970
year 693.609 8080.938 180.724 0.97812 0.97317
trans 689.636 8097.136 164.526 0.98009 0.97436
cyl 685.650 8101.292 160.370 0.98059 0.97487
-------------------------------------------------------------------
Univariat screening
Många forskare använder univariat screening för att bestämma vilka variabler som skall ingå i modellen. Detta innebär att en variabel i taget testas och om den är statistiskt signifikant så inkluderas den i den slutliga modellen. Detta är också felaktigt eftersom variabelselektionen inte skall baseras på P-värden. Dessutom kan det leda till att variabler som endast är signifikanta i närvaron av andra variabler, blir exkluderade. Således kan man förlora viktiga prediktorer med denna metoden.
LASSO (least absolute shrinkage and selection operator)
LASSO är en regressionsmodell som kan användas för att selektera variabler. LASSO fungerar genom att beräkna parametern \(\lambda\), med vilken mer komplexa modeller bestraffas, och därmed kan variabler exkluderas.
I R används paketet glmnet()
för att utföra LASSO. Paketet accepterar inte en data frame utan vill att utfallet och prediktorerna specificeras i två separata matriser (se nedan). Alla variabler av typen character behöver konverteras till factor. Därefter måste one-hot encoding göras för faktorer, vilket innebär att en factor med 4 nivåer konverteras till 4 olika binära variabler (en för varje nivå på den ursprungliga variabeln). Följ kommentarerna i koden nedan för att förstå vilka moment som görs.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Resultatet blir som följer nedan (avkortat). DF (degrees of freedom) är antalet frihetsgrader, vilket är antalet prediktorer. %Dev liknar måttet R2 (dvs ett mått på prediktionsförmåga).
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
För ett specifikt \(\lambda\) kan vi se vilka variabler som finns i modellen med följande kommando:
coef(my_lasso, 1)
83 x 1 sparse Matrix of class "dgCMatrix"
s1
(Intercept) 6.1476740
drv_4 -0.8684261
cty 1.0483884
Vi kan visualisera prediktorerna i den bästa modellen med funktionen plot_glmnet()
från paketet plotmo
. Om du inte har plotmo
behöver du installera det först (install.packages("plotmo")
). Här nedan visualiserar vi de 5 bästa prediktorerna.
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
LASSO bör egentligen göras med korsvalidering (cross validation). För att upprepa processen med korsvalidering med 5 folder används följande kommando:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Vi kan visualisera resultatet av LASSO, som följer:
BLOCKERAD KOD, BILD ELLER TEXT
Du måste logga in för att komma åt allt material.
Grafen ovan visar MSE (medelvärdet på kvadrerad error) på Y-axeln och X-axeln visar log(\(\lambda\)) med ett konfidensintervall för varje modell. Det finns två vertikala (streckade) linjer. Linjen till vänster visar var lägsta MSE är. Linjen till höger är belägen 1 standard error högre (i MSE), och indikerar lambda för en mer regulariserad modell. En regulariserad model har mindre overfitting och predicerar bättre på testdata.
Vi kan extrahera \(\lambda\) för modellen med lägsta MSE med följande kommando:
cv_lasso_fit$lambda.min
[1] 0.0213847
Vi kan extrahera lambda för modellen som har 1 standar derror högre MSE:
cvdata$lambda.1se
[1] 0.071673
För att få ut vilka variabler detta är skrives:
coef(cv_lasso_fit, cv_lasso_fit$lambda.1se)
83 x 1 sparse Matrix of class "dgCMatrix"
s1
(Intercept) -64.0455866216
manufacturer_audi 1.5005369115
manufacturer_jeep -0.1174150053
manufacturer_land rover 0.1612552376
manufacturer_nissan -0.1059190236
manufacturer_pontiac 0.8169337991
model_4runner 4wd -0.5598256719
model_a4 quattro 0.5838794421
model_c1500 suburban 2wd -0.2756224964
model_caravan 2wd -0.3546136186
model_corvette 1.5663555709
model_f150 pickup 4wd -0.2270155529
model_forester awd 0.6830388254
model_grand prix 0.0193951129
model_maxima -0.6714694460
model_new beetle 0.2395820131
model_passat 0.2035794420
model_range rover 0.0072253567
model_toyota tacoma 4wd -0.1979795939
year 0.0353436525
cyl -0.0568519000
trans_auto(av) -0.4658374498
trans_auto(l3) -0.8101522067
trans_auto(l4) -0.0860617303
trans_auto(l5) 0.1494574949
trans_auto(s5) 0.5779641947
drv_4 -1.5127151569
drv_f 0.0009265857
cty 1.0643633366
fl_c 2.5131385470
fl_d 0.5011373754
fl_e -0.8901996792
class_2seater 0.0315777873
class_compact 0.0529440191
class_midsize 0.6824124438
class_pickup -1.4729080052
class_suv -1.2054913050
Machine learning för variabelselektion
Machine learning, särskilt random forest, kan också användas för att identifiera viktiga variabler. Machine learning (random forest) har ett naturligt sätt att kvantifiera varje prediktors styrka och därmed kan man rangordna alla prediktorerna efter deras prediktionsförmåga. Detta blir allt vanligare i kliniska studier och fördelen är att dessa metoder kan hantera ett mycket stort antal kandidatvariabler (tusentals variabler går utmärkt). Andra metoder, såsom principal component analysis (PCA) kan också användas men random forest har flera fördelar jämfört med dessa. Dessa metoder diskuteras i respektive kapitel.