Gå till index

Analys med R

0% färdig
0/0 Steps
  1. Analys och forskning med R och Posit (Rstudio)
  2. Grunderna i R och Rstudio
    7 Ämnen
  3. Importera, exportera, spara och ladda data
    5 Ämnen
  4. Strängar och regular expressions (regex)
    1 Ämne
  5. Bearbetning av data med dplyr
    12 Ämnen
  6. Visualisera och presentera
    14 Ämnen
  7. Explorerande analyser
    6 Ämnen
  8. Prediktionsmodeller
    12 Ämnen
  9. Klassisk regressionsanalys
    8 Ämnen
  10. Machine learning (ML) och Artificiell Intelligens (AI)
    9 Ämnen
  11. Prediktionsmodeller: Tidymodels
  12. Hypotestester
    1 Ämne
Avsnitt 8, Ämne 7
Startad

Variabelselektion (Feature Selection)

Avsnitt Progress
0% färdig

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().

R
library(olsrr)
library(broom)
library(tidyverse)

# Skapar modellen
model <- lm(hwy ~., data = mpg)

# Se modellens resultat innan forward stepwise selection
tidy(model)

# Forward stepwise selection
forward<-ols_step_forward_aic(model)

plot(forward) + theme_bw()
R
print(forward)
Resultat
                         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.

R
# Aktivera mltools för att få tillgång till funktionen one_hot()
library(mltools)
# Aktivera data.table för att få tillgång till funktionen as.data.table()
library(data.table)
# Aktivera glmnet som har lasso()
library(glmnet)

# Konverterar alla character till factor
mpg <- mpg %>% mutate_if(is.character, as.factor)

# One-hot encoding
mpg <- one_hot(as.data.table(mpg))

# Alla prediktorer hamnar i en matris
x <- as.matrix(select(mpg, -hwy))

# Utfallsmåttet hamnar i en annan matris
y <- as.matrix(select(mpg, hwy))

my_lasso <- glmnet(x,y)
print(my_lasso)

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).

Resultat
Call:  glmnet(x = x, y = y) 

   Df  %Dev Lambda
1   0  0.00 5.6800
2   1 15.51 5.1750
3   1 28.39 4.7160
4   1 39.09 4.2970
5   1 47.97 3.9150
6   1 55.34 3.5670
7   1 61.46 3.2500
..................
80 63 98.07 0.0037
81 63 98.07 0.0033
82 63 98.07 0.0030
83 63 98.07 0.0028
84 63 98.07 0.0025
85 64 98.07 0.0023

För ett specifikt \(\lambda\) kan vi se vilka variabler som finns i modellen med följande kommando:

R
coef(my_lasso, 1)
Resultat
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.

R
library(plotmo)
plot_glmnet(my_lasso, label=5)

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:

R
cv_lasso_fit <- cv.glmnet(x = x, y = y,
                          alpha = 1,
                          nfolds = 5)

Vi kan visualisera resultatet av LASSO, som följer:

R
plot(cv_lasso_fit)

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:

R
cv_lasso_fit$lambda.min
Resultat
[1] 0.0213847

Vi kan extrahera lambda för modellen som har 1 standar derror högre MSE:

R
cvdata$lambda.1se
Resultat
[1] 0.071673

För att få ut vilka variabler detta är skrives:

R
coef(cv_lasso_fit, cv_lasso_fit$lambda.1se)
Resultat
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.