Skip to Tutorial Content

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 minst

  • alder er i antall år

  • kjonn er dikotom (1 = menn, 2 = kvinner)

  • utdanning er antall år med fullført utdanning

  • tillit (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 funksjonen names() til å se på variabel-navnene i datasettet. Husk at datasettet heter internett.
names(internett)
Bruk funksjonen 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.

Bruk head() 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 funksjonen sum() 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 funksjonen table() 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.
For hvor mange observasjoner har vi informasjon om alle variabler? Altså hvor mange fullstendige rader inneholder datasettet nå? Kombiner funksjonen 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

Funksjonen str() 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 funksjonen table() til å få bedre oversikt over variabelen kjonn.
table(internett$kjonn)

Her ser du antall menn og kvinner i utvalget.

Bruk funksjonen table() 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 funksjonen table() 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.

Bruk funksjonen 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?

Bruk funksjonen 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().

Lag et plott med variabelen 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 variabelen tillit 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 variabelen tillit 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 variabelen internettbruk 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.

Lag samme type plott som over, men med variabelen 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)
Lag samme type plott som over, men med variabelen 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.

Lag en modell hvor avhengig variabel er internettbruk og uavhengig variabel er alder. Lagre modell-objektet som mod1.
mod1 <- lm(internettbruk ~ alder,
           data = internett)
Print resultatene fra modellen ved hjelp av summary().
summary(mod1)
Bruk koden 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().

Estimer en linær modell som heter mod2 hvor internettbruk er avhengig variabel og alder og kjonn er uavhengige variabler.
mod2 <- lm(internettbruk ~ alder + kjonn, 
           data = internett)
Print modellsammendraget ved hjelp av funksjonen 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?

Bruk 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 kaller mod3 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)
Print et sammendrag av mod3 ved hjelp av funksjonen stargazer().
stargazer(mod3, type = "text")
Print et sammendrag av 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.

Bruk stargazer() 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!

Arbeidsbok 6: Multivariat regresjonsanalyse

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

30/01/2024