Skip to Tutorial Content

Mål og forberedelser

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

Mål for arbeidsboken:

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.

# Henter nødvendige pakker 
library(tidyverse)

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

Oversikt over datsettet

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)

Referanser

Kellstedt, P. M. og Whitten, G. D. (2018). The Fundamentals of Political Science Research (Third edition.). Cambridge University Press.

Omkoding

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

Her skal vi lage to nye variabler ved hjelp av funksjonene is.na() og complete.cases(). Disse funksjonene ble diskutert i Arbeidsboken Statistisk analyse 1 under Missing data.

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(inf_na = ,
         complete = )
EcoData <- EcoData %>%
  mutate(inf_na = ,
         complete = )
EcoData <- EcoData %>%
  mutate(inf_na = ,
         complete = complete.cases(.))
EcoData <- EcoData %>%
  mutate(inf_na = is.na(inflation),
         complete = complete.cases(.))
EcoData <- EcoData %>%
  mutate(inf_na = is.na(inflation),
         complete = complete.cases(.))

Omkoding med ifelse()

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_binary = ifelse(, "Growth", "No growth"),
         growth_binary = factor(growth_binary, levels = c("No growth", "Growth")
                              )
         )

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

EcoData <- EcoData %>%
  mutate(growth_binary = ifelse(growth > 0, "Growth", "No growth"),
  growth_binary = factor(growth_binary, 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_binary 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_binary)) +
  geom_bar() +
  theme(legend.title=element_blank()) +
  xlab("Growth rate") +
  ylab("No. of observations")

Lineær regresjon

Visualisering av lineær sammenheng

Før man kjører en regresjonsmodell, er det lurt å skape et plott først som viser sammenhengen mellom avhengig variabel og uavhengig variabel i modellen vår. I forrige arbeidsbok (Statistisk analyse 1) så vi på hvordan vi kunne lage et spredningsplott for å illustrere sammenhengen mellom growth og inc_vote.

Lag et spredningsplott med growth variabelen på x-aksen og inc_vote på y-aksen.

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

Kjøre lineær regresjon i R

Vi bruker lm() for å kjøre en lineær regresjon i R. Syntaksen til lm() er som følger:

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.

mod1 <- lm(inc_vote ~ growth, data = EcoData)

Håndtere missing i regresjonsanalyse

Dersom datasettet ditt har manglende informasjon (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 senere kan bruke fitted() for å finne predikerte verdier, som diskuteres i Plotte regresjonslinjer.

mod1 <- lm(inc_vote ~ growth, data = 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.

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, evt. kan du bruke type = "latex" for å få latex kode, om du skriver i det.

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. I seminar skal vi bruke en del tid på å tolke disse tabellene.

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. Prøv å gjør det på plottet vi lagde istad.

ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point()
ggplot(EcoData, aes(growth, inc_vote)) +
  geom_point() +
  geom_smooth(method = "lm")

Vi kan også vise at regresjonslinjen krysser utvalgets gjennomsnitsverdier på avhengig og uavhengig 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. Denne metoden går vi ikke gjennom i detalj på seminar så det holder i massevis å kunne den første.

R kan regne ut de predikerte verdiene for oss ved hjelp av funksjonen fitted() så vi slipper heldigvis å gjøre det for hånd. Vi kan også bruke resid() funksjonen for å hente ut residualene. Prøv å lage 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 denne informasjonen til å legge til en regresjonslinje i plottet vårt. Prikkene angir de ulike observerte verdikominasjonene, mens den rette linjen gir oss den lineære sammenhengen fra modellen vår. For å legge til disse verdiene må du bruke geom_line(). I den 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))

Multivariat regresjonsmodell

Multivariat regresjonsanalyse er regresjonanalyse med flere uavhengige variabler. De uavhengige variablene kan være forklaringsvariabler eller variabler du ønsker å kontrollere for.

Her bruker vi også lm()-funksjonen, som man bruker for bivariat regresjonsanalyse. Syntaksen er som følger:

model <- lm(avhengig_variabel ~ uavhengig_variabel1 + uavhengig_variabel2, data = data, na.action = "na.exclude")

