library(tidyverse)
library(ggplot2)
library(plotly)
library(kableExtra)
library(leaflet)
library(leaflegend)
library(htmltools)
library(scales)
library(icons)

# Time pre and post reform
# Note the snapshot graphic in intro ends on 12/31/2023 instead

today = Sys.Date()

yrs.pre = as.numeric(reform.date - start.date)/365
yrs.post = as.numeric(today - reform.date)/365

days.post <- as.numeric(today - reform.date)
date.sameperiod.before <- reform.date - days.post


# Pre-post legislation pursuit vehicular fatality counts ----
# Needs to be done each time because the lookback window keeps changing,
# even if there are no *new* pursuit fatalities, this can change the
# pre-post comparison

## Pursuit vehicular fatalities (includes terminated pursuits)
pre.post.apf <- fatalities.pvf %>%
  filter(date > date.sameperiod.before) %>%
  group_by(postreform) %>%
  summarize(Subjects = sum(victim == "Subject"),
            Bystanders = sum(victim == "Bystander"),
            Passengers = sum(victim == "Passenger"),
            Officers = sum(victim == "Officer"),
            Total = n()
            ) %>%
  mutate(Period = factor(ifelse(postreform==0, "Pre-reform", "Post-reform"),
                         levels = c("Pre-reform", "Post-reform"))
         )

pre.reform.num <- pre.post.apf$Total[pre.post.apf$postreform == 0]
post.reform.num <- pre.post.apf$Total[pre.post.apf$postreform == 1]
pct.change.post.reform <- post.reform.num/pre.reform.num - 1

# End of previous year snapshot

eoy2023 = as.Date("2023-12-31")
days.post.snapshot <- as.numeric(eoy2023 - reform.date)
date.snapshot.before <- (reform.date-1) - days.post.snapshot

pre.post.snapshot <- fatalities.pvf %>%
  filter(date > date.snapshot.before & date <= eoy2023) %>%
  group_by(postreform) %>%
  summarize(Subjects = sum(victim == "Subject"),
            Bystanders = sum(victim == "Bystander"),
            Passengers = sum(victim == "Passenger"),
            Officers = sum(victim == "Officer"),
            Total = n()
            ) %>%
  mutate(Period = factor(ifelse(postreform==0, "Pre-reform", "Post-reform"),
                         levels = c("Pre-reform", "Post-reform"))
         ) 

pre.reform.num.snapshot <-
  pre.post.snapshot$Total[pre.post.snapshot$postreform == 0]
post.reform.num.snapshot <-
  pre.post.snapshot$Total[pre.post.snapshot$postreform == 1]
pct.change.post.reform.snapshot <-
  post.reform.num.snapshot/pre.reform.num.snapshot - 1

Introduction

This report examines fatalities associated with vehicle pursuits by law enforcement in WA State since 2015.

Pursuits are unique among police tactics in their risk of collateral damage. Nationally, about one-third of pursuits lead to vehicular accidents, and a substantial fraction of those injured or killed in these accidents are uninvolved bystanders, passengers and officers.

Here in Washington state, recent legislative changes provide an opportunity to observe whether pursuit policies can reduce these fatalities.

Legislative history

In 2021 the legislature enacted a statewide policy to reduce the growing number of people killed during police vehicle pursuits (House Bill 1054, effective July 25, 2021). At that time, pursuits were responsible for 10-20% of the fatalities from police activities each year. About half of those killed were passengers, officers or uninvolved bystanders.

HB 1054 established a clear standard for balancing the danger posed to the public by the pursuit against the danger posed by a fleeing subject. It prioritized public safety: police are allowed to engage in pursuits when there is a well established threat to public safety – violent offenses (like carjackings, armed robberies), sex offenses, DUIs, and prison escapes – but not for misdemeanors or property crimes. It required that the evidence of the threat meets the “probable cause” standard – the same standard required to make an arrest. In effect the law says: If you don’t have enough evidence to arrest the person, then you can not justify the risk to public safety for this pursuit.

In 2023 the legislature modified the policy, lowering the standard of evidence required from probable cause to reasonable suspicion, adding vehicular and domestic assaults explicitly to the list of offenses eligible for pursuit, and removing the requirement for supervisory authorization. These changes took effect May 3, 2023.

The full text of the current law (RCW) on vehicle pursuits can be found in the Pursuit legislation section at the end of this report.

Summary of impact through 2023

It has been about 2.5 years since the 2021 policy took effect, and the data show that pursuit-related fatalities in Washington have fallen in that time.

By the end of 2023, the number of people killed during pursuits had dropped by 50% since the pursuit policy was first adopted.

# Snapshot: Time pre and post reform thru 12/31/2023

yval <- pre.post.apf$Total[nrow(pre.post.apf)] + 0.5
txt <- paste(scales::percent(-pct.change.post.reform.snapshot),
             "reduction")

df.snapshot <- fatalities.pvf %>%
  filter(date > date.snapshot.before & date <= eoy2023) %>%
  mutate(Period = factor(ifelse(postreform==0, 
                                "Pre-reform", "Post-reform"),
                         levels = c("Pre-reform", "Post-reform"))
         ) %>%

  mutate(Group2 = if_else(victim == "Subject", victim, "Other People")) %>%
  select(Period, Group2) 
  

prepost <- ggplot(df.snapshot, 
                  aes(x=Period, fill=Group2)) +
  
  geom_bar(alpha = 0.8) +
  
  annotate("text",
           x = 2, y = yval,
           label = txt) +
  
  scale_y_continuous(breaks = 0:max(pre.post.apf$Total)) +
  
  scale_x_discrete(breaks=levels(df.snapshot$Period),
                   labels=c(
                     paste0(
                       "Pre-reform \n",
                       format(date.snapshot.before, "%m/%d/%y"), " - ",
                       format(reform.date-1, "%m/%d/%y")),
                     paste0(
                       "Post-reform \n",
                       format(reform.date, "%m/%d/%y"), " - ",
                       format(eoy2023, "%m/%d/%y"))
                  )) +
  
  scale_fill_manual(values = cols.2) +
  
  theme(text = element_text(size = 12),
        axis.title.x = element_text(size = 12)) +

  labs(title = "Persons killed in vehicular pursuits: pre vs. post reform",
       x = "Period",
       y = "Number of people killed",
       fill = "Person killed")
  
  
ggplotly(prepost) %>% reverse_legend_labels()

This graph provides an end-of-year snapshot of the number of people killed in equivalent time periods before and after the 2021 pursuit policy change. The total time covered by this comparison is now about 5 years, with half before and half after the reform. The pursuit fatalities include all known incidents where an active vehicular pursuit led to a vehicular homicide.


It will be important to continue to monitor the data, but the trend so far suggests that the law is working as intended to improve public safety: It is saving lives.

For more details on temporal patterns, including a continuously updated estimate of the impact, see the section on Trend over time.

For information on data sources and identification of vehicular pursuit incidents, see the Data section.

What this report covers

The remainder of this report examines the range of fatalities that are associated with police vehicular pursuits:

  • “Pursuit vehicular fatalities” - an active vehicular pursuit led to a vehicular homicide caused by one of the cars involved in the pursuit (shown in the graph above).

  • “After pursuit fatalities” – a pursuit was involved earlier in the incident, but had ended by the time the fatality occurred. Typically the person killed in these cases is a fleeing subject who is shot at the end of the chase. But sometimes if police terminate a pursuit the subject may continue to flee for some time, and cause a vehicular homicide that happens well after the end of the pursuit. In these cases the fatality may be an uninvolved bystander or passenger.

  • “Attempted stop fatalities” – a subject fled an attempted stop by police and committed a vehicular homicide in the process, but the police vehicle did not engage in pursuit. We are relying on the media report of the law enforcement statement that the patrol car lights and/or siren were activated to stop the subject, but there was no pursuit.

The majority of the report focuses on the first two types: pursuit vehicular fatalities and after pursuit fatalities, examined separately. The attempted stop fatalities are different for several reasons, so we address them in a section of their own.

How the report is organized

The table of contents on the left shows the outline of the information. All of the entries are linked and can be used to navigate through the report. Note that clicking on an entry of the TOC will cause the sub-headings to display if there are any.

Within each section of the report listed in the TOC, you may find “tabs” on the page that contain additional information. The active tab is highlighted with a blue filled box, and you can click the inactive tabs on either side of the active tab to access their information.

The graphics use a consistent color coding to help with comparisons, and the color scheme is linked to the type of data in the graph: pursuit vehicular fatalities (color codes for victim type), after pursuit fatalities (color codes for homicide vs. suicide), and incidents (color codes for pursuit vehicular fatalities and after pursuit fatalities).


Interactive Maps

The first map is restricted to pursuit vehicular fatalities only.

The second map adds in after pursuit fatalities.

Pursuit vehicular fatalities

