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
  1. 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
  1. Was the randomly assigned strategy balanced across the subject's race (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")
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
  1. Now balance race across what officers actually did (T_FINAL). What changed?
mdve %>% select(T_FINAL, S_RACE) %>%
  datasummary_balance(~ T_FINAL, data = .,
                      title = "Subject's race by *actual* strategy")
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
  1. First stage. Regress actual coddling (1 = coddled) on the assigned strategy. How much more likely was an officer to coddle when randomly told to, rather than arrest? — in IV language this is the .
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
  1. 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 .

  2. 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?