Afsnit 9.4: Forward selektion

Som omtalt i foregående afsnit, kan vi ikke bruge backward selektion til at lave en simpel model, når der er for mange forklarende variable. Hvis man formoder, der kun er få af variablene, der har indflydelse på middelværdien af respons, kan man benytte en alternativ metode, kaldet forward selektion, til at etablere en model. Ved forward selektion starter man med den mindst mulige model, det vil sige modellen uden nogen forklarende variabel, hvor alle de stokastiske variable har samme middelværdi. Man bygger dernæst modellen op successivt, ved i hvert trin at inkludere en ny forklarende variabel valgt således, at spredningsskønnet s(M)s(M) reduceres mest muligt.
Definition 9.4.1. (Forward selektion)
Et trin i forward selektionsalgoritmen kan beskrives på følgende vis. Antag, at den nuværende model har inkluderet variablene v1,,vkv_1,\ldots,v_k (ved start af algoritmen er k=0k=0). For hver variabel prøver vi at udvide modellen med variabel vv blandt de variable, der endnu ikke er inkluderet. Dette giver en model med k+1k+1 variable, og for hvert vv kan vi beregne et spredningsskøn, som vi kalder sk(+v).s_k(+v). Den variabel v0v_0 med mindst spredningsskøn sk(+v)s_k(+v) er vores kandidat til udvidelsen af modellen.
I modellen hvor variabel v0v_0 er inkluderet, kan vi se på pp-værdien for test af hypotesen βv0=0,\beta_{v_0}=0, det vil sige, et test for at den sidst inkluderede variabel kan undværes i modellen med k+1k+1 variable. Alt efter størrelsen på denne pp-værdi kan vi vælge at stoppe algoritmen.
I denne bog vil jeg ikke stoppe algoritmen ud fra pp-værdien, men ud fra prædiktionsspredningen opnået ved cross-validation.
Definition 9.4.2. (Forward selektion med cross-validation)
Prædiktionsspredningen i en model, der inkluderer jj variable, findes ved, at der i hvert trin af LOOCV proceduren laves en model med jj variable fundet ved forward selektion. Antallet af variable i slutmodellen findes som den værdi af j,j, hvor prædiktionsspredningen er mindst.
Lad os vende tilbage til data omkring oktantallet for 60 bensinprøver i afsnit 9.3. Tabellen nedenfor viser i de tre første rækker resultatet af at bruge forward selektion, indtil 6 variable er inkluderet. Den sidste række viser prædiktionsspredningen som funktion af, hvor mange variable der inkluderes.
Antal variable123456Variabelnummer1551493939736154Spredningsskøn0.6610.2760.2310.2100.2020.194P-værdi5.110231.710235.61060.00060.02450.0271Prædiktionsspredning0.6730.3080.2590.3300.3370.611 \begin{array}{lcccccc} \hline \text{Antal variable} & 1 & 2 & 3 & 4 & 5 & 6 \\ \hline \text{Variabelnummer} & 155 & 149 & 39 & 397 & 36 & 154 \\ \text{Spredningsskøn} & 0.661 & 0.276 & 0.231 & 0.210 & 0.202 & 0.194 \\ \text{P-værdi} & 5.1\cdot 10^{-23} & 1.7\cdot 10^{-23} & 5.6\cdot 10^{-6} & 0.0006 & 0.0245 & 0.0271 \\ \hline \text{Prædiktionsspredning} & 0.673 & 0.308 & 0.259 & 0.330 & 0.337 & 0.611 \\ \hline \end{array}
Den første variabel, der inkluderes, er variabel nummer 155. Skønnet over spredningen i en regressionsmodel med kun denne ene variabel er 0.661, og hvis vi i denne model laver tt-testet for hypotesen β155=0,\beta_{155}=0, er pp-værdien 5.11023.5.1\cdot 10^{-23}. Når vi går fra denne ene variabel til to variable, er det variabel nummer 149, der tilføjes, og spredningsskønnet falder fra 0.661 til 0.276. Dette er et stort fald, og tilsvarende er pp-værdien for test af hypotesen β149=0\beta_{149}=0 meget lille, nemlig 1.71023.1.7\cdot 10^{-23}. I næste trin inddrages variabel nummer 39, og den tilsvarende pp-værdi er 0.0000056, og i fjerde trin kommer variabel nummer 397 med, hvor pp-værdien er 0.0006. I det femte trin tilføjes variabel 36, men nu er pp-værdien noget større nemlig 0.0245, og faldet i spredningsskøn er da også kun fra 0.210 til 0.202.
Figuren nedenfor viser tallene i tabellen udvidet op til forward selektion med 15 variable. Den sorte kurve i det venstre delplot er spredningsskønnet, og det højre delplot viser p-værdierne. Vi ser tydeligt et spring opad i pp-værdierne, efter at fire variable er inkluderet. Fra 5 til 9 variable svinger pp-værdien mellem to og fem procent, og det er først, når den tiende variabel inkluderes, at vi kommer over en formel grænse på 5 procent.
Vi kan se, at spredningsskønnet falder (sorte kurve), jo flere variable vi inkluderer, og dette vil typisk være tilfældet i en situation som her med mange forklarende variable. Det skyldes, at vi i hvert trin leder efter den variabel, der gør spredningsskønnet mindst muligt. Vi kan derfor ikke bruge værdien af spredningsskønnet til at vurdere, hvornår vi skal stoppe forward selektionsprocessen. I stedet bruger vi prædiktionsspredningen fundet ved leave one out cross-validation. Prædiktionsspredningen, som funktion af hvor mange variable der inkluderes, er vist som den røde kurve i det venstre delplot i ovenstående figur. Prædiktionsspredningen viser, at vi kun bør inddrage tre variable i modellen, flere variable vil blot øge usikkerheden i prædiktionerne. Samlet set peger analysen på, at vi nok skal bruge tre eller fire variable til at beskrive data. Prædiktionsspredningen peger på tre variable hvorimod pp-værdierne fra hvert trin viser et markant skift, når fire variable er inkluderet.