Each marker represents an active vehicle pursuit that ended with a vehicular homicide.

  • Red markers are pursuits that resulted in officers, bystanders and/or passengers being killed or injured.

  • Blue markers are pursuits with subject fatalities only

  • The icon inside the marker shows whether this was a single or multiple fatality incident.

This map is also interactive:

  • Hovering over the pointer brings up the number of people killed and injured, the law enforcement agency involved, and the date of the incident;

  • Clicking the pointer will bring up a url to a news article on the incident.

# Make icons for single/multiple fatality incidents

# color = incident type for map:
## red = ap with any pb killed, 
## blue = ap with subject killed, 
# icon = number killed (single/multiple)

iconset <- awesomeIconList(
  single = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ),
  mult = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ))

iconset.legend <- awesomeIconList(
  `P/O/B killed` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'red',
  ),
  `Subject killed` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'blue',
  ),
  `Multiple fatalities` = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'white',
  ))

labs <- with(incidents.pvf, 
              as.character(paste("fatalities:", 
                                 fatalities, '<br>',
                                 "injuries:",
                                 total.injuries, '<br>',
                                 'by', agency, '<br>',
                                 'date: ', format(date, format="%m/%d/%y"))))

map <- leaflet(
  data = incidents.pvf, 
  width = "100%") %>% 
  addTiles() %>%
  
  addAwesomeMarkers( ~ long, ~ lat,
                    popup = ~ url_click,
                    label = lapply(labs, htmltools::HTML),
                    icon = ~iconset[inci.mapmult]) %>%
  
  addLegendAwesomeIcon(iconSet = iconset.legend,
                       orientation = 'vertical',
                       title = htmltools::tags$div(
                         style = 'font-size: 10px;',
                         'Incident type'),
                       labelStyle = 'font-size: 8px;') %>%
  
  leaflet.extras::addResetMapButton()
map

All pursuits

Each marker represents one or more fatalities from an incident that involved a police vehicle pursuit.

  • Red markers are pursuits that resulted in officers, bystanders and/or passengers being killed.

  • Blue markers are pursuits with subject fatalities only.

  • Green markers are after pursuit homicides – the person was killed after the pursuit ended.

  • Beige markers are after pursuit suicides – the person took their own life after the pursuit ended.

  • The icon in the marker shows whether this was a single or multiple fatality incident.

This map is interactive:

  • Hovering over the pointer brings up the number of people killed and injured, the law enforcement agency involved, and the date of the incident;

  • Clicking the pointer will bring up a url to a news article on the incident.

# Make icons for single/multiple fatality incidents

# color = incident type for map:
## red = ap with pb killed/injured, 
## blue = ap with only suspect killed, 
## green = After pursuit homicide (suspect killed)
## yellow = After pursuit suicide


# icon = number killed (single/multiple)

iconset <- awesomeIconList(
  single = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ),
  mult = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ))

iconset.legend <- awesomeIconList(
  `Pursuit fatality, P/O/B` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'red',
  ),
  `Pursuit fatality, Subject` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'blue',
  ),
  `After pursuit homicide` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'green',
  ),
    `After pursuit suicide` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'beige',
  ),
  `Multiple fatalities` = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'white',
  ))

labs <- with(incidents.p, 
              as.character(paste("fatalities:", 
                                 fatalities, '<br>',
                                 "injuries:",
                                 total.injuries, '<br>',
                                 'by', agency, '<br>',
                                 'date: ', format(date, format="%m/%d/%y"))))

map <- leaflet(data = incidents.p, width = "100%") %>% 
  addTiles() %>%
  
  addAwesomeMarkers( ~ long, ~ lat,
                    popup = ~ url_click,
                    label = lapply(labs, htmltools::HTML),
                    icon = ~iconset[inci.mapmult]) %>%
  
  addLegendAwesomeIcon(iconSet = iconset.legend,
                       orientation = 'vertical',
                       title = htmltools::tags$div(
                         style = 'font-size: 10px;',
                         'Incident type'),
                       labelStyle = 'font-size: 8px;') %>%
  
  leaflet.extras::addResetMapButton()
map

Pursuit Statistics

Pursuit statistics can be counted in two ways:

  • Number of people killed (“fatalities”)

  • Number of incidents

Since more than one person may be killed in an incident the number of incidents will generally be smaller than the number of people killed. Fatalities are a better metric for understanding who is at risk from pursuits. Incidents are a better metric for understanding the agencies involved. We look at both below.

People killed

Summary

How often are pursuits involved?


Pursuits are involved in 26% of the police encounters that result in a fatality.


The table below shows how often pursuits and other vehicle-related deaths are involved when people are killed during police encounters. The categories are:

  • Vehicle not involved – No indication that a vehicle was involved in the incident that led to this fatality.

  • After pursuit fatality – A vehicle pursuit occurred during the incident, but was not the immediate cause of death. Most of these cases are gun-related fatalities (78% are either shot by police or die of a self-inflicted gunshot). The suicides are broken out in the table below.

  • Pursuit vehicular fatality – A pursuit led directly to a vehicular homicide (e.g., a crash or someone getting run over).

  • Attempted stop – The subject fled a traffic stop and committed a vehicular homicide, but police report they did not engage in pursuit.

  • Vehicle accident – An on-duty officer causes a vehicular homicide, but there is no pursuit involved.

fatalities.all %>%
  mutate(Status = case_when(
    is.na(vpursuit) | grepl("not related", vpursuit) ~ "Vehicle not involved",
    TRUE ~ as.character(incident.type))) %>%
  group_by(Status) %>%
  summarize(Number = n()) %>%
  mutate(Percent = Number/sum(Number)) %>%
  arrange(desc(Number)) %>%
  bind_rows(data.frame(Status ="Total",
                       Number = sum(.$Number),
                       Percent = sum(.$Percent))) %>%
  mutate(Percent = scales::percent(Percent, acc=0.1)) %>%
  
  kbl(caption = "Persons killed by police in WA since 2015: By vehicle involvement",
      align = "lrr") %>%
  kable_styling(bootstrap_options = "striped") %>%
  row_spec(7, bold=T) %>%
  
  footnote("See Data section for information on data sources and coding.")
Persons killed by police in WA since 2015: By vehicle involvement
Status Number Percent
Vehicle not involved 266 70.2%
After pursuit homicide 59 15.6%
Pursuit vehicular fatality 32 8.4%
After pursuit suicide 9 2.4%
Attempted stop fatality 9 2.4%
Vehicle accident fatality 4 1.1%
Total 379 100.0%
Note:
See Data section for information on data sources and coding.

How often do pursuits cause fatalities?


Pursuit-related accidents account for about 8% of all persons killed during police encounters. They are the second leading cause of death from police activities.


The table below breaks down all persons killed during an encounter with law enforcement since 2015 by cause of death. After pursuit vehicular fatalities, the two next most common causes of death are shown. The remaining causes are all less common and grouped together.

fatalities.all %>%
  mutate(cod.cat = factor(case_when(
    incident.type == "Pursuit vehicular fatality" ~ "Pursuit vehicular fatality",
    cod == "Gunshot" ~ "Gunshot",
    cod == "Taser" ~ "Taser", 
    grepl("Asphyx", cod)  ~ "Asphyxiated/Restrained",
    TRUE ~ "All other causes"),
    levels = c("Gunshot", "Pursuit vehicular fatality", 
               "Taser", "Asphyxiated/Restrained",
               "All other causes"))
  ) %>%
  group_by(cod.cat) %>%
  summarize(Number = n()) %>%
  mutate(Percent = Number/sum(Number)) %>%
  bind_rows(data.frame(cod.cat ="Total",
                       Number = sum(.$Number),
                       Percent = sum(.$Percent))) %>%
  mutate(Percent = scales::percent(Percent, acc = 0.1)) %>%
  rename(`Cause of Death` = cod.cat) %>%

  
  kbl(caption = "Persons killed by police in WA since 2015: By cause of death",
      align = "lrr") %>%
  kable_styling(bootstrap_options = "striped") %>%
  row_spec(6, bold=T) %>%
  
  footnote("All other causes includes beaten, tasered, accident etc.")
Persons killed by police in WA since 2015: By cause of death
Cause of Death Number Percent
Gunshot 292 77.0%
Pursuit vehicular fatality 32 8.4%
Taser 12 3.2%
Asphyxiated/Restrained 8 2.1%
All other causes 35 9.2%
Total 379 100.0%
Note:
All other causes includes beaten, tasered, accident etc.

Who gets killed?


56% of the persons killed during pursuits since 2015 in WA have been passengers, officers or uninvolved bystanders.


