The goal of CoRe
is to ease the calculation of the costs of reoffending for any given group of reoffences. CoRe
is based on the methodology used in the Economic and Social Costs of Reoffending publication. The costs of reoffending calculated in this package can be used to support business cases and impact assessments/evaluations in government and wider.
You can install the released version of CoRe from github with:
install.packages("remotes")
remotes::install_github("moj-analytical-services/costs_of_reoffending")
The costs of reoffending (CoRe
) package exposes 5 functions as its API. These are:
rebase_reoffences
estimate_multipliers
estimate_wider_offences
estimate_unit_costs
estimate_total_costs
rebase_reoffences
is used to change from a number_reoffences
by index_offence_group
basis to a number_reoffences
by reoffence_group
basis. The latter basis is the basis used in the calculation of the costs of reoffending.
estimate_multipliers
is a convenience function used to estimate multipliers from the numbers of crimes as recorded by police to an estimate of wider crime for a given 12-month-period, as defined in the Home Office economic and social costs of crime report. It is already called in estimate_wider_offences
and estimate_unit_costs
.
estimate_wider_offences
takes user_data
and target_date
as input to estimate the number of wider (re)offences for a given cohort in a 12-month-follow-up-period. User data should have the columns year_ending
, reoffence_group
and number_offences
, at the least. It will group_by
all non-numeric columns, so ensure that you are using only columns you wish to use.
estimate_unit_costs
takes target_fy
to estimate the unit costs for a crime/reoffence inflated to the relevant financial year using GDP deflators. This is a convenience function which is already called in estimate_total_costs
and so needn’t be called to use that function.
estimate_total_costs
takes user_data
, target_date
and target_fy
to estimate the total costs of crime/reoffences for a given cohort in a 12-month-follow-up-period inflated to a specified financial year’s prices. User data should have the columns year_ending
, reoffence_group
and number_offences
, at the least.
If we wanted to calculate the cost of reoffending for the 2016 offender cohort, as in the official statistics, we can use the reoffending_stats
provided in the package.
library(CoRe)
library(magrittr)
estimate_total_costs(reoffending_stats, "2016-12-31")
#> # A tibble: 3,250 x 14
#> offence_group proven_offences wider_offences number_offences
#> <chr> <dbl> <dbl> <dbl>
#> 1 Criminal dam… 31930 921189. 579254
#> 2 Criminal dam… 31930 921189. 579254
#> 3 Criminal dam… 31930 921189. 579254
#> 4 Criminal dam… 31930 921189. 579254
#> 5 Criminal dam… 31930 921189. 579254
#> 6 Criminal dam… 31930 921189. 579254
#> 7 Criminal dam… 31930 921189. 579254
#> 8 Criminal dam… 31930 921189. 579254
#> 9 Criminal dam… 31930 921189. 579254
#> 10 Criminal dam… 31930 921189. 579254
#> # … with 3,240 more rows, and 10 more variables: year_ending <dttm>,
#> # index_offence_group <chr>, number_offenders <chr>, age <chr>,
#> # number_reoffences <dbl>, reoffence_ratio <dbl>,
#> # wider_reoffences <dbl>, expenditure_group <chr>, cost <dbl>,
#> # total_cost <dbl>
These arguments are the defaults and they give a data frame with 14 columns. We can then estimate the total cost using dplyr
.
names(estimate_total_costs())
#> [1] "offence_group" "proven_offences" "wider_offences"
#> [4] "number_offences" "year_ending" "index_offence_group"
#> [7] "number_offenders" "age" "number_reoffences"
#> [10] "reoffence_ratio" "wider_reoffences" "expenditure_group"
#> [13] "cost" "total_cost"
estimate_total_costs() %>%
dplyr::summarise(total_cost = sum(total_cost, na.rm = TRUE))
#> # A tibble: 1 x 1
#> total_cost
#> <dbl>
#> 1 19773459964.
We can see the multipliers that were used to obtain the number of wider reoffences…
estimate_multipliers("2016-12-31")
#> # A tibble: 196 x 2
#> offence multiplier
#> <chr> <dbl>
#> 1 Abandoning a child under the age of two years 1.11
#> 2 Abduction of female 12.3
#> 3 Abuse of children through sexual exploitation 12.3
#> 4 Abuse of position of trust of a sexual nature 12.3
#> 5 Actual bodily harm (ABH) and other injury 1.92
#> 6 Aggravated burglary - business and community 0.831
#> 7 Aggravated burglary -Residential 2.99
#> 8 Aggravated burglary in a building other than a dwelling 0.831
#> 9 Aggravated burglary in a dwelling 2.99
#> 10 Aggravated vehicle taking 0.831
#> # … with 186 more rows
…and the number of wider (re)offences.
estimate_wider_offences() %>%
dplyr::group_by(c(offence_group)) %>%
dplyr::summarise(wider_offences = sum(wider_offences, na.rm = TRUE),
wider_reoffences = sum(wider_reoffences, na.rm = TRUE))
#> Warning in validate_reoffending_data(user_data): You have multiple
#> 'year_endings' in your input data, only the closest to the 'target_date'
#> will be used.
#> # A tibble: 13 x 3
#> `c(offence_group)` wider_offences wider_reoffences
#> <chr> <dbl> <dbl>
#> 1 Criminal damage and arson 23950909. 60759.
#> 2 Drug offences 3476538 37312.
#> 3 Fraud offences 86290057. 1004066.
#> 4 Miscellaneous crimes against society 2116374 34249.
#> 5 Other 0 0
#> 6 Possession of weapons offences 860444 15774.
#> 7 Public order offences 8191352 200632.
#> 8 Robbery 4834006. 123989.
#> 9 Sexual offences 30294448. 70228.
#> 10 Summary motoring 0 50100
#> 11 Summary non-motoring 0 146292
#> 12 Theft offences 73862997. 2603282.
#> 13 Violence against the person 45708852. 430356.
reoffending_stats
also includes index_offence_group
and we can experiment with trying to replicate our earlier result after destroying the reoffence data here using the rebase_reoffences
function.
reoff <- reoffending_stats %>%
dplyr::group_by(year_ending, index_offence_group) %>%
dplyr::summarise(number_reoffences_by_index = sum(number_reoffences, na.rm = TRUE))
reoff <- rebase_reoffences(reoff, "2016-12-31")
estimate_total_costs(reoff, "2016-12-31") %>%
dplyr::summarise(total_cost = sum(total_cost, na.rm = TRUE))
#> # A tibble: 1 x 1
#> total_cost
#> <dbl>
#> 1 19773459964.