Newer
Older
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#COMPAS-data\" data-toc-modified-id=\"COMPAS-data-1\"><span class=\"toc-item-num\">1 </span>COMPAS data</a></span></li><li><span><a href=\"#Generate-synthetic-data-set\" data-toc-modified-id=\"Generate-synthetic-data-set-2\"><span class=\"toc-item-num\">2 </span>Generate synthetic data set</a></span><ul class=\"toc-item\"><li><span><a href=\"#Machine-evaluation\" data-toc-modified-id=\"Machine-evaluation-2.1\"><span class=\"toc-item-num\">2.1 </span>Machine evaluation</a></span></li></ul></li><li><span><a href=\"#Implementation-of-contraction-algorithm\" data-toc-modified-id=\"Implementation-of-contraction-algorithm-3\"><span class=\"toc-item-num\">3 </span>Implementation of contraction algorithm</a></span></li><li><span><a href=\"#Implementation-of-our-model\" data-toc-modified-id=\"Implementation-of-our-model-4\"><span class=\"toc-item-num\">4 </span>Implementation of our model</a></span></li><li><span><a href=\"#Validation-analysis\" data-toc-modified-id=\"Validation-analysis-5\"><span class=\"toc-item-num\">5 </span>Validation analysis</a></span></li></ul></div>"
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bachelors thesis' analyses\n",
"\n",
"*This Jupyter notebook is for the analyses and model building for Riku Laine's bachelors thesis*\n",
"\n",
"Table of contents is provided above. First I will briefly present the COMPAS data set and then create the synthetic data set as done by Lakkaraju *et al.* ([link](https://helka.finna.fi/PrimoRecord/pci.acm3098066)). Then I will proceed to implement their algorithm as well as ours.\n",
"\n",
"## COMPAS data\n",
"\n",
"The following data filtering procedure follows the one described in the [ProPublica methodology](https://www.propublica.org/article/how-we-analyzed-the-compas-recidivism-algorithm)."
]
},
{
"cell_type": "code",
{
"name": "stdout",
"output_type": "stream",
"text": [
"(7214, 53)\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from datetime import datetime\n",
"import matplotlib.pyplot as plt\n",
"import numpy.random as npr\n",
"\n",
"plt.rcParams.update({'font.size': 16})\n",
"\n",
"# Read file\n",
"compas_raw = pd.read_csv(\"../data/compas-scores-two-years.csv\")\n",
"\n",
"# Check dimensions, number of rows should be 7214\n",
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(6172, 13)"
]
},
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Select columns\n",
"compas = compas_raw[[\n",
" 'age', 'c_charge_degree', 'race', 'age_cat', 'score_text', 'sex',\n",
" 'priors_count', 'days_b_screening_arrest', 'decile_score', 'is_recid',\n",
" 'two_year_recid', 'c_jail_in', 'c_jail_out'\n",
"]]\n",
"\n",
"# Subset values\n",
"compas = compas.query('days_b_screening_arrest <= 30 and \\\n",
" days_b_screening_arrest >= -30 and \\\n",
" is_recid != -1 and \\\n",
" c_charge_degree != \"O\"')\n",
"\n",
"# Drop row if score_text is na\n",
"compas = compas[compas.score_text.notnull()]\n",
"\n",
"compas.shape"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" length_of_stay decile_score\n",
"length_of_stay 1.000000 0.207478\n",
"decile_score 0.207478 1.000000\n",
"[[1. 0.20747808]\n",
" [0.20747808 1. ]]\n"
]
},
{
"data": {
"text/plain": [
"(0.2074780847803181, 5.439585463018677e-61)"
]
},
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"out = pd.to_datetime(compas.c_jail_out, format=\"%Y-%m-%d %H:%M:%S\")\n",
"in_ = pd.to_datetime(compas.c_jail_in, format=\"%Y-%m-%d %H:%M:%S\")\n",
"\n",
"compas['length_of_stay'] = (out - in_).astype('timedelta64[D]')\n",
"\n",
"# as denominator in variance. Reference:\n",
"# https://stackoverflow.com/questions/53404367/why-pearson-correlation-is-different-between-tensorflow-and-scipy\n",
"print(compas[['length_of_stay', 'decile_score']].corr())\n",
"\n",
"print(np.corrcoef(compas.length_of_stay, compas.decile_score))\n",
"\n",
"from scipy.stats import pearsonr\n",
"\n",
"pearsonr(compas.length_of_stay, compas.decile_score)"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"25 - 45 3532\n",
"Less than 25 1347\n",
"Greater than 45 1293\n",
"Name: age_cat, dtype: int64\n"
]
}
],
"source": [
"print(compas.age_cat.value_counts())"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"African-American 3175\n",
"Caucasian 2103\n",
"Hispanic 509\n",
"Other 343\n",
"Asian 31\n",
"Native American 11\n",
"Name: race, dtype: int64\n"
]
}
],
"source": [
"print(compas.race.value_counts())"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Black defendants: 51.44%\n",
"White defendants: 34.07%\n",
"Hispanic defendants: 8.25%\n",
"Asian defendants: 0.50%\n",
"Native American defendants: 0.18%\n"
]
}
],
"source": [
"print(\"Black defendants: %.2f%%\" % (3175 / 6172 * 100))\n",
"print(\"White defendants: %.2f%%\" % (2103 / 6172 * 100))\n",
"print(\"Hispanic defendants: %.2f%%\" % (509 / 6172 * 100))\n",
"print(\"Asian defendants: %.2f%%\" % (31 / 6172 * 100))\n",
"print(\"Native American defendants: %.2f%%\" % (11 / 6172 * 100))"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Low 3421\n",
"Medium 1607\n",
"High 1144\n",
"Name: score_text, dtype: int64"
]
},
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"compas.score_text.value_counts()"
]
},
{
"cell_type": "code",
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>race</th>\n",
" <th>African-American</th>\n",
" <th>Asian</th>\n",
" <th>Caucasian</th>\n",
" <th>Hispanic</th>\n",
" <th>Native American</th>\n",
" <th>Other</th>\n",
" </tr>\n",
" <tr>\n",
" <th>sex</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Female</th>\n",
" <td>549</td>\n",
" <td>2</td>\n",
" <td>482</td>\n",
" <td>82</td>\n",
" <td>2</td>\n",
" <td>58</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Male</th>\n",
" <td>2626</td>\n",
" <td>29</td>\n",
" <td>1621</td>\n",
" <td>427</td>\n",
" <td>9</td>\n",
" <td>285</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"race African-American Asian Caucasian Hispanic Native American Other\n",
"sex \n",
"Female 549 2 482 82 2 58\n",
"Male 2626 29 1621 427 9 285"
]
},
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tab = compas.groupby(['sex', 'race']).size()\n",
"tab.unstack()"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"<Figure size 1008x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"\n",
"fig, ax = compas.query(\"race in ['Caucasian', 'African-American']\").hist(\n",
" \"decile_score\",\n",
" by=\"race\",\n",
" figsize=(14, 7),\n",
" sharey=True,\n",
" xrot='horizontal',\n",
" ec='black',\n",
" bins=np.arange(0.5, 11.5, 1.0),\n",
" rwidth=0.9)\n",
"\n",
"fig.text(-1.5, 350, \"Frequency\", rotation='vertical')\n",
"fig.text(11.5, -60, \"Decile score\", horizontalalignment='center')\n",
"plt.tight_layout(w_pad=-2)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>age</th>\n",
" <td>69</td>\n",
" <td>34</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c_charge_degree</th>\n",
" <td>F</td>\n",
" <td>F</td>\n",
" <td>F</td>\n",
" </tr>\n",
" <tr>\n",
" <th>race</th>\n",
" <td>Other</td>\n",
" <td>African-American</td>\n",
" <td>African-American</td>\n",
" <td>Other</td>\n",
" <td>Caucasian</td>\n",
" </tr>\n",
" <tr>\n",
" <th>age_cat</th>\n",
" <td>Greater than 45</td>\n",
" <td>25 - 45</td>\n",
" <td>Less than 25</td>\n",
" <td>25 - 45</td>\n",
" <td>25 - 45</td>\n",
" </tr>\n",
" <tr>\n",
" <th>score_text</th>\n",
" <td>Low</td>\n",
" <td>Low</td>\n",
" <td>Low</td>\n",
" </tr>\n",
" <tr>\n",
" <th>sex</th>\n",
" <td>Male</td>\n",
" <td>Male</td>\n",
" <td>Male</td>\n",
" </tr>\n",
" <tr>\n",
" <th>priors_count</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>days_b_screening_arrest</th>\n",
" <td>-1</td>\n",
" <td>-1</td>\n",
" <td>-1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>decile_score</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>is_recid</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>two_year_recid</th>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c_jail_in</th>\n",
" <td>2013-08-13 06:03:42</td>\n",
" <td>2013-01-26 03:45:27</td>\n",
" <td>2013-04-13 04:58:34</td>\n",
" <td>2013-11-30 04:50:18</td>\n",
" <td>2014-02-18 05:08:24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c_jail_out</th>\n",
" <td>2013-08-14 05:41:20</td>\n",
" <td>2013-02-05 05:36:53</td>\n",
" <td>2013-04-14 07:02:04</td>\n",
" <td>2013-12-01 12:28:56</td>\n",
" <td>2014-02-24 12:18:30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>length_of_stay</th>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 \\\n",
"age 69 34 \n",
"c_charge_degree F F \n",
"race Other African-American \n",
"age_cat Greater than 45 25 - 45 \n",
"score_text Low Low \n",
"sex Male Male \n",
"priors_count 0 0 \n",
"days_b_screening_arrest -1 -1 \n",
"decile_score 1 3 \n",
"is_recid 0 1 \n",
"two_year_recid 0 1 \n",
"c_jail_in 2013-08-13 06:03:42 2013-01-26 03:45:27 \n",
"c_jail_out 2013-08-14 05:41:20 2013-02-05 05:36:53 \n",
"length_of_stay 0 10 \n",
"\n",
" 2 5 \\\n",
"age 24 44 \n",
"c_charge_degree F M \n",
"race African-American Other \n",
"age_cat Less than 25 25 - 45 \n",
"score_text Low Low \n",
"sex Male Male \n",
"priors_count 4 0 \n",
"days_b_screening_arrest -1 0 \n",
"decile_score 4 1 \n",
"is_recid 1 0 \n",
"two_year_recid 1 0 \n",
"c_jail_in 2013-04-13 04:58:34 2013-11-30 04:50:18 \n",
"c_jail_out 2013-04-14 07:02:04 2013-12-01 12:28:56 \n",
"length_of_stay 1 1 \n",
"\n",
" 6 \n",
"age 41 \n",
"race Caucasian \n",
"age_cat 25 - 45 \n",
"score_text Medium \n",
"is_recid 1 \n",
"two_year_recid 1 \n",
"c_jail_in 2014-02-18 05:08:24 \n",
"c_jail_out 2014-02-24 12:18:30 \n",
"length_of_stay 6 "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.kdeplot(compas_raw.age.values)\n",
"plt.title(\"Density plot of defendants' ages\")\n",
"plt.xlabel(\"Age of defendant\")\n",
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>is_recid</th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" </tr>\n",
" <tr>\n",
" <th>age_cat</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>25 - 45</th>\n",
" <td>1784</td>\n",
" <td>1748</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Greater than 45</th>\n",
" <td>847</td>\n",
" <td>446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Less than 25</th>\n",
" <td>551</td>\n",
" <td>796</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"is_recid 0 1\n",
"age_cat \n",
"25 - 45 1784 1748\n",
"Greater than 45 847 446\n",
"Less than 25 551 796"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>is_recid</th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" </tr>\n",
" <tr>\n",
" <th>sex</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Female</th>\n",
" <td>740</td>\n",
" <td>435</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Male</th>\n",
" <td>2442</td>\n",
" <td>2555</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"is_recid 0 1\n",
"sex \n",
"Female 740 435\n",
"Male 2442 2555"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>is_recid</th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" </tr>\n",
" <tr>\n",
" <th>race</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>African-American</th>\n",
" <td>1402</td>\n",
" <td>1773</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Asian</th>\n",
" <td>21</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Caucasian</th>\n",
" <td>1229</td>\n",
" <td>874</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hispanic</th>\n",
" <td>312</td>\n",
" <td>197</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Native American</th>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Other</th>\n",
" <td>213</td>\n",
" <td>130</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"is_recid 0 1\n",
"race \n",
"African-American 1402 1773\n",
"Asian 21 10\n",
"Caucasian 1229 874\n",
"Hispanic 312 197\n",
"Native American 5 6\n",
"Other 213 130"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tab = compas.groupby(['age_cat', 'is_recid']).size()\n",
"display(tab.unstack())\n",
"\n",
"tab = compas.groupby(['sex', 'is_recid']).size()\n",
"display(tab.unstack())\n",
"\n",
"tab = compas.groupby(['race', 'is_recid']).size()\n",
"display(tab.unstack())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate synthetic data set\n",
"\n",
"In the chunk below, we generate the synthetic data as described by Lakkaraju et al. The default values are as per their description. The definitions of $Y$ and $T$ values follow their description.\n",
"* M = `nJudges_M`, number of judges\n",
"* N = `nSubjects_N`, number of subjects assigned to each judge\n",
"* betas $\\beta_i$, where $i \\in \\{X, Z, W\\}$ are coefficients for the respected variables\n",
"* R = `acceptanceRate_R`, acceptance rates\n",
"* X = `X`, invidual's features observable to all (models and judges)\n",
"* Z = `Z`, information observable for judges only\n",
"* W = `W`, unobservable / inaccessible information\n",
"* T = `decision_T`, decisions where $T=0$ represents decision to deny and if $T=1$ then bail is granted.\n",
"* Y = `result_Y`, result variable, if $Y=0$ person will or would recidivate and if $Y=1$ person would not commit a crime."
]
},
{
"cell_type": "code",
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0 26137\n",
"1.0 23863\n",
"Name: decision_T, dtype: int64\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>decision_T</th>\n",
" <th>0.0</th>\n",
" <th>1.0</th>\n",
" </tr>\n",
" <tr>\n",
" <th>result_Y</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0.0</th>\n",
" <td>13119</td>\n",
" <td>12056</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1.0</th>\n",
" <td>13018</td>\n",
" <td>11807</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"decision_T 0.0 1.0\n",
"result_Y \n",
"0.0 13119 12056\n",
"1.0 13018 11807"
]
},
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
"# Set seed for reproducibility\n",
"npr.seed(0)\n",
"\n",
"def generateData(nJudges_M=100,\n",
" nSubjects_N=500,\n",
" beta_X=1.0,\n",
" beta_Z=1.0,\n",
" beta_W=0.2):\n",
"\n",
" # Assign judge IDs as running numbering from 0 to nJudges_M - 1\n",
" judgeID_J = np.repeat(np.arange(0, nJudges_M, dtype=np.int32), nSubjects_N)\n",
"\n",
" # Sample acceptance rates uniformly from a closed interval\n",
" # from 0.1 to 0.9 and round to tenth decimal place.\n",
" acceptance_rates = np.round(npr.uniform(.1, .9, nJudges_M), 10)\n",
"\n",
" # Replicate the rates so they can be attached to the corresponding judge ID.\n",
" acceptanceRate_R = np.repeat(acceptance_rates, nSubjects_N)\n",
"\n",
" # Sample the variables from standard Gaussian distributions.\n",
" X = npr.normal(size=nJudges_M * nSubjects_N)\n",
" Z = npr.normal(size=nJudges_M * nSubjects_N)\n",
" W = npr.normal(size=nJudges_M * nSubjects_N)\n",
"\n",
" probabilities_Y = 1 / (1 + np.exp(-(beta_X * X + beta_Z * Z + beta_W * W)))\n",
"\n",
" # 0 if P(Y = 0| X = x; Z = z; W = w) >= 0.5 , 1 otherwise\n",
" result_Y = 1 - probabilities_Y.round()\n",
"\n",
" probabilities_T = 1 / (1 + np.exp(-(beta_X * X + beta_Z * Z)))\n",
" probabilities_T += npr.normal(0, .1, nJudges_M * nSubjects_N)\n",
"\n",
" # Initialize decision values as -1\n",
" decision_T = np.zeros(nJudges_M * nSubjects_N) - 1\n",
"\n",
" # Initialize the dataframe\n",
" df_init = pd.DataFrame(\n",
" np.column_stack((judgeID_J, acceptanceRate_R, X, Z, W, result_Y,\n",
" probabilities_T, decision_T)),\n",
" columns=[\n",
" \"judgeID_J\", \"acceptanceRate_R\", \"X\", \"Z\", \"W\", \"result_Y\",\n",
" \"probabilities_T\", \"decision_T\"\n",
" ])\n",
"\n",
" # Sort by judges then probabilities\n",
" data = df_init.sort_values(\n",
" by=[\"judgeID_J\", \"probabilities_T\"], ascending=False)\n",
"\n",
" # Iterate over the data. Subject is in the top (1-r)*100% if\n",
" # his within-judge-index is over acceptance threshold times\n",
" # the number of subjects assigned to each judge. If subject\n",
" # is over the limit they are assigned a zero, else one.\n",
" for i in range(nJudges_M * nSubjects_N):\n",
" index = i % nSubjects_N\n",
" if index < (1 - data.acceptanceRate_R[i]) * nSubjects_N:\n",
" data.decision_T[i] = 0\n",
" else:\n",
" data.decision_T[i] = 1 # TARKISTA!!!!!!\n",
"\n",
" return data\n",
"\n",
"\n",
"df = generateData()\n",
"\n",
"# Basic stats of the created data set.\n",
"\n",
"print(df.decision_T.value_counts())\n",
"\n",
"tab = df.groupby(['result_Y', 'decision_T']).size()\n",
"tab.unstack()"
]
},
{
"cell_type": "code",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(25000, 8)\n",
"(25000, 8)\n",
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>decision_T</th>\n",
" <th>1.0</th>\n",
" </tr>\n",
" <tr>\n",
" <th>result_Y</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",