fatalities.pvf %>%
  group_by(Victim=victim) %>%
  summarize(Number = n()) %>%
  mutate(Percent = Number/sum(Number)) %>%
  arrange(desc(Number)) %>%
  bind_rows(data.frame(Victim ="Total",
                       Number = sum(.$Number),
                       Percent = sum(.$Percent))) %>%
  mutate(Percent = scales::percent(Percent),
        Victim = factor(Victim, 
                         levels = c("Subject", "Bystander", "Passenger",
                                    "Officer", "Total"))) %>%
  arrange(Victim) %>%
  
  kbl(caption = "Victims of vehicular pursuits in WA since 2015",
      digits = c(0,0,1),
      align = "lrr") %>%
  kable_styling(bootstrap_options = "striped") %>%
  row_spec(5, bold=T) %>%
  
  footnote("See Data section for information on data sources and coding.")
Victims of vehicular pursuits in WA since 2015
Victim Number Percent
Subject 14 44%
Bystander 10 31%
Passenger 6 19%
Officer 2 6%
Total 32 100%
Note:
See Data section for information on data sources and coding.

Trend over time

There are several ways we can examine the data over time. Some are better suited to revealing the impact of the policy change than others.

  • Pre vs. post reform: This is the the clearest “apples to apples” comparison. It shows the number of people killed in equivalent time periods before and after the law was changed. For now, we do not track the impact of the policy modification in May 2023 with this metric, so the “post reform” period includes this modification.

  • Calendar year: This does not give a very clear picture of the impact, because the law was changed in the middle of 2021, and again in the middle of 2023.

  • Legislative year: This does a better job of showing the impact, because the years are defined by when legislation becomes effective.

We show each of these below.

Pre vs post reform

The changes to statewide pursuit law were effective July 25, 2021. To construct a continuously updated comparison of the pre- and post- reform periods, we compare the number in the period after the effective date (929 days, as of this report) to the number in the same timeframe before (the pre-reform period starts on January 08 2019 as of the date of this report).

The plot below displays the number of people killed in the two periods.

Note this plot is different than the one shown in the introduction

The pre-post plot in the introduction presented a snapshot through the end of 2023. In this plot the numbers are instead updated as time moves on, so they will continue to change. Over time there may be new pursuit fatalities added to the post-reform period, and/or old pursuit fatalities added to the pre-reform period (since the lookback window will extend farther into the past). This plot also provides more detail in the breakdown of fatalities.

yval <- pre.post.apf$Total[nrow(pre.post.apf)] + 0.5
txt <- paste(scales::percent(-pct.change.post.reform),
                        "reduction")

df2 <- fatalities.pvf %>%
  filter(date > date.sameperiod.before) %>%
  mutate(Period = factor(ifelse(postreform==0, 
                                "Pre-reform", "Post-reform"),
                         levels = c("Pre-reform", "Post-reform"))
         ) %>%
  select(Period, Group=victim) 
  

prepost <- ggplot(df2, 
                  aes(x=Period, fill=Group)) +
  
  geom_bar(alpha = 0.8) +
  
  annotate("text",
           x = 2, y = yval,
           label = txt) +
  
  scale_y_continuous(breaks = 0:max(pre.post.apf$Total)) +
    scale_x_discrete(breaks=levels(df2$Period),
                   labels=c(
                     paste0(
                       "Pre-reform \n",
                       format(date.sameperiod.before, "%m/%d/%y"), " - ",
                       format(reform.date-1, "%m/%d/%y")),
                     paste0(
                       "Post-reform \n",
                       format(reform.date, "%m/%d/%y"), " - ",
                       format(today, "%m/%d/%y"))
                  )) +

  scale_fill_manual(values = cols.ap) +

  
  labs(title = "Persons killed in vehicular pursuits: pre vs. post reform",
       x = paste0("Period \n(", 
                  days.post, " days as of the date of this report: ",
                  format(Sys.Date(), format="%B %d, %Y"),
                  ")"),
       y = "Number",
       fill = "Person killed")
  
  
ggplotly(prepost) %>% reverse_legend_labels()

Note that the value of the Pre vs. Post comparison will change as time moves on.

# NOT USED This graph shows the annual average by period, but we're using the count per period instead for transparency and respect to the persons killed

df2 <- fatalities.all %>%
  mutate(fatality.apf = ifelse(incident.type == "Pursuit vehicular fatality", "yes", "no")) %>%
  group_by(fatality.apf, postreform) %>%
  summarize(Subjects = sum(victim == "Subject"),
            Bystanders = sum(victim == "Bystander"),
            Passengers = sum(victim == "Passenger"),
            Officers = sum(victim == "Officer"),
            Total = n(),
            post.reform = mean(postreform)) %>%
  mutate(yrs = ifelse(post.reform==0, yrs.pre, yrs.post),
         reform = factor(ifelse(post.reform==0, "Pre-reform", "Post-reform"),
                         levels = c("Pre-reform", "Post-reform")),
         avg.per.yr = Total/yrs) %>%
  filter(fatality.apf == "yes")

p <- ggplot(df2, 
            aes(x=reform, y=avg.per.yr,
                fill=Total,
                label=Total,
                text = paste("Total fatalities: <br>",
                             "Bystanders: ", Bystanders, "<br>",
                             "Passengers: ", Passengers, "<br>", 
                             "Subjects: ", Subjects, "<br>", 
                             "Officers:", Officers))) +
  geom_bar(stat = "identity", alpha = 0.8) +
  
  labs(title = "Average number of persons killed in pursuit vehicular fatalities since 2015",
       x = "Date of Incident",
       y = "Average fatalities per  year") +
  
  scale_fill_gradient(low="seashell", high = "firebrick",
                      guide = "none")
  
  
ggplotly(p, tooltip = "text")

By calendar year

Note that the current year is year to date: January 1 - February 09, 2024. So it is not strictly comparable to the other years.

Pursuit vehicular fatalities
  • Hovering over the bars will bring up number represented by each bar section.
df <- fatalities.pvf %>%
  group_by(Year=year, Victim=victim) %>%
  summarize(Number = n()) %>%
  left_join(allrows.calyr.pvf, .) %>%
  mutate(Number = tidyr::replace_na(Number,0)) %>%
  group_by(Year) %>%
  mutate(Total = sum(Number))

ymax <- max(df$Total)

p <- ggplot(df, aes(x=Year, y=Number, 
                    fill = Victim)) +
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  
  annotate("text",
           x = max.yr,
           y = df$Total[nrow(df)] + 0.5,
           label = "YTD") +
  
  labs(title = "Persons killed in vehicular pursuits by calendar year",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap) +
  
  ylim(0, (ymax + 2)) +
  scale_y_continuous(breaks = 1:(ymax + 2)) +
  scale_x_continuous(breaks = min.yr:max.yr)

  
ggplotly(p) %>% reverse_legend_labels()
After pursuit fatalities

This graph is restricted to after pursuit fatality incidents: incidents where there has been a pursuit, but the death occurs after the pursuit ended. It includes both homicides and suicides following a pursuit. Most of these deaths are caused by gunshot.

  • Hovering over the bars will bring up the number of persons killed.
df <- fatalities.apf %>%
  group_by(incident.type, Year=year) %>%
  summarize(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(Year) %>%
  mutate(Total = sum(Number))

p <- ggplot(df, aes(x=Year, y=Number, 
                    fill = Fatality)) +
  
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  
  annotate("text",
           x = max.yr,
           y = df$Total[nrow(df)] + 0.5,
           label = "YTD") +
  
  labs(title = "Fatalities after vehicle pursuits by calendar year",
       y = "Number") +
  
  scale_x_continuous(breaks = min.yr:max.yr) +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))
  
  
ggplotly(p)

By legislative year

Note that the current legislative year is year to date: August 1 - February 09, 2024. So it is not strictly comparable to the other years.

Pursuit vehicular fatalities
  • Hovering over the bars will bring up the Number in each bar segment.
df <- fatalities.pvf %>%
  filter(date > as.Date("2015-07-30")) %>% # to get the first complete year
  group_by(leg.year, Victim=victim) %>%
  summarize(Number = n()) %>%
  left_join(allrows.legyr.pvf, .) %>%
  mutate(Number = tidyr::replace_na(Number,0)) %>%
  group_by(leg.year) %>%
  mutate(Total = sum(Number))
 
ymax <- max(df$Total)

p <- ggplot(df, 
            aes(x=leg.year, y=Number,
                fill=Victim)) +
  
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  geom_vline(xintercept = 6.5, color="grey") +
  
  labs(title = "Persons killed in vehicular pursuits by legislative year",
       x = "Legislative Year",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap) +

  scale_y_continuous(breaks= 1:(ymax + 1)) +
  ylim(0, ymax+2) +
  
  annotate("text", 
           x = "Aug2021-Jul2022", 
           y = ymax + 1.5, 
           label = "post   \nreform", size = 3) +
  
  annotate("text",
           x = length(unique(df$leg.year)), # is a factor
           y = df$Total[nrow(df)] + 0.5,
           label = "YTD") +
  
  # geom_segment(aes(x= 7+0.5, xend=nrow(df), y=3, yend=3), 
  #              color="gray", 
  #              arrow=arrow()) +
  
  theme(axis.text.x = element_text(size = 5))

