\n"
+ ],
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "variable_name": "obs",
+ "summary": "{\n \"name\": \"obs\",\n \"rows\": 7,\n \"fields\": [\n {\n \"column\": \"start\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 0,\n \"max\": 7,\n \"num_unique_values\": 6,\n \"samples\": [\n 0,\n 1,\n 7\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"end\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 2,\n \"min\": 2,\n \"max\": 9,\n \"num_unique_values\": 5,\n \"samples\": [\n 2,\n 8,\n 6\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"status\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 1,\n \"num_unique_values\": 2,\n \"samples\": [\n 0,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
+ },
+ "metadata": {},
+ "execution_count": 24
+ }
+ ],
+ "source": [
+ "obs = pd.DataFrame()\n",
+ "\n",
+ "obs['start'] = 0,1,2,2,4,6,7\n",
+ "obs['end'] = 5,2,6,9,9,8,9\n",
+ "obs['status'] = 1,1,1,0,0,1,0\n",
+ "\n",
+ "obs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "N8FlCd7yTTlx"
+ },
+ "source": [
+ "This `DataFrame` contains one row for each dog and three columns:\n",
+ "\n",
+ "* `start`: arrival time, in weeks since the beginning of the study\n",
+ "\n",
+ "* `end`: adoption date, for dogs that were adopted, or `9` for dogs that had not been adopted at the end of the study\n",
+ "\n",
+ "* `status`: `1` for dogs that were adopted; `0` for dogs that were not."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "oSpxyFXUTTlx"
+ },
+ "source": [
+ "## Plotting lifelines\n",
+ "\n",
+ "The following function visualizes the data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "id": "GxBWpgBtTTly"
+ },
+ "outputs": [],
+ "source": [
+ "def plot_lifelines(obs):\n",
+ " \"\"\"Plot a line for each observation.\n",
+ "\n",
+ " obs: DataFrame\n",
+ " \"\"\"\n",
+ " for y, row in obs.iterrows():\n",
+ " start = row['start']\n",
+ " end = row['end']\n",
+ " status = row['status']\n",
+ "\n",
+ " if status == 0:\n",
+ " # ongoing\n",
+ " plt.hlines(y, start, end, color='C0')\n",
+ " else:\n",
+ " # complete\n",
+ " plt.hlines(y, start, end, color='C1')\n",
+ " plt.plot(end, y, marker='o', color='C1')\n",
+ "\n",
+ " plt.xlabel('Time (weeks)')\n",
+ " plt.ylabel('Dog index')\n",
+ " plt.gca().invert_yaxis()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "1sPBWtrSTTlz"
+ },
+ "source": [
+ "Here are the results:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 449
+ },
+ "id": "e_wzTSo3TTlz",
+ "outputId": "c5b62064-1f3d-4b48-d86d-b806b57985b5"
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "
"
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "plot_lifelines(obs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9v-FAT6MTTlz"
+ },
+ "source": [
+ "Each line represents the time a dog spends at the shelter. Each dot represents an adoption.\n",
+ "We can see, for example:\n",
+ "\n",
+ "* The dog with index 0 arrived during week 0, and was adopted during week 5.\n",
+ "\n",
+ "* The dog with index 3 arrived during week 2, and had not been adopted at the end of week 9.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gP-olgxWTTlz"
+ },
+ "source": [
+ "## Estimating survival\n",
+ "\n",
+ "Now suppose we want to know the distribution of \"survival time\" from arrival to adoption.\n",
+ "For the dogs that were adopted, we have all the data we need. \n",
+ "For the others, we have only partial information: if a dog hasn't been adopted yet, we don't know when it will be, but we can put a lower bound on it.\n",
+ "\n",
+ "When we have a mixture of complete and incomplete observations -- adopted and unadopted dogs -- we can't compute the Survival function directly.\n",
+ "Instead, we have to work backwards: we estimate the hazard function first, then use it to compute the survival function, CDF, and PMF.\n",
+ "\n",
+ "Specifically, we'll use Kaplan-Meier estimation, which is based on two key ideas.\n",
+ "\n",
+ "The first idea is that we can ignore the arrival time in the observed data, and consider only the durations. In effect, we can take the actual lifelines and shift them so they all start at 0, like this:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "tags": [],
+ "id": "X4RK8YAHTTlz"
+ },
+ "outputs": [],
+ "source": [
+ "duration = obs['end'] - obs['start']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "tags": [],
+ "id": "pFB7dzT2TTl0"
+ },
+ "outputs": [],
+ "source": [
+ "shifted = obs.copy()\n",
+ "shifted['start'] = 0\n",
+ "shifted['end'] = duration"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "tags": [],
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 449
+ },
+ "id": "hUSE7kJYTTl0",
+ "outputId": "61b1c0af-b72a-4001-ae1d-8903025c010b"
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ "
"
+ ],
+ "image/png": "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999/f83btSzrul4fHR2tmjVrXvPrr9axY8f0wQcfaNiwYWW+r7LSrFkzNWjQQG+//bbdUQCjUVSAcsjpdKpWrVq68cYb1bp1a02cOFHLli1TZmam5s6dK0k6cuSIHA6Hdu3a5X/d2bNn5XA4lJWVJUnKysqSw+FQZmambrnlFjmdTm3atEmHDh1Sv379FBsbq0qVKqlt27Zas2aNfztdunTR0aNHNWbMGP/RHan4Uz8zZsxQgwYNFBkZqcaNG+utt94KeN7hcOj1119X//79dcMNN6hRo0Zavnz5Zd//e++9pxYtWujGG2+UVFSwatSooffff9+/TsuWLRUXF+df3rRpk5xOp7799lv/Z/Hggw+qRo0acrlc6tatm3bv3h2wn2XLlql169aKiopS/fr1NXny5MsWuUmTJikuLk579uyRJP3lL39Ro0aNFBUVpdjYWA0YMCBg/T59+mjhwoWXfa9AqKOoAL8Q3bp1U4sWLbR48eISv3b8+PGaOnWqDhw4oOTkZBUUFOjOO+/U2rVrtXPnTvXs2VN9+vTRsWPHJEmLFy9W7dq19dxzzyk3N1e5ubnFbnfJkiVKT0/X448/rn379unhhx/W8OHDtX79+oD1Jk+erIEDB2rPnj268847NXjwYH3zzTeXzLtx40a1adPGv+xwONSpUyd/ATtz5owOHDig7777Tp9++qkkKTs7W23bttUNN9wgSbrnnnt0+vRpZWZmavv27WrdurW6d+/u3+/GjRs1dOhQpaena//+/Zo5c6bmzp2rF1544aI8lmVp1KhRevPNN7Vx40YlJydr27ZtGj16tJ577jnl5ORoxYoV6tSpU8Dr2rVrp48//lher/dy/3mA0Gbrz24GUGJpaWlWv379in3u3nvvtZo0aWJZlmUdPnzYkmTt3LnT//yZM2csSdb69esty7Ks9evXW5KspUuXXnG/TZs2tV555RX/cmJiovXyyy8HrDNnzhzL7Xb7lzt06GA99NBDAevcc8891p133ulflmQ99dRT/uWCggJLkpWZmXnJLC1atLCee+65gLE///nPVtOmTS3LsqylS5da7du3t/r162fNmDHDsizLSk1NtSZOnGhZlmVt3LjRcrlc1r///e+AbTRo0MCaOXOmZVmW1b17d2vKlCkBz7/11ltWXFxcQPa//e1v1v333281adLE+uc//+l/btGiRZbL5bI8Hs8l38fu3bstSdaRI0cuuQ4Q6jiiAvyCWJblPw1TEj89OiFJBQUFGjdunJo0aaLKlSurUqVKOnDggP+IytU6cOCAOnbsGDDWsWNHHThwIGAsOTnZ//uKFSvK5XLp9OnTl9zud999p6ioqICxzp07a//+/frqq6+UnZ2tLl26qEuXLsrKytKFCxe0efNmdenSRZK0e/duFRQUqFq1aqpUqZL/cfjwYR06dMi/znPPPRfw/EMPPaTc3Fz/6SNJGjNmjD766CNt2LDBfypKkm6//XYlJiaqfv36GjJkiObPnx/wOqloTo+ki8YB/EeE3QEAlJ4DBw6oXr16kqSwsKJ/h1iW5X/+woULxb6uYsWKAcvjxo3T6tWr9cc//lENGzZUdHS0BgwYoPPnz5dJ7goVKgQsOxyOy17BVL16dZ05cyZgrHnz5qpataqys7OVnZ2tF154QbVq1dKLL76orVu36sKFC+rQoYOkoiIWFxfnP1X0Uz/OsSkoKNDkyZP161//+qJ1flqSbr/9dr3zzjtauXKlBg8e7B+PiYnRjh07lJWVpVWrVumZZ57Rs88+q61bt/r38eNppho1alz6wwFCHEUF+IVYt26d9u7dqzFjxkj6z5dfbm6uWrVqJUkBE2sv5x//+IeGDRum/v37Syr60j5y5EjAOpGRkSosLLzsdpo0aaJ//OMfSktLC9h2UlLSVeW4lFatWmn//v0BYw6HQ7fddpuWLVumTz75RLfeeqtuuOEGeb1ezZw5U23atPEXstatW+vkyZOKiIhQ3bp1i91H69atlZOTo4YNG142S9++fdWnTx/df//9Cg8P13333ed/LiIiQqmpqUpNTdWkSZNUuXJlrVu3zl9+9u3bp9q1a6t69erX8WkAv2wUFaAc8nq9OnnypAoLC3Xq1CmtWLFCGRkZuuuuuzR06FBJRacVfvWrX2nq1KmqV6+eTp8+raeeeuqqtt+oUSMtXrxYffr0kcPh0NNPP33REY66detqw4YNuu++++R0Oov9sn3iiSc0cOBAtWrVSqmpqfr73/+uxYsXB1xBdC169OihBx98UIWFhQoPD/ePd+nSRY8//rjatGmjSpUqSZI6deqk+fPn64knnvCvl5qaqpSUFN199936wx/+oJtuukknTpzQ//7v/6p///5q06aNnnnmGd11112qU6eOBgwYoLCwMO3evVv79u3T888/H5Cnf//+euuttzRkyBBFRERowIAB+uCDD/TFF1+oU6dOqlKliv7v//5PPp9PjRs39r9u48aNuuOOO67rswB+8eyeJAOgZNLS0ixJliQrIiLCqlGjhpWammr99a9/tQoLCwPW3b9/v5WSkmJFR0dbLVu2tFatWlXsZNozZ84EvO7w4cNW165drejoaCshIcF69dVXrc6dO1vp6en+dbZs2WIlJydbTqfT+vGvkp9PprUsy/rLX/5i1a9f36pQoYJ10003WW+++WbA85KsJUuWBIy53W5rzpw5l/wMLly4YMXHx1srVqwIGN+5c6clyXryySf9Yy+//LIl6aJ1PR6PNWrUKCs+Pt6qUKGClZCQYA0ePNg6duyYf50VK1ZYHTp0sKKjoy2Xy2W1a9fOmjVr1iWzv/vuu1ZUVJS1aNEia+PGjVbnzp2tKlWqWNHR0VZycrL17rvv+tf97rvvLLfbbW3ZsuWS7xOAZTks6ycnsAGgnJg+fbqWL1+ulStX2h3lmsyYMUNLlizRqlWr7I4CGI1TPwDKpYcfflhnz55Vfn5+ubyNfoUKFfTKK6/YHQMwHkdUAACAsbiPCgAAMBZFBQAAGIuiAgAAjEVRAQAAxqKoAAAAY1FUAACAsSgqAADAWBQVAABgLIoKAAAw1v8Dfsl01SDWp4kAAAAASUVORK5CYII=\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "plot_lifelines(shifted)\n",
+ "plt.xlabel('Duration (weeks)');"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wYv8QX6_TTl0"
+ },
+ "source": [
+ "Notice that the x-axis in this figure is duration, not time.\n",
+ "\n",
+ "The second key idea is that we can estimate the hazard function by considering:\n",
+ "\n",
+ "* The number of dogs adopted at each duration, divided by\n",
+ "\n",
+ "* The number of dogs \"at risk\" at each duration, where \"at risk\" means that they *could* be adopted.\n",
+ "\n",
+ "For example:\n",
+ "\n",
+ "* At duration 1, there is 1 adoption out of 7 dogs at risk, so the hazard rate is `1/7`.\n",
+ "\n",
+ "* At duration 2, there is 1 adoption out of 6 dogs at risk, so the hazard rate is `1/6`.\n",
+ "\n",
+ "* At duration 4, there is 1 adoption out of 4 dogs at risk, so the hazard rate is `1/4`.\n",
+ "\n",
+ "And so on. Now let's see how that works computationally."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RoNynN_uTTl0"
+ },
+ "source": [
+ "## Computing \"at risk\"\n",
+ "\n",
+ "For each observed duration, we would like to compute the number of dogs that were at risk.\n",
+ "Here are the unique durations, in order:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "tags": [],
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "9ElKOYRnTTl0",
+ "outputId": "0ffb2ed7-46ee-479d-c03d-5b36ac693ac5"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([1, 2, 4, 5, 7])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 30
+ }
+ ],
+ "source": [
+ "ts = duration.unique()\n",
+ "ts.sort()\n",
+ "ts"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "OM-V9gg5TTl0"
+ },
+ "source": [
+ "To compute the number of dogs at risk, we can loop through `ts` and count the number of dogs where `t` is less than or equal to `end`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {
+ "scrolled": true,
+ "tags": [],
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 241
+ },
+ "id": "3e3xfHhLTTl0",
+ "outputId": "7b1b6c08-c968-4c43-ae60-dbc6e6f38568"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "1 7\n",
+ "2 6\n",
+ "4 4\n",
+ "5 3\n",
+ "7 1\n",
+ "dtype: int64"
+ ],
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
0
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
1
\n",
+ "
7
\n",
+ "
\n",
+ "
\n",
+ "
2
\n",
+ "
6
\n",
+ "
\n",
+ "
\n",
+ "
4
\n",
+ "
4
\n",
+ "
\n",
+ "
\n",
+ "
5
\n",
+ "
3
\n",
+ "
\n",
+ "
\n",
+ "
7
\n",
+ "
1
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 31
+ }
+ ],
+ "source": [
+ "at_risk = pd.Series(0, index=ts)\n",
+ "\n",
+ "for t in ts:\n",
+ " k = (t <= shifted['end'])\n",
+ " at_risk[t] = k.sum()\n",
+ "\n",
+ "at_risk"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "LRF-nVAyTTl0"
+ },
+ "source": [
+ "If you don't like mixing for loops with array operations, we can do the same computation using mesh grids."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "IPbcUPxETTl1",
+ "outputId": "cf15369c-d2f0-4c70-e00f-02c744aab826"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "(5, 7)"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 32
+ }
+ ],
+ "source": [
+ "E, T = np.meshgrid(shifted['end'], ts)\n",
+ "T.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "B-7MVJfmTTl1"
+ },
+ "source": [
+ "The results are arrays with one row for each value of `t` and one column for each dog.\n",
+ "Now we can use comparison operators to compare all values of `t` to all values of `end` at the same time."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "DaILrZrXTTl1",
+ "outputId": "d42b5a4d-129c-4a50-aadd-a85204101369"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "array([7, 6, 4, 3, 1])"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 33
+ }
+ ],
+ "source": [
+ "at_risk = (T <= E).sum(axis=1)\n",
+ "at_risk"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "LyWqWdv0TTl1"
+ },
+ "source": [
+ "The result is an array with the number of dogs at risk for each value of `t`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "lg5zAb0hTTl1"
+ },
+ "source": [
+ "## Estimating the hazard function\n",
+ "\n",
+ "Now, to compute the hazard function, we need to know the number of dogs adopted at each value of `t`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "tags": [],
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 241
+ },
+ "id": "KZUyAvh4TTl1",
+ "outputId": "b26580cb-829d-43f7-fc8d-0bef22044315"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "1 1\n",
+ "2 1\n",
+ "4 1\n",
+ "5 1\n",
+ "7 0\n",
+ "dtype: int64"
+ ],
+ "text/html": [
+ "