9.4.1 Beregning i python

Jeg har lavet to funktioner til at lave forward selektionsanalysen. Funktionen forward finder variable og tilhørende pp-værdier baseret på alle data, og producerer en tabel, som vist i de tre første rækker i tabellen ovenfor for bensindata. Input til funktionen er n×dn\times d matricen med værdierne af de forklarende variable, vektoren med responsværdierne og et tal, der angiver, hvor mange trin der skal laves i forward selektionsalgoritmen.
Den anden funktion, cvForward, laver beregningerne hørende til cross-validation (LOOCV). Input er som til funktionen forward. Output er prædiktionsspredningen, når der kun medtages 1 variabel, når der medtages 2 variable og så videre op til det antal, der er angivet i kaldet til funktionen. De to funktioner i filen pytFunktioner.py.
Det følgende skjulte punkt viser brugen af forward og cvForward på data vedrørende oktantallet i bensinprøver.

9.4.3 Forward selektion og cross-validation

I kodevinduet nedenfor hentes datasættet omkring oktantallet i bensinprøver fra en GitHub-adresse.

Se opstartskoden (til/fra)

Kør koden, og se, at output fra de 6 første variable stemmer overens med tallene i tabellen ovenfor, og at alle pp-værdierne stemmer overens med det højre delplot i figuren ovenfor.
Ændr dernæst funktionskaldet forward(spek,oktan,15) til cvForward(spek,oktan,4), for at finde prædiktionsspredningen ved forward selektion når der medtages fra 1 til 4 variable. Beregningen tager lidt under et minut, men vil typisk være hurtigere, hvis man kører python på egen computer. Tjek, at de fundne værdier stemmer overens med den røde kurve i ovenstående figur.

Kommentarer til koden

Åbn nu opstartskoden for at se definitionen på de to funktioner forward og cvForward. Her følger først lidt forklaring til koden i forward. Det essentielle trin i beregningen er "for"-løkken inde i forward-funktionen. Her prøver man for alle de forklarende variable, der endnu ikke er med i modellen, at tilføje en af disse (vv) og beregne spredningskønnet sk(+v),s_k(+v), når variablen er tilføjet de allerede udvalgte variable (som der er kk af). I den efterfølgende kommando argmin(res) finder man nummeret på den variabel, der giver den mindste værdi af sk(+v).s_k(+v). Estimation af den multiple regressionsmodel foregår ikke her med ols, som I ellers er vant til, men med funktionen OLS. I den sidste er input ikke en modelformel, men derimod en matrice med værdierne af de forklarende variable. Efter at den nye variabel er fundet, estimeres den multiple regressionsmodel, og pp-værdier findes i output.
Lad os dernæst se på opbygningen af funktionen cvForward. I denne indeholder matricen sqFejl alle de kvadrerede prædiktionsfejl, rækker svarer til observationsnummer og søjle angiver, hvor mange led der tages med i forward selektion. "For-løkken" over ii er selve cross-validation skridtet, hvor den ii'te observation tages ud, og træningssættet består af de resterende n1n-1 observationer. For hvert træningssæt gennemføres forward selektion, og hver gang en ny variabel er tilføjet, beregnes den prædikterede værdi for den observation, der er udeladt af træningssættet.

Det næste skjulte punkt viser, hvordan vi kan bruge modellen fundet ved forward selektion til at prædiktere nye prøver. Denne del kræver, at vi indskriver de variable, vi har fundet ved forward algoritmen.

9.4.4 Bruge slutmodellen til prædiktion

Når vi har gennemført en forward selektionsproces, og endt med at tage kk variable med, ønsker vi at bruge en multipel regressionsmodel, baseret på disse kk variable, til at lave prædiktion for kommende datasæt.
Umiddelbart vil vi nok gribe dette an som beskrevet i det skjulte punkt Konfidensinterval og prædiktionsinterval. Dog må vi forvente, at de konfidensintervaller og prædiktionsintervaller, der beregnes, er for smalle. Dette skyldes, at disse intervaller er på formen
skøn ±s(M)t-fraktilmodelkonstant. \text{skøn }\pm s(M)\cdot\text{t-fraktil}\cdot\text{modelkonstant}.
Per konstruktion af modellen vil vi forvente, at s(M)s(M) kan være for lille, og en mulighed vil være at skifte denne ud med prædiktionsspredningen scv.s_{\text{cv}}. I koden nedenfor er vist, hvordan dette kan gennemføres, idet prædiktionsspredningen scvs_{\text{cv}} er kendt fra opbygningen af modellen.
Kør koden. Kan du forstå længden af prædiktionsintervallerne set i relation til prædiktionsspredningen fra cross-validation? Prøv også at lave konfidensintervaller for middelværdien af kommende observationer.
Synes du, at modellen til beskrivelse af oktantallet er god nok i forhold til at prediktere oktantallet for nye prøver?

ForegåendeNæste