# plotly doesn't work with arrow(), so
# see https://plotly.com/r/text-and-annotations/
a <- list(
  x = 8, # "Aug2022-Jul2023"
  y = ymax + 1.5,
  xref = "x",
  yref = "y",
  showarrow = TRUE,
  arrowhead = 2,
  ax = -30,
  ay = 0
)
  
ggplotly(p) %>% reverse_legend_labels() %>%
  layout(annotations = a) 
After pursuit fatalities
  • Hovering over the bars will bring up the Number in each bar segment.
df <- fatalities.apf %>%
  filter(date > as.Date("2015-07-30")) %>% # to get the first complete year
  group_by(incident.type, leg.year) %>%
  summarize(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(leg.year) %>%
  mutate(Total = sum(Number))

ymax <- max(df$Total)

p <- ggplot(df, aes(x=leg.year, y=Number, 
                    fill = Fatality)) +
  
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  geom_vline(xintercept = 6.5, color="grey") +
  
  labs(title = "Fatalities after vehicle pursuits by legislative year",
       x = "Legislative Year",
       y = "Number") +
  
  ylim(0, ymax+2) +
  
  scale_y_continuous(breaks= 1:(ymax + 2)) +
  
  scale_fill_manual(values = c("gold2", "steelblue4")) +

  annotate("text", 
           x = "Aug2021-Jul2022", 
           y = ymax + 1.5, 
           label = "post   \nreform", size = 3) +
  
  annotate("text",
           x = length(unique(df$leg.year)), # is a factor
           y = df$Total[nrow(df)] + 0.5,
           label = "YTD") +
  
  theme(axis.text.x = element_text(size = 5))
  
# plotly doesn't work with arrow(), so
# see https://plotly.com/r/text-and-annotations/
a <- list(
  x = 8, # "Aug2022-Jul2023"
  y = ymax + 1.5,
  xref = "x",
  yref = "y",
  showarrow = TRUE,
  arrowhead = 2,
  ax = -30,
  ay = 0
)
  
ggplotly(p) %>% 
  layout(annotations = a)
# Not using for now -- the graph has all the info.

df %>%
  pivot_wider(id_cols = leg.year,
              names_from = Victim,
              values_from = Number) %>%
  rename(Legislative_Year = leg.year) #%>%
  
  kbl(caption = "Victims of pursuit vehicular fatalities in WA since 2015",
      digits = c(0,0,0,0,0),
      align = "lrrrr") %>%
  kable_styling(bootstrap_options = "striped") %>%
  
  footnote("See Data section for information on data sources and coding.")

Agencies

Agencies introduce another counting metric, since multiple agencies may be involved in a single incident. In this section we identify every agency involved in at least one pursuit-related fatality, along with the number and type of fatalities from the incidents involved (“Each agency count”). This means that fatalities will be multiply counted for incidents with multiple agency involvement, and the totals cannot be compared to those in previous sections. For cross-reference, we also include a graph with the multi-agency fatalities grouped together (“Multi-agency count”).

By type

Pursuit vehicular fatalities
Each agency count
df <- agency.fatality.p.long  %>%
  filter(grepl("vehicular", incident.type)) %>%
  group_by(agency.type, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf)) # percent of fatalities, sum > 100

 
p <- ggplot(df, 
            aes(x = reorder(agency.type, Total), y = Number, 
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 1) +
  
  labs(title = "Pursuit Vehicular Fatalities by Agency Type: Each agency count*",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap)

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Fatalities are counted more than once if multiple agencies are involved.

Multi-agency count
df <- fatalities.pvf  %>%
  group_by(agency.type, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf))

 
p <- ggplot(df, 
            aes(x = reorder(agency.type, Total), y = Number, 
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 1) +
  
  labs(title = "Pursuit Vehicular Fatalities by Agency Type: Multi-agency count*",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap)

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Each fatality only counts once

After pursuit fatalities
Each agency count
df <- agency.fatality.p.long  %>%
  filter(!grepl("vehicular", incident.type)) %>%
  group_by(agency.type, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(agency.type, Number), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 1) +
  
  labs(title = "Fatalities After Pursuits by Agency Type: Each agency count*",
       caption = "WA State since 2015",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))

ggplotly(p, tooltip = "text")
  • Fatalities are counted more than once if multiple agencies are involved.

Multi-agency count
df <- fatalities.apf  %>%
  group_by(agency.type, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(agency.type, Number), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 1) +
  
  labs(title = "Fatalities After Pursuits by Agency Type: Multi-agency count*",
       caption = "WA State since 2015",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))

ggplotly(p, tooltip = "text")
  • Each fatality only counts once

By name

For these graphs, we report only the “each agency count” statistics.

Pursuit vehicular fatalities
df <- agency.fatality.p.long  %>%
  filter(grepl("vehicular", incident.type)) %>%
  
  mutate(agency = gsub("Washington", "WA", agency),
         agency = gsub("County Sheriff's Office", "Co SO", agency),
         agency = gsub("Police Department", "PD", agency),
         agency = ifelse(grepl(",", agency), "Multiple agencies", agency)) %>%
  group_by(agency, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(agency) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf))
 
p <- ggplot(df, 
            aes(x = reorder(agency, Total), y = Number,
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Pursuit Vehicular Fatalities by Agency: Each agency count*",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "Agency",
       y = "Number") +

  scale_fill_manual(values = cols.ap) +
  scale_y_continuous(breaks = 0:max(df$Total)) +
  coord_flip()

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Fatalities are counted more than once if multiple agencies are involved.

After pursuit fatalities
df <- agency.fatality.p.long  %>%
  filter(!grepl("vehicular", incident.type)) %>%
  
    mutate(agency = gsub("Washington", "WA", agency),
           agency = gsub("County Sheriff's Office", "Co SO", agency),
           agency = gsub("Police Department", "PD", agency),
           agency = ifelse(grepl(",", agency), "Multiple agencies", agency)) %>%
  group_by(agency, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(agency) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(agency, Total), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Fatalities After Pursuits by Agency: Each agency count*",
       caption = "WA State since 2015",
       x = "Agency",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4")) +
  scale_y_continuous(breaks = 0:(max(df$Total)+1), 
                     labels = as.character(0:(max(df$Total)+1))) +
  theme(axis.text.y=element_text(size=6)) +
  
  coord_flip()

ggplotly(p, tooltip = "text")
  • Fatalities are counted more than once if multiple agencies are involved.

Geography

By County

Pursuit vehicular fatalities
df <- fatalities.pvf  %>%
  group_by(County=county, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(County) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf))
 
p <- ggplot(df, 
            aes(x = reorder(County, Total), y = Number, 
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Pursuit Vehicular Fatalities by County",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "County",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap) +
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()  

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()

After pursuit fatalities
df <- fatalities.apf  %>%
  group_by(County=county, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(County) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(County, Total), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Fatalities After Pursuits by County",
       caption = "WA State since 2015",
       x = "County",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))+
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()

ggplotly(p, tooltip = "text")

By City

Pursuit vehicular fatalities
df <- fatalities.pvf  %>%
  group_by(City=city, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(City) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf))
 
p <- ggplot(df, 
            aes(x = reorder(City, Total), y = Number, 
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Pursuit Vehicular Fatalities by City",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "City",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap) +
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()  

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()

After pursuit fatalities
df <- fatalities.apf  %>%
  rename(City=city) %>%
  group_by(City, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide")))  %>%
  group_by(City) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(City, Total), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Fatalities After Pursuits by City",
       caption = "WA State since 2015",
       x = "City",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))+
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()

ggplotly(p, tooltip = "text")

By Legislative District

Pursuit vehicular fatalities
df <- fatalities.pvf  %>%
  group_by(WA_District, Victim=victim) %>%
  summarise(Number = n()) %>%
  group_by(WA_District) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.pvf))
 