Her begynner vi først med å lage en regresjonsmodell med inc_vote som avhengig variabel og goodnews som uavhengig variabel.

# Kjører bivariat regresjonsmodell
m1 <- lm(inc_vote ~ goodnews, data = EcoData, na.action = "na.exclude")

# Printer resultatene med stargazer
stargazer(m1, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                              inc_vote          
## -----------------------------------------------
## goodnews                      0.868**          
##                               (0.323)          
##                                                
## Constant                     47.631***         
##                               (1.870)          
##                                                
## -----------------------------------------------
## Observations                    35             
## R2                             0.179           
## Adjusted R2                    0.155           
## Residual Std. Error       5.370 (df = 33)      
## F Statistic            7.217** (df = 1; 33)    
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Så kjører vi en multivariat med regresjonsmodell med inc_vote som avhengig variabel og goodnews og growth_binary som uavhengige variabler. Vi separarer de uavhengige variablene med +. Vi sammenligner m1 og m2 i en stargazer-tabell.

# Kjører multivariat regresjonsmodell
m2 <- lm(inc_vote ~ goodnews + growth_binary, data = EcoData, na.action = "na.exclude")

# Printer resultatene til begge modellene våre med stargazer
stargazer(m1, m2, type = "text")
## 
## =============================================================
##                                Dependent variable:           
##                     -----------------------------------------
##                                     inc_vote                 
##                             (1)                  (2)         
## -------------------------------------------------------------
## goodnews                  0.868**              0.862**       
##                           (0.323)              (0.317)       
##                                                              
## growth_binaryGrowth                             2.966        
##                                                (1.915)       
##                                                              
## Constant                 47.631***            45.632***      
##                           (1.870)              (2.241)       
##                                                              
## -------------------------------------------------------------
## Observations                 35                   35         
## R2                         0.179                0.237        
## Adjusted R2                0.155                0.189        
## Residual Std. Error   5.370 (df = 33)      5.259 (df = 32)   
## F Statistic         7.217** (df = 1; 33) 4.960** (df = 2; 32)
## =============================================================
## Note:                             *p<0.1; **p<0.05; ***p<0.01

Kjør en multivariat regresjonsmodell hvor du legger til inflation som en tredje uavhengig variabel. Spesifiser at informasjon om observasjoner manglende verdier skal beholdes (na.action = "na.exclude"). Kall modellen m3.

m3 <- lm(inc_vote ~ goodnews + growth_binary + inflation, data = EcoData, na.action = "na.exclude")

Multivariat regresjonsmodell med samspillsledd

Modellene i seksjonen over har vært additive modeller. Nå skal vi legge til et samspillsledd mellom i hvilken grad det har vært positive nyheter (goodnews) og den diktome variabelen for om det har vært økonomisk vekst (growth_binary). Dette vil si om det er forskjell på effekten av positive nyheter på stemmeandelen til den sittende presidenten avhengig av om det har vært økonomisk vekst eller ikke. Vi legger til samspillsledd i modellen vår ved å bruke * mellom de to variablene vi vil undersøke samspillet av.

# Kjører regresjonsmodell med samspillsledd
m3 <- lm(inc_vote ~ growth_binary*goodnews, data = EcoData, na.action = "na.exclude")

# Printer resultatene modellen med stargazer
stargazer(m3, type = "text")
## 
## ========================================================
##                                  Dependent variable:    
##                              ---------------------------
##                                       inc_vote          
## --------------------------------------------------------
## growth_binaryGrowth                   10.176**          
##                                        (3.807)          
##                                                         
## goodnews                              1.891***          
##                                        (0.564)          
##                                                         
## growth_binaryGrowth:goodnews          -1.435**          
##                                        (0.666)          
##                                                         
## Constant                              40.484***         
##                                        (3.197)          
##                                                         
## --------------------------------------------------------
## Observations                             35             
## R2                                      0.336           
## Adjusted R2                             0.272           
## Residual Std. Error                4.984 (df = 31)      
## F Statistic                     5.230*** (df = 3; 31)   
## ========================================================
## Note:                        *p<0.1; **p<0.05; ***p<0.01

Neste arbeidsbok

Statistisk analyse 2

Master i statsvitenskap — R-forberedelse

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

2023-06-14