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