p <- ggplot(df, 
            aes(x = reorder(WA_District, Total), y = Number, 
                fill = Victim,
                text = paste("Victim: ", Victim, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Pursuit Vehicular Fatalities by WA Legislative District",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "District",
       y = "Number") +
  
  scale_fill_manual(values = cols.ap) +
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()  

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()

After pursuit fatalities
df <- fatalities.apf  %>%
  group_by(WA_District, incident.type) %>%
  summarise(Number = n()) %>%
  mutate(Fatality = factor(ifelse(grepl("suicide", incident.type), "Suicide", "Homicide"),
                           levels = c("Suicide", "Homicide"))) %>%
  group_by(WA_District) %>%
  mutate(Total = sum(Number))  %>%
  mutate(Percent = Total/nrow(fatalities.apf))
 
p <- ggplot(df, 
            aes(x = reorder(WA_District, Total), y = Number, 
                fill = Fatality,
                text = paste("Type: ", Fatality, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
            size = 3, nudge_y = 0.5) +
  
  labs(title = "Fatalities After Pursuits by WA Legislative District",
       caption = "WA State since 2015",
       x = "District",
       y = "Number") +
  
  scale_fill_manual(values = c("gold2", "steelblue4"))+
  scale_y_continuous(breaks = 0:max(df$Total))+
  coord_flip()

ggplotly(p, tooltip = "text")

Incident characteristics

These tables and graphs break down the number of incidents, rather than persons killed, and we restrict the focus to incidents with active pursuit fatalities. In active pursuit incidents more than one person may be killed, so there are fewer incidents than fatalities. The same is not true for the after pursuit fatalities in our dataset: each of these only has one fatality. So an “incident-based” analysis is the same as a “fatality-based” analysis for those incidents, and the results would be the same as in the previous section.

Recall that we do not have data on all vehicular pursuit incidents – we only have data on the incidents that result in a fatality.

Fatalities per incident

We only observe multi-fatality incidents for the pursuit vehicular homicides. There may have been accidents and injuries during the after pursuit fatalities but we are not capturing those in our data.

incidents.pvf  %>%
  group_by(Fatalities=fatalities) %>%
  summarize(Number = n()) %>%
  mutate(Percent = Number/sum(Number),
         Fatalities = as.character(Fatalities)) %>%
  bind_rows(data.frame(Fatalities = "Total",
                       Number = sum(.$Number),
                       Percent = sum(.$Percent))) %>%
  mutate(Percent = scales::percent(Percent)) %>%
  
  kbl(caption = "Pursuit vehicular fatalities per incident",
      align = "lrr",
      digits = c(0,0,1)) %>%
  kable_styling(bootstrap_options = "striped") %>%
  row_spec(3, bold = T) %>%
  footnote("Incidents with pursuit fatalities in WA since 2015")
Pursuit vehicular fatalities per incident
Fatalities Number Percent
1 24 86%
2 4 14%
Total 28 100%
Note:
Incidents with pursuit fatalities in WA since 2015

Agencies

Agencies introduce another counting metric, since multiple agencies may be involved in a single incident. In this section we identify every agency involved in at least one pursuit-related fatality, along with the number and type of incidents involved (“Each agency count”). This means that incidents will be multiply counted for incidents with multiple agency involvement, and the totals cannot be compared to those in previous sections. For cross-reference, we also include a graph with the multi-agency fatalities grouped together (“Multi-agency count”).

By type

Each agency count
df <- agency.incident.p.long  %>%
  group_by(agency.type, Incident=incident.type) %>%
  summarise(Number = n()) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number)) %>%
  mutate(Percent = Total/nrow(incidents.p))

p <- ggplot(df, 
            aes(x = reorder(agency.type, Total), y = Number, 
                fill = Incident,
                text = paste("Incident: ", Incident, "<br>",
                             "Number: ", Number))) +

   geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
                size = 3, nudge_y = 1) +
  
  labs(title = "Pursuit Incidents by Agency Type: Each agency count*",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci)

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Incidents are counted more than once if multiple agencies are involved.

Multi-agency count
df <- incidents.p  %>%
  group_by(agency.type, Incident=incident.type) %>%
  summarise(Number = n()) %>%
  group_by(agency.type) %>%
  mutate(Total = sum(Number)) %>%
  mutate(Percent = Total/nrow(incidents.p))

p <- ggplot(df, 
            aes(x = reorder(agency.type, Total), y = Number, 
                fill = Incident,
                text = paste("Incident: ", Incident, "<br>",
                             "Number: ", Number))) +

   geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
                size = 3, nudge_y = 1) +
  
  labs(title = "Pursuit Incidents by Agency Type: Multi-agency count*",
       caption = "WA State since 2015; y-axis=pct, bar label=count",
       x = "Agency type",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci)

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Each incident only counts once

By name

For this graph, we report only the “each agency count” statistics.

df <- agency.incident.p.long  %>%
  mutate(agency = gsub("Washington", "WA", agency),
         agency = gsub("County Sheriff's Office", "Co SO", agency),
         agency = gsub("Police Department", "PD", agency),
         agency = if_else(grepl(",", agency), "Multiple agencies", agency)) %>%
  group_by(agency, Incident=incident.type) %>%
  summarise(Number = n()) %>%
  group_by(agency) %>%
  mutate(Total = sum(Number)) %>%
  mutate(Percent = Total/nrow(incidents.p))

p <- ggplot(df, 
            aes(x = reorder(agency, Total), y = Number, 
                fill = Incident,
                text = paste("Incident: ", Incident, "<br>",
                             "Number: ", Number))) +

  geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
                size = 2, nudge_y = 0.6) +
  
  labs(title = "Pursuit Incidents by Agency: Each agency count*",
       caption = "WA State since 2015",
       x = "Agency",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci) +
  scale_y_continuous(breaks = 0:(max(df$Total)+1), 
                     labels = as.character(0:(max(df$Total)+1))) +
  theme(axis.text.y=element_text(size=6)) +
          
  coord_flip()

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()
  • Incidents are counted more than once if multiple agencies are involved.

Geography

By County

df <- incidents.p  %>%
  group_by(county, Incident=incident.type) %>%
  summarise(Number = n()) %>%
  group_by(county) %>%
  mutate(Total = sum(Number)) %>%
  mutate(Percent = Total/nrow(incidents.p))

p <- ggplot(df, 
            aes(x = reorder(county, Total), y = Number, 
                fill = Incident,
                text = paste("Incident: ", Incident, "<br>",
                             "Number: ", Number))) +

   geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  geom_text(aes(y = Total,
                label = scales::percent(Percent, acc=1)),
                size = 3, nudge_y = 1) +
  
  labs(title = "Pursuit Incidents by County",
       caption = "WA State since 2015",
       x = "County",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci) +
    scale_y_continuous(breaks = 0:max(df$Total), labels = as.character(0:max(df$Total))) +
  coord_flip()

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()

By City

df <- incidents.p  %>%
  group_by(city, Incident=incident.type) %>%
  summarise(Number = n()) %>%
  group_by(city) %>%
  mutate(Total = sum(Number)) %>%
  mutate(Percent = Total/nrow(incidents.p))

p <- ggplot(df, 
            aes(x = reorder(city, Total), y = Number, 
                fill = Incident,
                text = paste("Incident: ", Incident, "<br>",
                             "Number: ", Number))) +

   geom_bar(stat="identity",  color = "grey", alpha = 0.8) +
  
  # geom_text(aes(y = Total,
  #               label = scales::percent(Percent, acc=1)),
  #               size = 3, nudge_y = 0.5) +
  
  labs(title = "Pursuit Incidents by City",
       caption = "WA State since 2015",
       x = "City",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci) +
  scale_y_continuous(breaks = 0:max(df$Total)) +
  
  theme(axis.text.y = element_text(size = 6)) +
  
  coord_flip()

ggplotly(p, tooltip = "text") %>% reverse_legend_labels()

Trend over time

Calendar year

df <- incidents.p %>%
  group_by(Year=year, incident.type) %>%
  summarize(Number = n()) %>%
  left_join(allrows.calyr.inci, .) %>%
  mutate(Number = tidyr::replace_na(Number,0)) %>%
  group_by(Year) %>%
  mutate(Total = sum(Number))



p <- ggplot(df, aes(x=Year, y=Number, 
                    fill = incident.type)) +
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  
  annotate("text",
           x = max.yr,
           y = df$Total[nrow(df)]+1,
           label = "YTD") +
  
  labs(title = "Pursuit incidents by calendar year",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci) +
  scale_x_continuous(breaks = min.yr:max.yr)
  
ggplotly(p) %>% reverse_legend_labels()

Legislative year

df <- incidents.p %>%
  filter(date > as.Date("2015-07-30")) %>% # to get the first complete year
  group_by(leg.year, incident.type) %>%
  summarize(Number = n()) %>%
  left_join(allrows.legyr.inci, .) %>%
  mutate(Number = tidyr::replace_na(Number,0)) %>%
  group_by(leg.year) %>%
  mutate(Total = sum(Number))
  
ymax <- max(df$Total)

p <- ggplot(df, 
            aes(x=leg.year, y=Number,
                fill=incident.type)) +
  
  geom_bar(stat = "identity", color="grey", alpha = 0.8) +
  geom_vline(xintercept = 6.5, color="grey") +
  
  labs(title = "Pursuit incidents by legislative year",
       x = "Legislative Year",
       y = "Number") +
  
  scale_fill_manual(values = cols.inci) +

  scale_y_continuous(breaks= c(2*(1:6))) +
  ylim(0, ymax+2) +
  
  annotate("text", 
           x = "Aug2021-Jul2022", 
           y = ymax + 1.5, 
           label = "post   \nreform", size = 3) +
  
  annotate("text",
           x = length(unique(df$leg.year)), # is a factor
           y = df$Total[nrow(df)] + 1,
           label = "YTD") +
  
  # geom_segment(aes(x= 7+0.5, xend=nrow(df), y=3, yend=3), 
  #              color="gray", 
  #              arrow=arrow()) +
  
  theme(axis.text.x = element_text(size = 5))

