## 10.3 Visualizing the model

To get our version of the values in Table 10.2, we’ll first recreate columns for $$D_{1}$$ through $$W$$ (SEXISM) and save then as a tibble, nd.

(
nd <-
tibble(D1 = rep(c(0, 1, 0), each = 3),
D2 = rep(c(0, 0, 1), each = 3),
sexism = rep(quantile(protest$sexism, probs = c(.16, .5, .84)), times = 3)) ) ## # A tibble: 9 x 3 ## D1 D2 sexism ## <dbl> <dbl> <dbl> ## 1 0 0 4.31 ## 2 0 0 5.12 ## 3 0 0 5.87 ## 4 1 0 4.31 ## 5 1 0 5.12 ## 6 1 0 5.87 ## 7 0 1 4.31 ## 8 0 1 5.12 ## 9 0 1 5.87 With nd in hand, we’ll feed the predictor values into fitted() for the typical posterior summaries. fitted(model2, newdata = nd) %>% round(digits = 3) ## Estimate Est.Error Q2.5 Q97.5 ## [1,] 5.673 0.221 5.245 6.106 ## [2,] 5.289 0.159 4.974 5.606 ## [3,] 4.934 0.231 4.474 5.390 ## [4,] 5.428 0.246 4.959 5.914 ## [5,] 5.772 0.155 5.474 6.072 ## [6,] 6.091 0.198 5.697 6.487 ## [7,] 5.528 0.198 5.148 5.930 ## [8,] 5.776 0.149 5.484 6.065 ## [9,] 6.005 0.213 5.593 6.427 But is we want to make a decent line plot, we’ll need many more values for sexism, which will appear on the x-axis. nd <- tibble(sexism = rep(seq(from = 3.5, to = 6.5, length.out = 30), times = 9), D1 = rep(rep(c(0, 1, 0), each = 3), each = 30), D2 = rep(rep(c(0, 0, 1), each = 3), each = 30)) This time we’ll save the results from fitted() as a tlbble and wrangle a bit to get ready for Figure 10.3. model2_fitted <- fitted(model2, newdata = nd, probs = c(.025, .25, .75, .975)) %>% as_tibble() %>% bind_cols(nd) %>% mutate(condition = rep(c("No Protest", "Individual Protest", "Collective Protest"), each = 3*30)) %>% # This line is not necessary, but it will help order the facets of the plot mutate(condition = factor(condition, levels = c("No Protest", "Individual Protest", "Collective Protest"))) glimpse(model2_fitted) ## Observations: 270 ## Variables: 10 ##$ Estimate  <dbl> 6.054450, 6.005548, 5.956646, 5.907744, 5.858842, 5.809940, 5.761038, 5.71213...
## $Est.Error <dbl> 0.3576588, 0.3386639, 0.3199649, 0.3016169, 0.2836879, 0.2662626, 0.2494467, ... ##$ Q2.5      <dbl> 5.366049, 5.352536, 5.338721, 5.324167, 5.308774, 5.295117, 5.279485, 5.26047...
## $Q25 <dbl> 5.812538, 5.778561, 5.743566, 5.707137, 5.670806, 5.634155, 5.595954, 5.55770... ##$ Q75       <dbl> 6.290437, 6.231015, 6.170806, 6.110722, 6.052133, 5.991066, 5.932566, 5.87289...
## $Q97.5 <dbl> 6.758325, 6.675455, 6.589070, 6.505128, 6.419579, 6.333093, 6.251963, 6.17586... ##$ sexism    <dbl> 3.500000, 3.603448, 3.706897, 3.810345, 3.913793, 4.017241, 4.120690, 4.22413...
## $D1 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,... ##$ D2        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $condition <fct> No Protest, No Protest, No Protest, No Protest, No Protest, No Protest, No Pr... For Figure 10.3 and many to follow for this chapter, we’ll superimpose 50% intervals on top of 95% intervals. # This will help us add the original data points to the plot protest <- protest %>% mutate(condition = ifelse(protest == 0, "No Protest", ifelse(protest == 1, "Individual Protest", "Collective Protest"))) %>% mutate(condition = factor(condition, levels = c("No Protest", "Individual Protest", "Collective Protest"))) # This will help us with the x-axis breaks <- tibble(values = quantile(protest$sexism, probs = c(.16, .5, .84))) %>%
mutate(labels = values %>% round(2) %>% as.character())

# Here we plot
model2_fitted %>%
ggplot(aes(x = sexism)) +
geom_ribbon(aes(ymin = Q2.5, ymax = Q97.5),
alpha = 1/3) +
geom_ribbon(aes(ymin = Q25, ymax = Q75),
alpha = 1/3) +
geom_line(aes(y = Estimate)) +
geom_point(data = protest,
aes(y = liking),
size = 2/3) +
scale_x_continuous(breaks = breaks$values, labels = breaks$labels) +
coord_cartesian(xlim = 4:6,
ylim = c(2.5, 7.2)) +
labs(x = expression(paste("Perceived Pervasiveness of Sex Discrimination in Society (", italic(W), ")")),
y = "Evaluation of the Attorney") +
facet_wrap(~condition) +
theme_minimal()

By adding the data to the plots, they are both more informative and now serve as a posterior predictive check.