Instructions
We are given a dataset with information regarding 500 individuals and
their state transition status within the justice system.
-
The dataset tracks 500 individuals over a maximum of 5 time periods,
recording their state transitions within the justice system.
-
Individuals start as either law-abiding citizens (No Record) or
First-Time Offenders.
-
As time progresses, they move through different states (probation,
prison, reformation, life sentence) based on realistic transition
probabilities.
-
If an individual reaches Reformed Citizen or Life Sentence, they exit
the system (absorbing states).
Steps to Complete the Assignment
-
Identify all the states
-
Extract the Transition Probability Matrix
-
Compute Absorption Probabilities
-
Interpret the results:
What % of first-time offenders eventually
become reformed vs. end up in life sentence?
On average, how many
steps (years) does it take for someone to exit the justice system?
If someone proposes a new policy that improves the system how can you
prove its effectiveness?
Load relevant libraries
library(matlib)
library(ggplot2)
Read the data
read.csv('JusticeDataset.csv')->data
head(data)
Identify all the states
Extract states and print them
states <- unique(c(unique(data$Current_State), unique(data$Next_State)))
print(states)
[1] "Citizen (No Record)" "First-Time Offender" "Long-Term Prison"
[4] "Probation/Parole" "Short-Term Prison" "Reformed Citizen"
[7] "Life Sentence"
Extract the transition probability matrix
mat <- matrix(NA, nrow = length(states), ncol = length(states))
for(i in 1:length(states)){
for(j in 1:length(states)){
mat[i,j] <- sum(data$Current_State == states[i] & data$Next_State == states[j])
}
}
Define absorbing states and set the probability of staying in those
states to 1 manually
absorbing_states <- c("Reformed Citizen", "Life Sentence")
absorbing.idx.vect <- which(states %in% absorbing_states)
for(state.idx in absorbing.idx.vect){
mat[state.idx, state.idx]<-1
}
mat <- mat/rowSums(mat)
This is the transition probability matrix
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 0.9728507 0.02714932 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
[2,] 0.0000000 0.00000000 0.0640000 0.4560000 0.2160000 0.2640000 0.0000000
[3,] 0.0000000 0.00000000 0.3333333 0.0000000 0.0000000 0.5454545 0.1212121
[4,] 0.0000000 0.00000000 0.1111111 0.1666667 0.2638889 0.4583333 0.0000000
[5,] 0.0000000 0.00000000 0.2340426 0.2765957 0.1914894 0.2978723 0.0000000
[6,] 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000 1.0000000 0.0000000
[7,] 0.0000000 0.00000000 0.0000000 0.0000000 0.0000000 0.0000000 1.0000000
Compute absorption probabilities
R <- mat[1:5, 6:7]
Q <- mat[1:5, 1:5]
absorption.probs <- inv(diag(5)-Q)%*%R
absorption.probs
[,1] [,2]
[1,] 0.9526840 0.04731601
[2,] 0.9526840 0.04731601
[3,] 0.8181818 0.18181818
[4,] 0.9541206 0.04587935
[5,] 0.9316729 0.06832715
Interpretation
print(paste0('The percentage of first time offenders that eventually become a reformed citizen is: ', absorption.probs[2,1]*100, ' %'))
[1] "The percentage of first time offenders that eventually become a reformed citizen is: 95.2683991462766 %"
print(paste0('The percentage of first time offenders that eventually get a life sentence is: ', absorption.probs[2,2]*100, ' %'))
[1] "The percentage of first time offenders that eventually get a life sentence is: 4.73160133333333 %"
time.period.reformed <- data[data$Next_State=='Reformed Citizen',]$Time_Period+1
time.period.life.sentence <- data[data$Next_State=='Life Sentence',]$Time_Period+1
ggplot()+geom_density(aes(time.period.reformed, color='reformed'), size=1.3)+
geom_density(aes(time.period.life.sentence, color='life sentence'),size=1.3)+
theme(
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank(),
axis.line = element_line(colour = "black"),
plot.title = element_text(hjust = 0.5, size = 20),
axis.text = element_text(size = 15),
text = element_text(size = 18)
)+
scale_color_manual(values=c('reformed'='darkred', 'life sentence'='navy'))+
labs(colour="Absorbing state", x='Time period', y='Density')