# plotly doesn't work with arrow(), so
# see https://plotly.com/r/text-and-annotations/
a <- list(
  x = 8, # "Aug2022-Jul2023"
  y = ymax + 1.5,
  xref = "x",
  yref = "y",
  showarrow = TRUE,
  arrowhead = 2,
  ax = -30,
  ay = 0
)
  
ggplotly(p) %>% reverse_legend_labels() %>%
  layout(annotations = a)

Attempted stops

Attempted stops are defined as incidents when an officer signals a motorist to stop by activating their lights and/or siren, but the motorist flees and the officer does not pursue. Whether these incidents should be considered vehicular pursuits is unclear. The definition of a pursuit in Washington was also codified into law by HB 1054 in RCW 10.116.060:


  1. For purposes of this section, “vehicular pursuit” means an attempt by a uniformed peace officer in a vehicle equipped with emergency lights and a siren to stop a moving vehicle where the operator of the moving vehicle appears to be aware that the officer is signaling the operator to stop the vehicle and the operator of the moving vehicle appears to be willfully resisting or ignoring the officer’s attempt to stop the vehicle by increasing vehicle speed, making evasive maneuvers, or operating the vehicle in a reckless manner that endangers the safety of the community or the officer.

Note this definition does not require that the officer pursue the fleeing vehicle. Attempted stops would appear to meet this definition of pursuit.

There are incidents in the Fatal Encounters dataset that appear to be attempted stops. Our ability to identify these depends on what is reported in the supporting document. This is typically a news report, which in turn often relies on official police press releases or statements, so there are multiple opportunities for mis-characterization. It also seems likely that such incidents are more likely to be ignored or misreported by the media, so we miss them altogether.

Given the ambiguous status of these “attempted stops”, and the greater likelihood that they will not be captured accurately in our data, we have chosen to exclude them from the pursuit analysis above.

But these incidents are dangerous; they trigger the same fear and flight reactions in the subject, setting in motion a sequence of events that can lead to accidents, injuries and fatalities – just like active pursuits.

One example is an incident in Marysville, WA on August 29, 2020. According to the news report, an officer was on her way to another call around 2am when she saw a motorist doing donuts in the roadway. The officer activated her emergency lights to signal the motorist to stop, and allegedly he sped off but she did not pursue him. Within a minute he killed a man on a bicycle, and then crashed through the bedroom of a duplex killing a 97 year old woman asleep in her bed.

In this section we present information on the attempted stop incidents we do observe in our data, noting again the caveat that we may be missing many of these incidents.

Of the 6 attempted stop incidents we observe in our data, 3 involved multiple fatalities.

These incidents are shown on the map below. More information on each case can be obtained by hovering over, or clicking, the incident icon on the map. The list of fatalities is in the “Table of fatalities” tab, which can be downloaded.

Map of incidents

iconset <- awesomeIconList(
  single = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ),
  mult = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'white',
    markerColor = ~ inci.mapcolor
  ))

iconset.legend <- awesomeIconList(
  `B or P killed` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'red',
  ),
  `Subject killed` = makeAwesomeIcon(
    icon = 'user',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'blue',
  ),
  `Multiple fatalities` = makeAwesomeIcon(
    icon = 'users',
    library = 'fa',
    iconColor = 'black',
    markerColor = 'white',
  ))

labs <- with(incidents.as, 
             as.character(paste("fatalities:", 
                                fatalities, '<br>',
                                "injuries:",
                                total.injuries, '<br>',
                                'by', agency, '<br>',
                                'date: ', format(date, format="%m/%d/%y"))))

map <- leaflet(
  data = incidents.as, 
  width = "100%") %>% 
  addTiles() %>%
  
  addAwesomeMarkers( ~ long, ~ lat,
                     popup = ~ url_click,
                     label = lapply(labs, htmltools::HTML),
                     icon = ~iconset[inci.mapmult]) %>%
  
  addLegendAwesomeIcon(iconSet = iconset.legend,
                       orientation = 'vertical',
                       title = htmltools::tags$div(
                         style = 'font-size: 10px;',
                         'Incident type'),
                       labelStyle = 'font-size: 8px;') %>%
  
  leaflet.extras::addResetMapButton()
map

Table of fatalities

fatalities.as %>%
  select(name, date, victim, county, agency, url_click) %>%
  mutate(agency = gsub("Washington", "WA", agency),
         agency = gsub("County Sheriff's Office", "Co SO", agency),
         agency = gsub("Police Department", "PD", agency),
         agency = gsub("State Patrol", "SP", agency)) %>%
  rename(`link to article` = url_click) %>%
  arrange(desc(date)) %>%
  DT::datatable(rownames = F,
                caption = "Persons killed after attempted stops since 2015",
                filter = 'top',
                escape = FALSE,
                extensions = 'Buttons', 
                options = list(
                  dom = 'Bfrtip',
                  buttons = c('copy', 'csv', 'excel', 'pdf', 'print')) )

Was it worth it? Some examples

This report has documented some of the collateral damage caused by police pursuits. No pursuit is begun with the intention of killing uninvolved bystanders, but every pursuit brings that risk. Is the risk worth it? Consider the incidents below.

  • Kimberly Winslow was killed when she crashed into a tree while being pursued by Tacoma police for an alleged speeding violation. Her 9 year old son was in the car with her at the time, he was injured but survived.

  • State Trooper Justin Robert Schaffer was killed while laying down spike strips to disable a fleeing vehicle during a pursuit. He was hit by the fleeing vehicle. The pursuit started when a deputy with the Thurston County Sheriff’s Office identified a suspect in a shoplifting incident from the day before and initiated a traffic stop.

  • Kent Officer Diego Moreno was also killed laying down spike strips, but he was hit by the patrol car that was chasing the subject. The pursuit began when the subjects allegedly fired a gun in the air during a dispute in a parking lot at a bar and restaurant, and fled when they saw the police car.

  • Delilah Minshew, 6 yrs old, and Timothy Escamilla, 8 yrs old A speeding car going the wrong way on I-82 caused a head-on collision that killed two children in the other car. Multiple officers, from both the Washington State Patrol and the Sunnyside police department had begun pursuits of this vehicle in the previous hour, but terminated them due to safety concerns. The driver was charged with DUI, and under the WA state pursuit policy, reasonable suspicion of DUI allowed for pursuit.

    At the time of the crash, the final pursuit (4 in total) had been terminated 10 minutes earlier. For that reason, this case is classified as “pursuit-involved” rather than “active pursuit,” and is not included in the active pursuit vehicular fatality count in the graphic above (see the next section and the Data section of the report for more details on definitions). This case is included in the analysis above where pursuit-involved incidents are examined.

    A similar incident involving a wrong way driver on an interstate highway was handled differently, and resulted in no fatalities.

Data

Sources

The data we do use

