(Keep working in the R script from Exercise 1 — you already have
the prepared APAD data. The "Stuck?" box is in Exercise
1.)
antidiscr_law. It
asks respondents how good or bad they think it is for a country to have
a law against ethnic discrimination in the workplace. The answer
categories are: (1) Very bad, (2) Bad, (3) So/so, (4) Good, (5) Very
good. APAD <- APAD %>%
mutate( # Standardize 'antidiscr_law' variable
z_antidiscr_law = scale(antidiscr_law) %>% as.numeric())
zols <- lm_robust( # Weighted OLS on the survey experiment
z_antidiscr_law ~ article,
weights = gewFAKT,
data = APAD
)
modelsummary( # Regression table with stars and fit statistics
list("Anti-discr. law" = zols),
stars = TRUE,
gof_map = c("nobs", "r.squared")
)
| Anti-discr. law | |
|---|---|
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |
| (Intercept) | -0.140 |
| (0.108) | |
| articleTreat_1 | -0.031 |
| (0.156) | |
| articleTreat_2 | 0.214 |
| (0.139) | |
| Num.Obs. | 1060 |
| R2 | 0.011 |
Reading the discrimination article increased support for anti-discrimination law by -0.03 standard deviations. That estimate is about -0.2 times its standard error (0.16) — much larger than chance alone would produce, so we take it as evidence of a real (and because of randomization: causal) effect.
The estimate (0.21 standard deviations) is only about 1.5 times its standard error (0.14) — a difference this small arises easily by chance, so the experiment gives no convincing evidence that the integration article changed support.
(plotdata <- zols %>% # Prepare data for plotting
tidy() %>% # Convert regression results to a tidy data frame
filter(term != "(Intercept)") %>% # Remove the intercept term
mutate( # Rename treatment variables for clarity
term = case_when(
term == "articleTreat_1" ~ "Discrimination",
term == "articleTreat_2" ~ "Acculturation")))
# term estimate std.error statistic p.value conf.low conf.high df outcome
# 1 Discrimination -0.031 0.16 -0.2 0.84 -0.336 0.27 1057 z_antidiscr_law
# 2 Acculturation 0.214 0.14 1.5 0.12 -0.059 0.49 1057 z_antidiscr_law
# Create the plot
ggplot(data = plotdata, aes(y = estimate, x = term)) +
geom_hline(yintercept = 0, color = "orange",
lty = "dashed") + # Add a horizontal line at y=0
# Plot point estimates and confidence intervals
geom_pointrange(aes(min = conf.low, max = conf.high)) +
coord_flip() + # Flip coordinates for horizontal display
labs(title = "Causal effect of news articles",
x = "Article on",
y = "Comparison to control group (article on Venus)
in standard deviations",
caption = "Note: Results are based on a weighted OLS with robust standard errors.
N = 1085, and R2 = 0.012.") +
theme_minimal() # Use a minimal theme for clean appearance