The Minneapolis Domestic Violence Experiment (Sherman & Berk 1984) randomly told officers how to respond to a domestic-violence call — but officers didn't always comply. Copy the starter:
pacman::p_load(tidyverse, estimatr, modelsummary, masteringmetrics)
data("mdve", package = "masteringmetrics") # ships with the package
T_RANDOM is the randomly assigned strategy,
T_FINAL what the officer actually did (1 = arrest;
2 & 3 = the lenient "coddle"; 4 = other → NA). Recode
both into two-category factors (Arrest as reference),
then cross-tabulate. How many officers complied with
their randomly assigned strategy?
mdve <- mdve %>%
mutate(
T_RANDOM = case_when(T_RANDOM %in% c(2, 3) ~ "Coddle!",
T_RANDOM == 1 ~ "Arrest!", TRUE ~ NA_character_) %>%
fct_relevel("Arrest!"),
T_FINAL = case_when(T_FINAL %in% c(2, 3) ~ "Coddled",
T_FINAL == 1 ~ "Arrested", TRUE ~ NA_character_) %>%
fct_relevel("Arrested"))
mdve %>% select(T_RANDOM, T_FINAL) %>% table()
# T_FINAL
# T_RANDOM Arrested Coddled
# Arrest! 91 1
# Coddle! 45 177
91 + 177 # compliers: arranged-and-arrested + coddle-and-coddled
# [1] 268
S_RACE)? Recode race, then
make a balance table across T_RANDOM.
mdve <- mdve %>%
mutate(S_RACE = case_when(S_RACE == 1 ~ "White", S_RACE == 2 ~ "Black",
S_RACE == 3 ~ "Indian", S_RACE == 4 ~ "Asian",
S_RACE == 5 ~ "Hispanic", TRUE ~ "Other"))
mdve %>% select(T_RANDOM, S_RACE) %>%
datasummary_balance(~ T_RANDOM, data = .,
title = "Subject's race by *assigned* strategy")
| Arrest! (N=93) | Coddle! (N=237) | ||||
|---|---|---|---|---|---|
| N | Pct. | N | Pct. | ||
| S_RACE | Asian | 0 | 0.0 | 2 | 0.8 |
| Black | 34 | 36.6 | 83 | 35.0 | |
| Hispanic | 1 | 1.1 | 7 | 3.0 | |
| Indian | 19 | 20.4 | 32 | 13.5 | |
| Other | 1 | 1.1 | 4 | 1.7 | |
| White | 38 | 40.9 | 109 | 46.0 | |
T_FINAL). What changed?
mdve %>% select(T_FINAL, S_RACE) %>%
datasummary_balance(~ T_FINAL, data = .,
title = "Subject's race by *actual* strategy")
| Arrested (N=136) | Coddled (N=178) | ||||
|---|---|---|---|---|---|
| N | Pct. | N | Pct. | ||
| S_RACE | Asian | 0 | 0.0 | 2 | 1.1 |
| Black | 49 | 36.0 | 62 | 34.8 | |
| Hispanic | 2 | 1.5 | 4 | 2.2 | |
| Indian | 24 | 17.6 | 24 | 13.5 | |
| Other | 1 | 0.7 | 3 | 1.7 | |
| White | 60 | 44.1 | 83 | 46.6 | |
mdve <- mdve %>%
mutate(T_FINAL_01 = if_else(T_FINAL == "Coddled", 1, 0))
first_stage <- lm_robust(T_FINAL_01 ~ T_RANDOM, data = mdve)
modelsummary(list("Coddled (0/1)" = first_stage), stars = TRUE,
coef_rename = c("T_RANDOMCoddle!" = "Randomly told to coddle"),
gof_map = c("nobs", "r.squared"))
| Coddled (0/1) | |
|---|---|
| + p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001 | |
| (Intercept) | 0.011 |
| (0.011) | |
| Randomly told to coddle | 0.786*** |
| (0.029) | |
| Num.Obs. | 314 |
| R2 | 0.522 |
Sherman & Berk report that being randomly told to coddle raised the probability of a repeat assault by 0.114, versus being told to arrest (regardless of what the officer did). In IV language this is the .
Put it together. The IV estimate of the local average causal effect of coddling (vs. arresting) on repeat assault is reduced form ÷ first stage: (two digits).
0.114 / 0.79 # reduced form / first stage = LATE
# [1] 0.14
So, for compliers, coddling rather than arresting raised the probability of a repeat assault by about 0.14 — evidence that arrest did deter. (Careful: it is a LATE, for the officers whose behaviour the random instruction actually changed.)
Discuss with your neighbour: which of the three IV requirements is hardest to defend here — that the random instruction affects repeat violence only through what the officer actually did (the exclusion restriction)? Could being told to arrest change an officer's demeanour in other ways?