The data come from the Fatal Encounters Project, manual updates to those data for WA State since 12/31/2021 (available from our Github repository, see #GitHub-repository), and the Washington Post Police Shootings Database.

  • The Fatal Encounters project is the only crowd-sourced incident-based dataset that includes cases when the cause of death is vehicular homicide caused by an active pursuit, and deaths after pursuits where the victims are not shot by police (e.g., taser and asphyxiation deaths and suicides) . The WaPo data are restricted to persons shot by police. The Fatal Encounters project is in transition, so we have been manually updating their data for WA State since 12/31/2021, replicating their search methods.

  • Both sources are used to identify homicides after pursuits when the subject is shot and killed.


The data we don’t use

The official government source of data for police pursuit fatalities is the Fatality Analysis Reporting System (FARS) maintained by the National Highway Traffic Safety Agency (NHTSA). Locally, the Washington State Traffic Safety Commission (WTSC) collects and codes these data and sends them to the national program. We do not use these data for several reasons:

  • The official data have a long publication lag.

    As of February 09, 2024, the FARS data are only available through 2020, and the WTSC data through 2021. Since the pursuit policy change went into effect on July 25, 2021, the time lag in the official datasets makes it impossible to use them to assess impacts of the policy change. In Washington, real time police traffic collision reports (PTCRs) can be accessed through the Washington State Patrol Collision Analysis Tool here, but these do not identify pursuit-related incidents.

  • The official data do not include after pursuit fatalities.

    FARS is a program designed to provide data on fatalities from vehicle accidents only. After pursuit fatalities will not be captured by this system.

  • The official data likely undercount pursuit vehicular fatalities.

    The WTSC and FARS were not originally designed to provide accurate data on pursuit fatalities. The “police pursuit involved” tag was added in 1994 to FARS (p. 91, FARS Users Manual). The way in which this is captured likely varies across the states. Here in WA, the WTSC tags an incident as pursuit-related through a labor-intensive manual coding of the law enforcement narrative documents submitted with the Police Traffic Collision Report (PTCR). If the pursuit is not mentioned in the narrative, if there is no narrative, or if the coder fails to tag a case, a pursuit incident will fail to be identified. The likelihood that this results in under-identification of pursuit-related fatalties was acknowledged by the Research Director of the WTSC in a recent interview.

    Incomplete coverage of fatalities related to police activities is unfortunately the norm in official datasets. Homicides by police have been found to be undercounted by about 50% in official government data sources like the Arrest Related Death Program, the National Vital Statistics System and the Uniform Crime Reports. The most recent analysis to have replicated this finding is from the Institute for Health Metrics and Evaluation at the UW in 2021, published in the Lancet, one of the most respected peer-reviewed science publications in the world. You can access that paper online here.

    It is worth noting that the undercounts were documented and quantified by comparing official data to open-source data like Fatal Encounters. The open source methodology is now recommended as a way to improve official data collection.

  • The official data do not provide key information on the individual incidents.

    FARS also does not include information on the law enforcement agenc(ies) involved in the pursuit. The local WTSC data has information on the agency that reported the incident and the agency that is investigating the incident, which may or may not be the agency involved in the pursuit.

    By contrast, detailed incident-based information is available in the data from Fatal Encounters. The document link provided for each case in the Fatal Encounters dataset contains a wealth of additional contextual information, and serves as a springboard for further research on individual cases. These media reports also help to remind us that each of these “cases” is a person, someone from our community, and not just a number.

The Fatal Encounters dataset is not perfect. It also likely undercounts the true number of fatalities associated with pursuits, as the search methods used by this project rely on the incidents leaving a digital signature online, and not all pursuit fatalities will be reported this way. It does, however, provide more complete information, on a wider range of cases, and in a more timely manner, than the official data.

The number of fatalities we report here gives a lower bound on the true number vehicle pursuit-related fatalities. There may be more, but there will not be less.


Coding

The original data sources are not designed to facilitate direct analysis of vehicular pursuits. So we have identified and coded these cases by hand, with two independent coders for all Fatal Encounters records in Washington State since January 1 2015.

Data cleaning

We begin with a dataset that merges information on fatalities from the Fatal Encounters project and the Washington Post. The data are cleaned and new variables constructed to facilitate analysis. Any errors found are corrected. Updates to the cleaned dataset are made weekly.

More information can be found in this report, which also has links to the GitHub repository that hosts all of the basic data cleaning and analysis scripts.

Case inclusion/exclusion in this report

For this analysis, we exclude cases where a person is killed by someone other than a law enforcement officer during a police encounter, unless the incident was pursuit related (n = 0 cases). The Fatal Encounters project keeps track of all persons killed during these encounters, regardless of who committed the homicide. We exclude cases where the homicide is committed by someone other than the officer, with these exceptions:

  • We retain vehicular homicides committed by the fleeing subject. This is a key contributor to the risks that police pursuits pose to the general public, so we retain these cases in the dataset.

  • We retain after-pursuit suicides. This term refers to a person taking their own life with a gun, not to “suicide by cop.” The classification is based on the media report, which sometimes refers to a coroner’s or medical examiner’s determination. These cases are identified separately in the tables and graphics.

The final number of fatalities included is (n = 379), and the final number of incidents is (n = 370).

Pursuit review

All included cases in the dataset were reviewed for evidence of pursuit involvement and coded into categories.

We reviewed all the available evidence in the dataset, including original variables coded by Fatal Encounters and the Washington Post and the link to the verification document (typically a news article). We conducted additional online searches if this information was not sufficient. Using this information we classified cases into the following categories:

  • Active Pursuit – vehicular homicides from an active pursuit (e.g., a crash-related fatality, or someone getting run over).

  • Terminated pursuit – vehicular homicides from an active pursuit that was reportedly terminated just before the accident occurred. “Just before” means within a minute or a mile.

  • Involved pursuit – a vehicle pursuit occurred during the incident, but it had finished before the person was killed. Typically the person killed in these cases is a fleeing subject who is either shot by police at the end of the chase, or their death is ruled due to a self-inflicted gunshot. Less commonly, if police terminate a pursuit the subject may continue to flee for some time, and cause a vehicular homicide that happens well after the end of the pursuit. In these cases the fatality may be an uninvolved bystander or passenger.

  • Attempted stop – vehicular homicides that occur when the subject flees a traffic stop but is not pursued. We are relying on a media report of the law enforcement statement that there was no pursuit, but lights and/or siren may have been activated.

  • Vehicle accident – vehicular homicides that are not related in any way to a pursuit (e.g., an on-duty officer ran someone over).

  • Reviewed not related – all other incidents we reviewed and determined were not related to vehicle stops/accidents/pursuits.

The variable in the dataset that contains this coded information is “vpursuit”.

Final categories

We grouped the active and terminated pursuits together into the “Pursuit vehicular homicide” category, and split the involved pursuits into “After pursuit homicides” and “After pursuit suicides”. These are the three types of pursuit-related fatalities that are the primary focus of this report.

tbl <- fatalities.all %>%
  mutate(vpursuit = factor(vpursuit,
                           levels = c("Active pursuit", "Terminated pursuit",
                                      "Involved pursuit", "Attempted stop",
                                      "Vehicle accident", "Reviewed not related"))) %>%
  group_by(vpursuit, incident.type) %>%
  count() %>%
  tidyr::pivot_wider(id_cols=vpursuit, names_from = incident.type, values_from = n) %>%
  mutate(across(where(is.numeric), ~replace_na(.x, 0)))

  

tbl %>% kbl(caption = "Coding results") %>%
  kable_styling(bootstrap_options = "striped")
Coding results
vpursuit Pursuit vehicular fatality After pursuit homicide After pursuit suicide Attempted stop fatality Vehicle accident fatality All other fatalities
Active pursuit 29 0 0 0 0 0
Terminated pursuit 3 0 0 0 0 0
Involved pursuit 0 59 9 0 0 0
Attempted stop 0 0 0 9 0 0
Vehicle accident 0 0 0 0 4 0
Reviewed not related 0 0 0 0 0 266

Some tables in the beginning of the Pursuit Statistics section include all cases in the datset, to establish the relative fraction of pursuit-related fatalities in the context of police encounters.

The majority of the report focuses on the two pursuit-related fatality categories: pursuit vehicular fatalities (n = 32) and after pursuit fatalities (n = 68). These two categories are presented separately in the pursuit statistics for persons, and combined but distinguished by color in the pursuit statistics for incidents.


Coding vehicular fatality victim types

Vehicular fatalities are a subset of the cases identified by the “vpursuit” variable above: the cases where the cause of death is a vehicle. This includes all fatalities from active and terminated pursuits, attempted stops and vehicle accidents. There are also a few “Involved pursuit” incidents where a vehicle is the cause of death. In one the subject’s car was stopped after a pursuit and he fled by foot onto I5 where he was hit and killed. In another the officer was making a u-turn at the start of the pursuit, and the subject crashed into them and died.

For each vehicular fatality we coded

  • The status of the person(s) killed: subject (the driver of the vehicle being pursued), passenger (in the fleeing vehicle), bystander or officer.

  • Whether there were any additional injuries noted in the supporting documents (again coding status of the injured person).


What we miss

Our ability to identify and track these incidents is far from perfect. The two key limitations are:

  1. This is a fatality-based dataset, not a dataset of pursuits.

The data we have only includes pursuits from incidents that result in at least one fatality – so:

  • We miss pursuits that result in accidents that cause injuries and/or property damage only

  • We miss pursuits that end without accidents or fatalities

For this reason, we are not able to estimate the total number of pursuits, or the fraction of pursuits that lead to fatalities, injuries or property damage.

  1. We rely on online documents to find and code these cases.
  • We miss incidents that do not leave an online trace, or if our search methods do not capture that trace

  • We miss incidents if the document reports the fatality but fails to report on the pursuit

  • We may misclassify a case if the document has not included the necessary information

We rely on the level of detail reported in the online documents to find these cases. Those documents, in turn, typically rely on a press release or social media post from the involved law enforcement agency. The law enforcement description of the event is rarely verified with independent sources, unless it becomes a high profile case and comes under scrutiny.


Ambiguous cases

In 2 incidents, the information available in the media report left it somewhat unclear whether the incident should be classified as a pursuit or as an attempted stop: Robert Bray (9/25/2022) and Stephanie Laguardia (3/16/2022). We coded these as pursuits, given the balance of the evidence. If these cases were instead coded as attempted stops, they would be removed from the pursuit vehicular fatality count. Since both of these cases occurred post-reform, the pre v. post comparison of fatalities would change, from 15 vs 7 to 15 vs 5, an 67% reduction in fatalities after the change in pursuit policy.

In 1 incident, the events lay on the boundary of the pursuit category: Sergey Pavlovich (6/28/2019). Here the officer reportedly was making a U-turn in response to a 911 call for speeding motorcycles, and saw the motorcycles approaching him at the time. Pavlovich’s motorcycle crashed into the patrol car, killing him. It is unclear whether the officer intended to give pursuit. We coded this case as “pursuit-involved”, but it could also be considered a “Vehicular accident”. This case would have no impact on the estimate of the post-reform change in fatalities.

In 1 incident, the events lay close to the boundary between “pursuit-involved” and “terminated pursuit”. This incident involved a speeding motorist who was pursued multiple times over the course of an hour by 4 different state patrol troopers and local police. In each case, the pursuit was terminated for safety reasons, as the motorist exceeded 100 mph, weaving in and out of traffic. The last pursuit terminated 10 minutes before the motorist crashed into another vehicle, killing 2 people in that vehicle. Since the pursuit was terminated 10 minutes before the crash, and the terminated pursuit classification we use requires termination within a minute or a mile of the vehicular homicide, we classified this incident as “pursuit-involved”.


Download the data

Persons killed

This table lists all fatalities in the dataset, with some basic information, the pursuit related coding for this incident, and a link to a verification document for further details. This document can be used as a starting place for research on this case.

The “LD” variable is the WA legislative district.

The “incident type” variable shows the coding of cases used in the report. The “code detail” variable shows the detailed classification for each case (the “vpursuit” variable). The relationship between these two variables is shown in the Final Categories section above.

Buttons for downloading the data are at the top of the table. The table columns can be filtered and sorted as well.

fatalities.all %>%
  mutate(vpursuit = factor(vpursuit)) %>%
  select(name, date, victim, county, agency, LD=WA_District, `incident type` = incident.type, `code detail`= vpursuit, url_click) %>%
  mutate(agency = gsub("Washington State Patrol", "WSP", agency),
         agency = gsub("Washington", "WA", agency),
         agency = gsub("County Sheriff's Office", "Co SO", agency),
         agency = gsub("Police Department", "PD", agency)) %>%
  rename(`link to article` = url_click) %>%
  arrange(desc(date)) %>%
  DT::datatable(rownames = F,
                caption = "Persons killed during police encounters since 2015",
                filter = 'top',
                escape = FALSE,
                extensions = 'Buttons', 
                options = list(
                  dom = 'Bfrtip',
                  buttons = c('copy', 'csv', 'excel', 'pdf', 'print')) )

Incidents

This table lists just the incidents that resulted in fatalities classified as “pursuit”, with information on the agency involved, the fatalities and injuries.

Buttons for downloading the data are at the top of the table, and the columns can be filtered and sorted.

incidents.p %>%
  mutate(agency = gsub("Washington State Patrol", "WSP", agency),
         agency = gsub("Washington", "WA", agency),
         agency = gsub("County Sheriff's Office", "Co SO", agency),
         agency = gsub("Police Department", "PD", agency)) %>%
  select(Agency=agency, Date=date, LD=district, Fatalities=fatalities,
         `P/O/B killed` = pbo.killed, 
         `P/B injured` = pb.injured) %>%

  DT::datatable(rownames = F,
                caption = "Incidents by agency",
                extensions = 'Buttons', 
                options = list(
                  dom = 'Bfrtip',
                  buttons = c('copy', 'csv', 'excel', 'pdf', 'print')) )

GitHub respository

This report follows the principles of transparent, reproducible science. All of the scripts, data and software are open source and freely available to the public, online.


The scripts needed to reproduce this report are posted on our public GitHub Pursuits Repository.


Note that the source data files must first be constructed using the scripts in the GitHub Fatal Encounters / Washington Post repository.

The software used to produce this report comes from the open-source R project. You can view the code in the report itself by clicking the Code buttons in the right margin, or you can download all of the scripts from the repository.

R is free and runs on most Unix, Windows and MacOS operating systems. The report script uses rmarkdown and knitr.

  • If you find a bug in our code, please let us know by posting it as an issue in the repository.

  • If you have a question about the methodology, or the data, or the topic in general, please start a thread on the repository discussions page (note: you’ll need a GitHub account – they’re free, just follow the instructions at the link).

  • If you want to get involved, please email us at Next Steps Washington


: : : :


Pursuit legislation

2021 legislation

The full text of HB 1054 as passed by the WA State legislature in 2021 can be found online here.

The section addressing vehicle pursuits reads:

knitr::include_graphics(here::here("Images", "PursuitPolicy.PNG"))

2023 legislation

The full text of SB 5352 as passed by the WA State legislature in 2023 can be found online here.

The current RCW can be found online here

The section addressing vehicle pursuits reads:

Vehicular pursuit. (1) A peace officer may not engage in a vehicular pursuit, unless:
(a) There is reasonable suspicion to believe that a person in the vehicle has committed or is committing:
(i) A violent offense as defined in RCW 9.94A.030;
(ii) A sex offense as defined in RCW 9.94A.030;
(iii) A vehicular assault offense under RCW 46.61.522;
(iv) An assault in the first, second, third, or fourth degree offense under chapter 9A.36 RCW only if the assault involves domestic violence as defined in RCW 10.99.020;
(v) An escape under chapter 9A.76 RCW; or
(vi) A driving under the influence offense under RCW 46.61.502; (b) The pursuit is necessary for the purpose of identifying or apprehending the person;
(c) The person poses a serious risk of harm to others and the safety risks of failing to apprehend or identify the person are considered to be greater than the safety risks of the vehicular pursuit under the circumstances; and
(d)(i) Except as provided in (d)(ii) of this subsection, the pursuing officer notifies a supervising officer immediately upon initiating the vehicular pursuit; there is supervisory oversight of the pursuit; and the pursuing officer, in consultation with the supervising officer, considers alternatives to the vehicular pursuit, the justification for the vehicular pursuit and other safety considerations, including but not limited to speed, weather, traffic, road conditions, and the known presence of minors in the vehicle;
(ii) For those jurisdictions with fewer than 15 commissioned officers, if a supervisor is not on duty at the time, the pursuing officer requests the on-call supervisor be notified of the pursuit according to the agency’s procedures, and the pursuing officer considers alternatives to the vehicular pursuit, the justification for the vehicular pursuit, and other safety considerations, including but not limited to speed, weather, traffic, road conditions, and the known presence of minors in the vehicle.
(2) In any vehicular pursuit under this section:
(a) The pursuing officer and the supervising officer, if applicable, shall comply with any agency procedures for designating the primary pursuit vehicle and determining the appropriate number of vehicles permitted to participate in the vehicular pursuit;
(b) The supervising officer, the pursuing officer, or dispatcher shall notify other law enforcement agencies or surrounding jurisdictions that may be impacted by the vehicular pursuit or called upon to assist with the vehicular pursuit, and the pursuing officer and the supervising officer, if applicable, shall comply with any agency procedures for coordinating operations with other jurisdictions, including available tribal police departments when applicable;
(c) The pursuing officer must be able to directly communicate with other officers engaging in the pursuit, the supervising officer, if applicable, and the dispatch agency, such as being on a common radio channel or having other direct means of communication;
(d) As soon as practicable after initiating a vehicular pursuit, the pursuing officer, supervising officer, if applicable, or responsible agency shall develop a plan to end the pursuit through the use of available pursuit intervention options, such as the use of the pursuit intervention technique, deployment of spike strips or other tire deflation devices, or other department authorized pursuit intervention tactics; and
(e) The pursuing officer must have completed an emergency vehicle operator’s course, must have completed updated emergency vehicle operator training in the previous two years, where applicable, and must be certified in at least one pursuit intervention option. Emergency vehicle operator training must include training on performing the risk assessment analysis described in subsection (1)(c) of this section.
(3) A vehicle pursuit not meeting the requirements under this section must be terminated.
(4) A peace officer may not fire a weapon upon a moving vehicle unless necessary to protect against an imminent threat of serious physical harm resulting from the operator’s or a passenger’s use of a deadly weapon. For the purposes of this subsection, a vehicle is not considered a deadly weapon unless the operator is using the vehicle as a deadly weapon and no other reasonable means to avoid potential serious harm are immediately available to the officer.
(5) For purposes of this section, “vehicular pursuit” means an attempt by a uniformed peace officer in a vehicle equipped with emergency lights and a siren to stop a moving vehicle where the operator of the moving vehicle appears to be aware that the officer is signaling the operator to stop the vehicle and the operator of the moving vehicle appears to be willfully resisting or ignoring the officer’s attempt to stop the vehicle by increasing vehicle speed, making evasive maneuvers, or operating the vehicle in a reckless manner that endangers the safety of the community or the officer.