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 6
Startad

Hantering av Kontinuerliga variabler, Icke-Linjära samband och Flexibla Funktioner

Avsnitt Progress
0% färdig

Hantering av prediktorer: kategoriska, kontinuerliga

Under datainsamling och vid utveckling av prediktionsmodeller skall man alltid sträva efter att använda kontinuerliga variabler. En kontinuerlig variabel innehåller alltid mer (oavsett modell) information än en kategorisk variabel och det är som regel felaktigt att kategorisera en kontinuerlig variabel, vare sig variabeln är utafllet (\(Y\)) eller en prediktor (\(X\)). Trots detta kategoriseras ofta kontinuerliga variabler utan att det är motiverat.

Det finns dock scenarion då det är motiverat att kategorisera en kontinuerlig variabel. Ponera att vi undersöker hur kroppsvikt (kg) påverkar risken för att utveckla diabetes. Vi skapar då en prediktionsmodell med kroppsvikt (kg) som prediktor och diabetes (ja/nej) som utfall. Om kroppsvikt är en kontinuerlig variabel (kg) så kommer regressionskoefficienten visa hur mycket risken för diabetes ökar för varje kg (kilogram) kroppsvikten ökar. Riskökningen som medförs av att vikt ökar 1 kg kan framstå som liten och möjligtvis till och med sakna klinisk relevans. Då kan det vara motiverat att kategorisera kroppsvikt i kategorier (exempelvis i kategorierna normalvikt, övervikt, fetma). När prediktionsmodellen istället använder denna kategoriserade prediktor kommer "effekten" (dvs regressionskoefficienten) vara kraftigare. I detta fall kan det således vara meningsfullt att kategorisera prediktorn. Det tjänar dock endast ett pedagogiskt syfte; modellen med den kategoriserade prediktorn kommer i princip alltid vara sämre än modellen med den kontinuerliga prediktorn.

Prospektiva studier bör samla in data som kontinuerliga variabler i den mån det är möjligt. Då finns möjligheten att kategorisera variablerna i ett senare skede.

Antagandet om linjäritet: relaxering med restricted cubic splines och polynom

Linjära modeller, eller modeller nära besläktade med den linjära modellen, dominerar analyser som görs för effektestimering och prediktion. Den linjära modellen bygger på antagandet att det finns ett linjärt samband mellan prediktorn \(X\) och utfallet \(Y\) (se figur nedan). Detta antagande utgör en bekvämlighet, eftersom linjära samband är enkla att hantera matematiskt. Faktum är dock att naturen sällan är helt linjär och det kan vara naivt att utgå ifrån att samband är linjära. Förklaringen till att analytiker och forskare ofta nöjer sig med linjära funktioner är för att de erbjuder en acceptabel approximation av verkligheten. I nedanstående figur ser vi en regressionslinje (svart) som visar hur prediktorn \(X\) relaterar till bränsleförbrukning (\(Y\)). Av figuren framgår att regressionslinjen är en acceptabel approximation till sambandet men vid låga (<2) och höga värden (>5) på \(X\) är regressionslinjen längre ifrån datapunkterna (error är högre).

Låt oss göra om ovanstående modell och låta prediktorn \(X\) anta ett icke-linjärt samband med \(Y\). Detta innebär att sambandet mellan \(X\) och \(Y\) tillåts variera (vara flexibelt) över \(X\) intervall. Resultatet blir som följer:

Om graferna placeras på varandra blir det tydligare att den icke-linjära modellen har högre precision:

Antagandet om linjaritet bör som regel ifrågasättas. Antagandet kan med enkelhet undersökas som i exemplet ovan (se kapitel Linjär regression). Den linjära modellens validitet är högre om prediktorerna är korrekt specificerade.

Om sambandet mellan \(X\) och \(Y\) inte är linjärt så kan det leda till felaktiga slutsatser. I figuren nedan visas ett kraftigt icke-linjärt samband som leder till den felaktiga slutsatsen att det inte finns något samband mellan \(X\) och \(Y\), vilket regressionslinjen visar genom att linjen i princip saknar lutning (β ≈ 0).

Det behövs en mer flexibel regressionslinje. Antagandet om linjaritet måste relaxeras för att regressionslinjen skall följa (predicera) data bättre. Att transformera prediktorn var tidigare en populär metod. Låt oss logaritmera prediktorn \(X\) och visualisera regressionslinjen igen:

