Skip to Tutorial Content

Mål og forberedelser

Denne arbeidsboken bygger videre på Arbeidsbok 4: Statistisk analyse. I denne boken går vi videre og viser hvordan vi kan gjøre regresjonsanalyser i R.

I denne arbeidsboken skal du lære:

  • Å lage en regresjonsmodell med en uavhengig variabel.
  • Å tolke og fremstille regresjonsresultater.

Innlasting av datasett

I denne arbeidsboken skal vi kjøre en regresjonanalyse som ser på sammenhengen mellom økonomisk vekst (growth) på andel stemmer partiet til den sittende kandidaten får. Datasettet er hentet fra The Fundamentals of Political Science Research (Kellstedt og Whitten, 2018).

Som vanlig når vi skal begynne å jobbe må vi starte med å laste inn data og pakkene vi skal bruke. Gjennom arbeidsboken bruker vi funksjoner fra pakken tidyverse.

# Henter nødvendige pakker 
library(tidyverse)

# Laster inn datasettet vi skal bruke
EcoData <- readRDS("EcoData.rds")

Oversikt over datasettet

Når vi først har lastet inn datasettet er det greit å sjekke ut hvordan datasettet ser ut. Se om du kan finne ut hvilke år datasettet dekker, og gjennomsnittet for inc_vote.

Hint: Dette er et fint sted å bruke summary() funksjonen.

summary(EcoData)
Datasett

Omkoding

Omkoding med is.na() og complete.cases()

I forrige arbeidsbok så vi på hvordan vi kan finne ut hvor mye missing det er i datasettet. Funksjonene vi brukte for å gjøre dette, f.eks. is.na() og complete.cases() er såkalte logiske tester. Det betyr at de returnerer TRUE eller FALSE avhengig av hvilke verdier vi gir til funksjonen. Dette kan vi bruke f.eks. for å lage nye variabler.

I tidyverse bruker man ofte funksjonen mutate() sammen med andre funksjoner for å opprette nye variabler.

Legg til variabelen inf_na som skal indikere om variabelen inflation er NA. Legg til variabelen complete som skal vise om en rad har minst en NA. MERK: For variabelen complete må du ha med et punktum i parantesen til complete.cases()-funksjonen.
EcoData %>%
  mutate(complete = ,
         inf_na = )
EcoData <- EcoData %>%
  mutate(complete = ,
         inf_na = )
EcoData <- EcoData %>%
  mutate(complete = complete.cases(.) ,
         inf_na = )
EcoData <- EcoData %>% 
  mutate(inf_na = is.na(inflation),
  complete = complete.cases(.))
EcoData <- EcoData %>%
  mutate(complete = complete.cases(.),
          inf_na = is.na(inflation))

Omkoding med ifelse()

Nå skal vi også kombinere mutate() med ifelse() for å lage en dikotom variabel.

Fyll inn koden under for å lage en dikotom variabel growth_binary som tar verdien: Growth om observasjonen er et år med positiv økonomisk vekst og No growth om observasjonen er et år uten økonomisk vekst.
EcoData <- EcoData %>%
  mutate(growth_dich = ifelse(, "Growth", "No growth"),
         growth_dich = factor(growth_dich, levels = c("No growth", "Growth")))

Hint: Husk at positiv vekst bare betyr at growth-variabelen er større enn null.

EcoData <- EcoData %>%
  mutate(growth_dich = ifelse(growth > 0, "Growth", "No growth"),
  growth_dich = factor(growth_dich, levels = c("No growth", "Growth")))

Når du lager en faktor-variabel så tar R utgangspunkt i alfabetet når referansekategorien bestemmes. I dette tilfellet ville referansekateogrien blitt Growth, men vi bruker factor() til å endre referansekategorien til No growth.

Når en omkoder numeriske variabler så kan det være nyttig å lage et plott for å sjekke at det ble riktig. Her kan du bruke fill argumentet til å gi ulik farge til observasjonene basert på growth_dich variabelen du nettopp lagde.

ggplot(EcoData, aes(x=growth)) +
  geom_bar() +
  theme(legend.title=element_blank()) +
  xlab("Growth rate") +
  ylab("No. of observations")

Hint: Husk at fill argumentet må stå inni aes(), etter x-variabelen

ggplot(EcoData, aes(x=growth, fill = growth_dich)) +
  geom_bar() +
  theme(legend.title=element_blank()) +
  xlab("Growth rate") +
  ylab("No. of observations")

Lineær regresjon