print(paste0('The average time it takes for a person to exit the justice system reformed is ', round(mean(time.period.reformed), 3), ' \n'))
[1] "The average time it takes for a person to exit the justice system reformed is 2.622 \n"
print(paste0('The average time it takes for a person to exit the justice system reformed is ', round(mean(time.period.life.sentence), 3)))
[1] "The average time it takes for a person to exit the justice system reformed is 4.75"
If someone proposes a new policy that improves the system, we can
evaluate its effectiveness by running similar analysis. We can assess
whether the policy decreases the mean absorption time to the reformed
state for people in the Markov chain system or whether the number of
people that get absorbed to the reformed state increases.
LS0tCnRpdGxlOiAiQWJzb3JiaW5nIE1hcmtvdiBDaGFpbnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgo8aDM+SW5zdHJ1Y3Rpb25zPC9oMz4KV2UgYXJlIGdpdmVuIGEgZGF0YXNldCB3aXRoIGluZm9ybWF0aW9uIHJlZ2FyZGluZyA1MDAgaW5kaXZpZHVhbHMgYW5kIHRoZWlyIHN0YXRlIHRyYW5zaXRpb24gc3RhdHVzIHdpdGhpbiB0aGUganVzdGljZSBzeXN0ZW0uIAoKPHVsPgo8bGk+VGhlIGRhdGFzZXQgdHJhY2tzIDUwMCBpbmRpdmlkdWFscyBvdmVyIGEgbWF4aW11bSBvZiA1IHRpbWUgcGVyaW9kcywgcmVjb3JkaW5nIHRoZWlyIHN0YXRlIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUganVzdGljZSBzeXN0ZW0uPC9saT4KPGxpPkluZGl2aWR1YWxzIHN0YXJ0IGFzIGVpdGhlciBsYXctYWJpZGluZyBjaXRpemVucyAoTm8gUmVjb3JkKSBvciBGaXJzdC1UaW1lIE9mZmVuZGVycy48L2xpPgo8bGk+QXMgdGltZSBwcm9ncmVzc2VzLCB0aGV5IG1vdmUgdGhyb3VnaCBkaWZmZXJlbnQgc3RhdGVzIChwcm9iYXRpb24sIHByaXNvbiwgcmVmb3JtYXRpb24sIGxpZmUgc2VudGVuY2UpIGJhc2VkIG9uIHJlYWxpc3RpYyB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMuPC9saT4KPGxpPklmIGFuIGluZGl2aWR1YWwgcmVhY2hlcyBSZWZvcm1lZCBDaXRpemVuIG9yIExpZmUgU2VudGVuY2UsIHRoZXkgZXhpdCB0aGUgc3lzdGVtIChhYnNvcmJpbmcgc3RhdGVzKS48L2xpPgoKPC91bD4KCgpTdGVwcyB0byBDb21wbGV0ZSB0aGUgQXNzaWdubWVudAoKPHVsPgo8bGk+SWRlbnRpZnkgYWxsIHRoZSBzdGF0ZXM8L2xpPgo8bGk+RXh0cmFjdCB0aGUgVHJhbnNpdGlvbiBQcm9iYWJpbGl0eSBNYXRyaXg8L2xpPgo8bGk+Q29tcHV0ZSBBYnNvcnB0aW9uIFByb2JhYmlsaXRpZXM8L2xpPgo8bGk+SW50ZXJwcmV0IHRoZSByZXN1bHRzOgo8YnI+CldoYXQgJSBvZiBmaXJzdC10aW1lIG9mZmVuZGVycyBldmVudHVhbGx5IGJlY29tZSByZWZvcm1lZCB2cy4gZW5kIHVwIGluIGxpZmUgc2VudGVuY2U/Cjxicj4KT24gYXZlcmFnZSwgaG93IG1hbnkgc3RlcHMgKHllYXJzKSBkb2VzIGl0IHRha2UgZm9yIHNvbWVvbmUgdG8gZXhpdCB0aGUganVzdGljZSBzeXN0ZW0/Cjxicj4KSWYgc29tZW9uZSBwcm9wb3NlcyBhIG5ldyBwb2xpY3kgdGhhdCBpbXByb3ZlcyB0aGUgc3lzdGVtIGhvdyBjYW4geW91IHByb3ZlIGl0cyBlZmZlY3RpdmVuZXNzPwo8YnI+PC9saT48L3VsPgoKCkxvYWQgcmVsZXZhbnQgbGlicmFyaWVzCmBgYHtyfQpsaWJyYXJ5KG1hdGxpYikKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCgpSZWFkIHRoZSBkYXRhCgpgYGB7cn0KcmVhZC5jc3YoJ0p1c3RpY2VEYXRhc2V0LmNzdicpLT5kYXRhCmhlYWQoZGF0YSkKYGBgCjxoND5JZGVudGlmeSBhbGwgdGhlIHN0YXRlczwvaDQ+CkV4dHJhY3Qgc3RhdGVzIGFuZCBwcmludCB0aGVtCgpgYGB7cn0Kc3RhdGVzIDwtIHVuaXF1ZShjKHVuaXF1ZShkYXRhJEN1cnJlbnRfU3RhdGUpLCB1bmlxdWUoZGF0YSROZXh0X1N0YXRlKSkpCnByaW50KHN0YXRlcykKYGBgCgo8aDQ+RXh0cmFjdCB0aGUgdHJhbnNpdGlvbiBwcm9iYWJpbGl0eSBtYXRyaXg8L2g0PgoKYGBge3J9Cm1hdCA8LSBtYXRyaXgoTkEsIG5yb3cgPSBsZW5ndGgoc3RhdGVzKSwgbmNvbCA9IGxlbmd0aChzdGF0ZXMpKQoKCmZvcihpIGluIDE6bGVuZ3RoKHN0YXRlcykpewoKICBmb3IoaiBpbiAxOmxlbmd0aChzdGF0ZXMpKXsKCiAgICAgIG1hdFtpLGpdIDwtIHN1bShkYXRhJEN1cnJlbnRfU3RhdGUgPT0gc3RhdGVzW2ldICYgZGF0YSROZXh0X1N0YXRlID09IHN0YXRlc1tqXSkKCiAgfQoKCn0KCmBgYAoKRGVmaW5lIGFic29yYmluZyBzdGF0ZXMgYW5kIHNldCB0aGUgcHJvYmFiaWxpdHkgb2Ygc3RheWluZyBpbiB0aG9zZSBzdGF0ZXMgdG8gMSBtYW51YWxseQoKYGBge3J9CmFic29yYmluZ19zdGF0ZXMgPC0gYygiUmVmb3JtZWQgQ2l0aXplbiIsICJMaWZlIFNlbnRlbmNlIikKYWJzb3JiaW5nLmlkeC52ZWN0IDwtIHdoaWNoKHN0YXRlcyAlaW4lIGFic29yYmluZ19zdGF0ZXMpCmZvcihzdGF0ZS5pZHggaW4gYWJzb3JiaW5nLmlkeC52ZWN0KXsKICBtYXRbc3RhdGUuaWR4LCBzdGF0ZS5pZHhdPC0xCn0KCm1hdCA8LSBtYXQvcm93U3VtcyhtYXQpCgpgYGAKClRoaXMgaXMgdGhlIHRyYW5zaXRpb24gcHJvYmFiaWxpdHkgbWF0cml4CgpgYGB7cn0KbWF0CmBgYAoKPGg0PkNvbXB1dGUgYWJzb3JwdGlvbiBwcm9iYWJpbGl0aWVzPC9oND4KCmBgYHtyfQpSIDwtIG1hdFsxOjUsIDY6N10KUSA8LSBtYXRbMTo1LCAxOjVdCmFic29ycHRpb24ucHJvYnMgPC0gaW52KGRpYWcoNSktUSklKiVSCmFic29ycHRpb24ucHJvYnMKYGBgCgo8aDQ+SW50ZXJwcmV0YXRpb248L2g0PgpgYGB7cn0KcHJpbnQocGFzdGUwKCdUaGUgcGVyY2VudGFnZSBvZiBmaXJzdCB0aW1lIG9mZmVuZGVycyB0aGF0IGV2ZW50dWFsbHkgYmVjb21lIGEgcmVmb3JtZWQgY2l0aXplbiBpczogJywgYWJzb3JwdGlvbi5wcm9ic1syLDFdKjEwMCwgJyAlJykpCnByaW50KHBhc3RlMCgnVGhlIHBlcmNlbnRhZ2Ugb2YgZmlyc3QgdGltZSBvZmZlbmRlcnMgdGhhdCBldmVudHVhbGx5IGdldCBhIGxpZmUgc2VudGVuY2UgaXM6ICcsIGFic29ycHRpb24ucHJvYnNbMiwyXSoxMDAsICcgJScpKQpgYGAKYGBge3J9Cgp0aW1lLnBlcmlvZC5yZWZvcm1lZCA8LSBkYXRhW2RhdGEkTmV4dF9TdGF0ZT09J1JlZm9ybWVkIENpdGl6ZW4nLF0kVGltZV9QZXJpb2QrMQp0aW1lLnBlcmlvZC5saWZlLnNlbnRlbmNlIDwtIGRhdGFbZGF0YSROZXh0X1N0YXRlPT0nTGlmZSBTZW50ZW5jZScsXSRUaW1lX1BlcmlvZCsxCmBgYAoKYGBge3J9CmdncGxvdCgpK2dlb21fZGVuc2l0eShhZXModGltZS5wZXJpb2QucmVmb3JtZWQsIGNvbG9yPSdyZWZvcm1lZCcpLCBzaXplPTEuMykrCiAgZ2VvbV9kZW5zaXR5KGFlcyh0aW1lLnBlcmlvZC5saWZlLnNlbnRlbmNlLCBjb2xvcj0nbGlmZSBzZW50ZW5jZScpLHNpemU9MS4zKSsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSwKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KQogICkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCdyZWZvcm1lZCc9J2RhcmtyZWQnLCAnbGlmZSBzZW50ZW5jZSc9J25hdnknKSkrCiAgbGFicyhjb2xvdXI9IkFic29yYmluZyBzdGF0ZSIsIHg9J1RpbWUgcGVyaW9kJywgeT0nRGVuc2l0eScpCmBgYAoKCmBgYHtyfQpwcmludChwYXN0ZTAoJ1RoZSBhdmVyYWdlIHRpbWUgaXQgdGFrZXMgZm9yIGEgcGVyc29uIHRvIGV4aXQgdGhlIGp1c3RpY2Ugc3lzdGVtIHJlZm9ybWVkIGlzICcsIHJvdW5kKG1lYW4odGltZS5wZXJpb2QucmVmb3JtZWQpLCAzKSwgJyBcbicpKQoKcHJpbnQocGFzdGUwKCdUaGUgYXZlcmFnZSB0aW1lIGl0IHRha2VzIGZvciBhIHBlcnNvbiB0byBleGl0IHRoZSBqdXN0aWNlIHN5c3RlbSByZWZvcm1lZCBpcyAnLCByb3VuZChtZWFuKHRpbWUucGVyaW9kLmxpZmUuc2VudGVuY2UpLCAzKSkpCmBgYAoKCklmIHNvbWVvbmUgcHJvcG9zZXMgYSBuZXcgcG9saWN5IHRoYXQgaW1wcm92ZXMgdGhlIHN5c3RlbSwgd2UgY2FuIGV2YWx1YXRlIGl0cyBlZmZlY3RpdmVuZXNzIGJ5IHJ1bm5pbmcgc2ltaWxhciBhbmFseXNpcy4gV2UgY2FuIGFzc2VzcyB3aGV0aGVyIHRoZSBwb2xpY3kgZGVjcmVhc2VzIHRoZSBtZWFuIGFic29ycHRpb24gdGltZSB0byB0aGUgcmVmb3JtZWQgc3RhdGUgZm9yIHBlb3BsZSBpbiB0aGUgTWFya292IGNoYWluIHN5c3RlbSBvciB3aGV0aGVyIHRoZSBudW1iZXIgb2YgcGVvcGxlIHRoYXQgZ2V0IGFic29yYmVkIHRvIHRoZSByZWZvcm1lZCBzdGF0ZSBpbmNyZWFzZXMuIAoKCgoK