Att transformera prediktorn \(X\) leder i ovanstående fall till en bättre modell, men den är inte optimal (se intervallet \(X\) < 2) och nu blir dessutom koefficienten svårare att tolka (föreställ dig att vi logaritmerat kroppsvikt i kg). Det bättre att använda icke-linjära funktioner av \(X\), vilka inte förutsätter att sambandet mellan \(X\) och \(Y\) är linjärt. Vi skapar prediktionsmodellen igen med en icke-linjär funktion, utan att logaritmera \(X\), vilket ger följande resultat:

I ovanstående figur har \(X\) modellerats med ett andragradspolynom, vilket innebär att \(X\) multiplicerats med \(X\). Detta är det enklaste sättet att relaxera antagandet om linjaritet och det innebär att man använder ett polynom (eng. polynomial), vilket är heltalspotenser av prediktorn \(X\). Det finns följande polynom:

  • Andragradspolynom: \(X^2\)
  • Tredjegradspolynom: \(X^3\)
  • Fjärdegradspolynom: \(X^4\)

Om man önskar inkludera polynom i en regression så måste alla lägre grader av prediktorn också inkluderas. Det innebär att om tredjegradspolynom (\(X^3\)) för ålder skall inkluderas i modellen så skall även \(X^2\) och \(X\) inkluderas som enskilda prediktorer. En ofta använd, och lika ofta kritiserad, metod för att inkludera polynom i modeller är att testa polynomen och behålla de om koefficienterna är statistiskt significkanta (P < 0.05), eftersom detta är bevis för att det finns en icke-linjär funktion i data. Syntax för en linjär modell med ett tredjegradspolynom för prediktorn x är som följer:

R
lm(y ~ x + poly(x, 2) + poly(x, 3), data=data) 

Faktum är att R alltid inkluderar lägre grader av ett polynom även om man inte specificera detta. Det innebär att ovanstående modell är ekvivalent med följande:

R
lm(y ~ poly(x, 3), data=data) 

Låt oss skapa en linjär regression med ett tredjegradspolynom i mpg data. Vi använder paketet broom för att extrahera resulat från modellen.

R
library(tidyverse)
data(mpg)

my_fit <- lm(hwy ~ drv + cyl + poly(displ, 3), data=mpg)

library(broom)
tidy(my_fit)
termestimatestd.errorstatisticp.value
(Intercept)24.83047562.139266411.6070050.000000
drvf4.45535540.50505498.8215280.000000
drvr4.18922000.68716106.0964170.000000
cyl-0.65481090.3682590-1.7781260.0767217
poly(displ, 3)1-41.82155679.8728249-4.2360270.000033
poly(displ, 3)217.02009843.20632135.3082950.000000
poly(displ, 3)32.08021603.03577940.6852330.493896

Som framgår ovan är tredjegradspolynomet ("poly(displ, 3)3") inte statistiskt signifikant (p=0.493896), men däremot är andragradspolynomet statistiskt signifikant (p=0.000000), liksom den linjära prediktorn (p=0.000033). Polynom har dock flera brister som kan leda till otillfredsställande prediktioner. Splines föredras ofta framför polynom.

Regression splines: linjära splines, cubic splines, restricted cubic splines

En spline är en flexibel funktion som består av flera polynom. Varje polynom representerar ett intervall av fördelningen för prediktorn \(X\) och alla polynom är sammankopplade i ändarna.

Den enklaste spline-funktionen är den linjära. En enkel linjär spline innebär helt enkelt att prediktorn \(X\) har delats in i intervaller vilket leder till att \(X\) egentligen delas upp i flera prediktorer. Även om de enskilda intervallerna är linjära funktioner så kan de tillsammans skapa en icke-linjär funktion. I figuren nedan har \(X\) delats in i 3 intervaller med hjälp av två knytpunkter (eng. knots). Antal och placering av dessa knots kan justeras.

En enkel linjär spline möjliggör modellering av icke-linjära funktioner och kräver endast att sambandet mellan \(X\) och \(Y\) skall vara linjärt inom varje intervall.

Ekvationen för den ursprungliga modellen (utan spline) är som följer:

Y = β0 + β1X1

Om prediktorn X1 expanderas till en spline med 3 intervaller så blir ekvationen:

Y = β0 + β1X1 + β2X2 + β3X3

Cubic splines (CS)

