Skip to content

Instantly share code, notes, and snippets.

@jburroni
Created February 21, 2015 18:57
Show Gist options
  • Save jburroni/738c79eb3ddd7a987b64 to your computer and use it in GitHub Desktop.
Save jburroni/738c79eb3ddd7a987b64 to your computer and use it in GitHub Desktop.
test with neighbor
{
"metadata": {
"name": "pruebas con neighbor"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"from statsmodels import iolib\n",
"import pandas\n",
"import statsmodels.api as sm\n",
"from stats import pscore_match as ps\n",
"from stats.weightstats import CompareMeans, DescrStatsW"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nsw = pandas.DataFrame(iolib.genfromdta('datasets/dehejiawahha/DW2002.dta'))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nsw['re742'] = nsw.re74*nsw.re74\n",
"nsw['re752'] = nsw.re75*nsw.re75\n",
"nsw['u74'] = nsw.re74==0\n",
"nsw['blacku74'] = nsw.black*nsw.u74\n",
"nsw['age2'] = nsw.age*nsw.age\n",
"nsw['educ2'] = nsw.educ*nsw.educ"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"reload(ps)\n",
"psm = ps.PropensityScoreMatch(nsw.t, nsw.ix[:, ['age', 'black', 'blacku74', 'educ', 'hispanic', 'married', 'nodegree', 're74', 're742', 're75', 're752', 'age2', 'educ2']] , nsw.re78, algo= 'radius', radius=0.0001)\n",
"psm.result = ps.PScoreMatchResult()\n",
"psm.fit()\n",
"#psm.compute_pscore()\n",
"#psm.common_support()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Optimization terminated successfully.\n",
" Current function value: 204.929500\n",
" Iterations 12\n",
" Logit Regression Results \n",
"==============================================================================\n",
"Dep. Variable: t No. Observations: 2675\n",
"Model: Logit Df Residuals: 2661\n",
"Method: MLE Df Model: 13\n",
"Date: Sat, 08 Jun 2013 Pseudo R-squ.: 0.6953\n",
"Time: 04:37:44 Log-Likelihood: -204.93\n",
"converged: True LL-Null: -672.65\n",
" LLR p-value: 1.266e-191\n",
"==============================================================================\n",
" coef std err z P>|z| [95.0% Conf. Int.]\n",
"------------------------------------------------------------------------------\n",
"const -7.5525 2.452 -3.080 0.002 -12.358 -2.747\n",
"age 0.3306 0.120 2.747 0.006 0.095 0.566\n",
"black 1.1330 0.352 3.218 0.001 0.443 1.823\n",
"blacku74 2.1370 0.427 5.000 0.000 1.299 2.975\n",
"educ 0.8248 0.353 2.334 0.020 0.132 1.517\n",
"hispanic 1.9628 0.567 3.459 0.001 0.851 3.075\n",
"married -1.8841 0.299 -6.292 0.000 -2.471 -1.297\n",
"nodegree 0.1300 0.428 0.303 0.762 -0.710 0.970\n",
"re74 -0.0001 3.55e-05 -2.948 0.003 -0.000 -3.51e-05\n",
"re742 2.358e-09 6.57e-10 3.587 0.000 1.07e-09 3.65e-09\n",
"re75 -0.0002 4.15e-05 -5.228 0.000 -0.000 -0.000\n",
"re752 1.581e-10 6.68e-10 0.237 0.813 -1.15e-09 1.47e-09\n",
"age2 -0.0063 0.002 -3.417 0.001 -0.010 -0.003\n",
"educ2 -0.0483 0.019 -2.597 0.009 -0.085 -0.012\n",
"=============================================================================="
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"propensity scores description\n",
"count 2.675000e+03\n",
"mean 6.915888e-02\n",
"std 2.063646e-01\n",
"min 4.486613e-11\n",
"25% 3.409590e-05\n",
"50% 6.387597e-04\n",
"75% 1.091543e-02\n",
"max 9.748754e-01\n",
"dtype: float64\n"
]
}
],
"prompt_number": 72
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_effect()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 73,
"text": [
"29.974437572337962"
]
}
],
"prompt_number": 73
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"radius: 0.000100\t treated :27 control: 111 \t treatment effect: 29.974438\n"
]
}
],
"prompt_number": 74
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plt.scatter(psm.scores[psm.control()], psm.treatment_objective_variable[psm.control()], color='red')\n",
"plt.scatter(psm.scores[psm.treated()], psm.treatment_objective_variable[psm.treated()])\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 60,
"text": [
"<matplotlib.collections.PathCollection at 0x108b4b5d0>"
]
},
{
"output_type": "display_data",
"png": "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\nOXv2LAIDA1FRUYHr16/Dx8cHQUFBds6nwsJCDBgwwKkKCgQCgeD+0mwfx969e7F8+XJkZmZCp9NZ\ntw8fPhzbtm1DWVkZCgoKkJ+fj7i4OAQEBMDDwwPZ2dkgic2bN2PEiBHWYzZt2gQA2LFjBwYOHAhA\ndsB//vnnKCkpQXFxMfbv34/BgwffS30FAoFAcI8028cxY8YMlJWVITExEQDQq1cvZGRkIDIyEk8/\n/TQiIyOhUqmQkZFh9T9kZGRg8uTJuHPnDpKSkjBkyBAAQHJyMiZMmACz2QwfHx9s27YNAODt7Y0F\nCxagZ8+eAIC0tDR4eXndU4UFAoFAcI+wDVJUVMTHH3+cZrOZiYmJLC4urlPm7Nmz7NevHyMjI9mt\nWzeuWrWqFZTak5WVxfDwcJpMJi5durTeMjNmzKDJZGJ0dDRzc3NbWGHjNKX//fffZ3R0NLt3787e\nvXszLy+vFVTWjyPXniRzcnKoVCq5c+fOFlTXNI7oP3jwIGNjY9mtWzf27du3ZQU2QVP6r1y5wsGD\nBzMmJobdunXjhg0bWl5kAzz33HP08/NjVFRUg2Vcud02pb857bZNGo45c+Zw2bJlJMmlS5dy7ty5\ndcpcvHiRp06dIkneuHGDYWFhPHPmTIvqtKWiooKhoaEsKChgWVkZY2Ji6uj57LPPOHToUJLk8ePH\nGR8f3xpS68UR/UePHmVJSQlJuaNwFf2OaK8u179/fw4bNow7duxoBaX144j+4uJiRkZGsrCwkKTc\nEbsKjuhPS0vjvHnzSMravb29WV5e3hpy63D48GHm5uY22PG6crslm9bfnHbbJlOO2M77mDRpknU+\niC0BAQGIjY0FALi5uSEiIgIXLlxoUZ225OTkwGQyoXPnzlCr1Rg3bhwyMzPtytjWKz4+HiUlJbh8\n+XJryK2DI/p79eoFT09PAPZze1obR7QDwNtvv40xY8agffv2raCyYRzRv3XrVowePdoacOLr69sa\nUuvFEf0dOnTATz/9BAD46aef4OPjA5XqvswWuGf69OmDdu3aNbjfldst0LT+5rTbNmk4Ll++DH9/\nfwCAv79/kzfpP//5D06dOoX4+PiWkFcvtnNVgPrnpNRXxlU6X0f027Ju3TokJSW1hLQmcfTaZ2Zm\nIiUlBYBrzQtyRH9+fj6uXbuG/v37o0ePHti8eXNLy2wQR/RPnToVp0+fRmBgIGJiYrBq1aqWltls\nXLndOouj7dY1THo9NDSH5LXXXrP7LElSo4385s2bGDNmDFatWgU3N7f7rtNRHO2IWGtOiqt0YM7o\nOHjwINavX48jR478jIocxxHtqampWLp0KSRJAuUh3BZQ5hiO6C8vL0dubi4OHDiA27dvo1evXkhI\nSIDZbG4BhY3jiP4lS5YgNjYWhw4dwvfff4/ExETk5eXB3d29BRTeO67abp3BmXbrsoajsTkk/v7+\nuHTpEgICAnDx4kX4+fnVW668vByjR4/Gs88+i5EjR/5cUh2i9vyWwsJCu1nx9ZU5d+4cgoKCWkxj\nYziiHwC+/vprTJ06FXv37m309bglcUT7yZMnMW7cOADA1atXkZWVBbVajeHDh7eo1vpwRH9ISAh8\nfX2h1+uh1+vx2GOPIS8vzyUMhyP6jx49ipdffhkAEBoaii5duuDbb79Fjx49WlRrc3DldusoTrfb\n++aBaUHmzJljjcxIT0+v1zleVVXFCRMmMDU1taXl1Ut5eTm7du3KgoIClpaWNukcP3bsmEs52RzR\n/+OPPzI0NJTHjh1rJZX144h2WyZPnuxSUVWO6P/mm284cOBAVlRU8NatW4yKiuLp06dbSbE9juif\nNWsWFy5cSJK8dOkSg4KCWFRU1Bpy66WgoMAh57irtdtqGtPfnHbbJg1HUVERBw4cWCcc9/z580xK\nSiJJfvnll5QkiTExMYyNjWVsbCyzsrJaUzb37NnDsLAwhoaGcsmSJSTJNWvWcM2aNdYy06dPZ2ho\nKKOjo3ny5MnWklovTelPTk6mt7e39Xr37NmzNeXa4ci1r8bVDAfpmP7ly5czMjKSUVFRLhF+bktT\n+q9cucInnniC0dHRjIqK4pYtW1pTrh3jxo1jhw4dqFarGRwczHXr1rWpdtuU/ua0W4l0ocFcgUAg\nELg8bTKqSiAQCASthzAcAoFAIHAKYTgEAoFA4BTCcAgEAoHAKYThEAgEAoFTCMMhEAgEAqf4fymB\n6DYchqRkAAAAAElFTkSuQmCC\n"
}
],
"prompt_number": 60
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "unsupported format character '\t' (0x9) at index 9",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-67-c0e8b1a82448>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdescribe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/Users/jb/Documents/code/pscore/statsmodels/statsmodels/stats/pscore_match.py\u001b[0m in \u001b[0;36mdescribe\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mdescribe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 211\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0;34m'radius: %\\t treated :%d control: %d \\t treatment effect: %f'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mradius\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched_treatment\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched_control\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtreatment_effect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 212\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 213\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: unsupported format character '\t' (0x9) at index 9"
]
}
],
"prompt_number": 67
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"algo = psm.matching_algo\n",
"for radius in [0.2, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001]:\n",
" algo.radius = radius\n",
" algo.fit()\n",
" print radius, len(algo.matched.items()), algo.treatment_effect()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.2 185 -35.6056693412\n",
"0.1"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 185 984.946368243\n",
"0.01"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 145 963.401831897\n",
"0.001"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 57 -202.491604989\n",
"0.0001"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 27 29.9744375723\n",
"1e-05"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 16 569.898803711\n",
"1e-06"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 12 2721.52213542\n",
"1e-07"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 12 2721.52213542\n"
]
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treated()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 13,
"text": [
"0 True\n",
"1 True\n",
"2 True\n",
"3 True\n",
"4 True\n",
"5 True\n",
"6 True\n",
"7 True\n",
"8 True\n",
"9 True\n",
"10 True\n",
"11 True\n",
"12 True\n",
"13 True\n",
"14 True\n",
"...\n",
"2660 False\n",
"2661 False\n",
"2662 False\n",
"2663 False\n",
"2664 False\n",
"2665 False\n",
"2666 False\n",
"2667 False\n",
"2668 False\n",
"2669 False\n",
"2670 False\n",
"2671 False\n",
"2672 False\n",
"2673 False\n",
"2674 False\n",
"Length: 2675, dtype: bool"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.control() & np.abs(psm.scores - psm.scores[9] < 0.1)]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 26,
"text": [
"185 0.000000\n",
"186 0.000000\n",
"187 0.000000\n",
"189 0.000000\n",
"190 0.000000\n",
"191 0.000000\n",
"193 0.000000\n",
"194 0.000000\n",
"196 0.000000\n",
"199 11821.813477\n",
"200 0.000000\n",
"201 0.000000\n",
"203 0.000000\n",
"205 0.000000\n",
"206 0.000000\n",
"...\n",
"2558 23643.625000\n",
"2565 20688.171875\n",
"2566 23643.625000\n",
"2574 26599.078125\n",
"2575 0.000000\n",
"2595 13299.539062\n",
"2604 13063.102539\n",
"2606 45809.523438\n",
"2611 36943.164062\n",
"2614 9457.450195\n",
"2616 35465.437500\n",
"2620 44331.796875\n",
"2656 17732.718750\n",
"2657 17732.718750\n",
"2667 31032.257812\n",
"Name: re78, Length: 1066, dtype: float32"
]
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[ 9]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 22,
"text": [
"12418.07"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.matching_algo.neighbors_of(9)]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 27,
"text": [
"227 0\n",
"Name: re78, dtype: float32"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.matched.keys()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 28,
"text": [
"[3,\n",
" 6,\n",
" 9,\n",
" 143,\n",
" 20,\n",
" 152,\n",
" 26,\n",
" 34,\n",
" 49,\n",
" 178,\n",
" 180,\n",
" 53,\n",
" 182,\n",
" 183,\n",
" 56,\n",
" 63,\n",
" 181,\n",
" 66,\n",
" 73,\n",
" 80,\n",
" 184,\n",
" 88,\n",
" 92,\n",
" 102,\n",
" 123,\n",
" 124]"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for key, value in algo.matched.items():\n",
" print key, psm.scores[value].count()\n",
" print psm.treatment_objective_variable[value].describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"34 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"102 1\n",
"count 1.000000\n",
"mean 3694.316406\n",
"std NaN\n",
"min 3694.316406\n",
"25% 3694.316406\n",
"50% 3694.316406\n",
"75% 3694.316406\n",
"max 3694.316406\n",
"dtype: float64\n",
"6 1\n",
"count 1.000000\n",
"mean 4728.725098\n",
"std NaN\n",
"min 4728.725098\n",
"25% 4728.725098\n",
"50% 4728.725098\n",
"75% 4728.725098\n",
"max 4728.725098\n",
"dtype: float64\n",
"9 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"80 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"49 1\n",
"count 1.000000\n",
"mean 4728.725098\n",
"std NaN\n",
"min 4728.725098\n",
"25% 4728.725098\n",
"50% 4728.725098\n",
"75% 4728.725098\n",
"max 4728.725098\n",
"dtype: float64\n",
"20 2\n",
"count 2\n",
"mean 0\n",
"std 0\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"53 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"73 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"88 1\n",
"count 1\n",
"mean 0\n",
"std NaN\n",
"min 0\n",
"25% 0\n",
"50% 0\n",
"75% 0\n",
"max 0\n",
"dtype: float64\n",
"26 1\n",
"count 1.000000\n",
"mean 3694.316406\n",
"std NaN\n",
"min 3694.316406\n",
"25% 3694.316406\n",
"50% 3694.316406\n",
"75% 3694.316406\n",
"max 3694.316406\n",
"dtype: float64"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"92 1\n",
"count 1.000000\n",
"mean 3694.316406\n",
"std NaN\n",
"min 3694.316406\n",
"25% 3694.316406\n",
"50% 3694.316406\n",
"75% 3694.316406\n",
"max 3694.316406\n",
"dtype: float64\n"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 30,
"text": [
"-39.70155686598558"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.scores[92]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 46,
"text": [
"0.96687891809564797"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[(psm.assigment_index ==0) & (np.abs(psm.scores - psm.scores[92]) < 0.01)].describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 54,
"text": [
"count 5.000000\n",
"mean 1243.654663\n",
"std 1679.033447\n",
"min 0.000000\n",
"25% 0.000000\n",
"50% 218.703537\n",
"75% 2305.253418\n",
"max 3694.316406\n",
"dtype: float64"
]
}
],
"prompt_number": 54
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"algo.radius"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 49,
"text": [
"0.001"
]
}
],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treated().sum()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 36,
"text": [
"185"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm._basic_treated().sum()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 37,
"text": [
"185"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.any(psm.matching_algo.matched.values(), axis=0).sum()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 49,
"text": [
"7"
]
}
],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.sum(psm.matching_algo.matched.values(), axis=0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'numpy.ndarray' object has no attribute 'where'",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-53-511c450f31b2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m: 'numpy.ndarray' object has no attribute 'where'"
]
}
],
"prompt_number": 53
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def treated_mean():\n",
" return psm.treatment_objective_variable[psm.matching_algo.matched.keys()].mean()\n",
"def control_mean():\n",
" return psm.treatment_objective_variable[np.any(psm.matching_algo.matched.values(), axis=0)].mean()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 76
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"treated_mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 103,
"text": [
"7674.0078"
]
}
],
"prompt_number": 103
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"control_mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 115,
"text": [
"13539.3"
]
}
],
"prompt_number": 115
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def weights():\n",
" return np.sum(psm.matching_algo.matched.values(), axis=0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 81
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.dot(psm.treatment_objective_variable.where(np.any(psm.matching_algo.matched.values(), axis=0), 0), weights())/sum(weights())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 101,
"text": [
"10397.552867542614"
]
}
],
"prompt_number": 101
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"treated_mean() - np.dot(psm.treatment_objective_variable.where(np.any(psm.matching_algo.matched.values(), axis=0), 0), weights())/sum(weights())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 100,
"text": [
"-2723.545055042614"
]
}
],
"prompt_number": 100
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"radius: 0.000010\t treated :16 control: 16 \t treatment effect: 569.898804\n"
]
}
],
"prompt_number": 117
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"15461.147785659665/111"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 90,
"text": [
"139.2896196906276"
]
}
],
"prompt_number": 90
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"weights().sum()/float(16)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 99,
"text": [
"1.375"
]
}
],
"prompt_number": 99
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.radius = 0.00001"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 96
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.fit()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 97
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"radius: 0.000010\t treated :16 control: 16 \t treatment effect: 569.898804\n"
]
}
],
"prompt_number": 98
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum(psm.matching_algo.matched.values(), axis=1)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 121,
"text": [
"array([1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 6, 1, 1])"
]
}
],
"prompt_number": 121
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"treated_mean() - np.dot(psm.treatment_objective_variable[np.any(psm.matching_algo.matched.values(), axis=0)], 1.0/sum(psm.matching_algo.matched.values(), axis=1))/16"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 116,
"text": [
"-4683.1112365722656"
]
}
],
"prompt_number": 116
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(psm.matching_algo.matched.values())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 120,
"text": [
"16"
]
}
],
"prompt_number": 120
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.matching_algo.matched.values()]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "boolean index array should have 1 dimension",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-122-3a9028fc1e2f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtreatment_objective_variable\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/series.pyc\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 634\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_check_bool_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 635\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 636\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_with\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 637\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 638\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_with\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/series.pyc\u001b[0m in \u001b[0;36m_get_with\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 674\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 675\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mkey_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'boolean'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 676\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 677\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 678\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/series.pyc\u001b[0m in \u001b[0;36m_get_values\u001b[0;34m(self, indexer)\u001b[0m\n\u001b[1;32m 703\u001b[0m name=self.name)\n\u001b[1;32m 704\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 705\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 707\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget_dtype_counts\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: boolean index array should have 1 dimension"
]
}
],
"prompt_number": 122
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(1.0/sum(psm.matching_algo.matched.values(), axis=1))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 127,
"text": [
"16"
]
}
],
"prompt_number": 127
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.dot(psm.matching_algo.matched.values(), (1.0/sum(psm.matching_algo.matched.values(), axis=1)).T)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "matrices are not aligned",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-129-b5a6fca970c8>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mValueError\u001b[0m: matrices are not aligned"
]
}
],
"prompt_number": 129
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"len(psm.matching_algo.matched.values())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 126,
"text": [
"16"
]
}
],
"prompt_number": 126
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.dot?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 128
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.shape( (1.0/sum(psm.matching_algo.matched.values(), axis=1)).T)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 130,
"text": [
"(16,)"
]
}
],
"prompt_number": 130
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.shape(psm.matching_algo.matched.values().T)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "'list' object has no attribute 'T'",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-132-cc09e617b166>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatching_algo\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatched\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m: 'list' object has no attribute 'T'"
]
}
],
"prompt_number": 132
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"weights = np.matrix(psm.matching_algo.matched.values()).T.dot(1.0/sum(psm.matching_algo.matched.values(), axis=1))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 144
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable.dot(weights.T)/(weights.sum())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 148,
"text": [
"matrix([[ 7104.10894775]])"
]
}
],
"prompt_number": 148
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"weights.sum()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 147,
"text": [
"15.999999999999996"
]
}
],
"prompt_number": 147
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"radius: 0.000010\t treated :16 control: 16 \t treatment effect: 569.898804\n"
]
}
],
"prompt_number": 149
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.matching_algo.matched.keys()].sum()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 153,
"text": [
"122784.12"
]
}
],
"prompt_number": 153
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(psm.treatment_objective_variable[psm.matching_algo.matched.keys()].sum() - psm.treatment_objective_variable.dot(weights.T)/(weights.sum())) / (len(psm.matching_algo.matched.keys()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 155,
"text": [
"matrix([[ 7230.00100327]])"
]
}
],
"prompt_number": 155
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.matching_algo.matched.keys()].mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 157,
"text": [
"7674.0078"
]
}
],
"prompt_number": 157
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(psm.treatment_objective_variable.dot(weights.T)/(weights.sum())) / len(psm.matching_algo.matched.keys())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 161,
"text": [
"matrix([[ 444.00680923]])"
]
}
],
"prompt_number": 161
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(psm.treatment_objective_variable.dot(weights.T)/(weights.sum()))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 163,
"text": [
"matrix([[ 7104.10894775]])"
]
}
],
"prompt_number": 163
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.radius"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 164,
"text": [
"1e-05"
]
}
],
"prompt_number": 164
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.treatment_objective_variable[psm.matching_algo.matched.keys()].mean() - psm.treatment_objective_variable.dot(weights.T)/ len(psm.matching_algo.matched.keys())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 168,
"text": [
"matrix([[ 569.89886475]])"
]
}
],
"prompt_number": 168
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"psm.matching_algo.treatment_effect()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 169,
"text": [
"569.8988037109375"
]
}
],
"prompt_number": 169
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scores = psm.scores[psm.treated()]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 170
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.abs(psm.scores - scores.T) "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 174,
"text": [
"0 0\n",
"1 0\n",
"2 0\n",
"3 0\n",
"4 0\n",
"5 0\n",
"6 0\n",
"7 0\n",
"8 0\n",
"9 0\n",
"10 0\n",
"11 0\n",
"12 0\n",
"13 0\n",
"14 0\n",
"...\n",
"2660 NaN\n",
"2661 NaN\n",
"2662 NaN\n",
"2663 NaN\n",
"2664 NaN\n",
"2665 NaN\n",
"2666 NaN\n",
"2667 NaN\n",
"2668 NaN\n",
"2669 NaN\n",
"2670 NaN\n",
"2671 NaN\n",
"2672 NaN\n",
"2673 NaN\n",
"2674 NaN\n",
"Length: 2675, dtype: float64"
]
}
],
"prompt_number": 174
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scores"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 173,
"text": [
"0 0.676478\n",
"1 0.904854\n",
"2 0.946141\n",
"3 0.966927\n",
"4 0.966270\n",
"5 0.972337\n",
"6 0.948103\n",
"7 0.959188\n",
"8 0.678704\n",
"9 0.076200\n",
"10 0.966041\n",
"11 0.918273\n",
"12 0.962628\n",
"13 0.843061\n",
"14 0.954355\n",
"...\n",
"170 0.384416\n",
"171 0.046380\n",
"172 0.481091\n",
"173 0.358192\n",
"174 0.238137\n",
"175 0.387469\n",
"176 0.129368\n",
"177 0.798443\n",
"178 0.055468\n",
"179 0.574070\n",
"180 0.007592\n",
"181 0.005570\n",
"182 0.007960\n",
"183 0.003291\n",
"184 0.000653\n",
"Length: 185, dtype: float64"
]
}
],
"prompt_number": 173
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from scipy.spatial import KDTree"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 175
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tree = KDTree(matrix(psm.scores[psm.control()].T), leafsize =10)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 191
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"np.asarray(matrix(psm.scores[psm.control()]).T).shape"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 190,
"text": [
"(2490, 1)"
]
}
],
"prompt_number": 190
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tree.query(psm.scores[psm.treated()])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "x must consist of vectors of length 2490 but has shape (185,)",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-192-ebf4735c6817>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpsm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtreated\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/spatial/kdtree.pyc\u001b[0m in \u001b[0;36mquery\u001b[0;34m(self, x, k, eps, p, distance_upper_bound)\u001b[0m\n\u001b[1;32m 463\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 464\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 465\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"x must consist of vectors of length %d but has shape %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 466\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mp\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 467\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Only p-norms with 1<=p<=infinity permitted\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: x must consist of vectors of length 2490 but has shape (185,)"
]
}
],
"prompt_number": 192
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment