library(rio) #laden van data
library(tidyverse) #datamanipulatie en grafieken
library(broom) #samenvattingen regressiemodellen
library(marginaleffects) #voorspelde waarden berekenen
<- import("demdata.rds") |>
demdata as_tibble()
2 Bivariate Regressie met Binaire en Categorische Predictoren
In het vorige hoofdstuk bespraken we hoe een lineaire regressieanalyse te gebruiken om de relatie tussen continue variabelen na te gaan. In dit hoofdstuk wordt uitgelegd hoe je een bivariate regressie kan uitvoeren met binaire en categorische variabelen.
We beginnen zoals gewoonlijk met het laden van relevante R packages (‘libraries’). Deze packages zijn reeds geïnstalleerd op de universitaire computers, maar moeten eerst geladen worden. We laden ook onze dataset.
2.1 Data Management: Converteren naar een factor variabele
Via lineaire regressieanalyse kunnen we een continue afhankelijke variabele ook voorspellen aan de hand van binaire (2 waarden) en categorische (3 of meer waarden) variabelen.
Om deze variabelen te gebruiken in een regressiemodel moeten ze toegevoegd worden als dichotome of “dummy” variabelen. Als de variabele binair is, wordt 1 dummy gebruikt, als de variabelen meer categorieën kent, worden meerdere dummies gebruikt.1 R voegt automatisch dummies toe voor factor variabelen, dus transformeren we binaire en categorische variabelen naar factor variabelen voor we ze in een regressie analyse gebruiken.2
In dit voorbeeld maken we gebruik van de variabele “TYPEDEMO1984”. Deze binaire variabele toont of een land een democratie of autocratie was in het jaar 1984. De variabele is numeriek opgeslagen (dit kunnen we controleren met behulp van de functie class()
). De waarde 1 staat voor autocratie, de waarde 2 voor democratie.
#Informatie over type variabele:
class(demdata$TYPEDEMO1984)
[1] "numeric"
#simpele tabel
table(demdata$TYPEDEMO1984)
1 2
86 57
Aangezien de variabele numeriek is, transformeren we deze eerst naar een factor variabele. We kunnen dit doen met de ingebouwde factor()
functie (zie Statistiek I, 1.6.3) of met de factorize()
functie afkomstig uit het rio
package. Deze laatste functie is vooral handig als de waarden labels hebben zoals hier het geval is ( 1 = “Autocratie”, 2 = “Democratie”). Als er geen labels zijn, moet je factor()
gebruiken gezien factorize()
in dat geval niet de juiste uitkomsten geeft. Zie Paragraaf A.2 voor meer informatie.
De labels kun je zien met behulp van de view_df()
functie uit het sjPlot
package (zie Paragraaf 1.1) of door gebruik te maken van de ingebouwde functie attributes()
(vooraleer je transformeert naar factor): attributes(demdata$TYPEDEMO1984)
. Daarbij kijk je of er informatie is waar “$labels” staat.
attributes(demdata$TYPEDEMO1984)
$label
[1] "Type of democracy, 1984"
$format.stata
[1] "%10.0g"
$labels
Autocracies Democracies
1 2
We gebruiken factorize()
gezien de waarden van onze variabelen labels hebben (1 = “Autocratie”, 2 = “Democratie”). We kijken ook na of de functie gelukt is.
# transformeren naar factor
<- demdata |>
demdata mutate(TYPEDEMO1984_factor = factorize(TYPEDEMO1984))
#Niveaus (levels) bekijken en tabel om te checken
levels(demdata$TYPEDEMO1984_factor)
[1] "Autocracies" "Democracies"
table(demdata$TYPEDEMO1984_factor)
Autocracies Democracies
86 57
De syntax is eenvoudig:
factorize(
-
Naam van de functie die wordt toegepast op de variabele tussen haakjes.
TYPEDEMO1984
-
Aangeduide variabele. Het laagste numerieke niveau van deze variabele zal als eerste niveau van de factor gebruikt worden en dus als referentiecategorie.
Dezelfde procedure wordt gehanteerd voor een categorische variabele met 3 of meer categorieën. Bijvoorbeeld, de variabele Typeregime2006
geeft weer of een land een liberale democratie was (=1), een electorale democratie (=2), of een autocratie (=3) in het jaar 2006. Deze variabele heeft ook waarden-labels dus kunnen we opnieuw factorize()
gebruiken:
#transformeer naar factor variabele
<- demdata |>
demdata mutate(Typeregime2006_factor = factorize(Typeregime2006))
#Werk checken
levels(demdata$Typeregime2006_factor)
[1] "Liberal democracy" "Electoral democracy" "Autocracy"
table(demdata$Typeregime2006_factor)
Liberal democracy Electoral democracy Autocracy
71 53 41
We raden aan om nieuwe variabelen aan te maken wanneer je een bestaande variabele omzet naar een factorvariabele (of wanneer je hercodeert) zoals hiervoven (bv., mutate(TYPEDEMO1984_factor = factorize(TYPEDEMO1984))
). Als je een nieuwe variabele aanmaakt, overschrijf je nooit de originele. Dit kan helpen om fouten makkelijker te corrigeren (zonder dat je dataset opnieuw moet inladen en eerdere syntax runnen).
2.1.1 Veranderen van de referentiecategorie
factorize()
gebruikt de eerste numerieke waarde als referentiegroep bij het maken van een factorvariabele. factor()
doet dit ook, tenzij we expliciet de volgorde van de factorniveaus (levels) aanduiden in de syntax (zie het voorbeeld in Paragraaf A.2).
In elk geval kunnen we de referentiecategorie veranderen als we dat willen. Dit kunnen we doen met behulp van de relevel()
functie. Hieronder veranderen we de referentiecategorie voor “Typeregime2006_factor” naar “Electoral Democracy”.
<- demdata |>
demdata mutate(Typeregime2006_factor_relevel = relevel(Typeregime2006_factor, "Electoral democracy"))
relevel(
-
Naam van de functie
Typeregime2006_factor,
-
We gebruiken “Typeregime2006_factor” uit de “demdata” dataset.
"Electoral democracy")
-
We geven de naam op van de categorie die we als referentiecategorie willen nemen tussen dubbele aanhalingstekens. We gebruiken de naam tussen aanhalingstekens omdat de variabele reeds hierboven naar een factor is omgezet, anders zou dit niet werken.
We checken altijd beter of alles goed is gegaan:
#Checken:
levels(demdata$Typeregime2006_factor)
[1] "Liberal democracy" "Electoral democracy" "Autocracy"
levels(demdata$Typeregime2006_factor_relevel)
[1] "Electoral democracy" "Liberal democracy" "Autocracy"
2.2 Factor variabelen als predictoren
We voegen binaire en categorische onafhankelijke variabelen toe aan de regressieanalyse op dezelfde manier als bij continue variabelen:
# Met binaire predictor:
<- lm(v2x_polyarchy ~ TYPEDEMO1984_factor, data=demdata)
model_binary summary(model_binary)
Call:
lm(formula = v2x_polyarchy ~ TYPEDEMO1984_factor, data = demdata)
Residuals:
Min 1Q Median 3Q Max
-0.51025 -0.15007 -0.00857 0.17309 0.48543
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.41757 0.02333 17.90 < 2e-16 ***
TYPEDEMO1984_factorDemocracies 0.27268 0.03695 7.38 1.25e-11 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2163 on 141 degrees of freedom
(36 observations deleted due to missingness)
Multiple R-squared: 0.2786, Adjusted R-squared: 0.2735
F-statistic: 54.47 on 1 and 141 DF, p-value: 1.247e-11
# Met categorische predictor:
<- lm(v2x_polyarchy ~ Typeregime2006_factor, data=demdata)
model_categorical summary(model_categorical)
Call:
lm(formula = v2x_polyarchy ~ Typeregime2006_factor, data = demdata)
Residuals:
Min 1Q Median 3Q Max
-0.40104 -0.09898 0.00196 0.10773 0.47773
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.75404 0.01734 43.48 <2e-16
Typeregime2006_factorElectoral democracy -0.32106 0.02653 -12.10 <2e-16
Typeregime2006_factorAutocracy -0.50577 0.02866 -17.64 <2e-16
(Intercept) ***
Typeregime2006_factorElectoral democracy ***
Typeregime2006_factorAutocracy ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.1461 on 162 degrees of freedom
(14 observations deleted due to missingness)
Multiple R-squared: 0.6789, Adjusted R-squared: 0.6749
F-statistic: 171.2 on 2 and 162 DF, p-value: < 2.2e-16
De output van een model met binaire/categorische predictor is dezelfde als die van een model met een continue predictor met 1 verschil. R zal de variabelenaam bij de coëfficiënten anders weergeven als er een factor variabele is. Dan krijg je de naam van de variabele, onmiddellijk gevolgd door de categorie die de waarde 1 aanneemt in de dummy. Bijvoorbeeld: “TypeDemo1984_factorDemocracies” or “Typeregime2006_factorAutocracy.”
Er zijn subtiele verschillen in de interpretatie als een factor variabele opgenomen wordt in het model:
De Estimate
kolom toont de coëfficiënten van het regressiemodel.
Het”(Intercept)” toont nog steeds de verwachte waarde op de afhankelijke variabele als de onafhankelijke variabele gelijk is aan 0. Als de enige onafhankelijke variabele een factor is dan toont het intercept de gemiddelde waarde op Y voor de referentiegroep (factor dummy = 0).
Hier vinden we dat de gemiddelde waarde voor v2x_polyarchy
voor autocratieën (gemeten volgens de TYPEDEMO1984_factor
variabele) gelijk is aan het Intercept dat we hierboven vonden.
|>
demdata filter(TYPEDEMO1984_factor == "Autocracies") |>
summarize(mean_democracy = mean(v2x_polyarchy, na.rm=T)) |>
as.data.frame()
- 1
- De filter verwijdert observaties die niet de waarde “Autocracies” hebben voor TYPEDEMO1984_factor
- 2
- Deze optie dwingt R om alle decimalen weer te geven voor een betere vergelijking met het Intercept.
mean_democracy
1 0.4175698
De coëfficiënten voor binaire en categorische variabelen worden best gezien als het verschil in de gemiddelde score voor Y tussen de referentiecategorie en andere categorieën. De coëfficiënt voor “TYPEDEMO1984_factorDemocracies” is bijvoorbeeld 0.2726758.3 Dit betekent dat de gemiddelde score op Y voor democratieën 0.2726758 schaalpunten groter is dan de gemiddelde waarde voor autocratieën (de referentiecategorie).
We kunnen dit wiskundig nagaan:
# Gemiddelde voor democratieën
|>
demdata group_by(TYPEDEMO1984_factor) |>
summarize(mean_democracy = mean(v2x_polyarchy, na.rm = T)) |>
as.data.frame()
TYPEDEMO1984_factor mean_democracy
1 Autocracies 0.4175698
2 Democracies 0.6902456
3 <NA> 0.4638056
# gemiddelde democratieën - gemiddelde autocratieën
0.6902456 - 0.4175698
[1] 0.2726758
Hetzelfde geldt voor categorische factorvariabelen. De “(Intercept)” waarde in model_categorical
is de gemiddelde waarde voor de observaties in de referentiecategorie (hier: “Liberal Democracy”). De coefficiënten tonen hoe de andere groepen verschillen van dit gemiddelde. De gemiddelde 2020 democratiescore voor landen die in 2006 een “Electoral Democracy” waren is -0.32 schaalpunten lager dan de gemiddelde 2020 democratiescore voor de “Liberal Democracy” referentiegroep.
|>
demdata group_by(Typeregime2006_factor) |>
summarize(mean_democracy = mean(v2x_polyarchy, na.rm=T)) |>
as.data.frame()
Typeregime2006_factor mean_democracy
1 Liberal democracy 0.7540423
2 Electoral democracy 0.4329811
3 Autocracy 0.2482683
4 <NA> 0.3777143
# gemiddelde Elec Democracy - gemiddelde in Lib Democracy
0.4329811 - 0.7540423
[1] -0.3210612
# gemiddelde in Autocracy - gemiddelde in Lib Democracy
0.2482683 - 0.7540423
[1] -0.505774
Zie Paragraaf 8.4 voor verdere informatie over hoe de resultaten te presenteren in taken en papers.
We gebruiken k-1 dummies, waarbij k = aantal categorieën. Als een categorische variabele 4 categorieën heeft (Bijvoorbeeld: Noorden, Westen, Zuiden en Oosten), dan gebruiken we (4-1=) 3 dummies.↩︎
Transformatie is niet nodig als de originele variabelen reeds opgeslaan zijn als factor in de dataset, maar misschien moet de referentiecategorie wel aangepast worden (zie verder).↩︎
Normaal ronden we af op 2 of 3 decimalen, maar hier tonen we de hele coëfficiënt zodat deze beter vergeleken kan worden met het verschil tussen de gemiddelden.↩︎