En linjär spline är oftast att föredra framför polynom, men dessväre är linjära splines inte flexibla just i knytpunkterna och därför blir modellering av böjda/krökta samband inte optimal. För att överkomma detta kan man använda cubic splines, som är detsamma som linjära splines men i varje intervall använder man polynom. Detta gör att kopplingarna mellan intervallerna är mjuka och cubic splines är bättre (än linjära splines) på att definiera böjda/krökta samband. Om en cubic spline har 3 knypunkter (knots) så måste totalt 6 regressionskoefficienter (β1 till β6) beräknas. Antal koefficienter som måste beräknas är nämligen k+3, där k är antalet knots. Det innebär att användning av cubic splines blir kostsamt eftersom fler parametrar behöver beräknas.

Restricted cubic splines (RCS, natural splines)

Den bästa och mest använda spline-funktionen är restricted cubic spline. Dessa spline-funktioner är som cubic splines men funktionen tvingas vara linjär i svansarna (i början och slutet av prediktorns distribution). Detta ger bättre precision i modellen. Användning av restricted cubic splines bestraffar modellen med k+1 parametrar. Det innebär att om 3 knots används så måste 4 koefficienter beräknas.

Behövs splines?

Om en prediktorn \(X\) expanderas till en spline-funktion så kan man använda P-värdet för att avgöra om spline-funktionen är nödvändig. Nollhypotesen är att koefficienterna (för de enskilda spline-intervallerna) är lika med 0 och om P-värdet är < 0.05 så är detta osannolikt och då behåller man dessa splines.

Hur många knypunkter (knots) behövs?

Om man känner till sambandet mellan prediktorn \(X\) och utfallet \(Y\), och vet var det finns kurvaturer och icke-linjäriteter så kan man själv specificera var knytpunkterna skall placeras. Man måste inte vara bekant med var icke-linjaritet existerar. Det går utmärkt att använda splines utan kunskap om detta, givet att knytpunkter placeras jämnt utspritt över \(X\) intervall.

I R specificerar du antal knypunkter som önskas och dessa placeras automatiskt ut på rätt intervaller. Man använder minst 3 knytpunkter (även om exemplen ovan illustrerats med två knytpunkter) och det är sällan nödvändigt att använda fler än 6 knytpunkter. Ju fler observationer man har desto fler knytpunkter kan användas.

Restricted cubic splines kan används för linjär regression, logistisk regression, Poisson regression, Cox regressio, etc.

Man skall vara frikostig med att använda restricted cubic splines eftersom det är naivt att förutsätta att samband är linjära. Man bör dock pre-specificera sina splines innan modellen byggs. Att föregå detta genom att visualisera samband mellan variabler (t ex med korrelationsdiagram) rekommenderas inte. Man skall vara särskilt frikostig med splines för prediktorer som är starkt relaterade till utfallsmåttet. Det är oftast inte lönt att investera frihetsgrader i variabler med svaga samband med utfallsmåttet.

I nedanstående kod aktiverar vi paketen tidyverse, Hmisc och rms, för att därefter ladda mpg data. Paketet rms har funktioner för restricted cubic splines (rcs()). För att använda rms behöver vi berätta för paketet vilka distributioner som finns i mpg data. Därefter ställer vi in detta i options(). Därefter bygger vi en modell med ols() (detta är funktionen för linjär regression i paketet rms), där prediktorn displ modelleras med en splinefunktion. Sambandet visualiseras sedan med ggplot(). Notera att vi gör två grafer och placerar de ovanpå varandra med cowplot().

R
library(Hmisc)
library(rms)

# Distributioner
ddist <- datadist(mpg)
options(datadist='ddist')

# Skapar modellen
model <- ols(hwy ~ rcs(displ, 3), data=mpg, x=T, y=T)

# Gör graf spline-funktionen
p1 <- ggplot(Predict(model, "displ"), ylab="Y (hwy)") +theme_half_open()

# Gör graf med x och y värden utritade
p2 <- ggplot(mpg, aes(x=displ, y=hwy, color=displ)) + geom_point() + scale_color_viridis_c(option = "plasma") + theme_half_open()

# Placerar graferna på varandra
library(cowplot)
aligned_plots <- align_plots(p1, p2, align="hv", axis="tblr")
ggdraw(aligned_plots[[1]]) + draw_plot(aligned_plots[[2]])