Mål og forberedelser
Hvordan påvirker alderen din hvor mye internett du bruker?
En naturlig tanke er at yngre bruker mye mer internett enn eldre. Men stemmer det? Er det slik at personer som bruker mye tid på internett har mer eller mindre tillit til politikere? Hvordan henger tillit sammen med utdanning? Dette og mer skal vi finne ut av gjennom å se nærmere på datasettet internett.
I denne arbeidsboken skal vi lære:
- Hvordan vi kan lage en multivariat regresjonsmodell i R.
- Hvordan presentere resultatene i en tabell.
- Hvordan hente ut prediksjoner fra en regresjonsmodell og plotte dem.
Laste inn pakker
Det aller første vi gjør er å laste inn pakkene vi skal bruke i dag ved hjelp av library(pakkenavn)
.
Dersom du ikke har brukt disse pakkene før må du huske å kjøre install.packages("pakkenavn")
først. Dersom du får en feilmelding av typen “Error in library(pakkenavn) : there is no package called ‘pakkenavn’” så kan det indikere at pakken ikke er installert. Prøv å kjøre install.packages("pakkenavn")
og library(pakkenavn)
igjen.
I dag skal vi bruke disse pakkene:
library(dplyr)
library(ggplot2)
library(modelr)
library(stargazer)
Hente inn data
Det neste vi skal gjøre er å laste inn datasettet vi skal jobbe med i dag. Datasettet heter internett
, og omhandler internettbruken til italienere. Enhetene er italienske statsborgere, og samlet inneholder datasettet 2745 observasjoner og 5 variabler. Vi skal undersøke sammenhengen mellom internettbruk, alder, kjønn, utdanning og tillit.
I dette datasettet måles:
internettbruk
på en skala fra 1-5 hvor fem er høyest og 1 er minstalder
er i antall årkjonn
er dikotom (1 = menn, 2 = kvinner)utdanning
er antall år med fullført utdanningtillit
(til politikere) måles på en skala fra 0-10 hvor 10 er høy tillit og 0 er ingen tillit.
Datasettet er en csv-fil og vi bruker følgende kode for å laste det inn:
internett <- read.csv("https://raw.githubusercontent.com/louisabo/STV4020A/master/SEMINAR3/internett.csv")
Oversikt over data
Bruk funksjonennames()
til å se på variabel-navnene i datasettet. Husk at datasettet heter internett
.
names(internett)
summary()
til å se på variabel-navnene og hente ut beskrivende statistikk om variablene i datasettet.
summary(internett)
Her ser du at alle variablene er numeriske fordi R viser oss min, maks, median, gjennomsnitt og mer for alle de fem variablene.
Brukhead()
for å se de første seks radene av datasettet.
head(internett)
Før vi går videre er vi interessert i å finne ut hvor mange missingverdier/NA det er i datasettet og hva vi skal gjøre med disse.
Kombiner funksjonensum()
og is.na()
for å finne ut hvor mange missingverdier det er i hele datasettet.
sum(is.na(internett))
# Husk at koden sum() kommer først. Inni koden sum() skriver du is.na() og deretter legger du til datasettet.
Denne koden viser hvor mange kolonner som har NA.
For hvor mange observasjoner har vi informasjon om alle variabler? Altså hvor mange fullstendige rader inneholder datasettet? Kombiner funksjonentable()
med complete.cases()
for å finne ut dette.
table(complete.cases(internett))
# Husk at koden begynner med table(). Inni table() skriver du koden complete.cases() etterfulgt av navnet på datasettet.
Denne koden viser hvor mange rader som har en eller flere kolonner som er NA. Dvs. hvor mange observasjoner (altså rader i datasettet) som har én eller flere kolonner med NA.
Fjern NA fra datasettet. Bruk%>%
og funksjonen drop_na()
. Overskriv informasjon i det allerede foreliggende datasettet.
internett <- internett %>%
drop_na()
# Med overskriving mener vi at du skal lagre det 'nye' datasettet i det allerede foreliggende datasettet. Objektnavnet skal altså være det samme.
table()
med complete.cases()
for å finne ut dette.
table(complete.cases(internett))
Forberedelse av data
Her skal vi en se på hvilke klasser variablene har og se på fordelingen av observasjoner på variablene.
Klasser
Funksjonenstr()
gir deg oversikt over antall observasjoner, variabler og klassen til variablene i datasettet. Bruken str()
til å hente ut denne informasjonen.
str(internett)
Vi har 2562 observasjoner og 5 variabler. Alle er numeriske (integer). Kjonn er 1 og 2, hvor 1 er mann og 2 er kvinne. Man kunne også tatt for seg hver enkelt variabel med koden class()
.
Observasjoners fordeling på de ulike variablene
Bruk funksjonentable()
til å få bedre oversikt over variabelen kjonn
.
table(internett$kjonn)
Her ser du antall menn og kvinner i utvalget.
Bruk funksjonentable()
til å få bedre oversikt over variabelen internettbruk
.
table(internett$internettbruk)
Her ser du at skalen går fra 1 til 5. Vi vet at fem er den høyeste verdien, som vil si at respondenter som har svart 5, bruker internett svært hyppig, eller veldig ofte.
Bruk funksjonentable()
til å få bedre oversikt over variabelen alder
.
table(internett$alder)
Her får du en oversikt over variabelen alder og du ser at de yngste respondentene i utvalget er 16 år og de eldste er 90. Videre så er du at det er 26 16-åringer i utvalget, 25 17-åringer og 21 90-åringer i utvalget.
table()
til å få bedre oversikt over variabelen utdanning
.
table(internett$utdanning)
Her ser du fordelingen av variabelen utdanning
. Den er målt i antall år med fullført utdanning fra 0 år til 37 år. Det er 2 personer i utvalget som ikke har noe utdanning, mens det er 1 person i utvalget som har 37 år med utdanning. Får du inntrykk av at dette er et høytutdannet eller et lavtutdannet utvalg?
table()
til å få bedre oversikt over variabelen tillit
.
table(internett$tillit)
Denne variabelen måler tillit på en skala fra 0-10 hvor 10 er høy tillit og 0 er ingen tillit.
Plotting av data
I denne delen skal du plotte dataene for å få en bedre forståelse av sammenhengen mellom ulike variable. Vi skal bruke ggplot()
.
internettbruk
på x-aksen og variabelen alder
på y-aksen. Du skal bruke geom_smooth(method = lm)
.
ggplot(internett, aes(internettbruk, alder)) +
geom_smooth(method = lm)
Plottet viser at jo eldre respondenten er, jo mindre internett bruker vedkommende. På samme måte betyr det at jo yngre respondenten er jo mer internett bruker vedkommende. Som du ser går lave verdier på y-aksen sammen med høye verdier på x-aksen.
Lag samme type plott som i forrige oppgave, men med variabelentillit
på x-aksen og variabelen alder
på y-aksen.
ggplot(internett, aes(tillit, alder)) +
geom_smooth(method = lm)
Plottet viser den linære sammenhengen mellom alder og tillit. Plottet viser at eldre respondenter har mindre tillit, mens yngre respondenter har mer tillit. Dette hjelper oss å forstå hva vi kan forvente når vi lager regresjonsmodeller. Disse plottene sier noe om vi kan forvente positive eller negative koeffisienter.
Lag samme type plott som i forrige oppgave, men med variabelentillit
på x-aksen og variabelen utdanning
på y-aksen.
ggplot(internett, aes(tillit, utdanning)) +
geom_smooth(method = lm)
Dette plottet viser sammenhengen mellom utdanning og tillit. Jo høyere utdanning en repondent har dessto mer tillit (til politikere) har vedkommende.
Lag samme type plott som i forrige oppgave, men med variabeleninternettbruk
på x-aksen og variabelen utdanning
på y-aksen.
ggplot(internett, aes(internettbruk, utdanning)) +
geom_smooth(method = lm)
Plottet viser sammenhengen mellom variablene internettbruk og utdanning. Her ser vi at respondenter som har høyere utdanning vil bruke mer til på internett.
Kontrollere for kjønn
Vi har også variabelen kjonn
i datasettet. Det vi skal gjøre i det følgende er å forsøke å se på forskjellen mellom menn og kvinner. Siden det er en dikotom variabel skal vi å lage en én linje for kvinner og én for menn. Dette kan gjøre på følgende måte:
ggplot(internett, aes(alder, internettbruk, col = as.factor(kjonn))) +
geom_smooth(method = lm )
## `geom_smooth()` using formula = 'y ~ x'
Gjennom å legge til col=as.factor(variabel)
så lager vi to linjer i plottet. 1 = mann og 2 = kvinner. Grunnen for at vi må ha as.factor(variabel)
er fordi klassen til variabelen kjonn
er numerisk, men vi vil ikke at R skal lese variabelen som numerisk, men som dikotom.
internettbruk
på x-aksen og variabelen utdanning
på y-aksen. Kontroll for variabelen kjonn
.
ggplot(internett, aes(internettbruk, utdanning, col=as.factor(kjonn))) +
geom_smooth(method = lm)
tillit
på x-aksen og variabelen utdanning
på y-aksen. Kontroll for variabelen kjonn
.
ggplot(internett, aes(tillit, utdanning, col=as.factor(kjonn))) +
geom_smooth(method = lm)
# Her kan det være lurt å copy-paste kode. I R skriver vi ofte samme kode, men endrer kun noen få ting, som f.eks variable. Et tips er da å kopiere tidligere kode og gjøre de endringene vi trenger.
Bivariat regresjon
Hvordan påvirker alder hvor mye internett man bruker?
Vi bruker koden er lm()
til å lage en regresjonsmodell. Vi printer resultatene med summary()
. Vi skal også laste inn pakken stargazer()
og bruke koden stargazer(modellobjekt, type = "text")
til å printe sammendrag av modellen.
internettbruk
og uavhengig variabel er alder.
Lagre modell-objektet som mod1
.
mod1 <- lm(internettbruk ~ alder,
data = internett)
summary()
.
summary(mod1)
stargazer()
til å printe enda et modellsammendrag. Spesifiser at du vil se outputen i tekst.
stargazer(mod1, type = "text")
Multivariat (multippel) regresjon
Nå skal du legge til flere variabler i modellen du lagde ovenfor. Du skal legge til variabelen kjonn
for å se hvordan kjønn påvirker sammenhengen mellom alder og internettbruk. Deretter skal vi legge til variabelen utdanning for å se hvordan utdanning påvirker hvor mye internett man bruker.
Hvordan påvirkes koeffsienten alder når vi kontrollerer for kjønn? For å legge til flere variabler i regresjonsmodellen bruker vi +
i funksjonen lm()
.
mod2
hvor internettbruk
er avhengig variabel og alder
og kjonn
er uavhengige variabler.
mod2 <- lm(internettbruk ~ alder + kjonn,
data = internett)
stargazer()
. Spesifiser at det skal være i tekstformat.
stargazer(mod2, type = "text")
Hvordan endrer koeffisientene seg når vi legger til flere variable?
Ofte så er vi interessert i hvordan koeffisienten til en variabel endrer seg når vi legger til flere variabler i modellen. I vårt tilfelle er vi interessert i hvordan koeffisienten til variabelen alder
endrer seg når vi legger til variabelen kjonn
i modellen. Kan noe av variasjonen i internettbruk også forklares av hvilken kjønn man har?
stargazer()
til å printe sammendrag av mod1
og mod2
. Du skiller mellom ulike modeller i stargazer()
ved hjep av ,
.
stargazer(mod1, mod2, type = "text")
Kontrollere for utdanning
Vi skal kontrollere for utdanning for å se hvordan antall år med utdanning påvirker internettbruk.
Estimer en modell som du kallermod3
hvor du kontrollerer for utdanning
. Modellen har internettbruk
som avhengig variabel, alder
, kjonn
og utdanning
som uavhengige variable. Kall modellen mod3
.
mod3 <- lm(internettbruk ~ alder+ kjonn+ utdanning,
data = internett)
stargazer()
.
stargazer(mod3, type = "text")
mod2
og mod3
ved hjelp av funksjonen stargazer()
.
stargazer(mod2, mod3, type = "text")
Plot regresjonslinjen
Vi skal plotte regresjonslinjen fra mod3
. Det som er viktig å vite er at modellen vi har laget består av spesifikke prediksjoner. Vi kan bruke modellen og de estimerte koeffisientene til å predikere internettbruken til for eksempel en mann, som er 16 år, som har 5 år med utdanning.
Da ser vi først på konstantleddet 4.155 (dette er den estimerte internettbruken til en mann som er 16 år). Deretter legger vi til eller trekker fra koeffisienten for alder (-0.042) og til slutt koeffisienten for utdanning (0.134*5) og ganger denne med 5 ettersom personen vi ønsker å si noe om har 5 år med utdanning. Til sammen får vi: 4.155-0.042+0.67=4.783. Svaret er altså at en gutt på 16 år med 5 års utdanning bruker 4.783 skalaenheter med internett.
Nå når vi skal plotte regresjonslinjen til modellen skal vi hente ut prediksjonene og plotte disse. For å gjøre dette trenger vi funksjonen add_predictions()
fra pakken modelr
.
prediksjoner <- internett %>%
add_predictions(mod3, var = "pred")
Her oppretter vi et nytt datasett som heter prediksjoner.
Dette datasettet tar utgangspunkt i vår allerede eksisterende datasett internett.
Koden add_predictions()
tar to argumenter, et modell-argument (vi skriver inn navnet på vår siste model) og et var=
som ber oss oppgi hva vi vil kalle variabelen som inneholder prediksjonene. Modell-argumentet viser til hvilken modell vi vil at R skal bruke for å predikere verdier.
La oss ta en titt på hvordan datasettet ser ut nå:
head(prediksjoner)
Her har vi et nytt datasett som heter prediksjoner
. Dette inneholder en ny variabel pred
. Denne variabelen er den predikerte internettbruken til alle observasjonene i datasettet. Den predikerte internettbruken til alle observasjonene er beregnet ut ifra mod3
.
Hadde vi brukt en av de andre modellene vi estimerte hadde vi fått litt andre prediksjoner. Vi skal bruke variabelen pred
som y-variabel når vi plotter regresjonslinjen. Vi må selv velge hvilken x-variabel vi ønsker å plotte. Som oftest plotter man den forklaringsvariabelen vi er mest interessert i. I vårt tilfelle er dette alder.
ggplot(prediksjoner, aes(alder, pred)) +
geom_smooth(method = lm)
## `geom_smooth()` using formula = 'y ~ x'
Regresjon med samspill kjonn og utdanning
Vi legger til samspillsledd i modellen vår ved å bruke *
mellom de to variablene vi vil undersøke samspillet av.
Vi skal legge til et samspillsledd mellom variablene kjonn
og utdanning
fordi vi mistenker at antall år med utdanning henger sammen med hvilket kjønn man har.
Vi lager samme modell som ovenfor men med samspillsledd kjonn*utdanning
i modellen. Da ser det slik ut:
mod4 <- lm(internettbruk ~ alder + kjonn + utdanning +
kjonn*utdanning,
data = internett)
Selv om vi legger til et samspillsledd så estimerer vi fortsatt hver enkelt variabel for seg selv også.
Når vi ser på outputen får vi et estimat for samspillsleddet.
Brukstargazer()
til å printe et modellsammendrag av mod4
.
stargazer(mod4, type = "text")
Samspillsleddet vårt er ikke signifikant. Samspillsleddet ser om det er en effekt av kjønn på antall år med utdanning som bør estimeres i modellen. Vårt samspillsledd er ikke signifikant, men dersom vi uansett vil tolke det, så tolkes samspillsleddet som effekten av kjønn på utdanningslengde.
Noen små stargazer hacks
Med stargazer kan vi printe fine tabeller som du har gjort ovenfor. Vi kan formatere tabellene slik at de blir akkurat slik vi ønsker.
stargazer(mod2, type = "text",
digits = 2, # spesifiserer hvor mange desimaler
dep.var.caption = "OLS regresjon", # navngir er tittel
dep.var.labels = "Internettbruk - avhengig var", #endrer navn på avhengig variabel i modellen
covariate.labels = c("Alder",
"Kjønn",
"Konstant") #navngir uavhengig variable
)
##
## ================================================
## OLS regresjon
## ----------------------------
## Internettbruk - avhengig var
## ------------------------------------------------
## Alder -0.05***
## (0.001)
##
## Kjønn -0.19***
## (0.05)
##
## Konstant 6.70***
## (0.10)
##
## ------------------------------------------------
## Observations 2,721
## R2 0.42
## Adjusted R2 0.42
## Residual Std. Error 1.26 (df = 2718)
## F Statistic 974.11*** (df = 2; 2718)
## ================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
For en bedre oversikt kan du alltid bruke hjelpefilen i R. Med tid blir de lettere å forstå. Av alle hjelpefiler er stargazer sin ganske overkommelig når man leser argument-forklaringene!