Før vi starter med regresjonen er det ofte lurt å skape et plott først som viser sammenhengen mellom avhengig variabel og uavhengig variabel. Forrige gang så vi på hvordan vi kunne lage et spredningsdiagram med ggplot() og geom_point(). Se om du her kan lage et med growth variabelen på x-aksen og inc_vote på y-aksen.

ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point()
Spredningsplott

Kjøre lineær regresjon i R

For å kjøre en lineær regresjon, altså OLS, bruker vi funksjonen lm(). Her skriver vi først regresjonsformelen vår, og så data og evt. hva R skal gjøre med missing verdier. Resultatet vil se sånn her ut:

Dersom datasettet ditt har manglende informasjon/missing verdier (NA) så må du legge til et element som sier hvordan regresjonen skal forholde seg til dette. Ved å legge til na.action = "na.exclude" i lm(), så beholder R informasjon om hvilke observasjoner som mangler data. Dette gjør også at vi kan bruke funksjonen fitted(), som diskuteres i Plotte regresjonslinjer.

Vi er interessert i effekten av den uavhengige variabelen growth på den avhengige variabelen inc_vote. Se om du kan bruke oppskriften over til å lage en modell du kaller mod1, som modellerer sammenhengen mellom disse to variablene og som tar hensyn til at vi har missing verdier på variablene.
Mod1 <- lm(inc_vote ~ growth, EcoData, na.action = "na.exclude")

Tolke resultater

Det er flere måter du kan se resultatene av modellen på, f.eks. summary(), stargazer(), og ggplot().

Prøv å kjøre summary på modellen mod1.
Regresjon Model 1

Her kan du også bruke stargazer(), da får du modellene i et litt mer lettlest format. For å bruke den funksjonen må du først sette inn modellen din, og så legge til argumentet type = "text. Her kan det vært fint å vite at om du bruker type = "html" istedet får du HTML-kode, som kan limes inn i Word. Et annet alternativ er å bruke type = "latex" for å få latex kode, om du skriver i det formattet.

stargazer(Mod1, type = "text")

Informasjonen vi får ved hjelp av summary() og stargazer() er veldig nyttig. Vi får vite koeffisientene, standardfeilene og informasjon vi kan bruke til å evaluere modellen vår.

Plotte regresjonslinjer

Vi kan plotte regresjonslinjen vår for å illustrere bivariate sammenhenger. Dette kan gjøres på to ulike måter:

  • Med ggplot().
  • Ved å regne predikerte verdier med predict() og fitted().

Regresjonslinje med geom_smooth()

Om du legger til geom_smooth(method = "lm") på et plot får du en linær regresjonsmodell får du lagt til en regresjonslinje.

Legg til geom_smooth(method = "lm") på plottet vi lagde for sammenhengen mellom growth og inc_vote.
ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point()
ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point() +
  geom_smooth(method = "lm")

Vi kan vise at regresjonslinjen krysser utvalgets gjennomsnittsverdier på uavhengig og avhengig variabel ved å legge til to linjer i koden vår

ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point() +
  geom_smooth(method = "lm") +
  geom_hline(yintercept=mean(EcoData$inc_vote), linetype = "dashed") +
  geom_vline(xintercept=mean(EcoData$growth), linetype = "dashed")
## `geom_smooth()` using formula = 'y ~ x'

Quiz

Regresjonslinje med predikerte verdier

Den andre metoden er å be R løse regresjonslikningen for alle observasjonene våre og så legge til et nytt lag med predikerte verdier i plottet.

R kan regne ut de predikerte verdiene for oss ved hjelp av funksjonen fitted(), så vi slipper heldigvis å gjøre dette for hånd. Vi kan også bruke resid() funksjonen for å hente ut residualene.

Lag to nye variabler som inneholder henholdsvis residualene og de predikerte verdiene for hver observasjon.
EcoData <- EcoData %>%
  mutate(predik = ,
         residualer = 
  )
EcoData <- EcoData %>%
  mutate(predik = fitted(Mod1),
         residualer = resid(Mod1)
  )

Nå kan vi bruke informasjonen fra de to variablene vi har opprettet, til å legge til en regresjonslinje i plottet vårt. Prikkene angir de ulike observerte verdikombinasjonene, mens den rette linjen gir oss den lineære sammenhengen fra modellen vår.

For å legge til disse verdiene i plottet må du bruke geom_line(). I geom_line() må du legge til et eget aes()-argument som tar x = growth, og y = predik.
ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point()
ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point() +
  geom_line(aes(x = growth, y = predik))

Arbeidsbok 5: Bivariat regresjonsanalyse

Eli Sofie Baltzersen, Louisa Boulaziz, Bjørn Høyland, Eric Nilsen, Lise Rødland

01/02/2024