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