4.5 Relevante R-kommandoer
Under følger en liste over hvilke oppgaver du skal klare i R fra denne modulen. Vår policy fra og med vårsemesteret 2022 er at R-kommandoene under er tilstrekkelige for å løse oppgavene i datalabber og hjemmeeksamen i MET4. Det er med andre ord ikke nødvendig å lære seg teknikker utover det som er listet opp eksplisitt i listen under. Eventuelle nye teknikker som trengs for å løse en bestemt oppgave vil bli oppgitt og forklart dersom det er nødvendig. Det antas i tillegg at du kan den grunnleggende R-syntaksen som er dekket under Introduksjon til R.
Antakelser om datasett
Du kan gjøre de samme antakelsene om datasettet som i den tilsvarende oversikten i forrige modul: Datasettene er inneholdt i Excel-filer (.xls
eller xslx
) eller .csv
-filer, som kolonner av variabler, med variabelnavn i første rad.
Tilpasse en lineær regresjonsmodell
Her er et lekedatasett med tre forklaringsvariabler x1
, x2
og x3
, samt en responsvariabel y
: data-reg.xsls.
# Last inn data
library(readxl)
df <- read_excel("data-reg.xlsx")
# Syntaksen for å tilpasse en lineær regresjonsmodell med responsvariabel y og
# forklaringsvariabler x1, x2, x3 i datasettet df er som følger:
reg1 <- lm(y ~ x1 + x2 + x3, data = df)
# Dersom vi vil ha med interaksjonsledded mellom x1 og x3 kan vi skrive
# kommandoen under. Da vil også x1 og x3 automatisk bli med som variabler i
# tillegg til interaksjonsledde x1*x3.
reg2 <- lm(y ~ x1 + x2*x3, data = df)
# Log transformasjoner kan vi skrive rett inn i formelen
reg3 <- lm(log(y) ~ x1 + log(x2) + x3, data = df)
# Andre transformasjoner, som for eksempel dersom vi ønsker å ta med
# andregradsleddet x1^2, er greiest å få til dersom vi først lager en ny kolonne
# med kvadratene til x1, og så lager til regresjonen på vanlig måte:
df_ny <- df %>% mutate(x1_kvadrat = x1^2)
reg4 <- lm(y ~ x1 + x1_kvadrat+ x2 + x3, data = df_ny)
# Vi kan skrive ut et sammendrag for regresjonsmodellen ved hjelp av summary():
summary(reg1)
# Pakken stargazer inneholder en funksjon for å lage pene regresjonstabeller:
library(stargazer)
stargazer(reg1, reg2, type = "text")
# Man kan endre type-argumentet til "html", og sette out-argumentet til et
# filnavn hvis du vil skrive ut tabellen til en fil.
Prediksjoner, med konfidens- og prediksjonsintervall
La oss si at vi ønsker å predikere verdien av responsvariabelen for følgende verdier av forklaringsvariablene:
x1 | x2 | x3 |
---|---|---|
10 | 95 | 1 |
20 | 96 | 1 |
30 | 100 | 0 |
Da må vi først samle verdiene av forklaringsvariablene i en data frame; det kan vi enten gjøre direkte i R:
Et alternativ kan være å lage til et regneark i Excel, og så lese det inn ved hjelp av read_excel()
. Det er viktig at variabelnavnene i det nye datasettet er eksakt de samme som forklaringsvariablene i datasettet du brukte til å estimere regresjonsmodellen! Vi kan lage prediksjon med 95% konfidensintervall ved hjelp av predict()
:
Resultatet blir en ny data frame med kolonnene fit
(prediksjoner), samt lwr
og upr
, som inneholder nedre og øvre grense i konfidensintervallet henholdsvis. Du kan endre til prediksjonsintervaller ved å bytte ut "confidence"
med "prediction"
(eventuelt "none"
hvis du ikke ønsker noe intervall).
Lage residualplott
Vi må kunne lage følgende residualplott i R, her demonstrert med regresjonsmodellen reg1
som vi laget over:
# Henter ut residualer og predikerte verdier fra modellen, og setter de inn som
# kolonner i en dataframe:
residualer <- data.frame(residualer = reg1$residuals,
predikert = reg1$fitted.values)
# Spredningsplott, residualer mot predikerte verdier
ggplot(residualer, aes(x = predikert, y = residualer)) +
geom_point()
# Autokorrelasjonsplott
acf(reg1$residuals)
# Histogram for å sjekke normalantakelsen
ggplot(residualer, aes(x = residualer)) +
geom_histogram()
# QQ-plott, observasjonene ligger langs en rett linje hvis de er normalfordelte
ggplot(residualer, aes(sample = residualer)) +
stat_qq() +
stat_qq_line()
# Regner ut og plotter Cooks avstand:
infl <- influence.measures(reg1)
# Lager enkelt plott av Cooks avstand
cooks_avstand <- data.frame(obs = 1:nrow(df),
cook = infl$infmat[, "cook.d"],
cook_infl = infl$is.inf[, "cook.d"])
ggplot(cooks_avstand, aes(x = obs, y = cook)) +
geom_col()
Alle plottene over kan justeres og pyntes, for eksempel ved å gjøre endringer som i R-videoen om plotting. Se også forelesningsscriptet for flere tips om presentasjon av residualplott.