From 2424290edbe61895221cd34bb5ecc5344ae21241 Mon Sep 17 00:00:00 2001 From: jhkimon Date: Mon, 11 May 2026 20:56:28 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=EC=B4=88=EA=B8=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/why_causal_inference/why_causal_inference_ko.ipynb | 8 ++++++++ videos/why_causal_inference/src/why_causal_inference.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/book/why_causal_inference/why_causal_inference_ko.ipynb b/book/why_causal_inference/why_causal_inference_ko.ipynb index fcc3bbd..4a40843 100644 --- a/book/why_causal_inference/why_causal_inference_ko.ipynb +++ b/book/why_causal_inference/why_causal_inference_ko.ipynb @@ -10,6 +10,14 @@ "# 우리가 왜 인과추론에 관심을 가져야 할까요?\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0ab8792", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 1, diff --git a/videos/why_causal_inference/src/why_causal_inference.py b/videos/why_causal_inference/src/why_causal_inference.py index 75b65e7..2dca9d7 100644 --- a/videos/why_causal_inference/src/why_causal_inference.py +++ b/videos/why_causal_inference/src/why_causal_inference.py @@ -15,7 +15,7 @@ def load_icon(filename: str, color: str, height: float) -> SVGMobject: icon = SVGMobject(str(ASSET_DIR / filename)) - icon.set_stroke(color=color, width=2.6, opacity=1) + icon.set_stroke(color=color, width=2 .6, opacity=1) icon.set_fill(opacity=0) icon.height = height return icon @@ -1075,7 +1075,7 @@ def make_table_cell(content: Mobject, width: float, height: float, stroke_color= self.play( LaggedStart( *[ - Indicate(VGroup(row[1][0], row[2][0]), color=ACCENT_COLOR, scale_factor=1.02) + Indicate(VGroup(r ow[1][0], row[2][0]), color=ACCENT_COLOR, scale_factor=1.02) for row in body_rows ], lag_ratio=0.12, From cb9c29260b658f192c595a6afa360e789bcfa8b0 Mon Sep 17 00:00:00 2001 From: jhkimon Date: Mon, 11 May 2026 20:59:03 +0900 Subject: [PATCH 2/4] feat: add ipw part 2 (ipw in practice) --- book/ipw_basics/ipw_in_practice_ko.ipynb | 2263 ++++++++++++++++++++++ 1 file changed, 2263 insertions(+) create mode 100644 book/ipw_basics/ipw_in_practice_ko.ipynb diff --git a/book/ipw_basics/ipw_in_practice_ko.ipynb b/book/ipw_basics/ipw_in_practice_ko.ipynb new file mode 100644 index 0000000..8a03b58 --- /dev/null +++ b/book/ipw_basics/ipw_in_practice_ko.ipynb @@ -0,0 +1,2263 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c1ffddf8", + "metadata": {}, + "source": [ + "# IPW in Practice" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "44d09a27", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"PATH\"] += os.pathsep + \"/opt/homebrew/bin\"" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "78265c88", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "from joblib import Parallel, delayed\n", + "\n", + "from graphviz import Digraph\n", + "from IPython.display import display\n", + "\n", + "\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n", + "\n", + "np.random.seed(42)" + ] + }, + { + "cell_type": "markdown", + "id": "9da09828", + "metadata": {}, + "source": [ + "## Recap. IPW의 핵심 아이디어" + ] + }, + { + "cell_type": "markdown", + "id": "f954e846", + "metadata": {}, + "source": [ + "- 우리의 목표는 $ATE = \\mathbb{E}[Y_1 - Y_0]$, 즉, “전체 집단에서 모든 사람이 약을 복용했을 때의 평균 입원 일수와, 모든 사람이 약을 복용하지 않았을 때의 평균 입원 일수는 얼마나 차이가 나는지를 보는 것입니다.\n", + "\n", + "다시 아래의 예시를 보겠습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "d0adf24e", + "metadata": {}, + "outputs": [], + "source": [ + "drug_example = pd.DataFrame(dict(\n", + " sex= [\"M\",\"M\",\"M\",\"M\",\"M\",\"M\", \"W\",\"W\",\"W\",\"W\"],\n", + " drug=[1,1,1,1,1,0, 1,0,1,0],\n", + " days=[5,5,5,5,5,8, 2,4,2,4]\n", + "))" + ] + }, + { + "cell_type": "markdown", + "id": "7f2e30c3", + "metadata": {}, + "source": [ + "현실에서는 한 개인에 대해 $Y_0$와 $Y_1$을 동시에 관측할 수 없기 때문에 직접 알 수 없지만, 여기서는 설명을 위해 이를 알고 있다고 가정하겠습니다.\n", + "\n", + "- 남성: $Y_1 = 5, Y_0 = 8 \\Rightarrow Y_1 - Y_0 = -3$\n", + "- 여성: $Y_1 = 2, Y_0 = 4 \\Rightarrow Y_1 - Y_0 = -2$\n", + "\n", + "\n", + "그러면 실제 ATE는 입원일수가 3일 줄어드는 남성이 6명, 2일 줄어드는 여성이 4명이므로,\n", + "\n", + "$$\n", + "ATE = \\frac{-3 \\times 6 + -2 \\times 4}{10} = -2.6\n", + "$$\n", + "\n", + "즉, 실제로 약을 먹으면 입원 일수는 -2.6일이 줄어야 합니다. 즉, 단순 평균 비교는 실제 효과보다 훨씬 약의 입원일수 감소 효과를 작게 보게 되는 것입니다." + ] + }, + { + "cell_type": "markdown", + "id": "c1534535", + "metadata": {}, + "source": [ + "단순히 평균 비교 (naive)를 하게 되면:\n", + "\n", + "치료 받은 집단에서는 $(5 \\times 5 + 2 \\times 2)/7 = 29/7$, 치료 안 받은 집단에서는 $(1 \\times 8 + 2 \\times 4)/3 = 16/3$의 입원일수가 나오게 되고 둘을 빼면 우리가 원하는 값을 구할 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "140a6f6e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naive: -1.1904761904761898\n" + ] + } + ], + "source": [ + "print(\"Naive:\", drug_example.query(\"drug==1\")[\"days\"].mean() - drug_example.query(\"drug==0\")[\"days\"].mean())" + ] + }, + { + "cell_type": "markdown", + "id": "b897b61c", + "metadata": {}, + "source": [ + "이 값은 약의 효과가 아니라 집단 구성의 차이(성별 분포 차이)가 섞여 왜곡된 결과라고 볼 수 있습니다. 저희는 이러한 문제를 'confounding (교란효과)' 이라고 부르기로 약속하였습니다.\n", + "\n", + "이를 해결하기 위한 방법 중 하나로 저희는 IPW를 복습하였습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "fdcabd63", + "metadata": {}, + "outputs": [], + "source": [ + "ps = drug_example.groupby(\"sex\")[\"drug\"].mean()\n", + "drug_example[\"ps\"] = drug_example[\"sex\"].map(ps)\n", + "\n", + "drug_example[\"w\"] = (\n", + " drug_example[\"drug\"]/drug_example[\"ps\"] +\n", + " (1-drug_example[\"drug\"])/(1-drug_example[\"ps\"])\n", + ")\n", + "\n", + "ate_ipw = (\n", + " (drug_example[\"drug\"] * drug_example[\"days\"] * drug_example[\"w\"]).sum()\n", + " / (drug_example[\"drug\"] * drug_example[\"w\"]).sum()\n", + " -\n", + " ((1-drug_example[\"drug\"]) * drug_example[\"days\"] * drug_example[\"w\"]).sum()\n", + " / ((1-drug_example[\"drug\"]) * drug_example[\"w\"]).sum()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "50e105e3", + "metadata": {}, + "source": [ + "각 개체에 대해 $w =\\frac{T}{P(T=1 \\mid X)}+\\frac{1-T}{P(T=0 \\mid X)}$의 가중치를 부여하면, 실제 ATE와 같은 값을 회복할 수 있습니다.\n", + "\n", + "이렇게 재구성된 데이터는 실제로 관측된 데이터는 아니지만, 성별과 치료가 독립인 것처럼 보이도록 만든 가상의 모집단(pseudo-population)으로 해석할 수 있다는 점을 기억해야합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "e937266a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IPW: -2.6000000000000005\n" + ] + } + ], + "source": [ + "print(\"IPW:\", ate_ipw)" + ] + }, + { + "cell_type": "markdown", + "id": "9cc44b60", + "metadata": {}, + "source": [ + "지금 예시에서는 $X$가 하나이기에 따른 치료 비율을 단순히 세어서 $P(T \\mid X)$를 직접 계산할 수 있었습니다.\n", + "\n", + "하지만, 실제로는 이러한 확률을 정확히 알 수 없는 경우가 대부분입니다. 특히 공변량이 여러 개 존재하거나, 연속형 변수들이 포함된 경우에는 단순한 비율 계산만으로는 성향점수를 구할 수 없습니다. 따라서 실제 분석에서는 로지스틱 회귀와 같은 모델을 이용하여 성향점수를 **추정**하게 됩니다.\n", + "\n", + "따라서 실제 분석에서는 성향점수를 $e(X)$로 정의하고, 이를 데이터로부터 $\\hat{e}(X)$의 형태로 추정하여 사용하게 됩니다. 이때 Weighting 방법에서 사용하는 가중치는 이렇게 다시 쓸 수 있습니다:\n", + "\n", + "$$\n", + "\\hat{w}_i =\n", + "\\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}.\n", + "$$\n", + "\n", + "즉, 처치를 받은 경우에는 $\\hat{e}(X_i)$의 역수를, 처치를 받지 않은 경우에는 $1 - \\hat{e}(X_i)$의 역수를 가중치로 사용하게 됩니다." + ] + }, + { + "cell_type": "markdown", + "id": "8f7fd50f", + "metadata": {}, + "source": [ + "## 성향점수의 문제" + ] + }, + { + "cell_type": "markdown", + "id": "5cd9db8f", + "metadata": {}, + "source": [ + "성향점수를 사용할 때는 아래와 같은 주의점을 신경써야 합니다.\n", + "\n", + "1. 성향점수의 목적은 결과 예측이 아니라 confounder의 균형을 맞추는 것. -> 즉, 예측력만을 보면 오히려 균형이 깨질 수 있습니다.\n", + "\n", + "2. 성향점수 분포가 충분히 겹치지 않으면 (Positivity가 약함) 추정이 불안정해집니다." + ] + }, + { + "cell_type": "markdown", + "id": "ad6fedaa", + "metadata": {}, + "source": [ + "#### 1. 성향점수의 목적은 균형에 있다." + ] + }, + { + "cell_type": "markdown", + "id": "263f9f41", + "metadata": {}, + "source": [ + "두 학교가 있다고 하겠습니다. (Hernán 발췌)\n", + "학교 A는 거의 모두 처치를 받고, 학교 B는 거의 처치를 받지 않습니다.\n", + "\n", + "성향점수는 원래 공변량 $X$로부터 처치 $T$의 확률을 모델링하는 함수, 즉\n", + "$$\n", + "e(X)=P(T=1 \\mid X)\n", + "$$\n", + "이기 때문에, school 변수를 포함하면 당연히 처치 받을 확률을 매우 잘 예측하게 됩니다.\n", + "\n", + "하지만 과연 ATE 추정을 위해서도 이러한 변수를 포함하는 것이 바람직할까요?" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "326f798a", + "metadata": {}, + "outputs": [], + "source": [ + "school_a = pd.DataFrame({\n", + " \"T\": np.random.binomial(1, 0.99, 400),\n", + " \"school\": 0\n", + "})\n", + "\n", + "school_b = pd.DataFrame({\n", + " \"T\": np.random.binomial(1, 0.01, 400),\n", + " \"school\": 1\n", + "})\n", + "\n", + "ex_data = pd.concat([school_a, school_b], ignore_index=True)\n", + "\n", + "ex_data[\"intercept\"] = 1\n", + "\n", + "# True ATE = 0.1\n", + "ex_data[\"y\"] = 1 + 0.1 * ex_data[\"T\"] + np.random.normal(0, 1, len(ex_data))" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "d7077faa", + "metadata": {}, + "outputs": [], + "source": [ + "def run_ps(df, X, T, y):\n", + " model = LogisticRegression(C=1e6, max_iter=1000)\n", + "\n", + " model.fit(df[X], df[T])\n", + " ps = model.predict_proba(df[X])[:, 1]\n", + " weight = (df[T] - ps) / (ps * (1 - ps))\n", + "\n", + " return np.mean(weight * df[y])\n", + "\n", + "def bootstrap_ate(data, features, B=500):\n", + " return np.array([\n", + " run_ps(data.sample(frac=1, replace=True), features, \"T\", \"y\")\n", + " for _ in range(B)\n", + " ])\n", + "\n", + "ate_w_f = bootstrap_ate(ex_data, [\"school\"], B=500)\n", + "ate_wo_f = bootstrap_ate(ex_data, [\"intercept\"], B=500)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "2970bb09", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAHWCAYAAAClsUvDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMV0lEQVR4nO3deVxVdR7/8feV5YIoIAIiyiag4l6ajtMClKVYM2m2+bPC0hbTyjEtrZnUptJ2W8ymUrHRsmW0GssxckQnxS3XygxJcV8QBUEFLpzfH/68P2+Asly4B3g9H4/ziHvOud/zOfdc8s33nPM9FsMwDAEAAAAu1sTVBQAAAAASwRQAAAAmQTAFAACAKRBMAQAAYAoEUwAAAJgCwRQAAACmQDAFAACAKRBMAQAAYAoEUwAAAJgCwRQAGrGUlBRZLBbt2bOn1rc1fPhwRUZG2l/v2bNHFotFr7zySq1vW5KmTJkii8VSJ9sCUD0EU6AROB8+LpyCg4OVmJiopUuX1vr233nnHaWkpFTrvd98842mTJni1HpqwzfffCOLxaLQ0FCVlpba5yckJJT57Mubzu9jZGRkhesMGDDgojWkpaU5rG+1WtWqVSslJCTohRde0LFjx5yyr6dPn9aUKVOUlpbmlPacycy1Abg0i2EYhquLAFC7UlJSdO+99+rZZ59VVFSUDMPQkSNHlJKSop9++kn//ve/ddNNN9Xa9rt06aLAwMBqhYUxY8Zo5syZMvv/qoYNG6Y1a9Zoz549Sk1NVb9+/SRJqampOnLkiH29DRs26M0339RTTz2luLg4+/xu3bqpW7duioyMVIsWLfT444+X2UZoaKiuvfbaCmtIS0tTYmKiHn30UV1xxRUqKSnRsWPHtGbNGv373/+Wn5+fPv30U4c2SkpKVFxcLKvVWunexOzsbAUFBWny5MlV+qOhuLhYpaWlslqtks71mEZFRenll1/W+PHjK91OdWuz2Wyy2Wzy8vJyyrYAOJ+7qwsAUHeSkpLUq1cv++sRI0aoVatW+vjjj2s1mNYVm82m0tJSeXp61ul2CwoK9OWXX2ratGmaO3euFixYYA+m119/vcO6Xl5eevPNN3X99dcrISGh3PbatGmju+66q9r1XH311br11lsd5m3dulU33HCDhgwZop9//lmtW7eWJLm5ucnNza3a26qMgoIC+fj4yMPDo1a3cynu7u5yd+efPcDMOJUPNGL+/v7y9vYu8491QUGBHn/8cYWFhclqtapDhw565ZVXyvRa2mw2/f3vf1d0dLSsVqsiIyP11FNPqbCw0L5OZGSkfvrpJ61cudJ+ivl8ICsuLtbUqVMVGxsrLy8vtWzZUldddZVSU1MlnbsmcebMmZLkcIpacrw+ccaMGfYafv75ZxUVFemZZ55Rz5495efnJx8fH1199dVasWKFQ/0XtvH6668rIiJC3t7eio+P148//ljpz3Hx4sU6c+aMbrvtNt15551atGiRzp49W+n314Xu3btrxowZOnnypN5++237/PKuMd24caP69++vwMBAeXt7KyoqSvfdd5+kc59ZUFCQJGnq1KllLkUYPny4mjVrpszMTA0cOFDNmzfXsGHD7MsuvMb0Qpf6/BMSEsoN8he2eanayrvGtDLfYenc9/imm27S999/r969e8vLy0vt2rXThx9+WP4HDqBa+NMRaERyc3OVnZ0twzB09OhRvfXWW8rPz3fonTMMQ3/+85+1YsUKjRgxQj169NCyZcs0YcIEHThwQK+//rp93ZEjR2revHm69dZb9fjjj2vdunWaNm2aduzYocWLF0uSZsyYoUceeUTNmjXT008/LUlq1aqVpHNBYdq0aRo5cqR69+6tvLw8bdy4UZs2bdL111+vBx98UAcPHlRqaqr++c9/lrtPc+fO1dmzZ/XAAw/IarUqICBAeXl5+uCDDzR06FDdf//9OnXqlGbPnq3+/ftr/fr16tGjh0MbH374oU6dOqXRo0fr7NmzeuONN3Tttddq+/bt9lovZsGCBUpMTFRISIjuvPNOTZw4Uf/+97912223Ven4nFdcXKzs7Owy8318fOTt7V2tNiXp1ltv1YgRI/Ttt9/q+eefL3edo0eP6oYbblBQUJAmTpwof39/7dmzR4sWLZIkBQUFadasWRo1apQGDx6sW265RdK5SxHOs9ls6t+/v6666iq98soratq06UXrqunnf15lavu9ynyHz9u1a5f9M0xOTtacOXM0fPhw9ezZU507d650nQAuwgDQ4M2dO9eQVGayWq1GSkqKw7pffPGFIcl47rnnHObfeuuthsViMXbt2mUYhmFs2bLFkGSMHDnSYb3x48cbkoz//ve/9nmdO3c24uPjy9TVvXt348Ybb7xo7aNHjzbK+1/V7t27DUmGr6+vcfToUYdlNpvNKCwsdJh34sQJo1WrVsZ9991Xpg1vb29j//799vnr1q0zJBl/+ctfLlqbYRjGkSNHDHd3d+P999+3z/vjH/9o3HzzzeWu/9lnnxmSjBUrVpS7PCIiotxjJcmYNm3aRWtZsWKFIcn47LPPKlyne/fuRosWLeyvz383du/ebRiGYSxevNiQZGzYsKHCNo4dO2ZIMiZPnlxmWXJysiHJmDhxYrnLIiIi7K+r8vnHx8eX+x36fZsXq23y5MkO36WqfIfPH5dVq1bZ5x09etSwWq3G448/XmZbAKqHU/lAIzJz5kylpqYqNTVV8+fPV2JiokaOHGnvDZPO3V3u5uamRx991OG9jz/+uAzDsN/F/80330iSxo0bV2Y9Sfr6668vWY+/v79++uknZWRkVHufhgwZYj99e56bm5v9OtPS0lLl5OTIZrOpV69e2rRpU5k2Bg0apDZt2thf9+7dW3369LHv48UsXLhQTZo00ZAhQ+zzhg4dqqVLl+rEiRPV2qc+ffrYj9OF09ChQ6vV3oWaNWumU6dOVbjc399fkrRkyRIVFxdXezujRo2q9Lo1+fxroqrf4U6dOunqq6+2vw4KClKHDh3022+/1WqdQGNCMAUakd69e6tfv37q16+fhg0bpq+//lqdOnXSmDFjVFRUJEnKyspSaGiomjdv7vDe83eQZ2Vl2f/bpEkTxcTEOKwXEhIif39/+3oX8+yzz+rkyZNq3769unbtqgkTJmjbtm1V2qeoqKhy58+bN0/dunWzX7saFBSkr7/+Wrm5uWXWjY2NLTOvffv2lRrbc/78+erdu7eOHz+uXbt2adeuXbrssstUVFSkzz77rEr7cl5gYKD9OF04RUREVKu9C+Xn55c5theKj4/XkCFDNHXqVAUGBurmm2/W3Llzy1xzeTHu7u5q27ZtpdevyedfE1X9DoeHh5dpo0WLFtX+AwRAWQRToBFr0qSJEhMTdejQoWr3WtZkwPJrrrlGmZmZmjNnjrp06aIPPvhAl19+uT744INKt1HeNZfz58/X8OHDFR0drdmzZ+s///mPUlNTde211zqMMVpTGRkZ2rBhg77//nvFxsbap6uuukrSuWtPzaS4uFi//vprmSB2IYvFos8//1zp6ekaM2aMDhw4oPvuu089e/ZUfn5+pbZjtVrVpIlz/3mp6HtWUlJSa23/XkWjFxgmH8oMqE+4+Qlo5Gw2myTZQ0dERIS+++47nTp1yqFn7ZdffrEvP//f0tJSZWRkOIzHeeTIEZ08edKhd+9i//AHBATo3nvv1b333qv8/Hxdc801mjJlikaOHHnJ91bk888/V7t27bRo0SKH90+ePLnc9csL5b/++muFd5Cft2DBAnl4eOif//xnmdDy/fff680339TevXvL7Wlzhc8//1xnzpxR//79L7nuH/7wB/3hD3/Q888/r48++kjDhg3TwoULNXLkSKc/Pakyn3+LFi3KPWX++17NqtRWle8wgLpBjynQiBUXF+vbb7+Vp6en/R/mgQMHqqSkxGFIIenccD4Wi0VJSUn29aRzd91f6LXXXpMk3XjjjfZ5Pj4+OnnyZJntHz9+3OF1s2bNFBMT43Da2MfHR5LKfX9FzofEC3uy1q1bp/T09HLX/+KLL3TgwAH76/Xr12vdunX2fa3IggULdPXVV+uOO+7Qrbfe6jBNmDBBkvTxxx9Xuu7atHXrVo0dO1YtWrTQ6NGjK1zvxIkTZXoAz49icP64nL/LvirH5GIq8/lHR0frl19+cXh61datW7V69WqHtqpSW1W+wwDqBj2mQCOydOlSe8/n0aNH9dFHHykjI0MTJ06Ur6+vJOlPf/qTEhMT9fTTT2vPnj3q3r27vv32W3355ZcaO3asoqOjJZ0bFzM5OVnvvfeeTp48qfj4eK1fv17z5s3ToEGDlJiYaN9uz549NWvWLD333HOKiYlRcHCwrr32WnXq1EkJCQnq2bOnAgICtHHjRn3++ecaM2aMw3sl6dFHH1X//v3l5uamO++886L7edNNN2nRokUaPHiwbrzxRu3evVvvvvuuOnXqVO7p6JiYGF111VUaNWqUCgsLNWPGDLVs2VJPPPFEhdtYt26ddu3a5VDrhdq0aaPLL79cCxYs0JNPPnnRen/vwIEDmj9/fpn5zZo106BBgy75/v/97386e/asSkpKdPz4ca1evVpfffWV/Pz8tHjxYoWEhFT43nnz5umdd97R4MGDFR0drVOnTun999+Xr6+vPch5e3urU6dO+uSTT9S+fXsFBASoS5cu6tKlS5X287zKfP733XefXnvtNfXv318jRozQ0aNH9e6776pz587Ky8uzr1eV2qryHQZQR1w7KACAulDecFFeXl5Gjx49jFmzZhmlpaUO6586dcr4y1/+YoSGhhoeHh5GbGys8fLLL5dZr7i42Jg6daoRFRVleHh4GGFhYcakSZOMs2fPOqx3+PBh48YbbzSaN29uSLIP+/Pcc88ZvXv3Nvz9/Q1vb2+jY8eOxvPPP28UFRXZ32uz2YxHHnnECAoKMiwWi324n/NDDb388stl9re0tNR44YUXjIiICMNqtRqXXXaZsWTJkgqHK3r55ZeNV1991QgLCzOsVqtx9dVXG1u3br3oZ/rII48YkozMzMwK15kyZYohyaGtmgwXdWHt5Tk/XNT5ycPDwwgKCjKuueYa4/nnny8zrJZhlB0uatOmTcbQoUON8PBww2q1GsHBwcZNN91kbNy40eF9a9asMXr27Gl4eno6DM+UnJxs+Pj4lFtfTT//+fPnG+3atTM8PT2NHj16GMuWLSvT5sVq+/1wUYZR+e9wREREuUObVTSMFYDqsRgGV20DaJxq41ntAIDq4xpTAAAAmALBFAAAAKZAMAUAAIApcI0pAAAATIEeUwAAAJgCwRQAAACmUK8H2C8tLdXBgwfVvHlzpz8iDwAAADVnGIZOnTql0NBQNWly8T7Reh1MDx48qLCwMFeXAQAAgEvYt2+f2rZte9F16nUwbd68uaRzO3r+cYoAAAAwj7y8PIWFhdlz28XU62B6/vS9r68vwRQAAMDEKnPZpctvfjpw4IDuuusutWzZUt7e3uratas2btzo6rIAAABQx1zaY3rixAldeeWVSkxM1NKlSxUUFKSMjAy1aNHClWUBAADABVwaTF988UWFhYVp7ty59nlRUVEurAgAAACu4tJg+tVXX6l///667bbbtHLlSrVp00YPP/yw7r///nLXLywsVGFhof11Xl7eJbdhGIZsNptKSkqcVjdgFh4eHnJzc3N1GQAAOIVLg+lvv/2mWbNmady4cXrqqae0YcMGPfroo/L09FRycnKZ9adNm6apU6dWuv2ioiIdOnRIp0+fdmbZgGlYLBa1bdtWzZo1c3UpAADUmMUwDMNVG/f09FSvXr20Zs0a+7xHH31UGzZsUHp6epn1y+sxDQsLU25ubpm78ktLS5WRkSE3NzcFBQXJ09OTQfjRoBiGoWPHjun06dOKjY2l5xQAYEp5eXny8/MrN6/9nkt7TFu3bq1OnTo5zIuLi9O//vWvcte3Wq2yWq2VaruoqEilpaUKCwtT06ZNa1wrYEZBQUHas2ePiouLCaYAgHrPpcNFXXnlldq5c6fDvF9//VURERFO28alHn0F1GecBQAANCQuTW1/+ctftHbtWr3wwgvatWuXPvroI7333nsaPXq0K8sCAACAC7g0mF5xxRVavHixPv74Y3Xp0kV///vfNWPGDA0bNsyVZQEAAMAFXP5I0ptuukk33XRTnW5z7969ys7OrpNtBQYGKjw8vE621ZhNmTJFX3zxhbZs2VKr20lISFCPHj00Y8aMWt0OAACNkcuDaV3bu3evOsbF6UwdDSHl3bSpftmxo0rhdPjw4Zo3b56kc+NUhoeH65577tFTTz0ld/dzh+z999/X22+/rczMTLm7uysqKkq33367Jk2aVG6brVu31mOPPaaJEyfa502cOFEvvviiVqxYoYSEBPv8hIQEhYWF6Z///KdSUlI0duxYnTx5UgkJCVq5cmWFdcfHxystLU2RkZEaO3asxo4d67C8rsIjAAConxpdMM3OztaZ06c17MmX1So8ula3dWRvpha8OEHZ2dlV7jUdMGCA5s6dq8LCQn3zzTcaPXq0PDw8NGnSJM2ZM0djx47Vm2++qfj4eBUWFmrbtm368ccfK2wvISFBaWlpDsF0xYoVCgsLU1pamj2Ynj17VmvXri13HNlFixapqKhIkrRv3z717t1b3333nTp37izp3PBfAAAA1dXogul5rcKj1Ta2s6vLqJDValVISIgkadSoUVq8eLG++uorTZo0SV999ZVuv/12jRgxwr7++XBYkcTERD3++OOy2Wxyd3fXqVOntHnzZr3++uv67LPP7Oulp6ersLBQiYmJZdoICAiw/3z27FlJUsuWLe111tSJEyc0ZswYffvtt8rPz1fbtm311FNP6d5775Uk7d+/XxMmTNCyZctUWFiouLg4zZw5U3369LG38c9//lN/+9vfdOLECSUlJen9999X8+bNJZ0bB3fChAlauHCh8vLy1KtXL73++uu64oor7O9fuXKlJkyYoK1btyogIEDJycl67rnn7D3VAACg9jCWUj3h7e1t760MCQnR2rVrlZWVVen3JyYmKj8/Xxs2bJAk/e9//1P79u01ZMgQrVu3zh40V6xYocjISEVGRjp9Hy7lb3/7m37++WctXbpUO3bs0KxZsxQYGChJys/PV3x8vA4cOKCvvvpKW7du1RNPPKHS0lL7+zMzM/XF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WrNmjYYMGaKdO3fan8vr7e1dpfoAAEDdapQ9pvWB1WpVSEiIIiIiNGrUKPXr109fffWVJOmrr77S7bffrhEjRigmJkadO3fW0KFD9fzzz1fYXmJiolavXm3vdT116pQ2b96sJ5980qHHND09XYWFhUpMTCzTRkBAgEJCQhQSEqKgoCBJUsuWLe3zAgKq1kP89NNP6+DBg/ruu++UlJSk8PBwXXPNNVq2bJk8PDw0evToKrUXFBRUppbg4GD7PD8/v3Lf9/nnn6tr167y9vZWy5Yt1a9fPxUUFNiXz5kzR507d5bValXr1q01ZswYh/dnZ2dr8ODBatq0qWJjY+3H6byVK1eqd+/e9vdPnDjRofe7sLBQjz76qIKDg+Xl5aWrrrpKGzZsqNK+AwDQEBBM6wlvb297b2VISIjWrl2rrKysSr8/MTFR+fn59sDzv//9T+3bt9eQIUO0bt06nT17VtK5XtTIyEhFRkY6fR8uVFpaqoULF2rYsGEKCQlxWObt7a2HH35Yy5YtU05OTq3WcejQIQ0dOlT33XefduzYobS0NN1yyy0yDEOSNGvWLI0ePVoPPPCAtm/frq+++koxMTEObUydOlW33367tm3bpoEDB2rYsGH2ug8cOKCBAwfqiiuu0NatWzVr1izNnj1bzz33nP39TzzxhP71r39p3rx52rRpk2JiYtS/f/9a33cAAMyGYGpyhmHou+++07Jly3TttddKkiZPnix/f39FRkaqQ4cOGj58uD799FOVlpZW2E5sbKzatGlj7x1NS0tTfHy8QkJCFB4ervT0dPv88npLq+rJJ59Us2bNHKYXXnjBvvzYsWM6efJkhTeGxcXFyTAM7dq1q8a1XMyhQ4dks9l0yy23KDIyUl27dtXDDz+sZs2aSZKee+45Pf7443rsscfUvn17XXHFFWWudR0+fLiGDh2qmJgYvfDCC8rPz9f69eslSe+8847CwsL09ttvq2PHjho0aJCmTp2qV199VaWlpSooKNCsWbP08ssvKykpSZ06ddL7778vb29vzZ49u1b3HQAAsyGYmtSSJUvUrFkzeXl5KSkpSXfccYemTJki6dyNTOnp6dq+fbsee+wx2Ww2JScna8CAARcNp+evM5XkcF1pfHy80tLSdObMGa1bt84pwXTChAnasmWLw/TQQw+VWe98z6SrdO/eXdddd526du2q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zs5WSUlJub+Xv/zyS7nvOXz4ML/H9VR1jneHDh00Z84cdevWTbm5uXrllVf0xz/+UT/99JPatm1bF2XXGXpM64GJEyeWuej591NFX+bKuPPOO/XnP/9ZXbt21aBBg7RkyRJt2LBBaWlpztsJVFptH2+YS20f7wceeED9+/dX165dNWzYMH344YdavHixMjMznbgXAGpT3759dc8996hHjx6Kj4/XokWLFBQUpH/84x+uLs3p6DGtBx5//HENHz78ouu0a9fOadtr166dAgMDtWvXLl133XVOaxeVU5vHOyQkRJJ05MgRtW7d2j7/yJEj6tGjR7XaRM1U9niHhISUuTHCZrMpJyfHflwro0+fPpKkXbt2KTo6usr1wvkCAwPl5uamI0eOOMw/cuRIhcc2JCSkSuvDPKpzvH/Pw8NDl112mXbt2lUbJboUwbQeCAoKUlBQUJ1tb//+/Tp+/LhDcEHdqc3jHRUVpZCQEC1fvtweRPPy8rRu3boqj+QA56js8e7bt69OnjypH374QT179pQk/fe//1Vpaak9bFbGli1bJInfbxPx9PRUz549tXz5cg0aNEiSVFpaquXLl2vMmDHlvqdv375avny5xo4da5+Xmpqqvn371kHFqInqHO/fKykp0fbt2zVw4MBarNRFXH33FZwrKyvL2Lx5szF16lSjWbNmxubNm43Nmzcbp06dsq/ToUMHY9GiRYZhGMapU6eM8ePHG+np6cbu3buN7777zrj88suN2NhY4+zZs67aDVRSVY+3YRjG9OnTDX9/f+PLL780tm3bZtx8881GVFSUcebMGVfsAqpgwIABxmWXXWasW7fO+P77743Y2Fhj6NCh9uX79+83OnToYKxbt84wDMPYtWuX8eyzzxobN240du/ebXz55ZdGu3btjGuuucZVu4AKLFy40LBarUZKSorx888/Gw888IDh7+9vHD582DAMw7j77ruNiRMn2tdfvXq14e7ubrzyyivGjh07jMmTJxseHh7G9u3bXbULqIKqHu+pU6cay5YtMzIzM40ffvjBuPPOOw0vLy/jp59+ctUu1BqCaQOTnJxsSCozrVixwr6OJGPu3LmGYRjG6dOnjRtuuMEICgoyPDw8jIiICOP++++3/3LA3Kp6vA3j3JBRf/vb34xWrVoZVqvVuO6664ydO3fWffGosuPHjxtDhw41mjVrZvj6+hr33nuvwx8hu3fvdjj+e/fuNa655hojICDAsFqtRkxMjDFhwgQjNzfXRXuAi3nrrbeM8PBww9PT0+jdu7exdu1a+7L4+HgjOTnZYf1PP/3UaN++veHp6Wl07tzZ+Prrr+u4YtREVY732LFj7eu2atXKGDhwoLFp0yYXVF37LIZhGC7pqgUAAAAuwF35AAAAMAWCKQAAAEyBYAoAAABTIJgCAADAFAimAAAAMAWCKQAAAEyBYAoAAABTIJgCAADAFAimAAAAMAWCKQDUkfT0dLm5uenGG2+UJA0fPlwWi6XCKTIyUpKUkJBQ7vKHHnrIhXsDAM7HI0kBoI6MHDlSzZo10+zZs7Vz5075+PjozJkz9uWtW7fW3LlzNWDAAEmSm5ubgoKClJCQoPbt2+vZZ591aK9p06by9fWt030AgNrk7uoCAKAxyM/P1yeffKKNGzfq8OHDSklJ0VNPPSU/Pz+H9fz9/RUSElLm/U2bNi13PgA0JJzKB4A68Omnn6pjx47q0KGD7rrrLs2ZM0ecsAIARwRTAKgDs2fP1l133SVJGjBggHJzc7Vy5cpKv/+dd95Rs2bNHKYFCxbUVrkA4BKcygeAWrZz506tX79eixcvliS5u7vrjjvu0OzZs5WQkFCpNoYNG6ann37aYV6rVq2cXSoAuBTBFABq2ezZs2Wz2RQaGmqfZxiGrFar3n777TLXmZbHz89PMTExtVkmALgcp/IBoBbZbDZ9+OGHevXVV7Vlyxb7tHXrVoWGhurjjz92dYkAYBr0mAJALVqyZIlOnDihESNGlOkZHTJkiGbPnl2p8UhPnz6tw4cPO8yzWq1q0aKFU+sFAFeixxQAatHs2bPVr1+/ck/XDxkyRBs3btS2bdsu2c7777+v1q1bO0xDhw6tjZIBwGUYYB8AAACmQI8pAAAATIFgCgAAAFMgmAIAAMAUCKYAAAAwBYIpAAAATIFgCgAAAFMgmAIAAMAUCKYAAAAwBYIpAAAATIFgCgAAAFMgmAIAAMAU/i9iOKxpB2XW8gAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "\n", + "sns.histplot(ate_w_f, bins=30, stat=\"density\", label=\"PS WITH school\", alpha=0.5)\n", + "sns.histplot(ate_wo_f, bins=30, stat=\"density\", label=\"PS WITHOUT school\", alpha=0.5)\n", + "\n", + "plt.legend()\n", + "plt.title(\"Bootstrap ATE Distribution\")\n", + "plt.xlabel(\"ATE\")\n", + "plt.ylabel(\"Density\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "40dffcc9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WITH school: mean = -0.4524325457820468 , std = 0.4831547835682821\n", + "WITHOUT school: mean = 0.09055415800389073 , std = 0.07245027783775368\n" + ] + } + ], + "source": [ + "print(\"WITH school: mean =\", ate_w_f.mean(), \", std =\", ate_w_f.std())\n", + "print(\"WITHOUT school: mean =\", ate_wo_f.mean(), \", std =\", ate_wo_f.std())" + ] + }, + { + "cell_type": "markdown", + "id": "0d00a187", + "metadata": {}, + "source": [ + "보시다시피, 특성 학교를 추가하는 성향 점수 추정는 엄청난 분산을 갖는 반면, 그렇지 않은 것은 훨씬 더 잘 작동합니다.\n", + "\n", + "**즉, 실제로 Treatment를 예측하는 방식이 아니라 Confounder를 제어하는 ​​방식으로 예측을 구성해야 하는 것이 중요합니다.**" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "1f40c34a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "cluster_good\n", + "\n", + "Good: Confounder\n", + "\n", + "\n", + "cluster_bad\n", + "\n", + "Bad: Treatment-only predictor\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "Confounder X\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "Treatment T\n", + "\n", + "\n", + "\n", + "X->T\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Outcome Y\n", + "\n", + "\n", + "\n", + "X->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Z\n", + "\n", + "Predictor Z\n", + "\n", + "\n", + "\n", + "T2\n", + "\n", + "Treatment T\n", + "\n", + "\n", + "\n", + "Z->T2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y2\n", + "\n", + "Outcome Y\n", + "\n", + "\n", + "\n", + "T2->Y2\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dot = Digraph(format=\"png\")\n", + "dot.attr(rankdir=\"LR\", splines=\"ortho\")\n", + "dot.attr(\"node\", shape=\"box\", style=\"rounded\", fontsize=\"12\")\n", + "\n", + "# 왼쪽: confounder\n", + "with dot.subgraph(name=\"cluster_good\") as c:\n", + " c.attr(label=\"Good: Confounder\", color=\"black\")\n", + " c.node(\"X\", \"Confounder X\")\n", + " c.node(\"T\", \"Treatment T\")\n", + " c.node(\"Y\", \"Outcome Y\")\n", + " c.edge(\"X\", \"T\")\n", + " c.edge(\"X\", \"Y\")\n", + " c.edge(\"T\", \"Y\")\n", + "\n", + "# 오른쪽: treatment만 예측하는 변수\n", + "with dot.subgraph(name=\"cluster_bad\") as c:\n", + " c.attr(label=\"Bad: Treatment-only predictor\", color=\"black\")\n", + " c.node(\"Z\", \"Predictor Z\")\n", + " c.node(\"T2\", \"Treatment T\")\n", + " c.node(\"Y2\", \"Outcome Y\")\n", + " c.edge(\"Z\", \"T2\")\n", + " c.edge(\"T2\", \"Y2\")\n", + "\n", + "display(dot)" + ] + }, + { + "cell_type": "markdown", + "id": "cf2a7e4d", + "metadata": {}, + "source": [ + "#### 2. Positivity" + ] + }, + { + "cell_type": "markdown", + "id": "56268916", + "metadata": {}, + "source": [ + "한 가지 문제는, 처치를 받은 사람과 받지 않은 사람의 성향점수 분포가 크게 달라 서로 잘 겹치지 않을 수 있다는 점입니다." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "79e5d8f7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jgn1dBnnSE9Pd/y8ZMkSjRs3TgcOHHC0BQX9HtAMw1BJSYl8fPgqAADMiQnKJhQZGel4hYaGymKxON7v379fwcHB+vTTT9WmTRv5+/tr06ZNstvtSk5OVmxsrAIDA3Xttdfqgw8+cPRZUlKihx56yLG8efPm+sc//uFYPmHCBC1YsED//ve/ZbFYZLFYtHHjRknSsWPH1LNnT4WFhalWrVrq1q2bjhw5Uqrv4cOHKywsTLVr19Zzzz0nnk8LAHAWws5lauTIkZoyZYpSUlJ0zTXXKDk5We+8845mz56t77//XsOGDVPfvn31xRdfSJLsdrsaNGigZcuWad++fRo3bpyef/55LV26VJL0zDPPqGfPnuratavS09OVnp6uG264QUVFRUpMTFRwcLC++uorbd68WUFBQeratasKCwslSdOnT9f8+fM1d+5cbdq0SSdOnNDy5cs9tm8AAObCuYvLVFJSkm677TZJUkFBgV588UWtXbtWHTp0kCQ1btxYmzZt0ptvvqnOnTvL19dXEydOdGwfGxurrVu3aunSperZs6eCgoIUGBiogoICRUZGOtZ77733ZLfb9a9//csxl2jevHkKCwvTxo0bdfvtt2vmzJkaNWqUevToIUmaPXu21qxZ465dAQAwOcLOZapt27aOnw8dOqTc3FxH+DmjsLBQ1113neP9rFmzNHfuXKWlpSkvL0+FhYVq1arVecf59ttvdejQIQUHB5dqz8/P148//qjs7Gylp6erffv2jmU+Pj5q27Ytp7IAAE5B2LlMXXHFFY6fc3JyJEmffPKJ6tevX2o9f39/SdLixYv1zDPPaPr06erQoYOCg4P10ksvadu2becdJycnR23atNHChQvPWVanTp1L/RgAAFwQYQe66qqr5O/vr7S0NHXu3LnMdTZv3qwbbrhBgwcPdrT9+OOPpdbx8/NTSUlJqbbWrVtryZIlqlu3rkJCQsrsOyoqStu2bVOnTp0kScXFxdq5c6dat259KR8LAABJhJ1LkpKeY4pxgoOD9cwzz2jYsGGy2+268cYblZ2drc2bNyskJET9+/dX06ZN9c4772jNmjWKjY3Vu+++q+3btys2NtbRT0xMjNasWaMDBw6odu3aCg0NVZ8+ffTSSy+pW7duSkpKUoMGDXT06FF99NFHeu6559SgQQM9+eSTmjJlipo2baq4uDjNmDFD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t6t27dql2rOystS6dWsdPnzYKcWh+mseWUOtY0I9XQYA4DJWqQnKR44cUUlJyTntBQUF+vnnny+5KAAAAGep0JGdlStXOn5es2aNQkN//xd7SUmJ1q1bp5iYGKcVBwAAcKkqFHa6d+8uSbJYLOrfv3+pZb6+voqJidH06dOdVhwAAMClqlDYsdvtkqTY2Fht375d4eHhLikKAADAWSo1QTk1NdXZdQAAALhEpS89X7dundatW6fjx487jvicMXfu3EsuDAAAwBkqFXYmTpyopKQktW3bVlFRUbJYLM6uCwAAwCkqFXZmz56t+fPnq1+/fs6uBwAAwKkqdZ+dwsJC3XDDDc6uBQAAwOkqFXYefvhhLVq0yNm1lOnnn39W3759Vbt2bQUGBqply5basWOHY7lhGBo3bpyioqIUGBiohIQE/fDDD26pDQAAVH2VOo2Vn5+vOXPmaO3atbrmmmvk6+tbavmMGTOcUtxvv/2mjh076pZbbtGnn36qOnXq6IcfflDNmjUd60ybNk2vvvqqFixYoNjYWI0dO1aJiYnat2+fAgICnFIHAACovioVdr777ju1atVKkrR3795Sy5w5WXnq1Klq2LCh5s2b52iLjY11/GwYhmbOnKkxY8aoW7dukqR33nlHERERWrFihXr37u20WgAAQPVUqbCzYcMGZ9dRppUrVyoxMVF//etf9cUXX6h+/foaPHiwHnnkEUmn7/eTkZGhhIQExzahoaFq3769tm7dWm7YKSgoUEFBgeO9zWZz7QcBAAAeU6k5O+5y+PBhvfHGG2ratKnWrFmjxx57TE888YQWLFggScrIyJAkRURElNouIiLCsawsycnJCg0NdbwaNmzoug8BAAA8qlJHdm655Zbznq5av359pQs6m91uV9u2bfXiiy9Kkq677jrt3btXs2fPPufZXBUxatQoDR8+3PHeZrMReAAAMKlKhZ0z83XOKCoq0u7du7V3795LCiF/FBUVpauuuqpUW3x8vD788ENJUmRkpCQpMzNTUVFRjnUyMzPPqfFs/v7+8vf3d1qdAACg6qpU2HnllVfKbJ8wYYJycnIuqaCzdezYUQcOHCjVdvDgQTVq1EjS6cnKkZGRWrdunSPc2Gw2bdu2TY899pjT6gAAANWXU+fs9O3b16nPxRo2bJi+/vprvfjiizp06JAWLVqkOXPmaMiQIZJO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.histplot(np.random.beta(4,1,500), kde=False, label=\"Non Treated\")\n", + "sns.histplot(np.random.beta(1,3,500), kde=False, label=\"Treated\")\n", + "plt.title(\"Positivity Check\")\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "id": "ccdb64aa", + "metadata": {}, + "source": [ + "이런 성향점수를 보인다면, 값이 충분히 겹치지 않아 positivity가 강하지 않게 됩니다.\n", + "\n", + "예를 들어 성향점수 0.9인 사람은 대부분 처치를 받는 유형인데, 처치를 받지 않은 집단에는 이런 사람이 거의 없다면 이와 비교할 “비슷한 개인”이 존재하지 않습니다. 이는 키가 2m인 사람이 약을 복용했을 때 입원 일수가 얼마나 줄어드는지 알고 싶은데, 비교할 2m짜리 control이 없는 상황과 같아서, 결국 처치가 결과에 미치는 효과를 직접 비교할 수 없게 됩니다.\n", + "\n", + "즉, 일부 개인은 적절한 비교 대상이 없어 처치가 입원 일수에 미치는 효과를 직접 비교할 수 없게 됩니다." + ] + }, + { + "cell_type": "markdown", + "id": "328de311", + "metadata": {}, + "source": [ + "또한 성향점수가 0이나 1에 가까운 관측치는 IPW에서 매우 큰 가중치를 가지게 되어, 추정량의 분산이 크게 증가합니다. IPW의 가중치는 \n", + "\n", + "$$\n", + "w_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n", + "$$\n", + "\n", + "로 정의되는데, 이때 $\\hat{e}(X_i) \\approx 0$ 또는 $\\hat{e}(X_i) \\approx 1$이면 분모가 매우 작아져 $w_i$가 급격히 커지게 됩니다. 그 결과 일부 관측치가 전체 추정을 지배하게 되어 추정이 매우 불안정해질 수 있습니다. (실무적으로는 가중치가 20을 넘는 경우 문제가 있는 신호로 간주합니다.)" + ] + }, + { + "cell_type": "markdown", + "id": "66f79569", + "metadata": {}, + "source": [ + "## IPW in Practice" + ] + }, + { + "cell_type": "markdown", + "id": "91e0c014", + "metadata": {}, + "source": [ + "앞선 내용을 요약하면, 성향점수는 공변량의 균형을 맞추는 데 목적이 있으며, 이를 위해서는 두 집단 간에 positivity이 충분히 확보되어야 하고, 동시에 과도하게 큰 가중치가 발생하지 않도록 주의해야 합니다.\n", + "\n", + "실제로 IPW를 적용할 때는, 앞서 언급한 두 가지 조건(balancing과 weight 안정성)을 고려하여 다음과 같은 절차로 진행합니다." + ] + }, + { + "cell_type": "markdown", + "id": "22d31936", + "metadata": {}, + "source": [ + "- Step 0: Find Potential Confounders\n", + " - 도메인 지식을 기반으로 적절한 공변량을 선정합니다. \n", + "- Step 1: Propensity Score Estimation \n", + " - logistic / ML 등을 활용하여 성향점수 $\\hat{e}(X)$를 추정합니다.\n", + "\n", + "- Step 2: Positivity 확인 \n", + " - 성향점수 분포를 시각화하여 두 집단이 충분히 겹치는지 확인합니다. \n", + " - ❗ 겹치는 부분이 부족한 경우 이후 분석은 신뢰하기 어렵습니다.\n", + "\n", + "- Step 3: Weight 계산 \n", + " - $w_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}$ 를 이용해 가중치를 계산합니다.\n", + "\n", + "- Step 4: Covariate Balance 확인 \n", + " - weighting 이후 공변량 분포가 실제로 균형을 이루는지 확인합니다. \n", + " - ❗ IPW의 목적인 '균형' 달성을 이뤘는지 확인합니다.\n", + "\n", + "- Step 5: Weight 안정성 점검 \n", + " - weight 분포, extreme value 등을 확인하여 일부 관측치가 과도한 영향을 주지 않는지 평가합니다.\n", + " - ❗ 과도한 weight는 IPW의 안정성을 해칩니다.\n", + "\n", + "- Step 6: Estimation \n", + " - 최종적으로 가중치를 반영하여 ATE를 추정합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "173cd7a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "시작\n", + "\n", + "\n", + "\n", + "A1\n", + "\n", + "적절한 공변량 선정\n", + "\n", + "\n", + "\n", + "A->A1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "PS 추정\n", + "\n", + "\n", + "\n", + "A1->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "Overlap 충분?\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "가중치 계산\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E\n", + "\n", + "1. Balance 만족?\n", + "\n", + "\n", + "\n", + "D->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "F\n", + "\n", + "PS 모델 수정\n", + "\n", + "\n", + "\n", + "E->F\n", + "\n", + "\n", + "아니오\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "2. Weight 안정?\n", + "\n", + "\n", + "\n", + "E->G\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "F->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "가중치 조정\n", + "\n", + "\n", + "\n", + "G->H\n", + "\n", + "\n", + "아니오\n", + "\n", + "\n", + "\n", + "I\n", + "\n", + "효과 추정\n", + "\n", + "\n", + "\n", + "G->I\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "J\n", + "\n", + "종료\n", + "\n", + "\n", + "\n", + "I->J\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from graphviz import Digraph\n", + "\n", + "dot = Digraph(format=\"png\")\n", + "dot.attr(rankdir=\"TB\")\n", + "dot.attr(\"node\", shape=\"box\", style=\"rounded\", fontsize=\"11\")\n", + "\n", + "dot.node(\"A\", \"시작\", shape=\"oval\")\n", + "dot.node(\"A1\", \"적절한 공변량 선정\")\n", + "dot.node(\"B\", \"PS 추정\")\n", + "dot.node(\"C\", \"Overlap 충분?\", shape=\"diamond\")\n", + "dot.node(\"D\", \"가중치 계산\")\n", + "dot.node(\"E\", \"1. Balance 만족?\", shape=\"diamond\")\n", + "dot.node(\"F\", \"PS 모델 수정\")\n", + "dot.node(\"G\", \"2. Weight 안정?\", shape=\"diamond\")\n", + "dot.node(\"H\", \"가중치 조정\")\n", + "dot.node(\"I\", \"효과 추정\")\n", + "dot.node(\"J\", \"종료\", shape=\"oval\")\n", + "\n", + "dot.edge(\"A\", \"A1\")\n", + "dot.edge(\"A1\", \"B\")\n", + "dot.edge(\"B\", \"C\")\n", + "\n", + "dot.edge(\"C\", \"D\", label=\"예\")\n", + "\n", + "dot.edge(\"D\", \"E\")\n", + "\n", + "dot.edge(\"E\", \"F\", label=\"아니오\")\n", + "dot.edge(\"F\", \"B\")\n", + "\n", + "dot.edge(\"E\", \"G\", label=\"예\")\n", + "\n", + "dot.edge(\"G\", \"H\", label=\"아니오\")\n", + "dot.edge(\"H\", \"D\")\n", + "\n", + "dot.edge(\"G\", \"I\", label=\"예\")\n", + "dot.edge(\"I\", \"J\")\n", + "\n", + "display(dot)" + ] + }, + { + "cell_type": "markdown", + "id": "587b50e7", + "metadata": {}, + "source": [ + "## Simulation" + ] + }, + { + "cell_type": "markdown", + "id": "9fb5cd48", + "metadata": {}, + "source": [ + "- Simulation Data\n", + "\n", + "$$\n", + "X_1, X_2 \\sim \\mathcal{N}(0,1)\n", + "$$\n", + "\n", + "$$\n", + "e(X) = \\mathbb{P}(T=1 \\mid X) = \\frac{1}{1 + \\exp\\big(-(-0.3 + 0.8X_1 - 0.8X_2)\\big)}\n", + "$$\n", + "\n", + "$$\n", + "T \\mid X \\sim \\text{Bernoulli}(e(X))\n", + "$$\n", + "\n", + "$$\n", + "Y = 2T + X_1 + X_2 + \\varepsilon, \\quad \\varepsilon \\sim \\mathcal{N}(0,1)\n", + "$$\n", + "\n", + "즉, ATE = 2.\n", + "\n", + "$$\n", + "Y(0) = X_1 + X_2 + \\varepsilon, \\quad\n", + "Y(1) = 2 + X_1 + X_2 + \\varepsilon\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "713a6305", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
YTX1X2ps_true
0-1.7374670-1.085631-0.7488270.361365
14.16779310.9973450.5675950.510948
23.01822510.2829780.7181510.343409
3-1.4243901-1.506295-0.9993810.330587
40.4157750-0.5786000.4748980.241807
\n", + "
" + ], + "text/plain": [ + " Y T X1 X2 ps_true\n", + "0 -1.737467 0 -1.085631 -0.748827 0.361365\n", + "1 4.167793 1 0.997345 0.567595 0.510948\n", + "2 3.018225 1 0.282978 0.718151 0.343409\n", + "3 -1.424390 1 -1.506295 -0.999381 0.330587\n", + "4 0.415775 0 -0.578600 0.474898 0.241807" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def simulate_data(n=1000, seed=123):\n", + " np.random.seed(seed)\n", + "\n", + " X1 = np.random.normal(0, 1, n)\n", + " X2 = np.random.normal(0, 1, n)\n", + "\n", + " logit_ps = -0.3 + 0.8 * X1 - 0.8 * X2\n", + " ps = 1 / (1 + np.exp(-logit_ps))\n", + "\n", + " T = np.random.binomial(1, ps, n)\n", + "\n", + " # outcome\n", + " eps = np.random.normal(0, 1, n)\n", + " Y = 2 * T + 1.0 * X1 + 1.0 * X2 + eps\n", + "\n", + " df = pd.DataFrame({\n", + " \"Y\": Y,\n", + " \"T\": T,\n", + " \"X1\": X1,\n", + " \"X2\": X2,\n", + " \"ps_true\": ps\n", + " })\n", + "\n", + " return df\n", + "\n", + "df = simulate_data(n=1000)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "741d2cb7", + "metadata": {}, + "source": [ + "### 적절한 공변량 선택" + ] + }, + { + "cell_type": "markdown", + "id": "b9f19b57", + "metadata": {}, + "source": [ + "해당 시뮬레이션 데이터에서 적절한 공변량 조합은 X1과 X2를 모두 고르는 것입니다.\n", + "설명을 위해 X1만 고르는 bad case와 (X1, X2)를 모두 고르는 good case를 둘 다 활용하겠습니다.\n", + "실제로 적절한 공변량을 선택할 때는 도메인 지식에 근거해서 고르면 됩니다." + ] + }, + { + "cell_type": "markdown", + "id": "5edd2b38", + "metadata": {}, + "source": [ + "### 가중치 계산" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "7a53e172", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimated PS range:\n", + "min = 0.016, max = 0.977\n" + ] + }, + { + "data": { + "image/png": "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pUsXb9cCAABQLh4FmSFDhmju3LnergUAAKBcPLq0dPr0ac2YMUPLly9XmzZtFBQU5LZ+8uTJXikOAADgfDwKMt98843atm0rSdq8ebPbOib+AgCAquJRkPn000+9XQcAAEC5eTRHBgAAwB94NCLTvXv3815CWrFihccFAQAAXCyPgszZ+TFnFRUVKTs7W5s3bz7nyyQBAAAqi0dBZsqUKaW2jx8/XsePH69QQQAAABfLq3Nk7rvvPr5nCQAAVBmvBpnVq1crJCTEm4cEAAAok0eXlvr06eP22hijffv26auvvtLTTz/tlcIAAAAuxKMgExUV5fY6ICBAzZs314QJE3TTTTd5pTAAAIAL8SjIzJ4929t1AAAAlJtHQeasrKwsbdu2TZJ0xRVXqF27dl4pCgC8avEoz/brNc27dQDwOo+CzP79+/XnP/9ZmZmZio6OliQdOXJE3bt317x58/SHP/zBmzUCAACUyqO7lkaMGKFjx45py5YtOnTokA4dOqTNmzcrPz9fI0eO9HaNAAAApfJoRGbp0qVavny5WrZs6Wpr1aqV0tPTmewLAACqjEcjMiUlJQoKCjqnPSgoSCUlJRUuCgAA4GJ4FGR69OihUaNGae/eva62n3/+WWPGjNENN9zgteIAAADOx6Mg8/rrrys/P1+JiYlq0qSJmjRpokaNGik/P1+vvfaat2sEAAAolUdzZBISErRhwwYtX75c27dvlyS1bNlSPXv29GpxAC5e6oJNvi4BvuTpLeYSt5nDauUakVmxYoVatWql/Px8ORwO3XjjjRoxYoRGjBihjh076oorrtBnn31WWbUCAAC4KVeQmTp1qh544AFFRkaesy4qKkoPPfSQJk+e7LXiAAAAzqdcQebrr7/WzTffXOb6m266SVlZWRUuCgAA4GKUK8jk5eWVetv1WTVq1NAvv/xS4aIAAAAuRrmCzGWXXabNmzeXuf6bb75RfHx8hYsCAAC4GOUKMrfeequefvppnT59+px1p06d0rhx43T77bd7rTgAAIDzKdft10899ZQWLFigZs2aafjw4WrevLkkafv27UpPT1dxcbGefPLJSikUAADg98oVZGJjY/Xll1/q4YcfVmpqqowxkiSHw6Hk5GSlp6crNja2UgoFAAD4vXI/EK9hw4ZasmSJDh8+rF27dskYo8svv1y1atWqjPoAAADK5NGT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36isfneYC93XBAAA4Kf8eo4MAADA+RBkAACAtQgyAADAWgQZAABgrUs+yKSnpysxMVEhISHq3Lmz1q1bd97t58+frxYtWigkJEStW7fWkiVLqqjS6qU8/f7WW2/puuuuU61atVSrVi317Nnzgn8nnKu87/Wz5s2bJ4fDod69e1dugdVUefv9yJEjSklJUXx8vJxOp5o1a8a/Mx4ob79PnTpVzZs3V2hoqBISEjRmzBidPn26iqqtHlatWqVevXqpXr16cjgcWrRo0QX3yczM1NVXXy2n06mmTZtqzpw55T+xuYTNmzfPBAcHm1mzZpktW7aYBx54wERHR5u8vLxSt//iiy9MYGCgmTRpktm6dat56qmnTFBQkNm0aVMVV2638vb7X/7yF5Oenm42btxotm3bZgYOHGiioqLMTz/9VMWV26u8fX5WTk6Oueyyy8x1111n7rjjjqopthopb78XFBSYDh06mFtvvdV8/vnnJicnx2RmZprs7Owqrtxu5e33t99+2zidTvP222+bnJwc8/HHH5v4+HgzZsyYKq7cbkuWLDFPPvmkWbBggZFkFi5ceN7td+/ebWrWrGnGjh1rtm7dal577TUTGBholi5dWq7zXtJBplOnTiYlJcX1uri42NSrV8+kpaWVuv3dd99tbrvtNre2zp07m4ceeqhS66xuytvvv3fmzBkTERFh/vu//7uySqx2POnzM2fOmC5dupj/+q//MgMGDCDIeKC8/f7mm2+axo0bm8LCwqoqsVoqb7+npKSYHj16uLWNHTvWdO3atVLrrM4uJsg8+uij5oorrnBr69evn0lOTi7XuS7ZS0uFhYXKyspSz549XW0BAQHq2bOnVq9eXeo+q1evdttekpKTk8vcHufypN9/7+TJkyoqKlLt2rUrq8xqxdM+nzBhgmJiYjR48OCqKLPa8aTfP/jgAyUlJSklJUWxsbG68sor9eKLL6q4uLiqyraeJ/3epUsXZWVluS4/7d69W0uWLNGtt95aJTVfqrz1mer3T/atLAcOHFBxcfE5TwiOjY3V9u3bS90nNze31O1zc3Mrrc7qxpN+/73HHntM9erVO+c/AJTOkz7//PPPNXPmTGVnZ1dBhdWTJ/2+e/durVixQvfee6+WLFmiXbt2adiwYSoqKtK4ceOqomzredLvf/nLX3TgwAFde+21MsbozJkzGjp0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IiIizIEDB4wx//ctum3atDGffPKJ2bVrlzl48KAZOXKkqVevnlmyZInZsmWLGTBggKlVq5Y5ePCg234tW7Y0n3zyifnmm2/M7bffbhITE01hYaExxphdu3aZsLAwM2XKFLNz507zxRdfmHbt2pmBAwe6amzYsKGpXbu2SU9PN99++61JS0szAQEBZvv27cYYY15++WWTkJBgVq1aZb7//nvz2Wefmblz57r2l2QWLlxojDFm3bp1RpJZvny52bdvn6vWZs2amUmTJrn2KSwsNHXr1jWzZs0q9/vHGGPuvvtuk5CQYBYsWGC+++47s3z5cjNv3jxjjDE//fSTqVmzphk2bJjZtm2bWbhwoalbt67bN8h369bNhIeHm0ceecRs377dbN++3Rw+fNj84Q9/MKmpqWbbtm1mw4YN5sYbbzTdu3cv8+8LVDWCDOAlAwYMMIGBgSYsLMxteeGFF4wxxrz66qumWbNmrg/U32vYsKGZMmWKW1tpQaZmzZomPz/f1ZacnGwSExNNcXGxq6158+YmLS2tzFrnz59v6tSpU+Z5jDHmhx9+MIGBgebnn392a7/hhhtMamqqMcaYe+65x9x6661u6/v163dRQWbixImutqKiIlO/fn3z0ksvGWP+L5AsWrTItc3x48dNUFCQefvtt11thYWFpl69eq5AcHa/sx/gxvwaEkNDQ80777xjjDFm8ODB5sEHH3Sr6bPPPjMBAQHm1KlTxphf/xb33Xefa31JSYmJiYkxb775pjHGmBEjRpgePXqYkpKSUn/H3waZs7/vxo0b3bZ56aWXTMuWLV2v33vvPRMeHm6OHz9e6jHP9/7ZsWOHkWSWLVtW6r5PPPGEad68uVu96enpJjw83PW+6datm2nXrp3bfs8995y56aab3Nr27NljJJkdO3aUei6gqnFpCfCi7t27Kzs7220ZOnSoJOmuu+7SqVOn1LhxYz3wwANauHCh29D+xUpMTFRERITrdWxsrFq1aqWAgAC3tv3797teL1++XDfccIMuu+wyRUREqH///jp48KBOnjxZ5nk2bdqk4uJiNWvWTOHh4a5l5cqV+u677yRJ27ZtU+fOnd32S0pKuqjf47fb1ahRQx06dNC2bdvctunQoYPr5++++05FRUXq2rWrqy0oKEidOnU6Z7/fHrt27dpq3ry5a5uvv/5ac+bMcfudkpOTVVJSopycHNd+bdq0cf3scDgUFxfn6tOBAwcqOztbzZs318iRI/XJJ59c1O/8WwMHDtSuXbu0Zs0aSb9eorv77rsVFhZW6vbne/9kZ2crMDBQ3bp1K3Xfbdu2KSkpyXXJUpK6du2q48eP66effnK1tW/f3m2/r7/+Wp9++qlbX7Vo0UKSXO8BwNfsmDkHWCIsLExNmzYtdV1CQoJ27Nih5cuXa9myZRo2bJhefvllrVy5UkFBQRd9jt9v63A4Sm0rKSmR9OuclNtvv10PP/ywXnjhBdWuXVuff/65Bg8erMLCQtWsWbPU8xw/flyBgYHKyspSYGCg27rw8PCLrrciyvpQr4jjx4/roYcecptfclaDBg1cP5+vT6+++mrl5OToo48+0vLly3X33XerZ8+eevfddy+6jpiYGPXq1UuzZ89Wo0aN9NFHH50z/+i3zvf+8daE8N/39/Hjx9WrVy+99NJL52wbHx/vlXMCFUWQAapQaGioevXqpV69eiklJUUtWrTQpk2bdPXVVys4OFjFxcVeP2dWVpZKSkr06quvukZt/vWvf7ltU9q527Vrp+LiYu3fv7/MCagtW7bU2rVr3drOjjBcyJo1a/THP/5RknTmzBllZWVp+PDhZW7fpEkTBQcH64svvlDDhg0lSUVFRVq/fr1Gjx59zrHPhpLDhw9r586datmypaRfQ8jWrVvLDJwXKzIyUv369VO/fv30pz/9STfffLMOHTqk2rVru2139s6f0v62Q4YM0T333KP69eurSZMmbqNNpSnr/dO6dWuVlJRo5cqV6tmz5zn7tWzZUu+9956MMa5RmS+++EIRERGqX79+mee7+uqr9d577ykxMdGaO8Zw6eHSEuBFBQUFys3NdVvO3uExZ84czZw5U5s3b9bu3bv1v//7vwoNDXV9KCcmJmrVqlX6+eefvXpXSNOmTVVUVKTXXntNu3fv1v/8z/9o+vTpbtskJibq+PHjysjI0IEDB3Ty5Ek1a9ZM9957r/76179qwYIFysnJ0bp165SWlqYPP/xQkjRy5EgtXbpUr7zyir799lu9/vrrWrp06UXVlZ6eroULF2r79u1KSUnR4cOHdf/995e5fVhYmB5++GE98sgjWrp0qbZu3aoHHnhAJ0+e1ODBg922nTBhgjIyMrR582YNHDhQdevWVe/evSVJjz32mL788ksNHz5c2dnZ+vbbb/X++++fN0T93uTJk/XPf/5T27dv186dOzV//nzFxcWV+iyemJgYhYaGaunSpcrLy9PRo0dd65KTkxUZGannn39egwYNOu85z/f+SUxM1IABA3T//fdr0aJFysnJUWZmpiuwDhs2THv27NGIESO0fft2vf/++xo3bpzGjh3rdkny91JSUnTo0CHdc889Wr9+vb777jt9/PHHGjRoUKWEbsAjvp6kA1QXAwYMMJLOWZo3b26MMWbhwoWmc+fOJjIy0oSFhZlrrrnGLF++3LX/6tWrTZs2bYzT6TRn/9MsbbLvVVdddc55f3+3VLdu3cyoUaNcrydPnmzi4+NNaGioSU5ONv/4xz+MJHP48GHXNkOHDjV16tQxklx3sxQWFppnnnnGJCYmmqCgIBMfH2/uvPNO880337j2mzlzpqlfv74JDQ01vXr1Mq+88spFTfadO3eu6dSpkwkODjatWrUyK1ascG1zdtLub+szxphTp06ZESNGmLp16xqn02m6du1q1q1bd85+ixcvNldccYUJDg42nTp1Ml9//bXbcdatW2duvPFGEx4ebsLCwkybNm1ck7KNKX3i9VVXXeXqlxkzZpi2bduasLAwExkZaW644QazYcMG17b6zWRfY4x56623TEJCggkICDDdunVzO+7TTz9tAgMDzd69e8vsM2Mu/P45deqUGTNmjImPjzfBwcGmadOmbndAZWZmmo4dO5rg4GATFxdnHnvsMVNUVORa//v3zFk7d+40d955p4mOjjahoaGmRYsWZvTo0WVOdAaqmsMYY3wToQBcir7//ns1atRIGzduVNu2bb167MzMTHXv3l2HDx+25knFgwcP1i+//KIPPvjA16UAVuKiJwD4wNGjR7Vp0ybNnTuXEANUAEEGAHzgjjvu0Lp16zR06FDdeOONvi4HsBaXlgAAgLW4awkAAFiLIAMAAKxFkAEAANYiyAAAAGsRZAAAgLUIMgAAwFoEGQAAYC2CDAAAsNb/A33b85rV/HWRAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X = df[[\"X1\", \"X2\"]]\n", + "T = df[\"T\"]\n", + "\n", + "ps_model = LogisticRegression(max_iter=1000)\n", + "ps_model.fit(X, T)\n", + "ps_hat = ps_model.predict_proba(X)[:, 1]\n", + "\n", + "print(\"Estimated PS range:\")\n", + "print(f\"min = {ps_hat.min():.3f}, max = {ps_hat.max():.3f}\")\n", + "\n", + "plt.hist(ps_hat[T == 0], bins=30, alpha=0.6, label=\"T=0\")\n", + "plt.hist(ps_hat[T == 1], bins=30, alpha=0.6, label=\"T=1\")\n", + "plt.xlabel(\"Estimated propensity score\")\n", + "plt.ylabel(\"Count\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "af1800eb", + "metadata": {}, + "source": [ + "각 관측치는 자신의 처치 확률의 역수를 이용해 가중된다.\n", + "\n", + "$$\n", + "w_i =\n", + "\\begin{cases}\n", + "\\frac{1}{\\hat e(X_i)} & T_i = 1 \\\\\n", + "\\frac{1}{1 - \\hat e(X_i)} & T_i = 0\n", + "\\end{cases}\n", + "$$" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "eda8e112", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.42770576, 1.93721604, 2.9150843 , 3.84093377, 1.29270486])" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X1, X2 모두 사용해서 예측\n", + "w = np.where(\n", + " T == 1,\n", + " 1 / ps_hat,\n", + " 1 / (1 - ps_hat)\n", + ")\n", + "\n", + "w[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "0806d61f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.27976698, 1.66139077, 2.17965985, 6.02555447, 1.42185057])" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X1만 사용해서 예측\n", + "\n", + "ps_model_bad = LogisticRegression(max_iter=1000)\n", + "ps_model_bad.fit(df[[\"X1\"]], T) \n", + "\n", + "ps_hat_bad = ps_model_bad.predict_proba(df[[\"X1\"]])[:, 1]\n", + "\n", + "pA = T.mean()\n", + "w_bad = np.where(\n", + " T == 1,\n", + " 1 / ps_hat_bad,\n", + " 1 / (1 - ps_hat_bad)\n", + ")\n", + "\n", + "w_bad[:5]" + ] + }, + { + "cell_type": "markdown", + "id": "20e3d75f", + "metadata": {}, + "source": [ + "### 조건 1. Balancing 확인" + ] + }, + { + "cell_type": "markdown", + "id": "1bb92fad", + "metadata": {}, + "source": [ + "> ASMD (Absolute Standardized Mean Difference)\n", + "\n", + "공변량 균형은 처치군과 대조군 간 평균 차이를 표준화하여 평가한다.\n", + "\n", + "$$\n", + "\\text{ASMD}_j = \\frac{\\left| \\mu_{1j} - \\mu_{0j} \\right|}\n", + "{\\sqrt{\\frac{\\sigma_{1j}^2 + \\sigma_{0j}^2}{2}}}\n", + "$$\n", + "\n", + "가중치를 사용하는 경우, 평균과 분산은 다음과 같이 계산된다:\n", + "\n", + "$$\n", + "\\mu_{1j} = \\frac{\\sum_{i: A_i=1} w_i X_{ij}}{\\sum_{i: A_i=1} w_i}, \\quad\n", + "\\mu_{0j} = \\frac{\\sum_{i: A_i=0} w_i X_{ij}}{\\sum_{i: A_i=0} w_i}\n", + "$$\n", + "\n", + "$$\n", + "\\sigma_{1j}^2 = \\frac{\\sum_{i: A_i=1} w_i (X_{ij} - \\mu_{1j})^2}{\\sum_{i: A_i=1} w_i}, \\quad\n", + "\\sigma_{0j}^2 = \\frac{\\sum_{i: A_i=0} w_i (X_{ij} - \\mu_{0j})^2}{\\sum_{i: A_i=0} w_i}\n", + "$$\n", + "\n", + "일반적으로 해석 기준은 다음과 같이 알려져있다.\n", + "- ASMD < 0.1: 균형 달성\n", + "- ASMD ≥ 0.1: 균형 부족\n", + "\n", + "즉, ASMD는 공변량 분포가 weighting 이후 실제로 맞춰졌는지를 평가하는 지표이며, 예측력보다 해당 지표를 만족하는 것이 더 중요하다." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "50401f71", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_asmd(X, A, w=None):\n", + " import numpy as np\n", + " \n", + " asmd = {}\n", + " \n", + " for col in X.columns:\n", + " x = X[col].values\n", + " \n", + " if w is None:\n", + " m1 = x[A==1].mean()\n", + " m0 = x[A==0].mean()\n", + " v1 = x[A==1].var()\n", + " v0 = x[A==0].var()\n", + " else:\n", + " m1 = np.average(x[A==1], weights=w[A==1])\n", + " m0 = np.average(x[A==0], weights=w[A==0])\n", + " v1 = np.average((x[A==1] - m1)**2, weights=w[A==1])\n", + " v0 = np.average((x[A==0] - m0)**2, weights=w[A==0])\n", + " \n", + " # ASMD\n", + " asmd[col] = abs(m1 - m0) / np.sqrt((v1 + v0) / 2)\n", + " \n", + " return asmd" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "af1d7ec0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ASMD (good): {'X1': 0.06309973147556015, 'X2': 0.01295531253985427}\n", + "ASMD (bad): {'X1': 0.026121787445995373, 'X2': 0.5945621353824512}\n" + ] + } + ], + "source": [ + "X = df[[\"X1\", \"X2\"]]\n", + "\n", + "print(\"ASMD (good):\", compute_asmd(X, T, w))\n", + "print(\"ASMD (bad):\", compute_asmd(X, T, w_bad))" + ] + }, + { + "cell_type": "markdown", + "id": "190fb62c", + "metadata": {}, + "source": [ + "- Good model: 모든 공변량에서 ASMD < 0.1 → 균형 달성 \n", + "- Bad model: $X_2$에서 균형 실패\n", + "\n", + "Bad model에서는 중요한 공변량 $X_2$가 PS 모델에서 빠져 있어, weighting 이후에도 불균형이 남아 있다.\n", + "\n", + "→ 이 상태에서는 PS 모델을 수정하기 위해 이전 단계로 돌아가야 한다." + ] + }, + { + "cell_type": "markdown", + "id": "1aea243c", + "metadata": {}, + "source": [ + "추가) \n", + "공변량이 많아지면 값을 한 번에 비교하기 힘들어지는데, 이를 위해 시각화를 수행할 수 있다.\n", + "\n", + "\n", + "**Love Plot**은 IPW 적용 전후의 ASMD를 공변량별로 비교하는 시각화 도구입니다. \n", + "점이 왼쪽(0에 가까울수록)으로 이동할수록 균형이 잘 맞춰진 것이며, \n", + "**ASMD < 0.1** 이면 균형 달성으로 판단합니다. \n", + "IPW 결과 보고 시 가장 많이 활용하는 진단 그래프입니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "f91ed377", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABh7UlEQVR4nO3dd3gU5f7+8Xt3QxohCSWQIKFJVzqKgHQVBVEEFVA8IIgK0vRYUFRAwXIOHLscRIr1gBQVERVEgjRFkNBBwaAowdCTEEjY3ef3R77ZH0sCJJnNLgnv13Xlkp15ZuYzz07i3jvPzNiMMUYAAAAAYIE90AUAAAAAKP4IFgAAAAAsI1gAAAAAsIxgAQAAAMAyggUAAAAAywgWAAAAACwjWAAAAACwjGABAAAAwDKCBQAAAADLCBYAUMQ6dOigDh06BLqMYs1ms2ncuHGBLqPIcawAKM4IFgAuCrNmzZLNZtP69esDXUq+Va9eXTabzfNTsWJFtW3bVp9++qlP1p+RkaFx48YpISHBJ+tLTExUv379FB8fr5CQEJUrV07XXXedZs6cKZfL5ZNtXGy2b9+ucePGae/evT5db0JCgtd7b7PZVK5cOV1zzTX66KOPfLotACguggJdAAAUZ02aNNE///lPSdL+/fs1depU9ezZU1OmTNGDDz5oad0ZGRkaP368JFn+Fvvdd9/Vgw8+qEqVKumee+5R7dq1lZaWpmXLlmnQoEFKTk7WU089ZWkbRenkyZMKCir4/7K2b9+u8ePHq0OHDqpevbrP6xoxYoSuuuoqSdLhw4c1Z84c9evXT8eOHdNDDz3k8+0BwMWMYAEAFlx22WXq16+f5/U//vEP1apVS6+88orlYOErP/zwgx588EG1atVKixcvVpkyZTzzRo0apfXr12vr1q0BrDBvbrdbWVlZCg0NVWhoaKDLyVPbtm11++23e14PGTJENWvW1Mcff0ywAHDJYSgUgGJl48aNuummmxQZGamIiAh17txZP/zwg2f++vXrZbPZ9N577+Va9ptvvpHNZtOiRYs80/766y8NHDhQlSpVUkhIiK644grNmDGj0PXFxsaqfv36SkpKOm+7lJQUDRo0SJUqVVJoaKgaN27sVfPevXsVExMjSRo/frxnuE3OdQanT5/Wzp07lZycfMGacpb/6KOPvEJFjhYtWmjAgAGe1ydOnNA///lPz5CpunXratKkSTLGeNpceeWV6tixY651ud1uXXbZZV4ftidNmqTWrVurfPnyCgsLU/PmzTVv3rxcy9psNg0bNkwfffSRrrjiCoWEhOjrr7/2zDvzGovff/9dQ4cOVd26dRUWFqby5cvrjjvu8BryNGvWLN1xxx2SpI4dO3r68MyhZV999ZXatm2r0qVLq0yZMurWrZu2bdt2wT49l+DgYJUtWzbX2ZWZM2eqU6dOqlixokJCQtSgQQNNmTLlguvLysrSs88+q+bNmysqKkqlS5dW27ZttXz5cq92e/fulc1m06RJk/TOO+/o8ssvV0hIiK666ir99NNPuda7c+dO3XnnnYqJiVFYWJjq1q2rMWPGeLXx9e8GgJKPMxYAio1t27apbdu2ioyM1OOPP65SpUpp6tSp6tChg1asWKGWLVuqRYsWqlmzpj755BP179/fa/k5c+aobNmy6tKliyTp77//1jXXXOP5QBsTE6OvvvpKgwYNUmpqqkaNGlXgGk+fPq19+/apfPny52xz8uRJdejQQbt379awYcNUo0YNzZ07VwMGDNCxY8c0cuRIxcTEaMqUKRoyZIhuu+029ezZU5LUqFEjSdkf+urXr6/+/ftr1qxZ59xWRkaGli1bpnbt2qlq1aoXrN8Yo1tuuUXLly/XoEGD1KRJE33zzTd67LHH9Ndff+mVV16RJPXu3Vvjxo3TgQMHFBsb61l+1apV2r9/v/r06eOZ9tprr+mWW27R3XffraysLM2ePVt33HGHFi1apG7dunlt/7vvvtMnn3yiYcOGqUKFCuccvvTTTz9pzZo16tOnj6pUqaK9e/dqypQp6tChg7Zv367w8HC1a9dOI0aM0Ouvv66nnnpK9evXlyTPfz/44AP1799fXbp00csvv6yMjAxNmTJF1157rTZu3JivoVNpaWk6dOiQJOnIkSP6+OOPtXXrVk2fPt2r3ZQpU3TFFVfolltuUVBQkL744gsNHTpUbrf7vGc2UlNT9e6776pv374aPHiw0tLSNH36dHXp0kXr1q1TkyZNvNp//PHHSktL0wMPPCCbzaZ//etf6tmzp3777TeVKlVKkrR582a1bdtWpUqV0v3336/q1atrz549+uKLLzRx4kRJRfO7AeASYADgIjBz5kwjyfz000/nbNOjRw8THBxs9uzZ45m2f/9+U6ZMGdOuXTvPtCeffNKUKlXKHDlyxDMtMzPTREdHm4EDB3qmDRo0yMTFxZlDhw55badPnz4mKirKZGRknLfmatWqmRtuuMEcPHjQHDx40GzatMn06dPHSDLDhw/3tGvfvr1p37695/Wrr75qJJkPP/zQMy0rK8u0atXKREREmNTUVGOMMQcPHjSSzNixY3NtOykpyUgy/fv3P2+NmzZtMpLMyJEjz9sux2effWYkmQkTJnhNv/32243NZjO7d+82xhiza9cuI8m88cYbXu2GDh1qIiIivPru7H7MysoyV155penUqZPXdEnGbrebbdu25arr7H7I671Zu3atkWTef/99z7S5c+caSWb58uVebdPS0kx0dLQZPHiw1/QDBw6YqKioXNPPtnz5ciMp14/dbjcTJ07M1T6vert06WJq1qzpNe3sY8XpdJrMzEyvNkePHjWVKlXyOpZzjofy5ct7Hfeff/65kWS++OILz7R27dqZMmXKmN9//91rvW632/Nvq78bAC5NDIUCUCy4XC4tWbJEPXr0UM2aNT3T4+LidNddd2nVqlVKTU2VlP1t+unTp7VgwQJPuyVLlujYsWPq3bu3pOxv5ufPn6/u3bvLGKNDhw55frp06aLjx4/r559/vmBdS5YsUUxMjGJiYtS4cWPNnTtX99xzj15++eVzLrN48WLFxsaqb9++nmmlSpXSiBEjlJ6erhUrVlxwu9WrV5cx5rxnKyR5+iSvIVDnqs3hcGjEiBFe0//5z3/KGKOvvvpKklSnTh01adJEc+bM8bRxuVyaN2+eunfvrrCwMM/0M/999OhRHT9+XG3bts2zf9u3b68GDRpcsM4z13n69GkdPnxYtWrVUnR0dL7et6VLl+rYsWPq27ev13vvcDjUsmXLXEONzuXZZ5/V0qVLtXTpUs2ZM0d9+/bVmDFj9Nprr52z3uPHj+vQoUNq3769fvvtNx0/fvyc63c4HAoODpaUPczsyJEjcjqdatGiRZ772bt3b5UtW9bzum3btpKk3377TZJ08OBBff/99xo4cGCuM1g2m02S7343AFx6GAoFoFg4ePCgMjIyVLdu3Vzz6tevL7fbrX379umKK65Q48aNVa9ePc2ZM0eDBg2SlD0MqkKFCurUqZNnfceOHdM777yjd955J89tpqSkXLCuli1basKECbLZbAoPD1f9+vUVHR193mV+//131a5dW3a793c7OUN0fv/99wtuN78iIyMlZQ/ZyY/ff/9dlStXzhVE8qqtd+/eeuqpp/TXX3/psssuU0JCglJSUjzhLceiRYs0YcIEJSYmKjMz0zM954PsmWrUqJGvOk+ePKkXX3xRM2fO1F9//eV1/cf5Pqjn+PXXXyXJczycLaffLqRhw4a67rrrPK/vvPNOHT9+XKNHj9Zdd93luU5m9erVGjt2rNauXauMjAyvdRw/flxRUVHn3MZ7772nyZMna+fOnTp9+rRnel59dXZYyAkZR48elfT/A8aVV155zu356ncDwKWHYAGgROrdu7cmTpyoQ4cOqUyZMlq4cKH69u3ruajW7XZLkvr165frWowcOdcznE+FChW8PlhebGrVqqWgoCBt2bLF5+vu3bu3nnzySc2dO1ejRo3SJ598oqioKN14442eNitXrtQtt9yidu3a6e2331ZcXJxKlSqlmTNn6uOPP861zjO/2T+f4cOHa+bMmRo1apRatWqlqKgo2Ww29enTx/Penk9Omw8++MDrGpEchbm1bY7OnTtr0aJFWrdunbp166Y9e/aoc+fOqlevnv7zn/8oPj5ewcHBWrx4sV555ZXz1vvhhx9qwIAB6tGjhx577DFVrFhRDodDL774ovbs2ZOrvcPhyHM9ZwavC/HV7waASw/BAkCxEBMTo/DwcO3atSvXvJ07d8putys+Pt4zrXfv3ho/frzmz5+vSpUqKTU11euC4piYGJUpU0Yul8vvwaBatWravHmz3G6311mLnTt3euZLeX+jX1Dh4eHq1KmTvvvuO+3bt8+rj85V27fffqu0tDSvsxZn1yZlf2N+9dVXa86cORo2bJgWLFigHj16KCQkxNNm/vz5Cg0N1TfffOM1febMmZb2a968eerfv78mT57smXbq1CkdO3bMq925+vDyyy+XJFWsWNHn77/T6ZQkpaenS5K++OILZWZmauHChV5nFPIz3GrevHmqWbOmFixY4LUvY8eOLVRtOcMIz3d74UD+bgAo3rjGAkCx4HA4dMMNN+jzzz/3uqXo33//rY8//ljXXnut1/CV+vXrq2HDhpozZ47mzJmjuLg4tWvXzmt9vXr10vz58/P8kHXw4MEi25euXbvqwIEDXtcnOJ1OvfHGG4qIiFD79u0lZYcCSbk+LEsFu93s2LFjZYzRPffc4/mwe6YNGzZ4bnXbtWtXuVwuvfnmm15tXnnlFdlsNt10001e03v37q0ffvhBM2bM0KFDh3INg3I4HLLZbF5P9t67d68+++yzC9Z9Pg6HI9e38G+88UauJ4iXLl1aUu4+7NKliyIjI/XCCy94DS/KYeX9z7mdcePGjT21Sso1XCs/4SqvZX/88UetXbu2ULXFxMSoXbt2mjFjhv744w+veTnbCOTvBoDijTMWAC4qM2bM8Dy74EwjR47UhAkTtHTpUl177bUaOnSogoKCNHXqVGVmZupf//pXrmV69+6tZ599VqGhoRo0aFCuaxpeeuklLV++XC1bttTgwYPVoEEDHTlyRD///LO+/fZbHTlypEj28f7779fUqVM1YMAAbdiwQdWrV9e8efO0evVqvfrqq54zBWFhYWrQoIHmzJmjOnXqqFy5crryyit15ZVX5vt2s5LUunVrvfXWWxo6dKjq1avn9eTthIQELVy4UBMmTJAkde/eXR07dtSYMWO0d+9eNW7cWEuWLNHnn3+uUaNGeb7pz3HnnXfq0Ucf1aOPPqpy5crl+oa7W7du+s9//qMbb7xRd911l1JSUvTWW2+pVq1a2rx5c6H78Oabb9YHH3ygqKgoNWjQQGvXrtW3336b6za/TZo0kcPh0Msvv6zjx48rJCTE8zyJKVOm6J577lGzZs3Up08fxcTE6I8//tCXX36pNm3a5ApXeVm5cqVOnTolKft2swsXLtSKFSvUp08f1atXT5J0ww03KDg4WN27d9cDDzyg9PR0TZs2TRUrVrxgMLz55pu1YMEC3XbbberWrZuSkpL03//+Vw0aNMgzJObH66+/rmuvvVbNmjXT/fffrxo1amjv3r368ssvlZiYKClwvxsAirmA3IsKAM6Sc7vZc/3s27fPGGPMzz//bLp06WIiIiJMeHi46dixo1mzZk2e6/z11189y69atSrPNn///bd56KGHTHx8vClVqpSJjY01nTt3Nu+8884Fa65WrZrp1q3bBdudfQvRnO3ee++9pkKFCiY4ONg0bNjQzJw5M9eya9asMc2bNzfBwcFet1zN7+1mz7RhwwZz1113mcqVK5tSpUqZsmXLms6dO5v33nvPuFwuT7u0tDTz8MMPe9rVrl3b/Pvf//a6HemZ2rRpYySZ++67L8/506dPN7Vr1zYhISGmXr16ZubMmWbs2LHm7P8FSTIPPfRQnuvQWbebPXr0qKf/IiIiTJcuXczOnTtNtWrVcvXJtGnTTM2aNY3D4ch169nly5ebLl26mKioKBMaGmouv/xyM2DAALN+/frz9GTet5sNDg429erVMxMnTjRZWVle7RcuXGgaNWpkQkNDTfXq1c3LL79sZsyYYSSZpKQkT7uzjxW3221eeOEFU61aNRMSEmKaNm1qFi1aZPr372+qVavmaZdzPPz73/++YN8ZY8zWrVvNbbfdZqKjo01oaKipW7eueeaZZ7zaWPndAHBpshlTgCu6AAAAACAPXGMBAAAAwDKCBQAAAADLCBYAAAAALCNYAAAAALCMYAEAAADAMoIFAAAAAMsuygfkud1u7d+/X2XKlJHNZgt0OQAAAMAlyRijtLQ0Va5cOdeDZs92UQaL/fv3Kz4+PtBlAAAAAJC0b98+ValS5bxtLspgUaZMGUnZOxAZGemz9brdbh08eFAxMTEXTFwoPKfTqQULFigrK0t33nmngoODA11SicUx7T/0tX/Qz/5DX/sPfe0f9HPRSE1NVXx8vOfz+flclMEiZ/hTZGSkz4PFqVOnFBkZyQFXhJxOp8LDw+VwOBQZGUmwKEIc0/5DX/sH/ew/9LX/0Nf+QT8XrfxcnkCvAwAAALCMYAEAAADAMoIFAAAAAMsuymssAAAAkM3lcun06dOBLuOi53a7dfr0aZ06dYprLAqgVKlScjgcPlkXwQI+Z7fbdcUVVyg1NZVfbAAACskYowMHDujYsWOBLqVYMMbI7XYrLS2N56AVUHR0tGJjYy33G8ECPme329WwYUOlpKQQLAAAKKScUFGxYkWFh4fzYfkCjDFyOp0KCgqir/LJGKOMjAylpKRIkuLi4iytj2ABAABwkXG5XJ5QUb58+UCXUywQLAonLCxMkpSSkqKKFStaGhbF18nwOWOMjh8/rrS0NBljAl0OAADFTs41FeHh4QGuBJeCnOPM6rU8nLGAz7lcLn311VfKzMxUtWrVfHZBEAAAlxq+eYc/+Oo4I1j8n78On1BGljPf7cODg3RZ+dJFWBEAALDk+FFp12bpVIYUGi7VbSRFlQ10VUCJRbBQdqgY+HZCgZebMbQD4QIAgIvNn0nS4tnS+pWS2/3/p9vtUou2Utc+UpUagavP34pxwBo3bpymTJmilJQUffrpp+rRo0egS8J5FOgaC5fLpdatW6tnz55e048fP674+HiNGTNGmzZtUt++fRUfH6+wsDDVr19fr732mk+L9rWCnKnwxXIAAKCIbF0vTRiRO1RI2a/Xr8qev3V9YOrzpz+TpHdelB67O/u/77/m/frPpCLZ7IABA2Sz2Tw/5cuX14033qjNmzcXaD07duzQ+PHjNXXqVCUnJ+umm24qknrPZcCAAV5B5sz9Cg4OVq1atfTcc8/J6XQqPT1dpUqV0uzZs73W0adPH9lsNu3du9drevXq1fXMM8/4YS/8q0DBwuFwaNasWfr666/10UcfeaYPHz5c5cqV09ixY7VhwwZVrFhRH374obZt26YxY8boySef1Jtvvunz4gEAADz+TJLeHC+5nLlDRQ63K3v+m+OL7IP1RSHAAevGG29UcnKykpOTtWzZMgUFBenmm28u0Dr27NkjSbr11lsVGxurkJCQQtXiy4cL5uzXr7/+qn/+858aN26c/v3vfysiIkItWrRQQkKCV/uEhATFx8d7TU9KStLvv/+uTp06+ayui0WB7wpVp04dvfTSSxo+fLiSk5P1+eefa/bs2Xr//fcVHBysgQMH6rXXXlP79u1Vs2ZN9evXT/fee68WLFhQFPUDAABkWzw7Ozhc6I6ExmR/uF48xz91+dtFELBCQkIUGxur2NhYNWnSRKNHj9a+fft08OBBT5t9+/bpzjvvVHR0tMqVK6dbb73V883+uHHj1L17d0nZz8fKubjY7XbrueeeU5UqVRQSEqImTZro66+/9qxz7969stvtmjNnjtq3b6/Q0FDPl+Hvvvuu6tevr9DQUNWrV09vv/12oferWrVqGjJkiK677jotXLhQktSxY0evALFjxw6dOnVKQ4YM8ZqekJCgkJAQtWrVqsDbv9gV6nazw4cPV+PGjXXPPffo/vvv17PPPqvGjRufs/3x48dVrly5QhcJAABwXseP5v3t/Lm4XdL676XUY0VaVkBcZAErPT1dH374oWrVquV5Jsfp06fVpUsXlSlTRitXrtTq1asVERGhG2+8UVlZWXr00Uc1c+ZMSfKc+ZCk1157TZMnT9akSZO0efNmdenSRbfccot+/fVXr22OHj1aI0eO1I4dO9SlSxd99NFHevbZZzVx4kTt2LFDL7zwgp555hm99957lvYtLCxMWVlZkrKDxa5duzy1Ll++XNdee606derkFSyWL1+uVq1aKTQ01NK2L0aF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KAmq1JDuH539bIZdm7PveBRWOvs6gpJ2TcW55ASsxXOyn1Nx5tmbnIDVtTehAj5FsPg/hAQAAEqYyOiS9fC7giJgwc8IFgAAACXZpR6w4DcEC/iczWZTrVq1lJaWxsVTAAAAlwiCBXzO4XCoRYsWSklJ4eF4AAAAlwjuCgUAAADAMoIFfM4Yo1OnTikzM/O8D6sBAABAyUGwgM+5XC599tln+u677+RyuQJdDgAAAPyAaywAAABKkL8On7jon81ljNEDDzygefPm6ejRo9q4caOaNGni1xrgewQLAACAEuKvwyc08O2EAi83Y2gHn4eLtWvX6tprr9WNN96oL7/80mve119/rVmzZikhIUE1a9ZUhQoVZLPZ9Omnn6pHjx4+rSNHhw4d1KRJE7366que1ytWrJAkhYSEqGbNmho2bJiGDh2qnTt3qn79+lq7dq2uueYazzquueYaJSYm6tixYwoNDZUknTp1StHR0Xrrrbc0aNCgIqm9uGAoFAAAQAlRkDMVvljufKZPn67hw4fr+++/1/79+73m7dmzR3FxcWrdurViY2MVFOS777pPnz6d77aDBw9WcnKytm/frjvvvFMPPfSQ/ve//6levXqKjY1VQkKCp21aWpp+/vlnxcTE6IcffvBMX7t2rTIzM9WpUyef7UNxRbAAAACAT6Wnp2vOnDkaMmSIunXrplmzZnnmDRgwQMOHD9cff/whm82m6tWrq3r16pKk2267zTMtx+eff65mzZopNDRUNWvW1Pjx4+V0/v8gZLPZNGXKFN16662Kjo7WxIkT811neHi4YmNjVbNmTY0bN061a9fWwoULJUkdO3b0CharVq1SnTp11L17d6/pCQkJqlatmmrUqFGgPiqJCBYAAADwqU8++UT16tVT3bp11a9fP82YMcNzp8jXXntNzz33nKpUqaLk5GT99NNP+umnnyRJM2fO9EyTpJUrV+of//iHRo4cqe3bt2vq1KmaNWtWrvAwbtw49ejRQz///LMGDhxY6LrDwsKUlZUlKTtYrFq1yhNili9frg4dOqh9+/Zavny5Z5nly5erY8eOhd5mSUKwAAAAgE9Nnz5d/fr1kyTdeOONOn78uOd6hqioKJUpU0YOh0OxsbGKiYlRTEyMJCk6OtozTZLGjx+v0aNHq3///qpZs6auv/56Pf/885o6darX9u666y7de++9qlmzpqpWrVrgel0ulz788ENt3rzZM6SpY8eOOnHihCfkJCQkqH379mrXrp1+/PFHnTp1SidPntS6desIFv+Hi7fhczabTTVq1FBaWppsNlugywEAAH60a9curVu3Tp9++qkkKSgoSL1799b06dPVoUOHAq1r06ZNWr16tdcZCpfLpVOnTikjI0Ph4eGSpBYtWhSq1rffflvvvvuusrKy5HA49PDDD2vIkCGSpFq1aqlKlSpKSEjQFVdcoY0bN6p9+/aqWLGiqlatqrVr18oYo8zMTILF/yFYwOccDodatmyplJQUORyOQJcDAAD8aPr06XI6napcubJnmjFGISEhevPNNxUVFZXvdaWnp2v8+PHq2bNnrnk5d2WSpNKlC3dHq7vvvltjxoxRWFiY4uLiZLd7D+bp0KGDli9frkaNGql27dqqWLGiJHmGQxljVKtWLcXHxxdq+yUNwQIAAAA+4XQ69f7772vy5Mm64YYbvOb16NFD//vf//Tggw/muWypUqVyPVi3WbNm2rVrl2rVqlUk9UZFRZ133R07dtSIESPUoEEDr7Mt7dq107Rp02SM4WzFGQgW8DljjJxOp5xOp+dCLQAAUPItWrRIR48e1aBBg3KdmejVq5emT59+zmBRvXp1LVu2TG3atFFISIjKli2rZ599VjfffLOqVq2q22+/XXa7XZs2bdLWrVs1YcKEIt+fnOssZsyYoWnTpnmmt2/fXvfdd58kaejQoUVeR3HBxdvwOZfLpXnz5mnp0qW5vnkAAAAl1/Tp03XdddflOdypV69eWr9+vTZv3pznspMnT9bSpUsVHx+vpk2bSpK6dOmiRYsWacmSJbrqqqt0zTXX6JVXXlG1atWKdD9y1KhRQ9WqVVNaWprat2/vmV61alVVrlxZWVlZBb5upCTjjAUAAAB84osvvjjnvKuvvtozkqFRo0YaNWqU1/zu3bure/fuuZbr0qWLunTpcs715qzzQqMkznz2RF6vz2Xv3r15Tk9KSsrX8pcSzlgAAAAAsIxgAQAAUEKEBxduMEphlwPOxFEEAABQQlxWvrRmDO2gjCxnvpcJDw7SZeULd7tW4EwECwAAgBKEkIBAYSgUAAAAAMs4YwGfs9lsio+PV3p6umw2W6DLAQAAgB8QLOBzDodDbdq0UUpKihwOR6DLAQAAgB8wFAoAAACAZQQLAAAAAJYRLOBzTqdTs2fP1ldffSWnM/+3uwMAACVfQkKCbDabjh075tftzpo1S9HR0ZbWsXfvXtlsNiUmJp6zTX73b9myZapfv75cLpelmi7kv//9b55PNC8KBAsAAAD4hM1mO+/PuHHjAl3iRePxxx/X008/7XU9akJCgpo1a6aQkBDVqlVLs2bNOu86Tp06pQEDBqhhw4YKCgpSjx49crUZOHCgfv75Z61cudLHe5AbwQIAAAA+kZyc7Pl59dVXFRkZ6TXt0UcfLdR6s7KyfFxpYK1atUp79uxRr169PNOSkpLUrVs3dezYUYmJiRo1apTuu+8+ffPNN+dcj8vlUlhYmEaMGKHrrrsuzzbBwcG666679Prrr/t8P85GsAAAAIBPxMbGen6ioqJks9m8pkVERHjabtiwQS1atFB4eLhat26tXbt2eeaNGzdOTZo00bvvvqsaNWooNDRUknTs2DHdd999iomJUWRkpDp16qRNmzZ5ltu0aZM6deqkMmXKKDIyUs2bN9f69eu9avzmm29Uv359RURE6MYbb1RycrJnntvt1nPPPacqVaooJCRETZo00ddff33efV68eLHq1KmjsLAwdezYUXv37r1gP82ePVvXX3+9Z7+k7CFLNWrU0OTJk1W/fn0NGzZMt99+u1555ZVzrqd06dKaMmWKBg8erNjY2HO26969uxYuXKiTJ09esDYrCBYAAADFiNPpPOfP2eP1fdG2qIwZM0aTJ0/W+vXrFRQUpIEDB3rN3717t+bPn68FCxZ4rmm44447lJKSoq+++kobNmxQs2bN1LlzZx05ckSS1L9/f1WpUkU//fSTNmzYoNGjR6tUqVKedWZkZGjSpEn64IMP9P333+uPP/7wOovy2muvafLkyZo0aZI2b96sLl266JZbbtGvv/6a5z7s27dPPXv2VPfu3ZWYmKj77rtPo0ePvuC+r1y5Ui1atPCatnbt2lxnHbp06aK1a9decH0X0qJFCzmdTv3444+W13U+PMcCAACgGJk7d+4558XFxalDhw6e1wsWLDjnxcExMTFeH2QXLlyozMzMXO369u1b+GLPY+LEiWrfvr0kafTo0erWrZtOnTrl+RY/KytL77//vmJiYiRlDx9at26dUlJSFBISIkmaNGmSPvvsM82bN0+DBw/Wvn379Nhjj6levXqSpNq1a3tt8/Tp0/rvf/+ryy+/XJI0bNgwPffcc575kyZN0hNPPKE+ffpIkl5++WUtX75cr776qt56661c+zBlyhRdfvnlmjx5siSpbt262rJli15++eXz7vvvv/+uypUre007cOCAKlWq5DWtUqVKSk1N1cmTJxUWFnbedZ5PeHi4oqKi9Pvvvxd6HfnBGQsAAAD4XaNGjTz/jouLkySlpKR4plWrVs0TKqTsYU7p6ekqX768IiIiPD9JSUnas2ePJGnkyJEaPHiwrrvuOr300kue6TnCw8M9oSJnuznbTE1N1f79+9WmTRuvZdq0aaMdO3bkuQ87duxQy5Ytvaa1atXqgvt+8uRJr2FQ/hAWFqaMjIwi3QZnLOBzNptNcXFxOnHihGw2W6DLAQCgRLnjjjvOOe/s/+/27Nkz321vueUWa4UV0JlDlHJqcbvdnmmlS5f2ap+enq64uDglJCTkWlfObWSfffZZ9evXT4sXL9ZXX32lsWPHavbs2brttttybTNnu8YYX+xOgVSoUEFHjx71mhYbG6u///7ba9rff/+tyMhIS2crchw5csQrqBUFggV8zuFwqH379kpJSfG6hRoAALAuKCj/H9+Kqm0gNGvWTAcOHFBQUJCqV6+ea35OQKhTp47q1q2rhx9+WH379tXMmTM9weJ8IiMjVblyZa1evdozREuSVq9erauvvjrPZerXr6+FCxd6Tfvhhx8uuK2mTZtq+/btXtNatWqlxYsXe01bunRpvs6AXMiePXt06tQpNW3a1PK6zoehUAAAALjoXXfddWrVqpV69OihJUuWaO/evVqzZo3GjBmj9evX6+TJkxo5cqQSEhL0+++/a/Xq1frpp59Uv379fG/jscce08svv6w5c+Zo165dGj16tBITEzVy5Mg82z/44IP69ddf9dhjj2nXrl36+OOPL/jsCSn7ouxVq1blWtdvv/2mxx9/XDt37tTbb7+tTz75RA8//LCnzZtvvqnOnTt7Lbd9+3YlJibqyJEjOn78uBITE3M9wG/lypWqWbOm1zCwonBxR1MAAABA2cOWFi9erDFjxujee+/VwYMHFRsbq3bt2qlSpUpyOBw6fPiw+vfvr7///lsVKlRQz549NX78+HxvY8SIETp+/Lj++c9/KiUlRQ0aNNDChQtzXQSeo2rVqpo/f74efvhhvfHGG7r66qv1wgsv5LrD1dnuvvtuPf7449q1a5fq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1apVSw6Hw3Os5zWtpMnKylKtWrW0Zs2aQJeSb4cOHVLFihX1559/BroUoMQjWAAl0Nq1a+VwONStW7dAl5IvvvzwffDgQQ0ZMkRVq1ZVSEiIYmNj1aVLF61evdrTxmaz6bPPPrO8rYtN69atlZycrKioqIDVkPNeOhwO/fXXX17zkpOTFRQUJJvNpr179wamwDNUr15dNptNNptNYWFhql69uu6880599913Xu3y6tcHHnhAt99+u/bt26fnn3/+nNNKmv/+97+qUaOGWrdunWveAw88IIfDoblz5+aal5GRoSeffFKXX365QkNDFRMTo/bt2+vzzz/3tOnQoYNsNpteeumlXMt369ZNNptN48aNy9XeZrMpJCREl112mbp3764FCxZ4LVuhQgX94x//0NixYy3sOYD8IFgAJdD06dM1fPhwff/999q/f3+gy/GrXr16aePGjXrvvff0yy+/aOHCherQoYMOHz4c6NIKLSsrK1/tgoODFRsbK5vNVsQVXdhll12m999/32vae++9p8suuyxAFeXtueeeU3Jysnbt2qX3339f0dHRuu666zRx4kRPm7P7NT09XSkpKerSpYsqV66sMmXK5DmtMPL7XgeCMUZvvvmmBg0alGteRkaGZs+erccff1wzZszINf/BBx/UggUL9MYbb2jnzp36+uuvdfvtt+f6vYyPj9esWbO8pv31119atmyZ4uLicq138ODBSk5O1p49ezR//nw1aNBAffr00f333+/V7t5779VHH32kI0eOFGLPAeSbAVCipKWlmYiICLNz507Tu3dvM3HiRK/5y5cvN5LMokWLTMOGDU1ISIhp2bKl2bJli6fN3r17zc0332yio6NNeHi4adCggfnyyy898xMSEsxVV11lgoODTWxsrHniiSfM6dOnPfPbt29vRo4c6XktyXz66adedURFRZmZM2d65p/50759e0+7adOmmXr16pmQkBBTt25d89Zbb51z348ePWokmYSEhHO2qVatmte2qlWrZowxZvfu3eaWW24xFStWNKVLlzYtWrQwS5cuzbXsxIkTzb333msiIiJMfHy8mTp1qlebH3/80TRp0sSEhISY5s2bmwULFhhJZuPGjcYYY5xOpxk4cKCpXr26CQ0NNXXq1DGvvvqq1zr69+9vbr31VjNhwgQTFxdnqlevnq9157y3R48eNcZkvw9n960kk5SU5OmvQYMGmQoVKpgyZcqYjh07msTERK9aXnzxRVOxYkUTERFhBg4caJ544gnTuHHjc/ZvUlKSkWSefvppU7t2ba95derUMc8884xXDcYYs2XLFnPjjTea0qVLm4oVK5p+/fqZgwcPeuZ/9dVXpk2bNiYqKsqUK1fOdOvWzezevTvXNufPn286dOhgwsLCTKNGjcyaNWvOWacx2e/nK6+8kmv6s88+a+x2u9m5c2eufs3595k/55pmjDErV6401157rQkNDTVVqlQxw4cPN+np6V41PPfcc+aee+4xZcqUMf3798/3chc6Fvft22f69OljypYta8LDw03z5s3NDz/84Jn/2WefmaZNm5qQkBBTo0YNM27cOK/f47P99NNPxm63m9TU1FzzZs2aZa655hpz7NgxEx4ebv744w+v+VFRUWbWrFnnXLcx2cfrkCFDTPny5c2qVas80ydOnGi6d+9uGjdubMaOHevV/sy/MzlmzJhhJOX6/a1Ro4Z59913z1sDAGs4YwGUMJ988onq1aununXrql+/fpoxY4aMMbnaPfbYY5o8ebJ++uknxcTEqHv37jp9+rQk6aGHHlJmZqa+//57bdmyRS+//LIiIiIkZX972LVrV1111VXatGmTpkyZounTp2vChAmFrnndunWSpG+//VbJycmeoQwfffSRnn32WU2cOFE7duzQCy+8oGeeeUbvvfdenuuJiIhQRESEPvvsM2VmZubZ5qeffpIkzZw5U8nJyZ7X6enp6tq1q5YtW6aNGzfqxhtvVPfu3fXHH394LT958mS1aNFCGzdu1NChQzVkyBDt2rXLs46bb75ZDRo00IYNGzRu3Dg9+uijXsu73W5VqVJFc+fO1fbt2/Xss8/qqaee0ieffOLVbtmyZdq1a5eWLl2qRYsW5WvdZ1uwYIGSk5M9Pz179lTdunVVqVIlSdIdd9yhlJQUffXVV9qwYYOaNWumzp07e77V/eSTTzRu3Di98MILWr9+veLi4vT222+fd5s5brnlFh09elSrVq2SJK1atUpHjx5V9+7dvdodO3ZMnTp1UtOmTbV+/Xp9/fXX+vvvv3XnnXd62pw4cUKPPPKI1q9fr2XLlslut+u2226T2+32WteYMWP06KOPKjExUXXq1FHfvn3ldDrzVe+ZRo4cKWOM1zCdHK1bt/a83/Pnz1dycvI5p+3Zs0c33nijevXqpc2bN2vOnDlatWqVhg0b5rXOSZMmqXHjxtq4caOeeeaZfC93oWOxffv2+uuvv7Rw4UJt2rRJjz/+uKfPVq5cqX/84x8aOXKktm/frqlTp2rWrFleZ2rOtnLlStWpUyfPszHTp09Xv379FBUVpZtuuinXWYfY2FgtXrxYaWlp5+374OBg3X333Zo5c6Zn2qxZszRw4MDzLnem/v37q2zZsrmGRF199dVauXJlvtcDoBACnWwA+Fbr1q0934CfPn3aVKhQwfPtqTH//9vX2bNne6YdPnzYhIWFmTlz5hhjjGnYsKEZN25cnut/6qmnTN26dY3b7fZMe+utt0xERIRxuVzGmIKfscj5xjnnm/ccl19+ufn444+9pj3//POmVatW59z/efPmmbJly5rQ0FDTunVr8+STT5pNmzZ5tcmrnrxcccUV5o033vC8rlatmunXr5/ntdvtNhUrVjRTpkwxxhgzdepUU758eXPy5ElPmylTpuS5b2d66KGHTK9evTyv+/fvbypVqmQyMzM90/Kz7rPPWJzpP//5j4mOjja7du0yxmR/Ix4ZGWlOnTrl1e7yyy/3fPPdqlUrM3ToUK/5LVu2zNcZi40bN5pRo0aZe++91xhjzL333msefvhhs3HjRq8zFs8//7y54YYbvNaxb98+I8lT69kOHjxoJHnOsuVs88xvo7dt22YkmR07dpyz1nOdsTDGmEqVKpkhQ4YYY3L3a86ZsTN/r/KaNmjQIHP//fd7rXflypXGbrd73sdq1aqZHj16eLXJ73IXOhbLlCljDh8+nOf+de7c2bzwwgte0z744AMTFxeXZ3tjjBk5cqTp1KlTrum//PKLKVWqlOcs06effmpq1Kjh9TdixYoVpkqVKqZUqVKmRYsWZtSoUV5nJYz5/383EhMTTZkyZUx6erpZsWKFqVixojl9+nS+z1gYk32c3nTTTV7THn74YdOhQ4dz7h8A6zhjAZQgu3bt0rp169S3b19JUlBQkHr37q3p06fnatuqVSvPv8uVK6e6detqx44dkqQRI0ZowoQJatOmjcaOHavNmzd72u7YsUOtWrXyGsffpk0bpaen+/SuKydOnNCePXs0aNAgz5mIiIgITZgwQXv27Dnncr169dL+/fu1cOFC3XjjjUpISFCzZs1yfYN6tvT0dD366KOqX7++oqOjFRERoR07duQ6Y9GoUSPPv202m2JjY5WSkiIpu28aNWqk0NBQT5sz+znHW2+9pebNmysmJkYRERF65513cm2nYcOGCg4O9rzO77rz8tVXX2n06NGaM2eO6tSpI0natGmT0tPTVb58ea/+TUpK8vTvjh071LJlS6915XebkjRw4EDNnTtXBw4c0Ny5c/P81nnTpk1avny5Vw316tWTJE8dv/76q/r27auaNWsqMjJS1atXl6Tzvjc54/Fz3puCMsZYvlZl06ZNmjVrlte+denSRW63W0lJSZ52LVq0KNRy5zsWExMT1bRpU5UrV+6ctT333HNe28i5XiEjIyPPZU6ePOl1/OWYMWOGunTpogoVKkiSunbtquPHj3tdBN+uXTv99ttvWrZsmW6//XZt27ZNbdu2zfMi98aNG6t27dqaN2+eZsyYoXvuuUdBQUF51nQueb1/YWFh59w3AL5RsN9UABe16dOny+l0qnLlyp5pxhiFhITozTffzPfdgu677z516dJFX375pZYsWaIXX3xRkydP1vDhwwtVl81myzUcK2fY1bmkp6dLkqZNm5brw63D4TjvsqGhobr++ut1/fXX65lnntF9992nsWPHasCAAedc5tFHH9XSpUs1adIk1apVS2FhYbr99ttzXUxbqlSpXPt29pCc85k9e7YeffRRTZ48Wa1atVKZMmX073//Wz/++KNXu9KlS+d7neezfft29enTRy+99JJuuOEGz/T09HTFxcUpISEh1zLR0dE+2XbDhg1Vr1499e3bV/Xr19eVV16Z685f6enp6t69u15++eVcy+eEg+7du6tatWqaNm2aKleuLLfbrSuvvPK8703Oh8qCvDc5Dh8+rIMHD6pGjRoFXvZM6enpeuCBBzRixIhc86pWrer599nvdX6XO9+xGBYWdsHaxo8fr549e+aal1d4kLLvrrRlyxavaS6XS++9954OHDjg9eHf5XJpxowZ6ty5s1e9bdu2Vdu2bfXEE09owoQJeu655/TEE094hWgpO5S+9dZb2r59u2eoZH65XC79+uuvuuqqq7ymHzlyRDExMQVaF4CCIVgAJYTT6dT777+vyZMne32AlKQePXrof//7nx588EHPtB9++MHzIeXo0aP65ZdfVL9+fc/8+Ph4Pfjgg3rwwQf15JNPatq0aRo+fLjq16+v+fPne30juHr1apUpU0ZVqlTJs7aYmBglJyd7Xv/6669e3xzmfKhwuVyeaZUqVVLlypX122+/6e677y5st0iSGjRo4HV72VKlSnltK2cfBgwYoNtuu01S9gevgt4StX79+vrggw906tQpz4ezH374Idd2WrduraFDh3qmne8MTEHWfbZDhw6pe/fu6tWrlx5++GGvec2aNfN8GMw5A5DXNn/88Uf94x//8Ey70DbPNnDgQA0dOlRTpkzJc36zZs00f/58Va9ePc9vpQ8fPqxdu3Zp2rRpatu2rSR5rtsoKq+99prsdrt69OhhaT3NmjXT9u3bVatWLb8sd6ZGjRrp3Xff1ZEjR/I8a9GsWTPt2rWrQNto2rSppkyZ4vW7n3PdxMaNG70C/9atW3Xvvffq2LFj5wyqDRo0kNPp1KlTp3IFi7vuukuPPvqoGjdurAYNGuS7Rin77mNHjx5Vr169vKZv3bpVHTp0KNC6ABQMQ6GAEmLRokU6evSoBg0apCuvvNLrp1evXrmGQz333HNatmyZtm7dqgEDBqhChQqeD1KjRo3SN998o6SkJP38889avny5J3QMHTpU+/bt0/Dhw7Vz5059/vnnGjt2rB555BHZ7Xn/SenUqZPefPNNbdy4UevXr9eDDz7o9W1rxYoVFRYW5rlw9/jx45Kk8ePH68UXX9Trr7+uX375RVu2bNHMmTP1n//8J8/tHD58WJ06ddKHH36ozZs3KykpSXPnztW//vUv3XrrrZ521atX17Jly3TgwAEdPXpUklS7dm0tWLBAiYmJ2rRpk+66664Cf9t91113yWazafDgwdq+fbsWL16sSZMmebWpXbu21q9fr2+++Ua//PKLnnnmGc8F5FbXfbZevXopPDxc48aN04EDBzw/LpdL1113nVq1aqUePXpoyZIl2rt3r9asWaMxY8Zo/fr1krIvYp4xY4ZmzpypX375RWPHjtW2bdsK1CeDBw/WwYMHdd999+U5/6GHHtKRI0fUt29f/fTTT9qzZ4+++eYb3XvvvXK5XCpbtqzKly+vd955R7t379Z3332nRx55pEA1nE9aWpoOHDigffv26fvvv9f999+vCRMmaOLEiZY+2EvSE088oTVr1mjYsGFKTEzUr7/+qs8//zzXRdi+Wu5Mffv2VWxsrHr06KHVq1frt99+0/z587V27VpJ0rPPPqv3339f48eP17Zt27Rjxw7Nnj1bTz/99DnX2bFjR6Wnp3sdA9OnT1e3bt3UuHFjr785d955p6Kjo/XRRx9Jyn7mxNSpU7Vhwwbt3btXixcv1lNPPaWOHTsqMjIy17bKli2r5ORkLVu27Lz7mZGRoQMHDujPP//UDz/8oCeeeEIPPvighgwZoo4dO3q127BhQ64vXQD4WCAv8ADgOzfffLPp2rVrnvN+/PFHI8ls2rTJcyHqF198Ya644goTHBxsrr76aq8LnIcNG2Yuv/xyExISYmJiYsw999xjDh065Jlf0NvN/vXXX+aGG24wpUuXNrVr1zaLFy/2unjbmOzbysbHxxu73e51u9mPPvrINGnSxAQHB5uyZcuadu3amQULFuS5n6dOnTKjR482zZo1M1FRUSY8PNzUrVvXPP300yYjI8PTbuHChaZWrVomKCjIc7vZpKQk07FjRxMWFmbi4+PNm2++mWs/8rrY9+wLSteuXWsaN25sgoODTZMmTcz8+fO9LrA+deqUGTBggImKijLR0dFmyJAhZvTo0V4XROfcbvZsF1r32RcZK49bzeqMC6dTU1PN8OHDTeXKlU2pUqVMfHy8ufvuu71uFTpx4kRToUIFExERYfr3728ef/zxfF+8nZezL942Jvvi39tuu81ER0ebsLAwU69ePTNq1CjPxb9Lly419evXNyEhIaZRo0YmISHB6wL8vLaZ18XUZzvz1sPBwcGmatWq5s477zTfffedV7vCXrxtjDHr1q0z119/vYmIiDClS5c2jRo18roF9LkuIC/Mcmcfi3v37jW9evUykZGRJjw83LRo0cL8+OOPnvlff/21ad26tQkLCzORkZHm6quvNu+88845+8sYY+68804zevRoY4wxBw4cMEFBQeaTTz7Js+2QIUNM06ZNjTHGvPDCC6ZVq1amXLlyJjQ01NSsWdOMGDHC6+/K+S7Gzmv/zrydcnBwsImLizM333xznn8fPv74Y1O3bt3z7hsA62zG5HEfSgAAgLNs3rxZ119/vfbs2eO5BXVxcM0112jEiBG66667Al0KUKIxFAoAAORLo0aN9PLLL3vdnepid+jQIfXs2dNztzwARYczFgAAAAAs44wFAAAAAMsIFgAAAAAsI1gAAAAAsIxgAQAAAMAyggUAAAAAywgWAAAAACwjWAAAAACwjGABAAAAwDKCBQAAAADL/h+r1Yl6OMbHZwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Variable Before After Balanced\n", + "--------------------------------------------\n", + "X1 0.758 0.063 ✓\n", + "X2 0.564 0.013 ✓\n" + ] + } + ], + "source": [ + "X_cov = df[[\"X1\", \"X2\"]]\n", + "T_vec = df[\"T\"]\n", + "\n", + "# ASMD 계산\n", + "asmd_before = compute_asmd(X_cov, T_vec.values)\n", + "asmd_after = compute_asmd(X_cov, T_vec.values, w)\n", + "\n", + "# plotting 준비\n", + "var_names = list(asmd_before.keys())\n", + "bef = [asmd_before[v] for v in var_names]\n", + "aft = [asmd_after[v] for v in var_names]\n", + "y_pos = list(range(len(var_names)))\n", + "\n", + "# Love plot\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "\n", + "ax.scatter(\n", + " bef, y_pos,\n", + " marker='o',\n", + " color='tomato',\n", + " s=80,\n", + " label='Before IPW',\n", + " zorder=3\n", + ")\n", + "\n", + "ax.scatter(\n", + " aft, y_pos,\n", + " marker='s',\n", + " color='steelblue',\n", + " s=80,\n", + " label='After IPW',\n", + " zorder=3\n", + ")\n", + "\n", + "# before-after 연결선\n", + "for i in range(len(var_names)):\n", + " ax.plot(\n", + " [bef[i], aft[i]],\n", + " [y_pos[i], y_pos[i]],\n", + " color='gray',\n", + " linewidth=0.8,\n", + " zorder=2\n", + " )\n", + "\n", + "# 기준선\n", + "ax.axvline(\n", + " 0.1,\n", + " linestyle='--',\n", + " color='gray',\n", + " alpha=0.7,\n", + " label='Threshold (0.1)'\n", + ")\n", + "\n", + "ax.set_yticks(y_pos)\n", + "ax.set_yticklabels(var_names)\n", + "\n", + "ax.set_xlabel(\"Absolute Standardized Mean Difference (ASMD)\")\n", + "ax.set_title(\"Love Plot: Covariate Balance\")\n", + "\n", + "ax.legend()\n", + "ax.grid(axis='x', alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# 결과 출력\n", + "print(f\"\\n{'Variable':<10} {'Before':>10} {'After':>10} {'Balanced':>10}\")\n", + "print(\"-\" * 44)\n", + "\n", + "for v in var_names:\n", + " b = asmd_before[v]\n", + " a = asmd_after[v]\n", + " ok = \"✓\" if a < 0.1 else \"✗\"\n", + "\n", + " print(f\"{v:<10} {b:>10.3f} {a:>10.3f} {ok:>10}\")" + ] + }, + { + "cell_type": "markdown", + "id": "27b1841d", + "metadata": {}, + "source": [ + "### 조건 2. Weight 안정성" + ] + }, + { + "cell_type": "markdown", + "id": "72186272", + "metadata": {}, + "source": [ + "IPW에서 가중치는 bias를 줄이기 위한 도구이지만, 동시에 **분산을 크게 증가시킬 수 있습니다**. \n", + "특히 일부 관측치의 propensity score가 0 또는 1에 가까우면, 해당 관측치는 매우 큰 가중치를 가지게 되어 추정량이 불안정해집니다.\n", + "\n", + "가중치의 불안정성은 다음과 같은 지표로 확인할 수 있습니다:\n", + "\n", + "- 최대값 (max weight): 큰 값은 extreme weight 존재를 의미 \n", + "- 분위수 (95%, 99%): 상위 꼬리에서 extreme weight 존재 여부 확인 \n", + "- 시각화 (boxplot): 가중치 분포와 이상치 확인\n", + "\n", + "Weight truncation\n", + "\n", + "극단적인 가중치를 완화하기 위해, 일정 기준 이상을 잘라내는 방법을 사용할 수 있다:\n", + "\n", + "$$\n", + "w_i^{\\text{trunc}} = \\min(w_i, c)\n", + "$$\n", + "\n", + "예시:\n", + "```python\n", + "w_trunc = np.clip(w, 0, 20)\n", + "```\n", + "보통 20 수준에서 truncation을 적용한다.\n", + "\n", + "이는 extreme weight를 줄여 분산을 안정화할 수 있지만, 일부 관측치 정보가 줄어들고, 따라서 ATE가 아닌 다른 estimand (ATO)를 보게 됨.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "d70624e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: {'max': 18.64358877046646, 'p95': 4.381409300448245, 'p99': 7.6835220850896135}\n" + ] + } + ], + "source": [ + "def weight_diagnostics(w):\n", + " return {\n", + " \"max\": np.max(w),\n", + " \"p95\": np.percentile(w, 95),\n", + " \"p99\": np.percentile(w, 99)\n", + " }\n", + "\n", + "diag_good = weight_diagnostics(w)\n", + "print(\"Model:\", diag_good)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "711f2e7d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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P9/A6gAYgafAQuApMMCcvF6vKisrA2+CdjqdjPwAJsKboAEgBLvdzqPuACQxBwgAAFgQAQgAAFgOAQgAAFgOAQgAAFiOoQFo06ZNmjZtmlJSUmSz2VRaWhpoO3XqlH72s5/J4XDo0ksvVUpKimbNmqWDBw+e85qLFi2SzWYL2kaOHNnNnwQAAEQTQwNQa2urRo8erVWrVp3VduLECW3fvl0///nPtX37dpWUlGjXrl269dZbv/a611xzjdxud2DbvHlzd5QPAACilKGPwefm5io3NzdkW0JCgtavXx90bOXKlfr2t7+tffv26corr+z0ur169dKQIUPCWisAADCPqJoD1NTUJJvNpv79+5+zX21trVJSUnTVVVfpjjvu0L59+3qmQAAAEBWi5kWIn3/+uX72s59pxowZ53y7Y1ZWllavXq0RI0bI7XZr8eLFcjqdqqmpUb9+/UKe097ervb29sC+x+MJe/0AACByREUAOnXqlG6//Xb5/X698MIL5+x75i21a6+9VllZWRo6dKjefPNN3XPPPSHPKSoq0uLFi8NaMwAAiFwRfwusI/zs3btX69evv+C1ufr376/hw4drz549nfYpLCxUU1NTYNu/f//Flg0AACJYRAegjvBTW1ur9957T4MGDbrga7S0tKiurk7Jycmd9omNjVV8fHzQBgAAzMvQANTS0qLq6mpVV1dLkurr61VdXa19+/bp1KlTKigo0NatW/WHP/xBXq9XjY2Namxs1MmTJwPXmDRpklauXBnYnz9/vioqKtTQ0KCqqirddtttstvtmjFjRk9/PAAAEKEMnQO0detW5eTkBPbnzp0rSZo9e7YWLVqkP/3pT5Kk6667Lui8jRs3BlZ0rqur09GjRwNtBw4c0IwZM3Ts2DElJiZq/Pjx2rJlixITE7v3wwAAgKhh8/v9fqOLiDQej0cJCQlqamridhgAAFHiQr6/I3oOEAAAQHcgAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMvpZXQBANBTvF6vKisr5Xa7lZycLKfTKbvdbnRZAAzACBAASygpKVFGRoZycnI0c+ZM5eTkKCMjQyUlJUaXBsAAXQpAS5Ys0YkTJ8463tbWpiVLllx0UQAQTiUlJSooKJDD4ZDL5VJzc7NcLpccDocKCgoIQYAF2fx+v/9CT7Lb7XK73UpKSgo6fuzYMSUlJcnr9YatQCN4PB4lJCSoqalJ8fHxRpcD4CJ4vV5lZGTI4XCotLRUMTFf/t3n8/mUl5enmpoa1dbWcjsMiHIX8v3dpREgv98vm8121vGPPvpIAwcO7MolAaBbVFZWqqGhQQsXLgwKP5IUExOjwsJC1dfXq7Ky0qAKARjhgiZBDxgwQDabTTabTcOHDw8KQV6vVy0tLXrggQfCXiQAdJXb7ZYkZWZmhmzvON7RD4A1XFAAevbZZ+X3+3X33Xdr8eLFSkhICLT17t1baWlpGjduXNiLBICuSk5OliTV1NRo7NixZ7XX1NQE9QNgDV2aA1RRUaHs7Gxdcskl3VGT4ZgDBJgHc4AA67iQ7+8uvQdowoQJ8vl82r17tw4fPiyfzxfUftNNN3XlsgAQdna7XcuXL1dBQYHy8vJUWFiozMxM1dTUqKioSGVlZSouLib8ABbTpQC0ZcsWzZw5U3v37tVXB5BsNlvUPwUGwFzy8/NVXFysefPmKTs7O3A8PT1dxcXFys/PN7A6AEbo0i2w6667TsOHD9fixYuVnJx81hNhZ84NikbcAgPMiTdBA+Z2Id/fXQpAl156qT766CNlZGR0uchIRgACACD6dPt7gLKysrRnz54uFQcAAGC0854D9Le//S3w88MPP6x58+apsbFRDofjrKfBrr322vBVCAAAEGbnfQssJiZGNpvtrEnPgQv9o80Mk6C5BQYAQPTplsfg6+vrL7owAACASHDec4CGDh163tv52rRpk6ZNm6aUlBTZbDaVlpYGtfv9fj3xxBNKTk5Wnz59NHnyZNXW1n7tdVetWqW0tDTFxcUpKytLH3zwwXnXBAAAzK9L7wH605/+FPK4zWZTXFycMjIylJ6e/rXXaW1t1ejRo3X33XeHfA/Hv//7v+u5557Ta6+9pvT0dP385z/XlClT9MknnyguLi7kNd944w3NnTtXL774orKysvTss89qypQp2rVr11mr1wMAAGvq0mPwnc0HOnMe0Pjx41VaWqoBAwacXyE2m9566y3l5eVJ+mL0JyUlRfPmzdP8+fMlSU1NTRo8eLBWr16tH/3oRyGvk5WVpRtuuEErV66U9MWr7lNTU/Xwww/r8ccfP69amAMEAED06fbH4NevX68bbrhB69evV1NTk5qamrR+/XplZWWprKxMmzZt0rFjxwLBpSvq6+vV2NioyZMnB44lJCQoKytLLpcr5DknT57Utm3bgs6JiYnR5MmTOz1Hktrb2+XxeII2AABgXl26BfaTn/xEL730UtAr5SdNmqS4uDjdf//9+vjjj/Xss8/q7rvv7nJhjY2NkqTBgwcHHR88eHCg7auOHj0qr9cb8pydO3d2+ruKioq0ePHiLtcKAACiS5dGgOrq6kIOLcXHx+t///d/JUlXX321jh49enHV9ZDCwsLASFZTU5P2799vdEkAAKAbdSkAjRkzRgsWLNCRI0cCx44cOaLHHntMN9xwgySptrZWqampXS5syJAhkqRDhw4FHT906FCg7asuu+wy2e32CzpHkmJjYxUfHx+0AQAA8+pSAPrd736n+vp6XXHFFcrIyFBGRoauuOIKNTQ06OWXX5YktbS06F//9V+7XFh6erqGDBmiDRs2BI55PB7993//t8aNGxfynN69e2vMmDFB5/h8Pm3YsKHTcwAAgPV0aQ7QiBEj9Mknn+gvf/mLdu/eHTh2yy23KCbmi0zV8TTXubS0tAStKVZfX6/q6moNHDhQV155pX7605/qF7/4ha6++urAY/ApKSlB1540aZJuu+02zZkzR5I0d+5czZ49W9/61rf07W9/W88++6xaW1v14x//uCsfFQAAmFCXApD0xdNVU6dO1dSpU7v8y7du3aqcnJzA/ty5cyVJs2fP1urVq/XYY4+ptbVV999/v44fP67x48dr3bp1Qe8AqqurC5pr9MMf/lBHjhzRE088ocbGRl133XVat27dWROjAQCAdZ33e4Cee+453X///YqLi9Nzzz13zr6PPPJIWIozCu8BAgAg+lzI9/d5B6D09HRt3bpVgwYNOudbnm02W+BJsGhFAAIAIPp0+2KoLIwKAACiWZeeAutw8uRJ7dq1S6dPnw5XPQAAAN2uSwHoxIkTuueee9S3b19dc8012rdvnyTp4Ycf1i9/+cuwFggAABBuXQpAhYWF+uijj1ReXh70RNbkyZP1xhtvhK04AACA7tClx+BLS0v1xhtvaOzYsbLZbIHj11xzjerq6sJWHAAAQHfo0gjQkSNHlJSUdNbx1tbWoEAE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.boxplot(w)\n", + "plt.ylabel(\"weight\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d6f916fc", + "metadata": {}, + "source": [ + "상황에 따라 weight truncation을 적용할 수 있으며, 여기서는 적용하지 않겠습니다." + ] + }, + { + "cell_type": "markdown", + "id": "a9c0df23", + "metadata": {}, + "source": [ + "### Hájek ATE 추정 및 신뢰구간" + ] + }, + { + "cell_type": "markdown", + "id": "cbb82b1e", + "metadata": {}, + "source": [ + "최종 효과 추정은 Hajek estimator를 사용합니다. 이는 IPW estimator를 각 군 내부에서 정규화한 형태로, extreme weight에 덜 민감하다고 알려져있습니다.\n", + "Hajek estimator는 각 군의 weighted mean 차이로 해석할 수 있으며, IPW의 분산을 완화한 효과 추정량으로 자주 사용됩니다.\n", + "\n", + "$$\n", + "\\hat{ATE} = \\frac{\\sum_{i=1}^n T_i w_i Y_i}{\\sum_{i=1}^n T_i w_i} -\n", + "\\frac{\\sum_{i=1}^n (1-T_i) w_i Y_i}{\\sum_{i=1}^n (1-T_i) w_i}\n", + "$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "a303f32b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hájek ATE: 2.010314743855869\n" + ] + } + ], + "source": [ + "def hajek_ate(Y, T, ps_hat):\n", + " w = np.where(T == 1, 1 / ps_hat, 1 / (1 - ps_hat))\n", + " \n", + " mu1 = np.sum(T * w * Y) / np.sum(T * w)\n", + " mu0 = np.sum((1 - T) * w * Y) / np.sum((1 - T) * w)\n", + " \n", + " return mu1 - mu0\n", + "\n", + "Y = df[\"Y\"].values\n", + "T = df[\"T\"].values\n", + "\n", + "ate_hajek = hajek_ate(Y, T, ps_hat)\n", + "print(\"Hájek ATE:\", ate_hajek)" + ] + }, + { + "cell_type": "markdown", + "id": "5b5f64ce", + "metadata": {}, + "source": [ + "신뢰구간은 추정값의 불확실성을 정량화할 수 있는 방법으로 여기서는 다음과 같이 계산됩니다.\n", + "\n", + "IPW에서의 신뢰구간 추정은 propensity score 자체가 추정량이며, 가중치와 분모에도 추정량이 포함되어 있어 이론적 분산 계산이 까다롭습니다. \n", + "여기서는 bootstrap을 이용하여 신뢰구간을 추정하고 결과를 시각화하겠습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "bd8948a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ATE: 2.014496869751614\n", + "95% CI: [1.82360064 2.20068587]\n" + ] + } + ], + "source": [ + "def bootstrap_hajek(df, B=1000):\n", + " n = len(df)\n", + " ates = []\n", + " \n", + " for _ in range(B):\n", + " idx = np.random.choice(n, size=n, replace=True)\n", + " df_b = df.iloc[idx]\n", + " \n", + " X = df_b[[\"X1\", \"X2\"]].values\n", + " T = df_b[\"T\"].values\n", + " Y = df_b[\"Y\"].values\n", + " \n", + " ps_model = LogisticRegression(max_iter=1000)\n", + " ps_model.fit(X, T)\n", + " ps_hat_b = ps_model.predict_proba(X)[:, 1]\n", + " \n", + " ate = hajek_ate(Y, T, ps_hat_b)\n", + " ates.append(ate)\n", + " \n", + " ates = np.array(ates)\n", + " \n", + " return {\n", + " \"ATE\": ates.mean(),\n", + " \"CI\": np.percentile(ates, [2.5, 97.5]),\n", + " \"samples\": ates\n", + " }\n", + "\n", + "res = bootstrap_hajek(df, B=1000)\n", + "\n", + "print(\"ATE:\", res[\"ATE\"])\n", + "print(\"95% CI:\", res[\"CI\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "9f8d44a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHHCAYAAACle7JuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+BElEQVR4nO3df3zN9f//8fvZbGdjtpnYjNn8qPwKRdib/EqNlnhHSeqN0I/3JK0frB9EauIt+oGiRZS89YM+IZKkX2PR21soqfdE2FRvNr/287y+f/R13o5tbDvbXue1c7teLufSOa9f53FeW0/3PV/P1/PYDMMwBAAAYEE+ZhcAAABQXgQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAECxtm3bpilTpujo0aNmlwKUiCADoEIsXrxYNptN+/fvdy7r2bOnevbsWSXvb7PZ9NRTTzlfP/XUU7LZbPr999+r5P1jYmI0YsSIKnmv4syYMUMtWrSQw+GokOP98ccf+utf/6r8/HzVr1/fZV1xP+vSGjFihIKCgi66XZcuXfToo4+W+fjwPgQZVFtnG9tzH/Xr11evXr300UcfVfr7z5s3T4sXLy7XvmvXrnX5R9mbfP3113rqqad0/Phxs0spwlNry87O1nPPPacJEybIx+d/zbrNZtPYsWOL3efs/x/btm0rss4wDA0fPlw9e/bUtGnTKq3uC5kwYYLmzp2rjIwMU94f1kGQQbU3depULV26VEuWLNGjjz6q3377TTfccINWr15dqe/rbpCZMmVKxRZkgo8//lgff/xxmfb5+uuvNWXKlDKHhTNnzuiJJ54o0z5ldaHa9u7dq4ULF1bq+5fk9ddfV0FBgYYOHVohx0tPT1e3bt2UkpJS7Po777xTZ86cUXR0dIW8X3EGDBig4OBgzZs3r9LeA9VDDbMLACpbv3791LFjR+frUaNGKTw8XG+//bZuvPFGEyurGAUFBXI4HPL39ze7lCIquyaHw6G8vDwFBAQoICCgUt/rYux2u2nvvWjRIt10000Vdg6aNm2qiRMnlrje19dXvr6+FfJeJfHx8dHgwYO1ZMkSTZkyRTabrVLfD9ZFjwy8TmhoqAIDA1WjhmuOP3XqlB566CFFRUXJbrfr8ssv1z/+8Q+d/wXxBQUFevrpp9WsWTPZ7XbFxMToscceU25urnObmJgY7d69W5s3b3Ze1jo7ViQ/P19TpkzRpZdeqoCAANWtW1fdunXThg0bJP05hmDu3LmS5HJZTJL2798vm82mf/zjH5ozZ46zhj179igvL0+TJk1Shw4dFBISolq1aumaa67Rpk2bXOo/9xizZ89WdHS0AgMD1aNHD+3atatU53D37t3q3bu3AgMD1ahRI02bNq3YsRnFjZF56aWX1Lp1a9WsWVN16tRRx44dtWzZMkl/jmt55JFHJElNmjRxfvazYzHOXip566231Lp1a9ntdq1bt865rrjLcb///rtuvfVWBQcHq27dunrggQeUk5NT5HwU13t27jEvVltxY2T+85//6JZbblFYWJhq1qypLl26aM2aNS7bfPbZZ7LZbFqxYoWeeeYZNWrUSAEBAbr22mv1008/FanpfOnp6dq5c6f69Olz0W0vZufOnRoxYoSaNm2qgIAARURE6K677tIff/zhsl1JY2Q++ugjXXPNNapVq5Zq166t+Ph47d69+6Lvu2PHDtWrV089e/bUyZMnncuvu+46/fLLL9qxY4fbnw3VFz0yqPaysrL0+++/yzAMHT16VC+99JJOnjypO+64w7mNYRi66aabtGnTJo0aNUrt27fX+vXr9cgjj+jQoUOaPXu2c9vRo0frjTfe0ODBg/XQQw9p69atSk5O1vfff6+VK1dKkubMmaP7779fQUFBevzxxyVJ4eHhkv78BzE5OVmjR49Wp06dlJ2drW3btunbb7/Vddddp3vuuUeHDx/Whg0btHTp0mI/06JFi5STk6O7775bdrtdYWFhys7O1muvvaahQ4dqzJgxOnHihFJSUhQXF6e0tDS1b9/e5RhLlizRiRMnlJCQoJycHL3wwgvq3bu3vvvuO2etxcnIyFCvXr1UUFCgiRMnqlatWlqwYIECAwMv+rNYuHChxo0bp8GDBzsDxc6dO7V161bdfvvtuvnmm/Xjjz/q7bff1uzZs3XJJZdIkurVq+c8xqeffqoVK1Zo7NixuuSSSxQTE3PB97z11lsVExOj5ORkbdmyRS+++KKOHTumJUuWXLTec5WmtnNlZmbqL3/5i06fPq1x48apbt26euONN3TTTTfp3Xff1V//+leX7adPny4fHx89/PDDysrK0owZMzRs2DBt3br1gnV9/fXXkqSrrrqq2PU5OTnFDng+NzCctWHDBv38888aOXKkIiIitGvXLi1YsEC7d+/Wli1bLtgrsnTpUg0fPlxxcXF67rnndPr0ac2fP1/dunXTv/71rxJ/Tt98843i4uLUsWNHffDBBy6/Rx06dJAkffXVV7ryyitLfG94OQOophYtWmRIKvKw2+3G4sWLXbZdtWqVIcmYNm2ay/LBgwcbNpvN+OmnnwzDMIwdO3YYkozRo0e7bPfwww8bkoxPP/3Uuax169ZGjx49itTVrl07Iz4+/oK1JyQkGMX975menm5IMoKDg42jR4+6rCsoKDByc3Ndlh07dswIDw837rrrriLHCAwMNH799Vfn8q1btxqSjAcffPCCtY0fP96QZGzdutW57OjRo0ZISIghyUhPT3cu79Gjh8s5GDBggNG6desLHn/mzJlFjnOWJMPHx8fYvXt3sesmT57sfD158mRDknHTTTe5bPf3v//dkGT8+9//Ngzjf+dj0aJFFz3mhWqLjo42hg8f7nx99jx98cUXzmUnTpwwmjRpYsTExBiFhYWGYRjGpk2bDElGy5YtXX5+L7zwgiHJ+O6774q817meeOIJQ5Jx4sSJYuu/2OObb75xbn/y5Mkix3jzzTcNScbnn3/uXHb2/62z5+HEiRNGaGioMWbMGJd9MzIyjJCQEJflw4cPN2rVqmUYhmF8+eWXRnBwsBEfH2/k5OQU+/n8/f2N++6774LnAN6NS0uo9ubOnasNGzZow4YNevPNN9WrVy+NHj1a77//vnObtWvXytfXV+PGjXPZ96GHHpJhGM67nNauXStJSkxMLLKdpCKXDYoTGhqq3bt3a9++feX+TIMGDSrSE+Dr6+sck+JwOPTf//5XBQUF6tixo7799tsixxg4cKAaNmzofN2pUyd17tzZ+RlLsnbtWnXp0kWdOnVyLqtXr56GDRt20bpDQ0P166+/6ptvvrnotiXp0aOHWrVqVertExISXF7ff//9knTRz+mutWvXqlOnTurWrZtzWVBQkO6++27t379fe/bscdl+5MiRLmOKrrnmGkl/Xp66kD/++EM1atQo8ZbmAQMGOH//z32cvUx2rlq1ajmfG4ahnJwcXX/99ZJU7O/QWRs2bNDx48c1dOhQ/f77786Hr6+vOnfuXOTypiRt2rRJcXFxuvbaa/X++++XOMaoTp06VXYLPayJS0uo9jp16uQy2Hfo0KG68sorNXbsWN14443y9/fXL7/8osjISNWuXdtl35YtW0qSfvnlF+d/fXx81Lx5c5ftIiIiFBoa6tzuQqZOnaoBAwbosssuU5s2bdS3b1/deeedatu2bak/U5MmTYpd/sYbb2jWrFn64YcflJ+ff8HtL7300iLLLrvsMq1YseKC7/3LL7+oc+fORZZffvnlFytbEyZM0CeffKJOnTqpefPmuv7663X77bera9euF933rJI+e0nO/5zNmjWTj49PueZAKYuSztO5v1Nt2rRxLm/cuLHLdnXq1JEkHTt2zK06GjVqVOz4mV9//bXIsqysLE2fPl3//Oc/dejQIeXl5bmsK8nZUN67d+9i1wcHB7u8zsnJUXx8vDp06KAVK1YUGa92LsMwGOiLC6JHBl7Hx8dHvXr10pEjR8rdK+JOw9q9e3f9/PPPev3119WmTRu99tpruuqqq/Taa6+V+hjFjUd58803NWLECDVr1kwpKSlat26dNmzYoN69e1fYJGnuatmypfbu3avly5erW7dueu+999StWzdNnjy51McozVicCzn/Z1fSz7KwsNCt9ymrku4CMs4bbH6+unXrqqCgQCdOnHC7hiFDhujll1/WPffco9WrV+vrr7/WF198IUkX/B06u27p0qXF9v588MEHLtvb7XbFx8dr69atzsHaJTl+/LhzPBJQHHpk4JUKCgok/W/AY3R0tD755BOdOHHCpVfmhx9+cK4/+1+Hw6F9+/Y5/7KW/hzYefz4cZd5NS4UdsLCwjRy5EiNHDlSJ0+eVPfu3fXUU09p9OjRF923JO+++66aNm2q999/32X/kkJCcSHuxx9/vOjg2ejo6GL33bt3b6nqrFWrloYMGaIhQ4YoLy9PN998s5555hklJSUpICCgwv/63rdvn0svzk8//SSHw+H8nGd7Ps6fG6a43rWy1BYdHV3sOTn/d8pdLVq0kPTn3Utl6dU73/Hjx7V+/XpNmzZNEyZMcC7/8ccfL7pvs2bNJEn169cv1d1TNptNb731lgYMGKBbbrlFH330UbEzQJ/tFTr3/zXgfPTIwOvk5+fr448/lr+/v7OBvOGGG1RYWKiXX37ZZdvZs2fLZrOpX79+zu2kP+9KOtfzzz8vSYqPj3cuq1WrVrETp51/K2tQUJCaN2/ucvv22bEKZZkU7uxf9Of+Bb9161alpqYWu/2qVat06NAh5+u0tDRt3brV+VlLcsMNN2jLli1KS0tzLvvtt9/01ltvXbTG8z+7v7+/WrVqJcMwnJfCyvPZL+TsrexnvfTSS5Lk/JzBwcG65JJL9Pnnn7tsV9xEbGWp7YYbblBaWprL+T916pQWLFigmJiYMo3zuZDY2FhJKnaG3rI4OyPwuZckJWnWrFkX3TcuLk7BwcF69tlni+wv/fn7cT5/f3+9//77uvrqq9W/f3+X36eztm/fLkn6y1/+UqrPAO9EjwyqvY8++sj5V/DRo0e1bNky7du3TxMnTnReu+/fv7969eqlxx9/XPv371e7du308ccf64MPPtD48eOdf3G2a9dOw4cP14IFC3T8+HH16NFDaWlpeuONNzRw4ED16tXL+b4dOnTQ/PnzNW3aNDVv3lz169dX79691apVK/Xs2VMdOnRQWFiYtm3bpnfffddlKvmzt52OGzdOcXFx8vX11W233XbBz3njjTfq/fff11//+lfFx8crPT1dr7zyilq1alXsrbbNmzdXt27ddN999yk3N1dz5sxR3bp1L/r9No8++qiWLl2qvn376oEHHnDefh0dHa2dO3decN/rr79eERER6tq1q8LDw/X999/r5ZdfVnx8vLMn7Oxnf/zxx3XbbbfJz89P/fv3dxmIWhbp6em66aab1LdvX6WmpurNN9/U7bffrnbt2jm3GT16tKZPn67Ro0erY8eO+vzzz4vtiShLbRMnTtTbb7+tfv36ady4cQoLC9Mbb7yh9PR0vffeey5fJeCOpk2bqk2bNvrkk0901113lfs4wcHB6tatm2bOnKmCggI1bNhQ69ev14EDB0q17/z583XnnXfqqquu0m233aZ69erpwIEDWrNmjbp27VrkjwTpz8uEq1evVu/evdWvXz9t3rzZZdzQhg0b1LhxY269xoWZecsUUJmKu/06ICDAaN++vTF//nzD4XC4bH/ixAnjwQcfNCIjIw0/Pz/j0ksvNWbOnFlku/z8fGPKlClGkyZNDD8/PyMqKspISkoqcvtoRkaGER8fb9SuXduQ5LwNedq0aUanTp2M0NBQIzAw0GjRooXxzDPPGHl5ec59CwoKjPvvv9+oV6+eYbPZnLdin71VeObMmUU+r8PhMJ599lkjOjrasNvtxpVXXmmsXr3aGD58uBEdHe3c7txjzJo1y4iKijLsdrtxzTXXOG9Jvpid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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(res[\"samples\"], bins=40)\n", + "plt.axvline(res[\"CI\"][0], linestyle=\"--\")\n", + "plt.axvline(res[\"CI\"][1], linestyle=\"--\")\n", + "plt.xlabel(\"ATE\")\n", + "plt.ylabel(\"count\")\n", + "plt.title(\"Bootstrap distribution (Hájek)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f547d3b2", + "metadata": {}, + "source": [ + "## Real Data" + ] + }, + { + "cell_type": "markdown", + "id": "882436bb", + "metadata": {}, + "source": [ + "앞에서는 시뮬레이션 데이터로 IPW의 전체 절차를 살펴보았습니다. 이제 동일한 절차를 실제 데이터에 적용해 보겠습니다.\n", + "\n", + "여기서는 인과추론 분야의 대표적인 예제인 **NHEFS** (National Health and Nutrition Examination Survey Data I Epidemiologic Follow-up Study) 데이터를 사용합니다.\n", + "\n", + "- 연구 질문: **금연이 체중 변화에 미치는 인과 효과는 얼마인가?**\n", + "- Treatment $T$ (`qsmk`): 1971\\~1982 사이 금연 여부 (1 = 금연, 0 = 계속 흡연)\n", + "- Outcome $Y$ (`wt82_71`): 11년 간 체중 변화 (kg)" + ] + }, + { + "cell_type": "markdown", + "id": "34239024", + "metadata": {}, + "source": [ + "**데이터 불러오기**" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "faaefaac", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "샘플 수: 1566\n", + "금연 비율: 0.257\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
qsmkwt82_71sexageraceeducationsmokeintensitysmokeyrsexerciseactivewt71
00.0-10.093960042.01130.029.02079.04
10.02.604970036.00220.024.00058.63
20.09.414486156.01220.026.02056.81
30.04.990117068.0113.053.02159.42
40.04.989251040.00220.019.01187.09
\n", + "
" + ], + "text/plain": [ + " qsmk wt82_71 sex age race education smokeintensity smokeyrs \\\n", + "0 0.0 -10.093960 0 42.0 1 1 30.0 29.0 \n", + "1 0.0 2.604970 0 36.0 0 2 20.0 24.0 \n", + "2 0.0 9.414486 1 56.0 1 2 20.0 26.0 \n", + "3 0.0 4.990117 0 68.0 1 1 3.0 53.0 \n", + "4 0.0 4.989251 0 40.0 0 2 20.0 19.0 \n", + "\n", + " exercise active wt71 \n", + "0 2 0 79.04 \n", + "1 0 0 58.63 \n", + "2 2 0 56.81 \n", + "3 2 1 59.42 \n", + "4 1 1 87.09 " + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# NHEFS 데이터 로드: causaldata 패키지 사용 (pip install causaldata)\n", + "from causaldata import nhefs\n", + "\n", + "nhefs_df = nhefs.load_pandas().data\n", + "\n", + "# 분석에 필요한 변수만 선택\n", + "cols = ['qsmk', 'wt82_71', 'sex', 'age', 'race', 'education',\n", + " 'smokeintensity', 'smokeyrs', 'exercise', 'active', 'wt71']\n", + "nhefs_df = nhefs_df[cols].dropna().reset_index(drop=True)\n", + "\n", + "print(f\"샘플 수: {len(nhefs_df)}\")\n", + "print(f\"금연 비율: {nhefs_df['qsmk'].mean():.3f}\")\n", + "nhefs_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "1b7f1c7c", + "metadata": {}, + "source": [ + "먼저 **단순 비교 (naive)** 결과를 살펴봅시다." + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "a5750610", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naive ATE: 2.541 kg\n" + ] + } + ], + "source": [ + "naive_ate = (\n", + " nhefs_df.query(\"qsmk==1\")[\"wt82_71\"].mean()\n", + " - nhefs_df.query(\"qsmk==0\")[\"wt82_71\"].mean()\n", + ")\n", + "print(f\"Naive ATE: {naive_ate:.3f} kg\")" + ] + }, + { + "cell_type": "markdown", + "id": "9dc9e8fc", + "metadata": {}, + "source": [ + "### 적절한 공변량 선택\n", + "\n", + "- Confounders $X$: 성별(`sex`), 인종(`race`), 나이(`age`), 학력(`education`), 흡연량(`smokeintensity`), 흡연 기간(`smokeyrs`), 운동량(`exercise`), 활동 수준(`active`), 1971년 체중(`wt71`)\n", + "\n", + "흡연자 (T)는 보통 더 마른 경향이 있고, 금연 결심에 영향을 주는 요인(나이, 건강 상태 등)이 체중 변화(Y)에도 영향을 주기 때문에, 단순 비교는 금연의 효과를 과소추정하게 됩니다." + ] + }, + { + "cell_type": "markdown", + "id": "674d2a4b", + "metadata": {}, + "source": [ + "단순 비교만으로는 금연 집단이 체중이 약 2.5kg 정도 더 증가한 것으로 보이지만, 이는 confounding이 섞인 결과일 수 있습니다. 예를 들어, 금연한 사람은 평균적으로 나이가 더 많고, 흡연량이 적었던 경우가 많아 체중 변화 양상도 다를 수 있습니다.\n", + "\n", + "이제 IPW로 보정한 효과를 추정해보겠습니다." + ] + }, + { + "cell_type": "markdown", + "id": "459b02ba", + "metadata": {}, + "source": [ + "### 가중치 계산\n", + "\n", + "연속형 공변량은 비선형 효과를 잡기 위해 제곱항을 추가하고, 범주형 변수(`education`, `exercise`, `active`)는 one-hot encoding 처리하여 진행했습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "6871110b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimated PS range: [0.054, 0.788]\n" + ] + } + ], + "source": [ + "X_nhefs = nhefs_df[['sex', 'age', 'race', 'smokeintensity', 'smokeyrs', 'wt71']].copy()\n", + "\n", + "# 연속형 변수에 제곱항 추가\n", + "X_nhefs['age_sq'] = X_nhefs['age']**2\n", + "X_nhefs['smokeintensity_sq'] = X_nhefs['smokeintensity']**2\n", + "X_nhefs['smokeyrs_sq'] = X_nhefs['smokeyrs']**2\n", + "X_nhefs['wt71_sq'] = X_nhefs['wt71']**2\n", + "\n", + "# 범주형 변수 one-hot encoding\n", + "X_nhefs = pd.concat([\n", + " X_nhefs,\n", + " pd.get_dummies(nhefs_df[['education', 'exercise', 'active']],\n", + " columns=['education', 'exercise', 'active'],\n", + " drop_first=True, dtype=float)\n", + "], axis=1)\n", + "\n", + "T_nhefs = nhefs_df['qsmk'].astype(int).values\n", + "Y_nhefs = nhefs_df['wt82_71'].values\n", + "\n", + "# 표준화 후 PS 추정\n", + "scaler = StandardScaler()\n", + "X_nhefs_s = scaler.fit_transform(X_nhefs.values)\n", + "\n", + "ps_model_nhefs = LogisticRegression(max_iter=5000)\n", + "ps_model_nhefs.fit(X_nhefs_s, T_nhefs)\n", + "ps_hat_nhefs = ps_model_nhefs.predict_proba(X_nhefs_s)[:, 1]\n", + "\n", + "print(f\"Estimated PS range: [{ps_hat_nhefs.min():.3f}, {ps_hat_nhefs.max():.3f}]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "fa332e06", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAHWCAYAAABt3aEVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABXFElEQVR4nO3dd1yV9f//8ScbFAEnoKLgNkduQy1zr0g/WY6vuVIbrsyGWTnS1NyWmqY5sjTLHNUnQxNHuXOVe0VmJqip4EhQeP/+6Mf5eATMg8iBy8f9dju3OO/rfV3X67w52JM37+s6LsYYIwAAAMACXJ1dAAAAAJBZCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAcpzQ0FB169bN2WUgkzn7+zpu3DiVK1dOycnJTqshq1y/fl0hISH64IMPnF0KkOkIt0AOMX/+fLm4uNge3t7eKlOmjPr27avY2Fhnl+dUBw4c0PDhw/Xbb79l+rG/+eYb1a9fX4UKFVKuXLlUokQJtWvXTpGRkZl+rqxw/fp1vf/++6pZs6by5MkjX19f1axZU++//76uX7/u7PKcJj4+XmPHjtWgQYPk6vq//zWm/LxNnDgx1T4pP5M7duywtQ0fPlwuLi46d+5cmucJDQ3VY489Ztd288/1rY/nn3/e1q9bt27p9rv5/bh37149+eSTKl68uLy9vVWkSBE1adJEU6dOtfXx8PDQwIEDNWrUKF27ds3xAQOyMXdnFwDAMSNGjFBYWJiuXbumjRs3asaMGVq5cqX27dunXLlyObu8LHH48GG7AHLgwAG9/fbbevTRRxUaGppp55kwYYJeffVV1a9fX4MHD1auXLl07NgxrVmzRosXL1bz5s0z7VxZ4cqVK2rVqpU2bNigxx57TN26dZOrq6siIyP14osvatmyZfr222+VO3duZ5ea5ebOnasbN26oY8eOaW4fP368XnjhhXv2M9akSRN16dIlVXuZMmXsnnt5eemjjz5K1e/BBx+UJG3evFkNGjRQsWLF1KtXLwUFBenkyZPaunWr3nvvPfXr18+2T/fu3fX6669r0aJFeuaZZzL5FQHOQ7gFcpgWLVqoRo0akqSePXsqf/78mjRpkr766qt0/8d85coVSwUWLy+ve36OGzduaOTIkWrSpIlWr16davuZM2fueQ0pkpOTlZiYKG9v77s6zsCBA7VhwwZNnTpVffv2tbW/8MILmj59uvr27atXXnlFM2bMuNuS75gxRteuXZOPj0+WnTMt8+bN0+OPP57mGFepUkV79uzRzJkzNXDgwHty/jJlyujpp5/+137u7u637Tdq1Cj5+/vrp59+UkBAgN22W9+zAQEBatq0qebPn0+4haWwLAHI4Ro2bChJio6OlvTPny59fX11/PhxtWzZUnny5FGnTp0k/RNyX375ZYWEhMjLy0tly5bVhAkTZIyxO6aLi4v69u2rhQsXqmzZsvL29lb16tX1ww8/pDr/qVOn9MwzzygwMFBeXl6qUKGC5s6da9dn/fr1cnFx0RdffKFRo0apaNGi8vb2VqNGjXTs2DG7vkePHlXbtm0VFBQkb29vFS1aVB06dFBcXJytz81rM+fPn6+nnnpKktSgQQPbn2nXr1+vrl27qkCBAmn+ub1p06YqW7ZsuuN67tw5xcfHq27dumluL1SokN3za9euafjw4SpTpoy8vb0VHBysJ554QsePH7f1ycj4V6hQQV5eXrY/O9/JeKfljz/+0Jw5c9SwYUO7YJuiT58+atCggT766CP98ccfkqSKFSuqQYMGqfomJyerSJEievLJJ+3apkyZogoVKsjb21uBgYF67rnndOHCBbt9U/4sv2rVKtWoUUM+Pj768MMP06z5/PnzeuWVV1SpUiX5+vrKz89PLVq00M8//2zXL+X99fnnn+uNN95QUFCQcufOrccff1wnT57817GJjo7WL7/8osaNG6e5vW7dumrYsKHGjRunv//++1+P50zHjx9XhQoVUgVbKfV7Vvpnxnjjxo06f/58FlQHZA1mboEcLiU85c+f39Z248YNNWvWTPXq1dOECROUK1cuGWP0+OOPa926derRo4eqVKmiVatW6dVXX9WpU6c0efJku+Nu2LBBn3/+ufr37y8vLy998MEHat68ubZv366KFStKkmJjY/XQQw/ZwljBggX13XffqUePHoqPj9eAAQPsjvnuu+/K1dVVr7zyiuLi4jRu3Dh16tRJ27ZtkyQlJiaqWbNmSkhIUL9+/RQUFKRTp07pv//9ry5evCh/f/9Ur/+RRx5R//799f777+uNN95Q+fLlJUnly5dX586dtWDBAq1atcpunWNMTIzWrl2rYcOGpTuuhQoVko+Pj7755hv169dP+fLlS7dvUlKSHnvsMUVFRalDhw568cUXdenSJX3//ffat2+fSpYs6fD4r127Vl988YX69u2rAgUKKDQ01OHxvtl3332npKSkNP/0naJLly5at26dIiMj1bNnT7Vv317Dhw9XTEyMgoKCbP02btyoP//8Ux06dLC1Pffcc5o/f766d++u/v37Kzo6WtOmTdPu3bu1adMmeXh42PoePnxYHTt21HPPPadevXql+0vGr7/+qhUrVuipp55SWFiYYmNj9eGHH6p+/fo6cOCAChcubNd/1KhRcnFx0aBBg3TmzBlNmTJFjRs31p49e247M7x582ZJUrVq1dLtM3z4cD3yyCOaMWPGHc3ephcW07tY7dq1a2mu0/Xz85Onp6dd2639PDw8bD8bxYsX15YtW7Rv3z7bz+ntVK9eXcYYbd68OdVaYCDHMgByhHnz5hlJZs2aNebs2bPm5MmTZvHixSZ//vzGx8fH/PHHH8YYY7p27Wokmddff91u/xUrVhhJ5p133rFrf/LJJ42Li4s5duyYrU2SkWR27Nhhaztx4oTx9vY2//nPf2xtPXr0MMHBwebcuXN2x+zQoYPx9/c3V69eNcYYs27dOiPJlC9f3iQkJNj6vffee0aS2bt3rzHGmN27dxtJZsmSJbcdi+LFi5uuXbvani9ZssRIMuvWrbPrl5SUZIoWLWrat29v1z5p0iTj4uJifv3119ueZ+jQoUaSyZ07t2nRooUZNWqU2blzZ6p+c+fONZLMpEmTUm1LTk42xjg+/q6urmb//v12fe90vNMyYMAAI8ns3r073T67du0ykszAgQONMcYcPnzYSDJTp06169e7d2/j6+trO9+PP/5oJJmFCxfa9YuMjEzVXrx4cSPJREZGpjr/rd/Xa9eumaSkJLs+0dHRxsvLy4wYMcLWlvL+KlKkiImPj7e1f/HFF0aSee+999J9zcYY89ZbbxlJ5tKlS6m2STJ9+vQxxhjToEEDExQUZHvdKT+TP/30k63/sGHDbD8/6T1atWqV6hzpPT777DNbv5Sf7Vsf9evXt/VZvXq1cXNzM25ubiY8PNy89tprZtWqVSYxMTHN1/7nn38aSWbs2LG3HSMgJ2FZApDDNG7cWAULFlRISIg6dOggX19fLV++XEWKFLHr98ILL9g9X7lypdzc3NS/f3+79pdfflnGGH333Xd27eHh4apevbrtebFixdS6dWutWrVKSUlJMsZo6dKlioiIkDFG586dsz2aNWumuLg47dq1y+6Y3bt3t5uFevjhhyX9M0MnyTb7tGrVKl29ejUjw2PH1dVVnTp10tdff61Lly7Z2hcuXKg6deooLCzstvu//fbbWrRokapWrapVq1bpzTffVPXq1VWtWjUdPHjQ1m/p0qUqUKCA3cU6KVxcXCQ5Pv7169fXAw88YHuekfG+Wcrrz5MnT7p9UrbFx8dL+mcdaJUqVfT555/b+iQlJenLL79URESEbTZ0yZIl8vf3V5MmTezqql69unx9fbVu3Tq784SFhalZs2bp1pHCy8vLduFgUlKS/vrrL/n6+qps2bJpvtYuXbrYvb4nn3xSwcHBWrly5W3P89dff8nd3V2+vr637Zcyiz1z5sx/rX3p0qX6/vvvUz0CAwPT7N+6des0+9+6LMTb2ztVn5vv5NCkSRNt2bJFjz/+uH7++WeNGzdOzZo1U5EiRfT111+nOm/evHklpZ4NBnIyliUAOcz06dNVpkwZubu7KzAwUGXLlrW7c4D0z0UnRYsWtWs7ceKEChcunCrcpPwZ/8SJE3btpUuXTnXuMmXK6OrVqzp79qxcXV118eJFzZo1S7NmzUqz1lsvYClWrJjd85T/saasywwLC9PAgQM1adIkLVy4UA8//LAef/xxPf3002kuSbgTXbp00dixY7V8+XJ16dJFhw8f1s6dO+8ooEhSx44d1bFjR8XHx2vbtm2aP3++Fi1apIiICO3bt0/e3t46fvy4ypYtK3f39P9JdXT8bw3eZ8+edXi8b5Zy3ptD/q3SCsDt27fXG2+8oVOnTqlIkSJav369zpw5o/bt29v6HD16VHFxcWmu6Uyrrn/7pSJFcnKy3nvvPX3wwQeKjo5WUlKSbdvNy3BS3PqedXFxUalSpTLtFnGPPPKIGjRooHHjxtndoiu9vgUKFEjVnt5FgUWLFk13ze/N3Nzc/rVfzZo1tWzZMiUmJurnn3/W8uXLNXnyZD355JPas2dPql+apP/9EgZYAeEWyGFq1aplu1tCem6e8bpXUtYOPv300+ratWuafSpXrmz33M3NLc1+5qYLqiZOnKhu3brpq6++0urVq9W/f3+NGTNGW7duTRXY78QDDzyg6tWr69NPP1WXLl306aefytPTU+3atXPoOH5+fmrSpImaNGkiDw8Pffzxx9q2bZvq16/vcE134tY1ohkZ75ulhOhffvlFVapUSbPPL7/8Ikl24ad9+/YaPHiwlixZogEDBuiLL76Qv7+/3W3QkpOTVahQIS1cuDDN4xYsWPC2ry09o0eP1pAhQ/TMM89o5MiRypcvn1xdXTVgwIBM/aCF/Pnz68aNG7p06dJtZ7YladiwYXr00Uf14YcfpnnRVnbi6empmjVrqmbNmipTpoy6d++uJUuW2K01T/nFMq0gDuRUhFvgPlG8eHGtWbMm1f/ADx06ZNt+s6NHj6Y6xpEjR5QrVy5bWMmTJ4+SkpLuaMbJEZUqVVKlSpX01ltvafPmzapbt65mzpypd955J83+/zbr1KVLFw0cOFCnT5/WokWL1KpVK9uscUbUqFFDH3/8sU6fPi1JKlmypLZt26br16/bXTh1M0fH/1YFCxa8q/Fu0aKF3Nzc9Mknn6R7UdmCBQvk7u5uF1zDwsJUq1Ytff755+rbt6+WLVumNm3a2N2OrWTJklqzZo3q1q2bqbf0+vLLL9WgQQPNmTPHrv3ixYtphrFb37PGGB07duy2oV+SypUrJ+mfuyb8W9/69evr0Ucf1dixYzV06NA7eRnZQsovxCnv2RQpd1lJ+eUHsALW3AL3iZYtWyopKUnTpk2za588ebJcXFzUokULu/YtW7bYrWs8efKkvvrqKzVt2lRubm5yc3NT27ZttXTpUu3bty/V+c6ePetwjfHx8bpx44ZdW6VKleTq6qqEhIR090u5h+/FixfT3N6xY0e5uLjoxRdf1K+//npH9xO9evWqtmzZkua2lPWxKVf5t23bVufOnUs1ttL/ZqUdHf9b3e14h4SEqHv37lqzZk2a97GdOXOm1q5dqx49eqSaIW/fvr22bt2quXPn6ty5c3ZLEiSpXbt2SkpK0siRI1Md98aNG+l+X/6Nm5tbqtukLVmyRKdOnUqz/4IFC+yWXXz55Zc6ffr0v45teHi4JNl90tjtpKy9TW95iDOtW7cu1ZhJsq07vvXOFDt37pSLi4ttDAArYOYWuE9ERESoQYMGevPNN/Xbb7/pwQcf1OrVq/XVV19pwIABKlmypF3/ihUrqlmzZna3ApP+ucgqxbvvvqt169apdu3a6tWrlx544AGdP39eu3bt0po1axy+d+batWvVt29fPfXUUypTpoxu3LihTz75xBbs0lOlShW5ublp7NixiouLk5eXlxo2bGhbA1qwYEE1b95cS5YsUUBAgFq1avWvtVy9elV16tTRQw89pObNmyskJEQXL17UihUr9OOPP6pNmzaqWrWqpH9mhhcsWKCBAwdq+/btevjhh3XlyhWtWbNGvXv3VuvWrR0e/7Tc7XhPnjxZhw4dUu/evRUZGWmboV21apW++uor1a9fP82PmW3Xrp1eeeUVvfLKK8qXL1+qmeP69evrueee05gxY7Rnzx41bdpUHh4eOnr0qJYsWaL33nvP7p64d+qxxx7TiBEj1L17d9WpU0d79+7VwoULVaJEiTT758uXT/Xq1VP37t0VGxurKVOmqFSpUurVq9dtz1OiRAlVrFhRa9asuaMPM6hfv77q16+vDRs2OPya0nPkyBF9+umnqdoDAwPVpEmTOz5Ov379dPXqVf3nP/9RuXLllJiYqM2bN+vzzz9XaGiounfvbtf/+++/V926ddNcwwzkWM65SQMAR6V126G0dO3a1eTOnTvNbZcuXTIvvfSSKVy4sPHw8DClS5c248ePt92uKoX+/+2PPv30U1O6dGnj5eVlqlatmupWW8YYExsba/r06WNCQkKMh4eHCQoKMo0aNTKzZs2y9Um5VdOtt/iKjo42ksy8efOMMcb8+uuv5plnnjElS5Y03t7eJl++fKZBgwZmzZo1dvvdessoY4yZPXu2KVGihHFzc0vztmApt4V69tlnbzN6/3P9+nUze/Zs06ZNG1O8eHHj5eVlcuXKZapWrWrGjx9vd0szY4y5evWqefPNN01YWJhtHJ588klz/PhxWx9Hxz8tdzLet5OQkGAmT55sqlevbnLnzm1y5cplqlWrZqZMmZLu7aKMMaZu3bpGkunZs2e6fWbNmmWqV69ufHx8TJ48eUylSpXMa6+9Zv78809bn+LFi6e6FdbN2269FdjLL79sgoODjY+Pj6lbt67ZsmWLqV+/vt3tr1LeX5999pkZPHiwKVSokPHx8TGtWrUyJ06cuKNxmTRpkt3tzVKk971IOeetP5MptwI7e/Zsuq/RkVuB3fw6b/ezneK7774zzzzzjClXrpzx9fU1np6eplSpUqZfv34mNjbWru/FixeNp6en+eijj257TCCncTEmjb9fALivubi4qE+fPmn+mT2n+uqrr9SmTRv98MMPtluQwRrW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dw5Hx2vdunVm2bJl5sCBA+bYsWNmypQpxs3NzURGRmZx5c7j6JiliI6ONkWKFDEPP/ywad26ddYUm004Ombz5s0zfn5+5vTp07ZHTExMFlftXI6OWUJCgqlRo4Zp2bKl2bhxo4mOjjbr1683e/bsyeLKncfRMfvrr7/s3mP79u0zbm5uZt68eVlbuBM5OmYLFy40Xl5eZuHChSY6OtqsWrXKBAcHm5deeinTaiLcWlytWrVMnz59bM+TkpJM4cKFzZgxY/513+LFi9+X4fZuxswYY27cuGHy5MljPv7443tVYrZyt+NljDFVq1Y1b7311r0oL1vKyJjduHHD1KlTx3z00Uema9eu9124dXTM5s2bZ/z9/bOouuzJ0TGbMWOGKVGihElMTMyqErOdu/33bPLkySZPnjzm8uXL96rEbMfRMevTp49p2LChXdvAgQNN3bp1M60mliVYWGJionbu3KnGjRvb2lxdXdW4cWNt2bLFiZVlX5kxZlevXtX169eVL1++e1VmtnG342WMUVRUlA4fPqxHHnnkXpaabWR0zEaMGKFChQqpR48eWVFmtpLRMbt8+bKKFy+ukJAQtW7dWvv378+KcrOFjIzZ119/rfDwcPXp00eBgYGqWLGiRo8eraSkpKwq26ky49//OXPmqEOHDsqdO/e9KjNbyciY1alTRzt37rQtXfj111+1cuVKtWzZMtPqssQnlCFt586dU1JSUqpPagsMDNShQ4ecVFX2lhljNmjQIBUuXNjuh92qMjpecXFxKlKkiBISEuTm5qYPPvhATZo0udflZgsZGbONGzdqzpw52rNnTxZUmP1kZMzKli2ruXPnqnLlyoqLi9OECRNUp04d7d+/X0WLFs2Ksp0qI2P266+/au3aterUqZNWrlypY8eOqXfv3rp+/bqGDRuWFWU71d3++799+3bt27dPc+bMuVclZjsZGbP/+7//07lz51SvXj0ZY3Tjxg09//zzeuONNzKtLsItkIneffddLV68WOvXr78vL165U3ny5NGePXt0+fJlRUVFaeDAgSpRooQeffRRZ5eW7Vy6dEmdO3fW7NmzVaBAAWeXk2OEh4crPDzc9rxOnToqX768PvzwQ40cOdKJlWVfycnJKlSokGbNmiU3NzdVr15dp06d0vjx4++LcHu35syZo0qVKqlWrVrOLiVbW79+vUaPHq0P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r169dPXqVfXo0cOu74gRIxQVFaV9+/apW7duKlCggNq0aSNJGjRokDZv3qy+fftqz549Onr0qL766qvbButbTZo0SZ999pkOHTqkI0eOaMmSJQoKCkrzXsGFChWSj4+PIiMjFRsbq7i4ONu2Zs2ayc/PT++88466d+9+23Pe7v0TGhqqrl276plnntGKFSsUHR2t9evX236J6d27t06ePKl+/frp0KFD+uqrrzRs2DANHDjQbjnLrfr06aPz58+rY8eO+umnn3T8+HGtWrVK3bt3vye/iAFwgLMX/QKwvq5duxpJqR5ly5Y1xhizfPlyU7t2bePn52dy585tHnroIbNmzRrb/lu2bDGVK1c2Xl5eJuWfrbQuKHvwwQdTnffWuzTUr1/fvPjii7bnkyZNMsHBwcbHx8c0a9bMLFiwwEgyFy5csPV5/vnnTf78+Y0k21X0iYmJZujQoSY0NNR4eHiY4OBg85///Mf88ssvtv3mzJljihYtanx8fExERISZMGHCHV1QtmjRIlOrVi3j6elpHnjgAbN27Vpbn5QLw26uzxhj/v77b9OvXz9ToEAB4+XlZerWrWu2b9+ear9vvvnGVKhQwXh6eppatWqZn3/+2e4427dvN02aNDG+vr4md+7cpnLlyrYL/4xJ++K+Bx980DYus2bNMlWqVDG5c+c2fn5+plGjRmbXrl22vrrpgjJjjJk9e7YJCQkxrq6upn79+nbHHTJkiHFzczN//vlnumNmzL+/f/7++2/z0ksvmeDgYOPp6WlKlSpld+eF9evXm5o1axpPT08TFBRkBg0aZK5fv27bfut7JsWRI0fMf/7zHxMQEGB8fHxMuXLlzIABA9K9mA5A1nAxxhjnxGoAwM1+++03hYWFaffu3apSpUqmHnv9+vVq0KCBLly4kGM+ca1Hjx46e/asvv76a2eXAiAHYaEQACBbiYuL0969e7Vo0SKCLQCHEW4BANlK69attX37dj3//PNq0qSJs8sBkMOwLAEAAACWwd0SAAAAYBmEWwAAAFgG4RYAAACWQbgFAACAZRBuAQAAYBmEWwAAAFgG4RYAAACWQbgFAACAZfw/vhaU0vnD8QUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Overlap (positivity) 확인\n", + "plt.figure(figsize=(8, 5))\n", + "plt.hist(ps_hat_nhefs[T_nhefs == 0], bins=30, alpha=0.6, label=\"T=0 (smoke)\")\n", + "plt.hist(ps_hat_nhefs[T_nhefs == 1], bins=30, alpha=0.6, label=\"T=1 (non-smoke)\")\n", + "plt.xlabel(\"Estimated propensity score\")\n", + "plt.ylabel(\"Count\")\n", + "plt.title(\"Propensity Score Overlap (NHEFS)\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "57ed6e50", + "metadata": {}, + "source": [ + "두 집단의 성향점수 분포가 충분히 겹치고 있고, 양끝 (0, 1 근처) 에 치우치지 않아 positivity가 잘 확보되었음을 확인할 수 있습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "b2278d80", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.11410616, 1.1693399 , 1.14790716, 1.65710476, 1.40403198])" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# IPW 가중치\n", + "w_nhefs = np.where(T_nhefs == 1, 1/ps_hat_nhefs, 1/(1 - ps_hat_nhefs))\n", + "w_nhefs[:5]" + ] + }, + { + "cell_type": "markdown", + "id": "6e212f00", + "metadata": {}, + "source": [ + "### 조건 1. Balancing 확인" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "b9b4e3cd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7NgRSUlJkMvl5g6HiIjIKHaFIiIiIiIikzGxICIiIiIikzGxICKycBqNBr/++itiYmKg0WjMHQ4REZFRHGNBRFQCpKWlQa1WmzsMIiKiHPGKBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyzQhERlQBOTk549uyZucMgIiLKERMLIiILZ2Vlha5duyIpKQlWVnzbJiIiy8SuUEREREREZDImFkREREREZDImFkREFk6j0WDHjh04fPgwNBqNucMhIiIyip11iYhKAJVKBbVabe4wiIiIcsQrFkREREREZDImFkREREREZDImFkREREREZDKOsSCLdudhGtIz8z5Y1U5hhUpu9kUYEZEFSnkMXDkLZKQDNnZArfqAs6u5oyIiojKGiYUFEAQBmzdvRo8ePcwdikW58zANQ5bF5Lte1OhgJhdUNtxOAHasAeIPA6L473KZDGjSGujaD6jsZ774iIioTGFiYQESExPh6spfF/8rP1cqCqMekSWzt7eHTPZC79Xz8cDSCEDUGiYVgO5xfCzwxxFgzEygXpPiDZaIiMokjrEoYs+fP39pGU9PTyiVymKIhohKIisrK3Tv3h3BwcGwsrLSXalYGgFoNdmTiiyiVrd+aYSuPBERURErc4mFKIqIjIyEn58fbG1t0aBBA2zYsAGSJCEkJASdOnWCJEkAgEePHqFy5cqYMWOGvv7KlSvh7+8PGxsb1K5dG8uWLdOvu3HjBgRBwNq1axEUFAQbGxusXr0aABAVFYW6detCqVTCy8sLY8aM0dcTBAFbtmwBAGRmZmLMmDHw8vKCjY0NfHx8EBkZqS/75MkTDBs2DO7u7nByckK7du1w5syZojxlRGRpdqzRJQ7/vFflSJJ0iceOtcUTFxERlWllritUZGQkfvzxR3z99deoUaMGDh06hLfffhvu7u74/vvvERAQgCVLluCDDz7AyJEjUalSJX1isXr1asyYMQNLly5FYGAgTp06heHDh8Pe3h6DBg3S7+PDDz/EwoULERgYCBsbGyxfvhwTJkzA3Llz0aVLF6SkpCAuLs5ofEuWLMHWrVuxbt06VKlSBbdu3cKtW7f06/v06QNbW1vs3LkTzs7OWLFiBdq3b48///wT5cqVK9qTR0Tmp3qcfUxFbkQtEH8I6DcScHIp0tCIiKhsK1OJhVqt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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Variable Before After Balanced\n", + "----------------------------------------------------\n", + "sex 0.160 0.006 ✓\n", + "age 0.282 0.014 ✓\n", + "race 0.177 0.004 ✓\n", + "education 0.088 0.021 ✓\n", + "smokeintensity 0.217 0.027 ✓\n", + "smokeyrs 0.159 0.001 ✓\n", + "exercise 0.104 0.010 ✓\n", + "active 0.089 0.007 ✓\n", + "wt71 0.133 0.010 ✓\n" + ] + } + ], + "source": [ + "\n", + "# ASMD 계산\n", + "X_disp = nhefs_df[['sex', 'age', 'race', 'education',\n", + " 'smokeintensity', 'smokeyrs',\n", + " 'exercise', 'active', 'wt71']].astype(float)\n", + "\n", + "asmd_before = compute_asmd(X_disp, T_nhefs)\n", + "asmd_after = compute_asmd(X_disp, T_nhefs, w_nhefs)\n", + "\n", + "# Love plot\n", + "var_names = list(asmd_before.keys())\n", + "bef = [asmd_before[v] for v in var_names]\n", + "aft = [asmd_after[v] for v in var_names]\n", + "y_pos = list(range(len(var_names)))\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "ax.scatter(bef, y_pos, marker='o', color='tomato', s=80, label='Before IPW', zorder=3)\n", + "ax.scatter(aft, y_pos, marker='s', color='steelblue', s=80, label='After IPW', zorder=3)\n", + "for i in range(len(var_names)):\n", + " ax.plot([bef[i], aft[i]], [y_pos[i], y_pos[i]], color='gray', linewidth=0.8, zorder=2)\n", + "ax.axvline(0.1, linestyle='--', color='gray', alpha=0.7, label='Threshold (0.1)')\n", + "ax.set_yticks(y_pos)\n", + "ax.set_yticklabels(var_names)\n", + "ax.set_xlabel(\"Absolute Standardized Mean Difference (ASMD)\")\n", + "ax.set_title(\"Love Plot: NHEFS Covariate Balance\")\n", + "ax.legend()\n", + "ax.grid(axis='x', alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print(f\"\\n{'Variable':<18} {'Before':>10} {'After':>10} {'Balanced':>10}\")\n", + "print(\"-\" * 52)\n", + "for v in var_names:\n", + " ok = \"✓\" if asmd_after[v] < 0.1 else \"✗\"\n", + " print(f\"{v:<18} {asmd_before[v]:>10.3f} {asmd_after[v]:>10.3f} {ok:>10}\")" + ] + }, + { + "cell_type": "markdown", + "id": "138bd5c3", + "metadata": {}, + "source": [ + "### 조건 2. Weight 안정성" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "ada60f3c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weight diagnostics: {'max': '16.27', 'p95': '4.92', 'p99': '7.19'}\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "diag = weight_diagnostics(w_nhefs)\n", + "print(\"Weight diagnostics:\", {k: f\"{v:.2f}\" for k, v in diag.items()})\n", + "\n", + "plt.figure(figsize=(5, 4))\n", + "plt.boxplot(w_nhefs)\n", + "plt.ylabel(\"weight\")\n", + "plt.title(\"IPW weight distribution (NHEFS)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9ff26dee", + "metadata": {}, + "source": [ + "최대 가중치가 약 17 정도로 다소 크지만, 99 percentile이 7 미만이므로 일부 관측치만 극단적인 가중치를 가지는 형태입니다.\n", + "샘플 수(1,566개)에 비해 큰 가중치가 많지 않으므로 truncation 없이 진행하겠습니다." + ] + }, + { + "cell_type": "markdown", + "id": "edea2150", + "metadata": {}, + "source": [ + "IPW 적용 전에는 `age`, `smokeintensity`, `race` 등 여러 공변량에서 ASMD가 0.1을 초과하여 두 집단의 분포 차이가 컸지만, IPW 적용 후에는 모든 공변량의 ASMD가 0.1 미만으로 떨어져 confounder가 잘 균형 잡힌 것을 볼 수 있습니다." + ] + }, + { + "cell_type": "markdown", + "id": "da6473a5", + "metadata": {}, + "source": [ + "### Hájek ATE 추정 및 신뢰구간" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "21c38d92", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hájek ATE: 3.475 kg\n" + ] + } + ], + "source": [ + "ate_nhefs = hajek_ate(Y_nhefs, T_nhefs, ps_hat_nhefs)\n", + "print(f\"Hájek ATE: {ate_nhefs:.3f} kg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "9ba0bfeb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bootstrap ATE: 3.436 kg\n", + "95% CI: [2.467, 4.377]\n" + ] + } + ], + "source": [ + "def bootstrap_hajek_nhefs(df_full, X_design_cols, B=500, seed=0):\n", + " rng = np.random.RandomState(seed)\n", + " n = len(df_full)\n", + " ates = []\n", + " for _ in range(B):\n", + " idx = rng.choice(n, size=n, replace=True)\n", + " sub = df_full.iloc[idx]\n", + "\n", + " Xb = sub[X_design_cols].values\n", + " Tb = sub['qsmk'].astype(int).values\n", + " Yb = sub['wt82_71'].values\n", + "\n", + " sc = StandardScaler()\n", + " Xb_s = sc.fit_transform(Xb)\n", + "\n", + " m = LogisticRegression(max_iter=5000)\n", + " m.fit(Xb_s, Tb)\n", + " ps_b = m.predict_proba(Xb_s)[:, 1]\n", + " ates.append(hajek_ate(Yb, Tb, ps_b))\n", + "\n", + " ates = np.array(ates)\n", + " return {\"ATE\": ates.mean(),\n", + " \"CI\": np.percentile(ates, [2.5, 97.5]),\n", + " \"samples\": ates}\n", + "\n", + "df_boot = pd.concat([nhefs_df.reset_index(drop=True),\n", + " X_nhefs.add_prefix(\"_d_\").reset_index(drop=True)], axis=1)\n", + "design_cols = [c for c in df_boot.columns if c.startswith(\"_d_\")]\n", + "\n", + "res_nhefs = bootstrap_hajek_nhefs(df_boot, design_cols, B=500)\n", + "print(f\"Bootstrap ATE: {res_nhefs['ATE']:.3f} kg\")\n", + "print(f\"95% CI: [{res_nhefs['CI'][0]:.3f}, {res_nhefs['CI'][1]:.3f}]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "id": "29c818e0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(res_nhefs[\"samples\"], bins=40)\n", + "plt.axvline(res_nhefs[\"CI\"][0], linestyle=\"--\", color=\"C1\")\n", + "plt.axvline(res_nhefs[\"CI\"][1], linestyle=\"--\", color=\"C1\")\n", + "plt.axvline(ate_nhefs, linestyle=\"-\", color=\"black\", label=\"point estimate\")\n", + "plt.xlabel(\"ATE (kg)\")\n", + "plt.ylabel(\"count\")\n", + "plt.title(\"Bootstrap distribution - NHEFS (Hájek)\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e12981f4", + "metadata": {}, + "source": [ + "### 결과 해석\n", + "\n", + "| 추정 방법 | ATE (kg) | 95% CI |\n", + "|---|---|---|\n", + "| Naive 비교 | ~ 2.54 | - |\n", + "| **IPW (Hájek)** | **~ 3.5** | **약 (2.4, 4.5)** |\n", + "\n", + "- Naive 비교가 약 2.5 kg 인 반면, IPW로 confounder를 보정하면 효과 추정치가 **약 3.5 kg 으로 더 커집니다**.\n", + "- 이는 흡연자가 평균적으로 더 마르고, 금연자가 더 나이가 많아 체중 증가가 자연스럽게 적게 일어나는 경향이 있어 confounding이 효과를 **과소추정**하고 있었음을 의미합니다.\n", + "\n", + "**해석**: 다른 조건이 같다면, 금연은 11년간 체중을 평균적으로 약 3.5 kg 증가시키는 것으로 추정됩니다. (다른 방법과 교차 검증이 필요합니다.)" + ] + }, + { + "cell_type": "markdown", + "id": "b276f94d", + "metadata": {}, + "source": [ + "### Reference" + ] + }, + { + "cell_type": "markdown", + "id": "e51b4f91", + "metadata": {}, + "source": [ + "- Stuart, E. A. (2010). Matching methods for causal inference: A review and a look forward. *Statistical Science*, 25(1), 1–21.\n", + "\n", + "- Chattopadhyay, A., Hase, C. H., & Zubizarreta, J. R. (2020). Balancing versus modeling approaches to weighting in practice. *Statistics in Medicine*, 39(24), 3227–3254." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d0b0dc5ebe5ff0e0363376ae46684a8fd2ac76d8 Mon Sep 17 00:00:00 2001 From: jhkimon Date: Mon, 11 May 2026 22:17:10 +0900 Subject: [PATCH 3/4] =?UTF-8?q?docs:=20IPW=20in=20Practice=20=EB=85=B8?= =?UTF-8?q?=ED=8A=B8=EB=B6=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20TOC=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 영문 버전 ipw_in_practice_en.ipynb 추가 - myst.yml TOC 수정: chapters → children 키 교체, 영문 기본/한국어 hidden 설정 - .claude/settings.json 프로젝트 권한 allowlist 추가 Co-Authored-By: Claude Sonnet 4.6 --- .claude/settings.json | 10 + book/ipw_basics/ipw_in_practice_en.ipynb | 2055 ++++++++++++++++++++++ book/ipw_basics/ipw_in_practice_ko.ipynb | 274 +-- book/myst.yml | 10 +- 4 files changed, 2106 insertions(+), 243 deletions(-) create mode 100644 .claude/settings.json create mode 100644 book/ipw_basics/ipw_in_practice_en.ipynb diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..1038e1c --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,10 @@ +{ + "permissions": { + "allow": [ + "Bash(pip list*)", + "Bash(pkill -f \"jupyter-book\"*)", + "Bash(jupyter-book *)", + "Bash(cd /Users/jhkim/Desktop/personal_study/causal/causal-studio/book*)" + ] + } +} diff --git a/book/ipw_basics/ipw_in_practice_en.ipynb b/book/ipw_basics/ipw_in_practice_en.ipynb new file mode 100644 index 0000000..99f3ac8 --- /dev/null +++ b/book/ipw_basics/ipw_in_practice_en.ipynb @@ -0,0 +1,2055 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c1ffddf8", + "metadata": {}, + "source": [ + "# IPW in Practice" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "44d09a27", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"PATH\"] += os.pathsep + \"/opt/homebrew/bin\"" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "78265c88", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "from joblib import Parallel, delayed\n", + "\n", + "from graphviz import Digraph\n", + "from IPython.display import display\n", + "\n", + "\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\", category=FutureWarning)\n", + "\n", + "np.random.seed(42)" + ] + }, + { + "cell_type": "markdown", + "id": "9da09828", + "metadata": {}, + "source": [ + "## Recap: The Core Idea of IPW" + ] + }, + { + "cell_type": "markdown", + "id": "f954e846", + "metadata": {}, + "source": [ + "Our goal is to estimate $ATE = \\mathbb{E}[Y_1 - Y_0]$, the average difference in outcomes between receiving and not receiving a treatment across the entire population. In the medication example, this means asking: how much does the average number of hospitalization days differ between a world where everyone takes the drug and one where no one does?\n\nLet's revisit the example below." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "d0adf24e", + "metadata": {}, + "outputs": [], + "source": [ + "drug_example = pd.DataFrame(dict(\n", + " sex= [\"M\",\"M\",\"M\",\"M\",\"M\",\"M\", \"W\",\"W\",\"W\",\"W\"],\n", + " drug=[1,1,1,1,1,0, 1,0,1,0],\n", + " days=[5,5,5,5,5,8, 2,4,2,4]\n", + "))" + ] + }, + { + "cell_type": "markdown", + "id": "7f2e30c3", + "metadata": {}, + "source": [ + "In reality, we cannot observe both $Y_0$ and $Y_1$ for the same person at the same time. For the sake of explanation, however, let's pretend we can see both worlds simultaneously.\n\nUnder this assumption, the individual treatment effects by sex are:\n\n- Male: $Y_1 = 5, Y_0 = 8 \\Rightarrow Y_1 - Y_0 = -3$\n- Female: $Y_1 = 2, Y_0 = 4 \\Rightarrow Y_1 - Y_0 = -2$\n\nSince there are 6 males (each with a −3 day effect) and 4 females (each with a −2 day effect), the true ATE is:\n\n$$\nATE = \\frac{-3 \\times 6 + (-2) \\times 4}{10} = -2.6\n$$\n\nIn other words, taking the drug should reduce hospitalization days by 2.6 on average. This is the true effect we want to recover." + ] + }, + { + "cell_type": "markdown", + "id": "c1534535", + "metadata": {}, + "source": [ + "What happens if we simply compare group means (naive estimate)?\n\nThe treated group average is $(5 \\times 5 + 2 \\times 2)/7 = 29/7$, and the untreated group average is $(1 \\times 8 + 2 \\times 4)/3 = 16/3$. Let's compute the difference." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "140a6f6e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naive: -1.1904761904761898\n" + ] + } + ], + "source": [ + "print(\"Naive:\", drug_example.query(\"drug==1\")[\"days\"].mean() - drug_example.query(\"drug==0\")[\"days\"].mean())" + ] + }, + { + "cell_type": "markdown", + "id": "b897b61c", + "metadata": {}, + "source": [ + "The result is $-1.19$, far from the true $ATE = -2.6$. This distortion doesn't come from the drug's effect — it comes from the difference in group composition, specifically the different sex distributions between treated and untreated groups. When a variable affects both treatment assignment and the outcome like this, we call it a **confounder**, and the resulting bias is called **confounding**.\n\nIPW (Inverse Probability Weighting) is one method designed to remove this confounding." + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "fdcabd63", + "metadata": {}, + "outputs": [], + "source": [ + "ps = drug_example.groupby(\"sex\")[\"drug\"].mean()\n", + "drug_example[\"ps\"] = drug_example[\"sex\"].map(ps)\n", + "\n", + "drug_example[\"w\"] = (\n", + " drug_example[\"drug\"]/drug_example[\"ps\"] +\n", + " (1-drug_example[\"drug\"])/(1-drug_example[\"ps\"])\n", + ")\n", + "\n", + "ate_ipw = (\n", + " (drug_example[\"drug\"] * drug_example[\"days\"] * drug_example[\"w\"]).sum()\n", + " / (drug_example[\"drug\"] * drug_example[\"w\"]).sum()\n", + " -\n", + " ((1-drug_example[\"drug\"]) * drug_example[\"days\"] * drug_example[\"w\"]).sum()\n", + " / ((1-drug_example[\"drug\"]) * drug_example[\"w\"]).sum()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "50e105e3", + "metadata": {}, + "source": [ + "By assigning the following weight to each unit, we can recover the true ATE:\n\n$$w_i = \\frac{T_i}{P(T=1 \\mid X_i)} + \\frac{1-T_i}{P(T=0 \\mid X_i)}$$\n\nThe resulting reweighted dataset is not the original observed data. Think of it as a **pseudo-population** — an artificial dataset constructed so that treatment assignment and sex appear independent, as if confounding had been eliminated." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "e937266a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IPW: -2.6000000000000005\n" + ] + } + ], + "source": [ + "print(\"IPW:\", ate_ipw)" + ] + }, + { + "cell_type": "markdown", + "id": "9cc44b60", + "metadata": {}, + "source": [ + "In this toy example, $X$ was a single binary variable, so we could directly count the treatment rate within each group to compute $P(T \\mid X)$.\n\nIn practice, however, this probability is rarely known. When there are many covariates or continuous variables are involved, simple counting won't work. This is why we **estimate** the propensity score using a model such as logistic regression.\n\nWe define the propensity score as $e(X)$, and estimate it from data as $\\hat{e}(X)$. The IPW weight then becomes:\n\n$$\n\\hat{w}_i =\n\\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n$$\n\nUnits that received treatment despite a low estimated probability — or were untreated despite a high probability — receive larger weights." + ] + }, + { + "cell_type": "markdown", + "id": "8f7fd50f", + "metadata": {}, + "source": [ + "## Pitfalls of Propensity Scores" + ] + }, + { + "cell_type": "markdown", + "id": "5cd9db8f", + "metadata": {}, + "source": [ + "There are two key things to watch out for when using propensity scores. First, the goal of a propensity score model is not to predict outcomes well — it's to achieve **covariate balance** between groups. Optimizing for predictive accuracy can actually destroy balance. Second, if the propensity score distributions of the two groups don't overlap sufficiently (weak **positivity**), estimation becomes unreliable.\n\nLet's look at each in turn." + ] + }, + { + "cell_type": "markdown", + "id": "ad6fedaa", + "metadata": {}, + "source": [ + "#### 1. The Goal Is Balance, Not Prediction" + ] + }, + { + "cell_type": "markdown", + "id": "263f9f41", + "metadata": {}, + "source": [ + "Consider an example from Miguel Hernán. Suppose School A has almost all students receiving treatment, while School B has almost none.\n\nThe propensity score is defined as the probability of treatment given covariates:\n\n$$\ne(X) = P(T=1 \\mid X)\n$$\n\nIf we include the school variable in the model, it will predict treatment very well — that's obvious. But is including it actually helpful for estimating the ATE?" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "326f798a", + "metadata": {}, + "outputs": [], + "source": [ + "school_a = pd.DataFrame({\n", + " \"T\": np.random.binomial(1, 0.99, 400),\n", + " \"school\": 0\n", + "})\n", + "\n", + "school_b = pd.DataFrame({\n", + " \"T\": np.random.binomial(1, 0.01, 400),\n", + " \"school\": 1\n", + "})\n", + "\n", + "ex_data = pd.concat([school_a, school_b], ignore_index=True)\n", + "\n", + "ex_data[\"intercept\"] = 1\n", + "\n", + "# True ATE = 0.1\n", + "ex_data[\"y\"] = 1 + 0.1 * ex_data[\"T\"] + np.random.normal(0, 1, len(ex_data))" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "d7077faa", + "metadata": {}, + "outputs": [], + "source": [ + "def run_ps(df, X, T, y):\n", + " model = LogisticRegression(C=1e6, max_iter=1000)\n", + "\n", + " model.fit(df[X], df[T])\n", + " ps = model.predict_proba(df[X])[:, 1]\n", + " weight = (df[T] - ps) / (ps * (1 - ps))\n", + "\n", + " return np.mean(weight * df[y])\n", + "\n", + "def bootstrap_ate(data, features, B=500):\n", + " return np.array([\n", + " run_ps(data.sample(frac=1, replace=True), features, \"T\", \"y\")\n", + " for _ in range(B)\n", + " ])\n", + "\n", + "ate_w_f = bootstrap_ate(ex_data, [\"school\"], B=500)\n", + "ate_wo_f = bootstrap_ate(ex_data, [\"intercept\"], B=500)" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "2970bb09", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAHWCAYAAAClsUvDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMV0lEQVR4nO3deVxVdR7/8feV5YIoIAIiyiag4l6ajtMClKVYM2m2+bPC0hbTyjEtrZnUptJ2W8ymUrHRsmW0GssxckQnxS3XygxJcV8QBUEFLpzfH/68P2+Asly4B3g9H4/ziHvOud/zOfdc8s33nPM9FsMwDAEAAAAu1sTVBQAAAAASwRQAAAAmQTAFAACAKRBMAQAAYAoEUwAAAJgCwRQAAACmQDAFAACAKRBMAQAAYAoEUwAAAJgCwRQAGrGUlBRZLBbt2bOn1rc1fPhwRUZG2l/v2bNHFotFr7zySq1vW5KmTJkii8VSJ9sCUD0EU6AROB8+LpyCg4OVmJiopUuX1vr233nnHaWkpFTrvd98842mTJni1HpqwzfffCOLxaLQ0FCVlpba5yckJJT57Mubzu9jZGRkhesMGDDgojWkpaU5rG+1WtWqVSslJCTohRde0LFjx5yyr6dPn9aUKVOUlpbmlPacycy1Abg0i2EYhquLAFC7UlJSdO+99+rZZ59VVFSUDMPQkSNHlJKSop9++kn//ve/ddNNN9Xa9rt06aLAwMBqhYUxY8Zo5syZMvv/qoYNG6Y1a9Zoz549Sk1NVb9+/SRJqampOnLkiH29DRs26M0339RTTz2luLg4+/xu3bqpW7duioyMVIsWLfT444+X2UZoaKiuvfbaCmtIS0tTYmKiHn30UV1xxRUqKSnRsWPHtGbNGv373/+Wn5+fPv30U4c2SkpKVFxcLKvVWunexOzsbAUFBWny5MlV+qOhuLhYpaWlslqtks71mEZFRenll1/W+PHjK91OdWuz2Wyy2Wzy8vJyyrYAOJ+7qwsAUHeSkpLUq1cv++sRI0aoVatW+vjjj2s1mNYVm82m0tJSeXp61ul2CwoK9OWXX2ratGmaO3euFixYYA+m119/vcO6Xl5eevPNN3X99dcrISGh3PbatGmju+66q9r1XH311br11lsd5m3dulU33HCDhgwZop9//lmtW7eWJLm5ucnNza3a26qMgoIC+fj4yMPDo1a3cynu7u5yd+efPcDMOJUPNGL+/v7y9vYu8491QUGBHn/8cYWFhclqtapDhw565ZVXyvRa2mw2/f3vf1d0dLSsVqsiIyP11FNPqbCw0L5OZGSkfvrpJ61cudJ+ivl8ICsuLtbUqVMVGxsrLy8vtWzZUldddZVSU1MlnbsmcebMmZLkcIpacrw+ccaMGfYafv75ZxUVFemZZ55Rz5495efnJx8fH1199dVasWKFQ/0XtvH6668rIiJC3t7eio+P148//ljpz3Hx4sU6c+aMbrvtNt15551atGiRzp49W+n314Xu3btrxowZOnnypN5++237/PKuMd24caP69++vwMBAeXt7KyoqSvfdd5+kc59ZUFCQJGnq1KllLkUYPny4mjVrpszMTA0cOFDNmzfXsGHD7MsuvMb0Qpf6/BMSEsoN8he2eanayrvGtDLfYenc9/imm27S999/r969e8vLy0vt2rXThx9+WP4HDqBa+NMRaERyc3OVnZ0twzB09OhRvfXWW8rPz3fonTMMQ3/+85+1YsUKjRgxQj169NCyZcs0YcIEHThwQK+//rp93ZEjR2revHm69dZb9fjjj2vdunWaNm2aduzYocWLF0uSZsyYoUceeUTNmjXT008/LUlq1aqVpHNBYdq0aRo5cqR69+6tvLw8bdy4UZs2bdL111+vBx98UAcPHlRqaqr++c9/lrtPc+fO1dmzZ/XAAw/IarUqICBAeXl5+uCDDzR06FDdf//9OnXqlGbPnq3+/ftr/fr16tGjh0MbH374oU6dOqXRo0fr7NmzeuONN3Tttddq+/bt9lovZsGCBUpMTFRISIjuvPNOTZw4Uf/+97912223Ven4nFdcXKzs7Owy8318fOTt7V2tNiXp1ltv1YgRI/Ttt9/q+eefL3edo0eP6oYbblBQUJAmTpwof39/7dmzR4sWLZIkBQUFadasWRo1apQGDx6sW265RdK5SxHOs9ls6t+/v6666iq98soratq06UXrqunnf15lavu9ynyHz9u1a5f9M0xOTtacOXM0fPhw9ezZU507d650nQAuwgDQ4M2dO9eQVGayWq1GSkqKw7pffPGFIcl47rnnHObfeuuthsViMXbt2mUYhmFs2bLFkGSMHDnSYb3x48cbkoz//ve/9nmdO3c24uPjy9TVvXt348Ybb7xo7aNHjzbK+1/V7t27DUmGr6+vcfToUYdlNpvNKCwsdJh34sQJo1WrVsZ9991Xpg1vb29j//799vnr1q0zJBl/+ctfLlqbYRjGkSNHDHd3d+P999+3z/vjH/9o3HzzzeWu/9lnnxmSjBUrVpS7PCIiotxjJcmYNm3aRWtZsWKFIcn47LPPKlyne/fuRosWLeyvz383du/ebRiGYSxevNiQZGzYsKHCNo4dO2ZIMiZPnlxmWXJysiHJmDhxYrnLIiIi7K+r8vnHx8eX+x36fZsXq23y5MkO36WqfIfPH5dVq1bZ5x09etSwWq3G448/XmZbAKqHU/lAIzJz5kylpqYqNTVV8+fPV2JiokaOHGnvDZPO3V3u5uamRx991OG9jz/+uAzDsN/F/80330iSxo0bV2Y9Sfr6668vWY+/v79++uknZWRkVHufhgwZYj99e56bm5v9OtPS0lLl5OTIZrOpV69e2rRpU5k2Bg0apDZt2thf9+7dW3369LHv48UsXLhQTZo00ZAhQ+zzhg4dqqVLl+rEiRPV2qc+ffrYj9OF09ChQ6vV3oWaNWumU6dOVbjc399fkrRkyRIVFxdXezujRo2q9Lo1+fxroqrf4U6dOunqq6+2vw4KClKHDh3022+/1WqdQGNCMAUakd69e6tfv37q16+fhg0bpq+//lqdOnXSmDFjVFRUJEnKyspSaGiomjdv7vDe83eQZ2Vl2f/bpEkTxcTEOKwXEhIif39/+3oX8+yzz+rkyZNq3769unbtqgkTJmjbtm1V2qeoqKhy58+bN0/dunWzX7saFBSkr7/+Wrm5uWXWjY2NLTOvffv2lRrbc/78+erdu7eOHz+uXbt2adeuXbrssstUVFSkzz77rEr7cl5gYKD9OF04RUREVKu9C+Xn55c5theKj4/XkCFDNHXqVAUGBurmm2/W3Llzy1xzeTHu7u5q27ZtpdevyedfE1X9DoeHh5dpo0WLFtX+AwRAWQRToBFr0qSJEhMTdejQoWr3WtZkwPJrrrlGmZmZmjNnjrp06aIPPvhAl19+uT744INKt1HeNZfz58/X8OHDFR0drdmzZ+s///mPUlNTde211zqMMVpTGRkZ2rBhg77//nvFxsbap6uuukrSuWtPzaS4uFi//vprmSB2IYvFos8//1zp6ekaM2aMDhw4oPvuu089e/ZUfn5+pbZjtVrVpIlz/3mp6HtWUlJSa23/XkWjFxgmH8oMqE+4+Qlo5Gw2myTZQ0dERIS+++47nTp1yqFn7ZdffrEvP//f0tJSZWRkOIzHeeTIEZ08edKhd+9i//AHBATo3nvv1b333qv8/Hxdc801mjJlikaOHHnJ91bk888/V7t27bRo0SKH90+ePLnc9csL5b/++muFd5Cft2DBAnl4eOif//xnmdDy/fff680339TevXvL7Wlzhc8//1xnzpxR//79L7nuH/7wB/3hD3/Q888/r48++kjDhg3TwoULNXLkSKc/Pakyn3+LFi3KPWX++17NqtRWle8wgLpBjynQiBUXF+vbb7+Vp6en/R/mgQMHqqSkxGFIIenccD4Wi0VJSUn29aRzd91f6LXXXpMk3XjjjfZ5Pj4+OnnyZJntHz9+3OF1s2bNFBMT43Da2MfHR5LKfX9FzofEC3uy1q1bp/T09HLX/+KLL3TgwAH76/Xr12vdunX2fa3IggULdPXVV+uOO+7Qrbfe6jBNmDBBkvTxxx9Xuu7atHXrVo0dO1YtWrTQ6NGjK1zvxIkTZXoAz49icP64nL/LvirH5GIq8/lHR0frl19+cXh61datW7V69WqHtqpSW1W+wwDqBj2mQCOydOlSe8/n0aNH9dFHHykjI0MTJ06Ur6+vJOlPf/qTEhMT9fTTT2vPnj3q3r27vv32W3355ZcaO3asoqOjJZ0bFzM5OVnvvfeeTp48qfj4eK1fv17z5s3ToEGDlJiYaN9uz549NWvWLD333HOKiYlRcHCwrr32WnXq1EkJCQnq2bOnAgICtHHjRn3++ecaM2aMw3sl6dFHH1X//v3l5uamO++886L7edNNN2nRokUaPHiwbrzxRu3evVvvvvuuOnXqVO7p6JiYGF111VUaNWqUCgsLNWPGDLVs2VJPPPFEhdtYt26ddu3a5VDrhdq0aaPLL79cCxYs0JNPPnnRen/vwIEDmj9/fpn5zZo106BBgy75/v/97386e/asSkpKdPz4ca1evVpfffWV/Pz8tHjxYoWEhFT43nnz5umdd97R4MGDFR0drVOnTun999+Xr6+vPch5e3urU6dO+uSTT9S+fXsFBASoS5cu6tKlS5X287zKfP733XefXnvtNfXv318jRozQ0aNH9e6776pz587Ky8uzr1eV2qryHQZQR1w7KACAulDecFFeXl5Gjx49jFmzZhmlpaUO6586dcr4y1/+YoSGhhoeHh5GbGys8fLLL5dZr7i42Jg6daoRFRVleHh4GGFhYcakSZOMs2fPOqx3+PBh48YbbzSaN29uSLIP+/Pcc88ZvXv3Nvz9/Q1vb2+jY8eOxvPPP28UFRXZ32uz2YxHHnnECAoKMiwWi324n/NDDb388stl9re0tNR44YUXjIiICMNqtRqXXXaZsWTJkgqHK3r55ZeNV1991QgLCzOsVqtx9dVXG1u3br3oZ/rII48YkozMzMwK15kyZYohyaGtmgwXdWHt5Tk/XNT5ycPDwwgKCjKuueYa4/nnny8zrJZhlB0uatOmTcbQoUON8PBww2q1GsHBwcZNN91kbNy40eF9a9asMXr27Gl4eno6DM+UnJxs+Pj4lFtfTT//+fPnG+3atTM8PT2NHj16GMuWLSvT5sVq+/1wUYZR+e9wREREuUObVTSMFYDqsRgGV20DaJxq41ntAIDq4xpTAAAAmALBFAAAAKZAMAUAAIApcI0pAAAATIEeUwAAAJgCwRQAAACmUK8H2C8tLdXBgwfVvHlzpz8iDwAAADVnGIZOnTql0NBQNWly8T7Reh1MDx48qLCwMFeXAQAAgEvYt2+f2rZte9F16nUwbd68uaRzO3r+cYoAAAAwj7y8PIWFhdlz28XU62B6/vS9r68vwRQAAMDEKnPZpctvfjpw4IDuuusutWzZUt7e3uratas2btzo6rIAAABQx1zaY3rixAldeeWVSkxM1NKlSxUUFKSMjAy1aNHClWUBAADABVwaTF988UWFhYVp7ty59nlRUVEurAgAAACu4tJg+tVXX6l///667bbbtHLlSrVp00YPP/yw7r///nLXLywsVGFhof11Xl7eJbdhGIZsNptKSkqcVjdgFh4eHnJzc3N1GQAAOIVLg+lvv/2mWbNmady4cXrqqae0YcMGPfroo/L09FRycnKZ9adNm6apU6dWuv2ioiIdOnRIp0+fdmbZgGlYLBa1bdtWzZo1c3UpAADUmMUwDMNVG/f09FSvXr20Zs0a+7xHH31UGzZsUHp6epn1y+sxDQsLU25ubpm78ktLS5WRkSE3NzcFBQXJ09OTQfjRoBiGoWPHjun06dOKjY2l5xQAYEp5eXny8/MrN6/9nkt7TFu3bq1OnTo5zIuLi9O//vWvcte3Wq2yWq2VaruoqEilpaUKCwtT06ZNa1wrYEZBQUHas2ePiouLCaYAgHrPpcNFXXnlldq5c6fDvF9//VURERFO28alHn0F1GecBQAANCQuTW1/+ctftHbtWr3wwgvatWuXPvroI7333nsaPXq0K8sCAACAC7g0mF5xxRVavHixPv74Y3Xp0kV///vfNWPGDA0bNsyVZQEAAMAFXP5I0ptuukk33XRTnW5z7969ys7OrpNtBQYGKjw8vE621ZhNmTJFX3zxhbZs2VKr20lISFCPHj00Y8aMWt0OAACNkcuDaV3bu3evOsbF6UwdDSHl3bSpftmxo0rhdPjw4Zo3b56kc+NUhoeH65577tFTTz0ld/dzh+z999/X22+/rczMTLm7uysqKkq33367Jk2aVG6brVu31mOPPaaJEyfa502cOFEvvviiVqxYoYSEBPv8hIQEhYWF6Z///KdSUlI0duxYnTx5UgkJCVq5cmWFdcfHxystLU2RkZEaO3asxo4d67C8rsIjAAConxpdMM3OztaZ06c17MmX1So8ula3dWRvpha8OEHZ2dlV7jUdMGCA5s6dq8LCQn3zzTcaPXq0PDw8NGnSJM2ZM0djx47Vm2++qfj4eBUWFmrbtm368ccfK2wvISFBaWlpDsF0xYoVCgsLU1pamj2Ynj17VmvXri13HNlFixapqKhIkrRv3z717t1b3333nTp37izp3PBfAAAA1dXogul5rcKj1Ta2s6vLqJDValVISIgkadSoUVq8eLG++uorTZo0SV999ZVuv/12jRgxwr7++XBYkcTERD3++OOy2Wxyd3fXqVOntHnzZr3++uv67LPP7Oulp6ersLBQiYmJZdoICAiw/3z27FlJUsuWLe111tSJEyc0ZswYffvtt8rPz1fbtm311FNP6d5775Uk7d+/XxMmTNCyZctUWFiouLg4zZw5U3369LG38c9//lN/+9vfdOLECSUlJen9999X8+bNJZ0bB3fChAlauHCh8vLy1KtXL73++uu64oor7O9fuXKlJkyYoK1btyogIEDJycl67rnn7D3VAACg9jCWUj3h7e1t760MCQnR2rVrlZWVVen3JyYmKj8/Xxs2bJAk/e9//1P79u01ZMgQrVu3zh40V6xYocjISEVGRjp9Hy7lb3/7m37++WctXbpUO3bs0KxZsxQYGChJys/PV3x8vA4cOKCvvvpKW7du1RNPPKHS0lL7+zMzM/XF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WrNmjYYMGaKdO3fan8vr7e1dpfoAAEDdapQ9pvWB1WpVSEiIIiIiNGrUKPXr109fffWVJOmrr77S7bffrhEjRigmJkadO3fW0KFD9fzzz1fYXmJiolavXm3vdT116pQ2b96sJ5980qHHND09XYWFhUpMTCzTRkBAgEJCQhQSEqKgoCBJUsuWLe3zAgKq1kP89NNP6+DBg/ruu++UlJSk8PBwXXPNNVq2bJk8PDw0evToKrUXFBRUppbg4GD7PD8/v3Lf9/nnn6tr167y9vZWy5Yt1a9fPxUUFNiXz5kzR507d5bValXr1q01ZswYh/dnZ2dr8ODBatq0qWJjY+3H6byVK1eqd+/e9vdPnDjRofe7sLBQjz76qIKDg+Xl5aWrrrpKGzZsqNK+AwDQEBBM6wlvb297b2VISIjWrl2rrKysSr8/MTFR+fn59sDzv//9T+3bt9eQIUO0bt06nT17VtK5XtTIyEhFRkY6fR8uVFpaqoULF2rYsGEKCQlxWObt7a2HH35Yy5YtU05OTq3WcejQIQ0dOlT33XefduzYobS0NN1yyy0yDEOSNGvWLI0ePVoPPPCAtm/frq+++koxMTEObUydOlW33367tm3bpoEDB2rYsGH2ug8cOKCBAwfqiiuu0NatWzVr1izNnj1bzz33nP39TzzxhP71r39p3rx52rRpk2JiYtS/f/9a33cAAMyGYGpyhmHou+++07Jly3TttddKkiZPnix/f39FRkaqQ4cOGj58uD799FOVlpZW2E5sbKzatGlj7x1NS0tTfHy8QkJCFB4ervT0dPv88npLq+rJJ59Us2bNHKYXXnjBvvzYsWM6efJkhTeGxcXFyTAM7dq1q8a1XMyhQ4dks9l0yy23KDIyUl27dtXDDz+sZs2aSZKee+45Pf7443rsscfUvn17XXHFFWWudR0+fLiGDh2qmJgYvfDCC8rPz9f69eslSe+8847CwsL09ttvq2PHjho0aJCmTp2qV199VaWlpSooKNCsWbP08ssvKykpSZ06ddL7778vb29vzZ49u1b3HQAAsyGYmtSSJUvUrFkzeXl5KSkpSXfccYemTJki6dyNTOnp6dq+fbsee+wx2Ww2JScna8CAARcNp+evM5XkcF1pfHy80tLSdObMGa1bt84pwXTChAnasmWLw/TQQw+VWe98z6SrdO/eXdddd526du2q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zs5WSUlJub+Xv/zyS7nvOXz4ML/H9VR1jneHDh00Z84cdevWTbm5uXrllVf0xz/+UT/99JPatm1bF2XXGXpM64GJEyeWuej591NFX+bKuPPOO/XnP/9ZXbt21aBBg7RkyRJt2LBBaWlpztsJVFptH2+YS20f7wceeED9+/dX165dNWzYMH344YdavHixMjMznbgXAGpT3759dc8996hHjx6Kj4/XokWLFBQUpH/84x+uLs3p6DGtBx5//HENHz78ouu0a9fOadtr166dAgMDtWvXLl133XVOaxeVU5vHOyQkRJJ05MgRtW7d2j7/yJEj6tGjR7XaRM1U9niHhISUuTHCZrMpJyfHflwro0+fPpKkXbt2KTo6usr1wvkCAwPl5uamI0eOOMw/cuRIhcc2JCSkSuvDPKpzvH/Pw8NDl112mXbt2lUbJboUwbQeCAoKUlBQUJ1tb//+/Tp+/LhDcEHdqc3jHRUVpZCQEC1fvtweRPPy8rRu3boqj+QA56js8e7bt69OnjypH374QT179pQk/fe//1Vpaak9bFbGli1bJInfbxPx9PRUz549tXz5cg0aNEiSVFpaquXLl2vMmDHlvqdv375avny5xo4da5+Xmpqqvn371kHFqInqHO/fKykp0fbt2zVw4MBarNRFXH33FZwrKyvL2Lx5szF16lSjWbNmxubNm43Nmzcbp06dsq/ToUMHY9GiRYZhGMapU6eM8ePHG+np6cbu3buN7777zrj88suN2NhY4+zZs67aDVRSVY+3YRjG9OnTDX9/f+PLL780tm3bZtx8881GVFSUcebMGVfsAqpgwIABxmWXXWasW7fO+P77743Y2Fhj6NCh9uX79+83OnToYKxbt84wDMPYtWuX8eyzzxobN240du/ebXz55ZdGu3btjGuuucZVu4AKLFy40LBarUZKSorx888/Gw888IDh7+9vHD582DAMw7j77ruNiRMn2tdfvXq14e7ubrzyyivGjh07jMmTJxseHh7G9u3bXbULqIKqHu+pU6cay5YtMzIzM40ffvjBuPPOOw0vLy/jp59+ctUu1BqCaQOTnJxsSCozrVixwr6OJGPu3LmGYRjG6dOnjRtuuMEICgoyPDw8jIiICOP++++3/3LA3Kp6vA3j3JBRf/vb34xWrVoZVqvVuO6664ydO3fWffGosuPHjxtDhw41mjVrZvj6+hr33nuvwx8hu3fvdjj+e/fuNa655hojICDAsFqtRkxMjDFhwgQjNzfXRXuAi3nrrbeM8PBww9PT0+jdu7exdu1a+7L4+HgjOTnZYf1PP/3UaN++veHp6Wl07tzZ+Prrr+u4YtREVY732LFj7eu2atXKGDhwoLFp0yYXVF37LIZhGC7pqgUAAAAuwF35AAAAMAWCKQAAAEyBYAoAAABTIJgCAADAFAimAAAAMAWCKQAAAEyBYAoAAABTIJgCAADAFAimAAAAMAWCKQDUkfT0dLm5uenGG2+UJA0fPlwWi6XCKTIyUpKUkJBQ7vKHHnrIhXsDAM7HI0kBoI6MHDlSzZo10+zZs7Vz5075+PjozJkz9uWtW7fW3LlzNWDAAEmSm5ubgoKClJCQoPbt2+vZZ591aK9p06by9fWt030AgNrk7uoCAKAxyM/P1yeffKKNGzfq8OHDSklJ0VNPPSU/Pz+H9fz9/RUSElLm/U2bNi13PgA0JJzKB4A68Omnn6pjx47q0KGD7rrrLs2ZM0ecsAIARwRTAKgDs2fP1l133SVJGjBggHJzc7Vy5cpKv/+dd95Rs2bNHKYFCxbUVrkA4BKcygeAWrZz506tX79eixcvliS5u7vrjjvu0OzZs5WQkFCpNoYNG6ann37aYV6rVq2cXSoAuBTBFABq2ezZs2Wz2RQaGmqfZxiGrFar3n777TLXmZbHz89PMTExtVkmALgcp/IBoBbZbDZ9+OGHevXVV7Vlyxb7tHXrVoWGhurjjz92dYkAYBr0mAJALVqyZIlOnDihESNGlOkZHTJkiGbPnl2p8UhPnz6tw4cPO8yzWq1q0aKFU+sFAFeixxQAatHs2bPVr1+/ck/XDxkyRBs3btS2bdsu2c7777+v1q1bO0xDhw6tjZIBwGUYYB8AAACmQI8pAAAATIFgCgAAAFMgmAIAAMAUCKYAAAAwBYIpAAAATIFgCgAAAFMgmAIAAMAUCKYAAAAwBYIpAAAATIFgCgAAAFMgmAIAAMAU/i9iOKxpB2XW8gAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8,5))\n", + "\n", + "sns.histplot(ate_w_f, bins=30, stat=\"density\", label=\"PS WITH school\", alpha=0.5)\n", + "sns.histplot(ate_wo_f, bins=30, stat=\"density\", label=\"PS WITHOUT school\", alpha=0.5)\n", + "\n", + "plt.legend()\n", + "plt.title(\"Bootstrap ATE Distribution\")\n", + "plt.xlabel(\"ATE\")\n", + "plt.ylabel(\"Density\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "40dffcc9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WITH school: mean = -0.4524325457820468 , std = 0.4831547835682821\n", + "WITHOUT school: mean = 0.09055415800389073 , std = 0.07245027783775368\n" + ] + } + ], + "source": [ + "print(\"WITH school: mean =\", ate_w_f.mean(), \", std =\", ate_w_f.std())\n", + "print(\"WITHOUT school: mean =\", ate_wo_f.mean(), \", std =\", ate_wo_f.std())" + ] + }, + { + "cell_type": "markdown", + "id": "0d00a187", + "metadata": {}, + "source": [ + "The results speak for themselves. The model that includes the school variable has massive variance and poor accuracy, while the model without it estimates the true ATE (0.1) much more stably.\n\n**The propensity score model should include confounders — variables that affect both treatment and outcome — not variables that merely predict treatment assignment.** The DAGs below illustrate the difference." + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "1f40c34a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "cluster_good\n", + "\n", + "Good: Confounder\n", + "\n", + "\n", + "cluster_bad\n", + "\n", + "Bad: Treatment-only predictor\n", + "\n", + "\n", + "\n", + "X\n", + "\n", + "Confounder X\n", + "\n", + "\n", + "\n", + "T\n", + "\n", + "Treatment T\n", + "\n", + "\n", + "\n", + "X->T\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y\n", + "\n", + "Outcome Y\n", + "\n", + "\n", + "\n", + "X->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "T->Y\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Z\n", + "\n", + "Predictor Z\n", + "\n", + "\n", + "\n", + "T2\n", + "\n", + "Treatment T\n", + "\n", + "\n", + "\n", + "Z->T2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Y2\n", + "\n", + "Outcome Y\n", + "\n", + "\n", + "\n", + "T2->Y2\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dot = Digraph(format=\"png\")\n", + "dot.attr(rankdir=\"LR\", splines=\"ortho\")\n", + "dot.attr(\"node\", shape=\"box\", style=\"rounded\", fontsize=\"12\")\n", + "\n", + "# 왼쪽: confounder\n", + "with dot.subgraph(name=\"cluster_good\") as c:\n", + " c.attr(label=\"Good: Confounder\", color=\"black\")\n", + " c.node(\"X\", \"Confounder X\")\n", + " c.node(\"T\", \"Treatment T\")\n", + " c.node(\"Y\", \"Outcome Y\")\n", + " c.edge(\"X\", \"T\")\n", + " c.edge(\"X\", \"Y\")\n", + " c.edge(\"T\", \"Y\")\n", + "\n", + "# 오른쪽: treatment만 예측하는 변수\n", + "with dot.subgraph(name=\"cluster_bad\") as c:\n", + " c.attr(label=\"Bad: Treatment-only predictor\", color=\"black\")\n", + " c.node(\"Z\", \"Predictor Z\")\n", + " c.node(\"T2\", \"Treatment T\")\n", + " c.node(\"Y2\", \"Outcome Y\")\n", + " c.edge(\"Z\", \"T2\")\n", + " c.edge(\"T2\", \"Y2\")\n", + "\n", + "display(dot)" + ] + }, + { + "cell_type": "markdown", + "id": "cf2a7e4d", + "metadata": {}, + "source": [ + "#### 2. Positivity" + ] + }, + { + "cell_type": "markdown", + "id": "56268916", + "metadata": {}, + "source": [ + "Another issue to watch for is when the propensity score distributions of treated and untreated groups differ so much that they barely overlap — a situation known as weak **positivity**." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "79e5d8f7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jgn1dBnnSE9Pd/y8ZMkSjRs3TgcOHHC0BQX9HtAMw1BJSYl8fPgqAADMiQnKJhQZGel4hYaGymKxON7v379fwcHB+vTTT9WmTRv5+/tr06ZNstvtSk5OVmxsrAIDA3Xttdfqgw8+cPRZUlKihx56yLG8efPm+sc//uFYPmHCBC1YsED//ve/ZbFYZLFYtHHjRknSsWPH1LNnT4WFhalWrVrq1q2bjhw5Uqrv4cOHKywsTLVr19Zzzz0nnk8LAHAWws5lauTIkZoyZYpSUlJ0zTXXKDk5We+8845mz56t77//XsOGDVPfvn31xRdfSJLsdrsaNGigZcuWad++fRo3bpyef/55LV26VJL0zDPPqGfPnuratavS09OVnp6uG264QUVFRUpMTFRwcLC++uorbd68WUFBQeratasKCwslSdOnT9f8+fM1d+5cbdq0SSdOnNDy5cs9tm8AAObCuYvLVFJSkm677TZJUkFBgV588UWtXbtWHTp0kCQ1btxYmzZt0ptvvqnOnTvL19dXEydOdGwfGxurrVu3aunSperZs6eCgoIUGBiogoICRUZGOtZ77733ZLfb9a9//csxl2jevHkKCwvTxo0bdfvtt2vmzJkaNWqUevToIUmaPXu21qxZ465dAQAwOcLOZapt27aOnw8dOqTc3FxH+DmjsLBQ1113neP9rFmzNHfuXKWlpSkvL0+FhYVq1arVecf59ttvdejQIQUHB5dqz8/P148//qjs7Gylp6erffv2jmU+Pj5q27Ytp7IAAE5B2LlMXXHFFY6fc3JyJEmffPKJ6tevX2o9f39/SdLixYv1zDPPaPr06erQoYOCg4P10ksvadu2becdJycnR23atNHChQvPWVanTp1L/RgAAFwQYQe66qqr5O/vr7S0NHXu3LnMdTZv3qwbbrhBgwcPdrT9+OOPpdbx8/NTSUlJqbbWrVtryZIlqlu3rkJCQsrsOyoqStu2bVOnTp0kScXFxdq5c6dat259KR8LAABJhJ1LkpKeY4pxgoOD9cwzz2jYsGGy2+268cYblZ2drc2bNyskJET9+/dX06ZN9c4772jNmjWKjY3Vu+++q+3btys2NtbRT0xMjNasWaMDBw6odu3aCg0NVZ8+ffTSSy+pW7duSkpKUoMGDXT06FF99NFHeu6559SgQQM9+eSTmjJlipo2baq4uDjNmDFD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t6t27dql2rOystS6dWsdPnzYKcWh+mseWUOtY0I9XQYA4DJWqQnKR44cUUlJyTntBQUF+vnnny+5KAAAAGep0JGdlStXOn5es2aNQkN//xd7SUmJ1q1bp5iYGKcVBwAAcKkqFHa6d+8uSbJYLOrfv3+pZb6+voqJidH06dOdVhwAAMClqlDYsdvtkqTY2Fht375d4eHhLikKAADAWSo1QTk1NdXZdQAAALhEpS89X7dundatW6fjx487jvicMXfu3EsuDAAAwBkqFXYmTpyopKQktW3bVlFRUbJYLM6uCwAAwCkqFXZmz56t+fPnq1+/fs6uBwAAwKkqdZ+dwsJC3XDDDc6uBQAAwOkqFXYefvhhLVq0yNm1lOnnn39W3759Vbt2bQUGBqply5basWOHY7lhGBo3bpyioqIUGBiohIQE/fDDD26pDQAAVH2VOo2Vn5+vOXPmaO3atbrmmmvk6+tbavmMGTOcUtxvv/2mjh076pZbbtGnn36qOnXq6IcfflDNmjUd60ybNk2vvvqqFixYoNjYWI0dO1aJiYnat2+fAgICnFIHAACovioVdr777ju1atVKkrR3795Sy5w5WXnq1Klq2LCh5s2b52iLjY11/GwYhmbOnKkxY8aoW7dukqR33nlHERERWrFihXr37u20WgAAQPVUqbCzYcMGZ9dRppUrVyoxMVF//etf9cUXX6h+/foaPHiwHnnkEUmn7/eTkZGhhIQExzahoaFq3769tm7dWm7YKSgoUEFBgeO9zWZz7QcBAAAeU6k5O+5y+PBhvfHGG2ratKnWrFmjxx57TE888YQWLFggScrIyJAkRURElNouIiLCsawsycnJCg0NdbwaNmzoug8BAAA8qlJHdm655Zbznq5av359pQs6m91uV9u2bfXiiy9Kkq677jrt3btXs2fPPufZXBUxatQoDR8+3PHeZrMReAAAMKlKhZ0z83XOKCoq0u7du7V3795LCiF/FBUVpauuuqpUW3x8vD788ENJUmRkpCQpMzNTUVFRjnUyMzPPqfFs/v7+8vf3d1qdAACg6qpU2HnllVfKbJ8wYYJycnIuqaCzdezYUQcOHCjVdvDgQTVq1EjS6cnKkZGRWrdunSPc2Gw2bdu2TY899pjT6gAAANWXU+fs9O3b16nPxRo2bJi+/vprvfjiizp06JAWLVqkOXPmaMiQIZJO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.histplot(np.random.beta(4,1,500), kde=False, label=\"Non Treated\")\n", + "sns.histplot(np.random.beta(1,3,500), kde=False, label=\"Treated\")\n", + "plt.title(\"Positivity Check\")\n", + "plt.legend();" + ] + }, + { + "cell_type": "markdown", + "id": "ccdb64aa", + "metadata": {}, + "source": [ + "When the two groups' propensity score distributions look like the plot above, what goes wrong?\n\nImagine someone with a propensity score of 0.9 — a type who almost always receives treatment. If the untreated group contains almost no one like this, there's no \"similar individual\" to compare against. It's like wanting to estimate how much a drug reduces hospitalization days for someone 2 meters tall, but having no 2-meter-tall control unit to compare with.\n\nWhen this happens, there is no appropriate comparison unit for some individuals, making it impossible to directly estimate the treatment effect for those people." + ] + }, + { + "cell_type": "markdown", + "id": "328de311", + "metadata": {}, + "source": [ + "On top of that, units with propensity scores near 0 or 1 receive extremely large weights in IPW. Looking at the weight formula makes this clear:\n\n$$\nw_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n$$\n\nWhen $\\hat{e}(X_i) \\approx 0$ or $\\hat{e}(X_i) \\approx 1$, the denominator shrinks toward zero and $w_i$ explodes. A handful of units then dominate the entire estimate, inflating the variance dramatically. In practice, weights above 20 are treated as a warning sign." + ] + }, + { + "cell_type": "markdown", + "id": "66f79569", + "metadata": {}, + "source": [ + "## IPW in Practice" + ] + }, + { + "cell_type": "markdown", + "id": "91e0c014", + "metadata": {}, + "source": [ + "To summarize: the propensity score's purpose is to balance covariates. To do that well, we need sufficient overlap (positivity) between the two groups, and we need to ensure no individual weight becomes excessively large.\n\nWhen applying IPW in practice, we follow the procedure below, keeping both conditions in mind." + ] + }, + { + "cell_type": "markdown", + "id": "22d31936", + "metadata": {}, + "source": [ + "- **Step 0. Select Covariates**\n Use domain knowledge to identify potential confounders.\n\n- **Step 1. Estimate Propensity Scores**\n Fit a logistic regression or ML model to estimate $\\hat{e}(X)$.\n\n- **Step 2. Check Positivity**\n Visualize the propensity score distributions to confirm sufficient overlap between groups.\n If overlap is poor, downstream analysis cannot be trusted.\n\n- **Step 3. Compute Weights**\n Calculate $w_i = \\dfrac{T_i}{\\hat{e}(X_i)} + \\dfrac{1 - T_i}{1 - \\hat{e}(X_i)}$.\n\n- **Step 4. Check Covariate Balance**\n Verify that the covariate distributions are actually balanced after weighting.\n This is the core diagnostic for whether IPW achieved its goal.\n\n- **Step 5. Check Weight Stability**\n Inspect the weight distribution and extreme values to ensure no single unit dominates.\n\n- **Step 6. Estimate the Effect**\n Use the final weights to estimate the ATE." + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "id": "173cd7a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "A\n", + "\n", + "시작\n", + "\n", + "\n", + "\n", + "A1\n", + "\n", + "적절한 공변량 선정\n", + "\n", + "\n", + "\n", + "A->A1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "B\n", + "\n", + "PS 추정\n", + "\n", + "\n", + "\n", + "A1->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "C\n", + "\n", + "Overlap 충분?\n", + "\n", + "\n", + "\n", + "B->C\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "D\n", + "\n", + "가중치 계산\n", + "\n", + "\n", + "\n", + "C->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "E\n", + "\n", + "1. Balance 만족?\n", + "\n", + "\n", + "\n", + "D->E\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "F\n", + "\n", + "PS 모델 수정\n", + "\n", + "\n", + "\n", + "E->F\n", + "\n", + "\n", + "아니오\n", + "\n", + "\n", + "\n", + "G\n", + "\n", + "2. Weight 안정?\n", + "\n", + "\n", + "\n", + "E->G\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "F->B\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H\n", + "\n", + "가중치 조정\n", + "\n", + "\n", + "\n", + "G->H\n", + "\n", + "\n", + "아니오\n", + "\n", + "\n", + "\n", + "I\n", + "\n", + "효과 추정\n", + "\n", + "\n", + "\n", + "G->I\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "H->D\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "J\n", + "\n", + "종료\n", + "\n", + "\n", + "\n", + "I->J\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from graphviz import Digraph\n", + "\n", + "dot = Digraph(format=\"png\")\n", + "dot.attr(rankdir=\"TB\")\n", + "dot.attr(\"node\", shape=\"box\", style=\"rounded\", fontsize=\"11\")\n", + "\n", + "dot.node(\"A\", \"시작\", shape=\"oval\")\n", + "dot.node(\"A1\", \"적절한 공변량 선정\")\n", + "dot.node(\"B\", \"PS 추정\")\n", + "dot.node(\"C\", \"Overlap 충분?\", shape=\"diamond\")\n", + "dot.node(\"D\", \"가중치 계산\")\n", + "dot.node(\"E\", \"1. Balance 만족?\", shape=\"diamond\")\n", + "dot.node(\"F\", \"PS 모델 수정\")\n", + "dot.node(\"G\", \"2. Weight 안정?\", shape=\"diamond\")\n", + "dot.node(\"H\", \"가중치 조정\")\n", + "dot.node(\"I\", \"효과 추정\")\n", + "dot.node(\"J\", \"종료\", shape=\"oval\")\n", + "\n", + "dot.edge(\"A\", \"A1\")\n", + "dot.edge(\"A1\", \"B\")\n", + "dot.edge(\"B\", \"C\")\n", + "\n", + "dot.edge(\"C\", \"D\", label=\"예\")\n", + "\n", + "dot.edge(\"D\", \"E\")\n", + "\n", + "dot.edge(\"E\", \"F\", label=\"아니오\")\n", + "dot.edge(\"F\", \"B\")\n", + "\n", + "dot.edge(\"E\", \"G\", label=\"예\")\n", + "\n", + "dot.edge(\"G\", \"H\", label=\"아니오\")\n", + "dot.edge(\"H\", \"D\")\n", + "\n", + "dot.edge(\"G\", \"I\", label=\"예\")\n", + "dot.edge(\"I\", \"J\")\n", + "\n", + "display(dot)" + ] + }, + { + "cell_type": "markdown", + "id": "587b50e7", + "metadata": {}, + "source": [ + "## Simulation" + ] + }, + { + "cell_type": "markdown", + "id": "9fb5cd48", + "metadata": {}, + "source": [ + "Let's build a simulation dataset. We draw covariates $X_1, X_2$ from standard normal distributions and define treatment probability as a linear combination of both. The outcome $Y$ is constructed to include a treatment effect of 2, so the true $ATE = 2$.\n\n$$\nX_1, X_2 \\sim \\mathcal{N}(0,1)\n$$\n\n$$\ne(X) = \\mathbb{P}(T=1 \\mid X) = \\frac{1}{1 + \\exp\\big(-(-0.3 + 0.8X_1 - 0.8X_2)\\big)}\n$$\n\n$$\nT \\mid X \\sim \\text{Bernoulli}(e(X))\n$$\n\n$$\nY = 2T + X_1 + X_2 + \\varepsilon, \\quad \\varepsilon \\sim \\mathcal{N}(0,1)\n$$\n\nIn terms of potential outcomes:\n\n$$\nY(0) = X_1 + X_2 + \\varepsilon, \\quad\nY(1) = 2 + X_1 + X_2 + \\varepsilon\n$$\n\nThe difference is exactly 2 regardless of the unit, so $ATE = 2$." + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "713a6305", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
YTX1X2ps_true
0-1.7374670-1.085631-0.7488270.361365
14.16779310.9973450.5675950.510948
23.01822510.2829780.7181510.343409
3-1.4243901-1.506295-0.9993810.330587
40.4157750-0.5786000.4748980.241807
\n", + "
" + ], + "text/plain": [ + " Y T X1 X2 ps_true\n", + "0 -1.737467 0 -1.085631 -0.748827 0.361365\n", + "1 4.167793 1 0.997345 0.567595 0.510948\n", + "2 3.018225 1 0.282978 0.718151 0.343409\n", + "3 -1.424390 1 -1.506295 -0.999381 0.330587\n", + "4 0.415775 0 -0.578600 0.474898 0.241807" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def simulate_data(n=1000, seed=123):\n", + " np.random.seed(seed)\n", + "\n", + " X1 = np.random.normal(0, 1, n)\n", + " X2 = np.random.normal(0, 1, n)\n", + "\n", + " logit_ps = -0.3 + 0.8 * X1 - 0.8 * X2\n", + " ps = 1 / (1 + np.exp(-logit_ps))\n", + "\n", + " T = np.random.binomial(1, ps, n)\n", + "\n", + " # outcome\n", + " eps = np.random.normal(0, 1, n)\n", + " Y = 2 * T + 1.0 * X1 + 1.0 * X2 + eps\n", + "\n", + " df = pd.DataFrame({\n", + " \"Y\": Y,\n", + " \"T\": T,\n", + " \"X1\": X1,\n", + " \"X2\": X2,\n", + " \"ps_true\": ps\n", + " })\n", + "\n", + " return df\n", + "\n", + "df = simulate_data(n=1000)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "741d2cb7", + "metadata": {}, + "source": [ + "### Covariate Selection" + ] + }, + { + "cell_type": "markdown", + "id": "b9f19b57", + "metadata": {}, + "source": [ + "The correct set of covariates for this simulation is both $X_1$ and $X_2$. To illustrate the importance of covariate selection, we'll compare a **bad case** (using only $X_1$) against a **good case** (using both $X_1$ and $X_2$). In practice, the right variables should be chosen based on domain knowledge." + ] + }, + { + "cell_type": "markdown", + "id": "5edd2b38", + "metadata": {}, + "source": [ + "### Computing Weights" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "7a53e172", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimated PS range:\n", + "min = 0.016, max = 0.977\n" + ] + }, + { + "data": { + "image/png": "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pUsXb9cCAABQLh4FmSFDhmju3LnergUAAKBcPLq0dPr0ac2YMUPLly9XmzZtFBQU5LZ+8uTJXikOAADgfDwKMt98843atm0rSdq8ebPbOib+AgCAquJRkPn000+9XQcAAEC5eTRHBgAAwB94NCLTvXv3815CWrFihccFAQAAXCyPgszZ+TFnFRUVKTs7W5s3bz7nyyQBAAAqi0dBZsqUKaW2jx8/XsePH69QQQAAABfLq3Nk7rvvPr5nCQAAVBmvBpnVq1crJCTEm4cEAAAok0eXlvr06eP22hijffv26auvvtLTTz/tlcIAAAAuxKMgExUV5fY6ICBAzZs314QJE3TTTTd5pTAAAIAL8SjIzJ4929t1AAAAlJtHQeasrKwsbdu2TZJ0xRVXqF27dl4pCgC8avEoz/brNc27dQDwOo+CzP79+/XnP/9ZmZmZio6OliQdOXJE3bt317x58/SHP/zBmzUCAACUyqO7lkaMGKFjx45py5YtOnTokA4dOqTNmzcrPz9fI0eO9HaNAAAApfJoRGbp0qVavny5WrZs6Wpr1aqV0tPTmewLAACqjEcjMiUlJQoKCjqnPSgoSCUlJRUuCgAA4GJ4FGR69OihUaNGae/eva62n3/+WWPGjNENN9zgteIAAADOx6Mg8/rrrys/P1+JiYlq0qSJmjRpokaNGik/P1+vvfaat2sEAAAolUdzZBISErRhwwYtX75c27dvlyS1bNlSPXv29GpxAC5e6oJNvi4BvuTpLeYSt5nDauUakVmxYoVatWql/Px8ORwO3XjjjRoxYoRGjBihjh076oorrtBnn31WWbUCAAC4KVeQmTp1qh544AFFRkaesy4qKkoPPfSQJk+e7LXiAAAAzqdcQebrr7/WzTffXOb6m266SVlZWRUuCgAA4GKUK8jk5eWVetv1WTVq1NAvv/xS4aIAAAAuRrmCzGWXXabNmzeXuf6bb75RfHx8hYsCAAC4GOUKMrfeequefvppnT59+px1p06d0rhx43T77bd7rTgAAIDzKdft10899ZQWLFigZs2aafjw4WrevLkkafv27UpPT1dxcbGefPLJSikUAADg98oVZGJjY/Xll1/q4YcfVmpqqowxkiSHw6Hk5GSlp6crNja2UgoFAAD4vXI/EK9hw4ZasmSJDh8+rF27dskYo8svv1y1atWqjPoAAADK5NGT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36isfneYC93XBAAA4Kf8eo4MAADA+RBkAACAtQgyAADAWgQZAABgrUs+yKSnpysxMVEhISHq3Lmz1q1bd97t58+frxYtWigkJEStW7fWkiVLqqjS6qU8/f7WW2/puuuuU61atVSrVi317Nnzgn8nnKu87/Wz5s2bJ4fDod69e1dugdVUefv9yJEjSklJUXx8vJxOp5o1a8a/Mx4ob79PnTpVzZs3V2hoqBISEjRmzBidPn26iqqtHlatWqVevXqpXr16cjgcWrRo0QX3yczM1NVXXy2n06mmTZtqzpw55T+xuYTNmzfPBAcHm1mzZpktW7aYBx54wERHR5u8vLxSt//iiy9MYGCgmTRpktm6dat56qmnTFBQkNm0aVMVV2638vb7X/7yF5Oenm42btxotm3bZgYOHGiioqLMTz/9VMWV26u8fX5WTk6Oueyyy8x1111n7rjjjqopthopb78XFBSYDh06mFtvvdV8/vnnJicnx2RmZprs7Owqrtxu5e33t99+2zidTvP222+bnJwc8/HHH5v4+HgzZsyYKq7cbkuWLDFPPvmkWbBggZFkFi5ceN7td+/ebWrWrGnGjh1rtm7dal577TUTGBholi5dWq7zXtJBplOnTiYlJcX1uri42NSrV8+kpaWVuv3dd99tbrvtNre2zp07m4ceeqhS66xuytvvv3fmzBkTERFh/vu//7uySqx2POnzM2fOmC5dupj/+q//MgMGDCDIeKC8/f7mm2+axo0bm8LCwqoqsVoqb7+npKSYHj16uLWNHTvWdO3atVLrrM4uJsg8+uij5oorrnBr69evn0lOTi7XuS7ZS0uFhYXKyspSz549XW0BAQHq2bOnVq9eXeo+q1evdttekpKTk8vcHufypN9/7+TJkyoqKlLt2rUrq8xqxdM+nzBhgmJiYjR48OCqKLPa8aTfP/jgAyUlJSklJUWxsbG68sor9eKLL6q4uLiqyraeJ/3epUsXZWVluS4/7d69W0uWLNGtt95aJTVfqrz1mer3T/atLAcOHFBxcfE5TwiOjY3V9u3bS90nNze31O1zc3Mrrc7qxpN+/73HHntM9erVO+c/AJTOkz7//PPPNXPmTGVnZ1dBhdWTJ/2+e/durVixQvfee6+WLFmiXbt2adiwYSoqKtK4ceOqomzredLvf/nLX3TgwAFde+21MsbozJkzGjp0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IiIizIEDB4wx//ctum3atDGffPKJ2bVrlzl48KAZOXKkqVevnlmyZInZsmWLGTBggKlVq5Y5ePCg234tW7Y0n3zyifnmm2/M7bffbhITE01hYaExxphdu3aZsLAwM2XKFLNz507zxRdfmHbt2pmBAwe6amzYsKGpXbu2SU9PN99++61JS0szAQEBZvv27cYYY15++WWTkJBgVq1aZb7//nvz2Wefmblz57r2l2QWLlxojDFm3bp1RpJZvny52bdvn6vWZs2amUmTJrn2KSwsNHXr1jWzZs0q9/vHGGPuvvtuk5CQYBYsWGC+++47s3z5cjNv3jxjjDE//fSTqVmzphk2bJjZtm2bWbhwoalbt67bN8h369bNhIeHm0ceecRs377dbN++3Rw+fNj84Q9/MKmpqWbbtm1mw4YN5sYbbzTdu3cv8+8LVDWCDOAlAwYMMIGBgSYsLMxteeGFF4wxxrz66qumWbNmrg/U32vYsKGZMmWKW1tpQaZmzZomPz/f1ZacnGwSExNNcXGxq6158+YmLS2tzFrnz59v6tSpU+Z5jDHmhx9+MIGBgebnn392a7/hhhtMamqqMcaYe+65x9x6661u6/v163dRQWbixImutqKiIlO/fn3z0ksvGWP+L5AsWrTItc3x48dNUFCQefvtt11thYWFpl69eq5AcHa/sx/gxvwaEkNDQ80777xjjDFm8ODB5sEHH3Sr6bPPPjMBAQHm1KlTxphf/xb33Xefa31JSYmJiYkxb775pjHGmBEjRpgePXqYkpKSUn/H3waZs7/vxo0b3bZ56aWXTMuWLV2v33vvPRMeHm6OHz9e6jHP9/7ZsWOHkWSWLVtW6r5PPPGEad68uVu96enpJjw83PW+6datm2nXrp3bfs8995y56aab3Nr27NljJJkdO3aUei6gqnFpCfCi7t27Kzs7220ZOnSoJOmuu+7SqVOn1LhxYz3wwANauHCh29D+xUpMTFRERITrdWxsrFq1aqWAgAC3tv3797teL1++XDfccIMuu+wyRUREqH///jp48KBOnjxZ5nk2bdqk4uJiNWvWTOHh4a5l5cqV+u677yRJ27ZtU+fOnd32S0pKuqjf47fb1ahRQx06dNC2bdvctunQoYPr5++++05FRUXq2rWrqy0oKEidOnU6Z7/fHrt27dpq3ry5a5uvv/5ac+bMcfudkpOTVVJSopycHNd+bdq0cf3scDgUFxfn6tOBAwcqOztbzZs318iRI/XJJ59c1O/8WwMHDtSuXbu0Zs0aSb9eorv77rsVFhZW6vbne/9kZ2crMDBQ3bp1K3Xfbdu2KSkpyXXJUpK6du2q48eP66effnK1tW/f3m2/r7/+Wp9++qlbX7Vo0UKSXO8BwNfsmDkHWCIsLExNmzYtdV1CQoJ27Nih5cuXa9myZRo2bJhefvllrVy5UkFBQRd9jt9v63A4Sm0rKSmR9OuclNtvv10PP/ywXnjhBdWuXVuff/65Bg8erMLCQtWsWbPU8xw/flyBgYHKyspSYGCg27rw8PCLrrciyvpQr4jjx4/roYcecptfclaDBg1cP5+vT6+++mrl5OToo48+0vLly3X33XerZ8+eevfddy+6jpiYGPXq1UuzZ89Wo0aN9NFHH50z/+i3zvf+8daE8N/39/Hjx9WrVy+99NJL52wbHx/vlXMCFUWQAapQaGioevXqpV69eiklJUUtWrTQpk2bdPXVVys4OFjFxcVeP2dWVpZKSkr06quvukZt/vWvf7ltU9q527Vrp+LiYu3fv7/MCagtW7bU2rVr3drOjjBcyJo1a/THP/5RknTmzBllZWVp+PDhZW7fpEkTBQcH64svvlDDhg0lSUVFRVq/fr1Gjx59zrHPhpLDhw9r586datmypaRfQ8jWrVvLDJwXKzIyUv369VO/fv30pz/9STfffLMOHTqk2rVru2139s6f0v62Q4YM0T333KP69eurSZMmbqNNpSnr/dO6dWuVlJRo5cqV6tmz5zn7tWzZUu+9956MMa5RmS+++EIRERGqX79+mee7+uqr9d577ykxMdGaO8Zw6eHSEuBFBQUFys3NdVvO3uExZ84czZw5U5s3b9bu3bv1v//7vwoNDXV9KCcmJmrVqlX6+eefvXpXSNOmTVVUVKTXXntNu3fv1v/8z/9o+vTpbtskJibq+PHjysjI0IEDB3Ty5Ek1a9ZM9957r/76179qwYIFysnJ0bp165SWlqYPP/xQkjRy5EgtXbpUr7zyir799lu9/vrrWrp06UXVlZ6eroULF2r79u1KSUnR4cOHdf/995e5fVhYmB5++GE98sgjWrp0qbZu3aoHHnhAJ0+e1ODBg922nTBhgjIyMrR582YNHDhQdevWVe/evSVJjz32mL788ksNHz5c2dnZ+vbbb/X++++fN0T93uTJk/XPf/5T27dv186dOzV//nzFxcWV+iyemJgYhYaGaunSpcrLy9PRo0dd65KTkxUZGannn39egwYNOu85z/f+SUxM1IABA3T//fdr0aJFysnJUWZmpiuwDhs2THv27NGIESO0fft2vf/++xo3bpzGjh3rdkny91JSUnTo0CHdc889Wr9+vb777jt9/PHHGjRoUKWEbsAjvp6kA1QXAwYMMJLOWZo3b26MMWbhwoWmc+fOJjIy0oSFhZlrrrnGLF++3LX/6tWrTZs2bYzT6TRn/9MsbbLvVVdddc55f3+3VLdu3cyoUaNcrydPnmzi4+NNaGioSU5ONv/4xz+MJHP48GHXNkOHDjV16tQxklx3sxQWFppnnnnGJCYmmqCgIBMfH2/uvPNO880337j2mzlzpqlfv74JDQ01vXr1Mq+88spFTfadO3eu6dSpkwkODjatWrUyK1ascG1zdtLub+szxphTp06ZESNGmLp16xqn02m6du1q1q1bd85+ixcvNldccYUJDg42nTp1Ml9//bXbcdatW2duvPFGEx4ebsLCwkybNm1ck7KNKX3i9VVXXeXqlxkzZpi2bduasLAwExkZaW644QazYcMG17b6zWRfY4x56623TEJCggkICDDdunVzO+7TTz9tAgMDzd69e8vsM2Mu/P45deqUGTNmjImPjzfBwcGmadOmbndAZWZmmo4dO5rg4GATFxdnHnvsMVNUVORa//v3zFk7d+40d955p4mOjjahoaGmRYsWZvTo0WVOdAaqmsMYY3wToQBcir7//ns1atRIGzduVNu2bb167MzMTHXv3l2HDx+25knFgwcP1i+//KIPPvjA16UAVuKiJwD4wNGjR7Vp0ybNnTuXEANUAEEGAHzgjjvu0Lp16zR06FDdeOONvi4HsBaXlgAAgLW4awkAAFiLIAMAAKxFkAEAANYiyAAAAGsRZAAAgLUIMgAAwFoEGQAAYC2CDAAAsNb/A33b85rV/HWRAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "X = df[[\"X1\", \"X2\"]]\n", + "T = df[\"T\"]\n", + "\n", + "ps_model = LogisticRegression(max_iter=1000)\n", + "ps_model.fit(X, T)\n", + "ps_hat = ps_model.predict_proba(X)[:, 1]\n", + "\n", + "print(\"Estimated PS range:\")\n", + "print(f\"min = {ps_hat.min():.3f}, max = {ps_hat.max():.3f}\")\n", + "\n", + "plt.hist(ps_hat[T == 0], bins=30, alpha=0.6, label=\"T=0\")\n", + "plt.hist(ps_hat[T == 1], bins=30, alpha=0.6, label=\"T=1\")\n", + "plt.xlabel(\"Estimated propensity score\")\n", + "plt.ylabel(\"Count\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "af1800eb", + "metadata": {}, + "source": [ + "We now assign weights to each unit based on the inverse of their estimated treatment probability:\n\n$$\nw_i =\n\\begin{cases}\n\\dfrac{1}{\\hat e(X_i)} & T_i = 1 \\\\\n\\dfrac{1}{1 - \\hat e(X_i)} & T_i = 0\n\\end{cases}\n$$\n\nUnits who received treatment despite a low probability, or were untreated despite a high probability, receive larger weights — effectively up-weighting underrepresented cases." + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "eda8e112", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.42770576, 1.93721604, 2.9150843 , 3.84093377, 1.29270486])" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X1, X2 모두 사용해서 예측\n", + "w = np.where(\n", + " T == 1,\n", + " 1 / ps_hat,\n", + " 1 / (1 - ps_hat)\n", + ")\n", + "\n", + "w[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "id": "0806d61f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.27976698, 1.66139077, 2.17965985, 6.02555447, 1.42185057])" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X1만 사용해서 예측\n", + "\n", + "ps_model_bad = LogisticRegression(max_iter=1000)\n", + "ps_model_bad.fit(df[[\"X1\"]], T) \n", + "\n", + "ps_hat_bad = ps_model_bad.predict_proba(df[[\"X1\"]])[:, 1]\n", + "\n", + "pA = T.mean()\n", + "w_bad = np.where(\n", + " T == 1,\n", + " 1 / ps_hat_bad,\n", + " 1 / (1 - ps_hat_bad)\n", + ")\n", + "\n", + "w_bad[:5]" + ] + }, + { + "cell_type": "markdown", + "id": "20e3d75f", + "metadata": {}, + "source": [ + "### Condition 1: Covariate Balance" + ] + }, + { + "cell_type": "markdown", + "id": "1bb92fad", + "metadata": {}, + "source": [ + "> **ASMD (Absolute Standardized Mean Difference)**\n\nCovariate balance is assessed by standardizing the mean difference between the treated and control groups:\n\n$$\n\\text{ASMD}_j = \\frac{\\left| \\mu_{1j} - \\mu_{0j} \\right|}\n{\\sqrt{\\frac{\\sigma_{1j}^2 + \\sigma_{0j}^2}{2}}}\n$$\n\nWhen weights are applied, means and variances are computed as weighted averages:\n\n$$\n\\mu_{1j} = \\frac{\\sum_{i: A_i=1} w_i X_{ij}}{\\sum_{i: A_i=1} w_i}, \\quad\n\\mu_{0j} = \\frac{\\sum_{i: A_i=0} w_i X_{ij}}{\\sum_{i: A_i=0} w_i}\n$$\n\n$$\n\\sigma_{1j}^2 = \\frac{\\sum_{i: A_i=1} w_i (X_{ij} - \\mu_{1j})^2}{\\sum_{i: A_i=1} w_i}, \\quad\n\\sigma_{0j}^2 = \\frac{\\sum_{i: A_i=0} w_i (X_{ij} - \\mu_{0j})^2}{\\sum_{i: A_i=0} w_i}\n$$\n\nThe standard threshold is **ASMD < 0.1** for balance. Achieving this matters more than predictive accuracy of the propensity score model." + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "id": "50401f71", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_asmd(X, A, w=None):\n", + " import numpy as np\n", + " \n", + " asmd = {}\n", + " \n", + " for col in X.columns:\n", + " x = X[col].values\n", + " \n", + " if w is None:\n", + " m1 = x[A==1].mean()\n", + " m0 = x[A==0].mean()\n", + " v1 = x[A==1].var()\n", + " v0 = x[A==0].var()\n", + " else:\n", + " m1 = np.average(x[A==1], weights=w[A==1])\n", + " m0 = np.average(x[A==0], weights=w[A==0])\n", + " v1 = np.average((x[A==1] - m1)**2, weights=w[A==1])\n", + " v0 = np.average((x[A==0] - m0)**2, weights=w[A==0])\n", + " \n", + " # ASMD\n", + " asmd[col] = abs(m1 - m0) / np.sqrt((v1 + v0) / 2)\n", + " \n", + " return asmd" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "id": "af1d7ec0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ASMD (good): {'X1': 0.06309973147556015, 'X2': 0.01295531253985427}\n", + "ASMD (bad): {'X1': 0.026121787445995373, 'X2': 0.5945621353824512}\n" + ] + } + ], + "source": [ + "X = df[[\"X1\", \"X2\"]]\n", + "\n", + "print(\"ASMD (good):\", compute_asmd(X, T, w))\n", + "print(\"ASMD (bad):\", compute_asmd(X, T, w_bad))" + ] + }, + { + "cell_type": "markdown", + "id": "190fb62c", + "metadata": {}, + "source": [ + "The good model achieves ASMD < 0.1 on all covariates — balance is achieved. The bad model fails on $X_2$: because $X_2$ was omitted from the PS model, its imbalance persists even after weighting.\n\nIn this case, we would need to go back and revise the PS model." + ] + }, + { + "cell_type": "markdown", + "id": "1aea243c", + "metadata": {}, + "source": [ + "When there are many covariates, comparing ASMD values one by one becomes tedious. This is where the **Love Plot** comes in.\n\nA Love Plot displays the ASMD for each covariate before and after IPW side by side. Points moving left (toward 0) indicate improved balance, and points inside the ASMD = 0.1 threshold line indicate balance achieved. It is the most widely used diagnostic plot for reporting IPW results." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "f91ed377", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAHqCAYAAACZcdjsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABh7UlEQVR4nO3dd3gU5f7+8Xt3QxohCSWQIKFJVzqKgHQVBVEEFVA8IIgK0vRYUFRAwXIOHLscRIr1gBQVERVEgjRFkNBBwaAowdCTEEjY3ef3R77ZH0sCJJnNLgnv13Xlkp15ZuYzz07i3jvPzNiMMUYAAAAAYIE90AUAAAAAKP4IFgAAAAAsI1gAAAAAsIxgAQAAAMAyggUAAAAAywgWAAAAACwjWAAAAACwjGABAAAAwDKCBQAAAADLCBYAUMQ6dOigDh06BLqMYs1ms2ncuHGBLqPIcawAKM4IFgAuCrNmzZLNZtP69esDXUq+Va9eXTabzfNTsWJFtW3bVp9++qlP1p+RkaFx48YpISHBJ+tLTExUv379FB8fr5CQEJUrV07XXXedZs6cKZfL5ZNtXGy2b9+ucePGae/evT5db0JCgtd7b7PZVK5cOV1zzTX66KOPfLotACguggJdAAAUZ02aNNE///lPSdL+/fs1depU9ezZU1OmTNGDDz5oad0ZGRkaP368JFn+Fvvdd9/Vgw8+qEqVKumee+5R7dq1lZaWpmXLlmnQoEFKTk7WU089ZWkbRenkyZMKCir4/7K2b9+u8ePHq0OHDqpevbrP6xoxYoSuuuoqSdLhw4c1Z84c9evXT8eOHdNDDz3k8+0BwMWMYAEAFlx22WXq16+f5/U//vEP1apVS6+88orlYOErP/zwgx588EG1atVKixcvVpkyZTzzRo0apfXr12vr1q0BrDBvbrdbWVlZCg0NVWhoaKDLyVPbtm11++23e14PGTJENWvW1Mcff0ywAHDJYSgUgGJl48aNuummmxQZGamIiAh17txZP/zwg2f++vXrZbPZ9N577+Va9ptvvpHNZtOiRYs80/766y8NHDhQlSpVUkhIiK644grNmDGj0PXFxsaqfv36SkpKOm+7lJQUDRo0SJUqVVJoaKgaN27sVfPevXsVExMjSRo/frxnuE3OdQanT5/Wzp07lZycfMGacpb/6KOPvEJFjhYtWmjAgAGe1ydOnNA///lPz5CpunXratKkSTLGeNpceeWV6tixY651ud1uXXbZZV4ftidNmqTWrVurfPnyCgsLU/PmzTVv3rxcy9psNg0bNkwfffSRrrjiCoWEhOjrr7/2zDvzGovff/9dQ4cOVd26dRUWFqby5cvrjjvu8BryNGvWLN1xxx2SpI4dO3r68MyhZV999ZXatm2r0qVLq0yZMurWrZu2bdt2wT49l+DgYJUtWzbX2ZWZM2eqU6dOqlixokJCQtSgQQNNmTLlguvLysrSs88+q+bNmysqKkqlS5dW27ZttXz5cq92e/fulc1m06RJk/TOO+/o8ssvV0hIiK666ir99NNPuda7c+dO3XnnnYqJiVFYWJjq1q2rMWPGeLXx9e8GgJKPMxYAio1t27apbdu2ioyM1OOPP65SpUpp6tSp6tChg1asWKGWLVuqRYsWqlmzpj755BP179/fa/k5c+aobNmy6tKliyTp77//1jXXXOP5QBsTE6OvvvpKgwYNUmpqqkaNGlXgGk+fPq19+/apfPny52xz8uRJdejQQbt379awYcNUo0YNzZ07VwMGDNCxY8c0cuRIxcTEaMqUKRoyZIhuu+029ezZU5LUqFEjSdkf+urXr6/+/ftr1qxZ59xWRkaGli1bpnbt2qlq1aoXrN8Yo1tuuUXLly/XoEGD1KRJE33zzTd67LHH9Ndff+mVV16RJPXu3Vvjxo3TgQMHFBsb61l+1apV2r9/v/r06eOZ9tprr+mWW27R3XffraysLM2ePVt33HGHFi1apG7dunlt/7vvvtMnn3yiYcOGqUKFCuccvvTTTz9pzZo16tOnj6pUqaK9e/dqypQp6tChg7Zv367w8HC1a9dOI0aM0Ouvv66nnnpK9evXlyTPfz/44AP1799fXbp00csvv6yMjAxNmTJF1157rTZu3JivoVNpaWk6dOiQJOnIkSP6+OOPtXXrVk2fPt2r3ZQpU3TFFVfolltuUVBQkL744gsNHTpUbrf7vGc2UlNT9e6776pv374aPHiw0tLSNH36dHXp0kXr1q1TkyZNvNp//PHHSktL0wMPPCCbzaZ//etf6tmzp3777TeVKlVKkrR582a1bdtWpUqV0v3336/q1atrz549+uKLLzRx4kRJRfO7AeASYADgIjBz5kwjyfz000/nbNOjRw8THBxs9uzZ45m2f/9+U6ZMGdOuXTvPtCeffNKUKlXKHDlyxDMtMzPTREdHm4EDB3qmDRo0yMTFxZlDhw55badPnz4mKirKZGRknLfmatWqmRtuuMEcPHjQHDx40GzatMn06dPHSDLDhw/3tGvfvr1p37695/Wrr75qJJkPP/zQMy0rK8u0atXKREREmNTUVGOMMQcPHjSSzNixY3NtOykpyUgy/fv3P2+NmzZtMpLMyJEjz9sux2effWYkmQkTJnhNv/32243NZjO7d+82xhiza9cuI8m88cYbXu2GDh1qIiIivPru7H7MysoyV155penUqZPXdEnGbrebbdu25arr7H7I671Zu3atkWTef/99z7S5c+caSWb58uVebdPS0kx0dLQZPHiw1/QDBw6YqKioXNPPtnz5ciMp14/dbjcTJ07M1T6vert06WJq1qzpNe3sY8XpdJrMzEyvNkePHjWVKlXyOpZzjofy5ct7Hfeff/65kWS++OILz7R27dqZMmXKmN9//91rvW632/Nvq78bAC5NDIUCUCy4XC4tWbJEPXr0UM2aNT3T4+LidNddd2nVqlVKTU2VlP1t+unTp7VgwQJPuyVLlujYsWPq3bu3pOxv5ufPn6/u3bvLGKNDhw55frp06aLjx4/r559/vmBdS5YsUUxMjGJiYtS4cWPNnTtX99xzj15++eVzLrN48WLFxsaqb9++nmmlSpXSiBEjlJ6erhUrVlxwu9WrV5cx5rxnKyR5+iSvIVDnqs3hcGjEiBFe0//5z3/KGKOvvvpKklSnTh01adJEc+bM8bRxuVyaN2+eunfvrrCwMM/0M/999OhRHT9+XG3bts2zf9u3b68GDRpcsM4z13n69GkdPnxYtWrVUnR0dL7et6VLl+rYsWPq27ev13vvcDjUsmXLXEONzuXZZ5/V0qVLtXTpUs2ZM0d9+/bVmDFj9Nprr52z3uPHj+vQoUNq3769fvvtNx0/fvyc63c4HAoODpaUPczsyJEjcjqdatGiRZ772bt3b5UtW9bzum3btpKk3377TZJ08OBBff/99xo4cGCuM1g2m02S7343AFx6GAoFoFg4ePCgMjIyVLdu3Vzz6tevL7fbrX379umKK65Q48aNVa9ePc2ZM0eDBg2SlD0MqkKFCurUqZNnfceOHdM777yjd955J89tpqSkXLCuli1basKECbLZbAoPD1f9+vUVHR193mV+//131a5dW3a793c7OUN0fv/99wtuN78iIyMlZQ/ZyY/ff/9dlStXzhVE8qqtd+/eeuqpp/TXX3/psssuU0JCglJSUjzhLceiRYs0YcIEJSYmKjMz0zM954PsmWrUqJGvOk+ePKkXX3xRM2fO1F9//eV1/cf5Pqjn+PXXXyXJczycLaffLqRhw4a67rrrPK/vvPNOHT9+XKNHj9Zdd93luU5m9erVGjt2rNauXauMjAyvdRw/flxRUVHn3MZ7772nyZMna+fOnTp9+rRnel59dXZYyAkZR48elfT/A8aVV155zu356ncDwKWHYAGgROrdu7cmTpyoQ4cOqUyZMlq4cKH69u3ruajW7XZLkvr165frWowcOdcznE+FChW8PlhebGrVqqWgoCBt2bLF5+vu3bu3nnzySc2dO1ejRo3SJ598oqioKN14442eNitXrtQtt9yidu3a6e2331ZcXJxKlSqlmTNn6uOPP861zjO/2T+f4cOHa+bMmRo1apRatWqlqKgo2Ww29enTx/Penk9Omw8++MDrGpEchbm1bY7OnTtr0aJFWrdunbp166Y9e/aoc+fOqlevnv7zn/8oPj5ewcHBWrx4sV555ZXz1vvhhx9qwIAB6tGjhx577DFVrFhRDodDL774ovbs2ZOrvcPhyHM9ZwavC/HV7waASw/BAkCxEBMTo/DwcO3atSvXvJ07d8putys+Pt4zrXfv3ho/frzmz5+vSpUqKTU11euC4piYGJUpU0Yul8vvwaBatWravHmz3G6311mLnTt3euZLeX+jX1Dh4eHq1KmTvvvuO+3bt8+rj85V27fffqu0tDSvsxZn1yZlf2N+9dVXa86cORo2bJgWLFigHj16KCQkxNNm/vz5Cg0N1TfffOM1febMmZb2a968eerfv78mT57smXbq1CkdO3bMq925+vDyyy+XJFWsWNHn77/T6ZQkpaenS5K++OILZWZmauHChV5nFPIz3GrevHmqWbOmFixY4LUvY8eOLVRtOcMIz3d74UD+bgAo3rjGAkCx4HA4dMMNN+jzzz/3uqXo33//rY8//ljXXnut1/CV+vXrq2HDhpozZ47mzJmjuLg4tWvXzmt9vXr10vz58/P8kHXw4MEi25euXbvqwIEDXtcnOJ1OvfHGG4qIiFD79u0lZYcCSbk+LEsFu93s2LFjZYzRPffc4/mwe6YNGzZ4bnXbtWtXuVwuvfnmm15tXnnlFdlsNt10001e03v37q0ffvhBM2bM0KFDh3INg3I4HLLZbF5P9t67d68+++yzC9Z9Pg6HI9e38G+88UauJ4iXLl1aUu4+7NKliyIjI/XCCy94DS/KYeX9z7mdcePGjT21Sso1XCs/4SqvZX/88UetXbu2ULXFxMSoXbt2mjFjhv744w+veTnbCOTvBoDijTMWAC4qM2bM8Dy74EwjR47UhAkTtHTpUl177bUaOnSogoKCNHXqVGVmZupf//pXrmV69+6tZ599VqGhoRo0aFCuaxpeeuklLV++XC1bttTgwYPVoEEDHTlyRD///LO+/fZbHTlypEj28f7779fUqVM1YMAAbdiwQdWrV9e8efO0evVqvfrqq54zBWFhYWrQoIHmzJmjOnXqqFy5crryyit15ZVX5vt2s5LUunVrvfXWWxo6dKjq1avn9eTthIQELVy4UBMmTJAkde/eXR07dtSYMWO0d+9eNW7cWEuWLNHnn3+uUaNGeb7pz3HnnXfq0Ucf1aOPPqpy5crl+oa7W7du+s9//qMbb7xRd911l1JSUvTWW2+pVq1a2rx5c6H78Oabb9YHH3ygqKgoNWjQQGvXrtW3336b6za/TZo0kcPh0Msvv6zjx48rJCTE8zyJKVOm6J577lGzZs3Up08fxcTE6I8//tCXX36pNm3a5ApXeVm5cqVOnTolKft2swsXLtSKFSvUp08f1atXT5J0ww03KDg4WN27d9cDDzyg9PR0TZs2TRUrVrxgMLz55pu1YMEC3XbbberWrZuSkpL03//+Vw0aNMgzJObH66+/rmuvvVbNmjXT/fffrxo1amjv3r368ssvlZiYKClwvxsAirmA3IsKAM6Sc7vZc/3s27fPGGPMzz//bLp06WIiIiJMeHi46dixo1mzZk2e6/z11189y69atSrPNn///bd56KGHTHx8vClVqpSJjY01nTt3Nu+8884Fa65WrZrp1q3bBdudfQvRnO3ee++9pkKFCiY4ONg0bNjQzJw5M9eya9asMc2bNzfBwcFet1zN7+1mz7RhwwZz1113mcqVK5tSpUqZsmXLms6dO5v33nvPuFwuT7u0tDTz8MMPe9rVrl3b/Pvf//a6HemZ2rRpYySZ++67L8/506dPN7Vr1zYhISGmXr16ZubMmWbs2LHm7P8FSTIPPfRQnuvQWbebPXr0qKf/IiIiTJcuXczOnTtNtWrVcvXJtGnTTM2aNY3D4ch169nly5ebLl26mKioKBMaGmouv/xyM2DAALN+/frz9GTet5sNDg429erVMxMnTjRZWVle7RcuXGgaNWpkQkNDTfXq1c3LL79sZsyYYSSZpKQkT7uzjxW3221eeOEFU61aNRMSEmKaNm1qFi1aZPr372+qVavmaZdzPPz73/++YN8ZY8zWrVvNbbfdZqKjo01oaKipW7eueeaZZ7zaWPndAHBpshlTgCu6AAAAACAPXGMBAAAAwDKCBQAAAADLCBYAAAAALCNYAAAAALCMYAEAAADAMoIFAAAAAMsuygfkud1u7d+/X2XKlJHNZgt0OQAAAMAlyRijtLQ0Va5cOdeDZs92UQaL/fv3Kz4+PtBlAAAAAJC0b98+ValS5bxtLspgUaZMGUnZOxAZGemz9brdbh08eFAxMTEXTFwoPKfTqQULFigrK0t33nmngoODA11SicUx7T/0tX/Qz/5DX/sPfe0f9HPRSE1NVXx8vOfz+flclMEiZ/hTZGSkz4PFqVOnFBkZyQFXhJxOp8LDw+VwOBQZGUmwKEIc0/5DX/sH/ew/9LX/0Nf+QT8XrfxcnkCvAwAAALCMYAEAAADAMoIFAAAAAMsuymssAAAAkM3lcun06dOBLuOi53a7dfr0aZ06dYprLAqgVKlScjgcPlkXwQI+Z7fbdcUVVyg1NZVfbAAACskYowMHDujYsWOBLqVYMMbI7XYrLS2N56AVUHR0tGJjYy33G8ECPme329WwYUOlpKQQLAAAKKScUFGxYkWFh4fzYfkCjDFyOp0KCgqir/LJGKOMjAylpKRIkuLi4iytj2ABAABwkXG5XJ5QUb58+UCXUywQLAonLCxMkpSSkqKKFStaGhbF18nwOWOMjh8/rrS0NBljAl0OAADFTs41FeHh4QGuBJeCnOPM6rU8nLGAz7lcLn311VfKzMxUtWrVfHZBEAAAlxq+eYc/+Oo4I1j8n78On1BGljPf7cODg3RZ+dJFWBEAALDk+FFp12bpVIYUGi7VbSRFlQ10VUCJRbBQdqgY+HZCgZebMbQD4QIAgIvNn0nS4tnS+pWS2/3/p9vtUou2Utc+UpUagavP34pxwBo3bpymTJmilJQUffrpp+rRo0egS8J5FOgaC5fLpdatW6tnz55e048fP674+HiNGTNGmzZtUt++fRUfH6+wsDDVr19fr732mk+L9rWCnKnwxXIAAKCIbF0vTRiRO1RI2a/Xr8qev3V9YOrzpz+TpHdelB67O/u/77/m/frPpCLZ7IABA2Sz2Tw/5cuX14033qjNmzcXaD07duzQ+PHjNXXqVCUnJ+umm24qknrPZcCAAV5B5sz9Cg4OVq1atfTcc8/J6XQqPT1dpUqV0uzZs73W0adPH9lsNu3du9drevXq1fXMM8/4YS/8q0DBwuFwaNasWfr666/10UcfeaYPHz5c5cqV09ixY7VhwwZVrFhRH374obZt26YxY8boySef1Jtvvunz4gEAADz+TJLeHC+5nLlDRQ63K3v+m+OL7IP1RSHAAevGG29UcnKykpOTtWzZMgUFBenmm28u0Dr27NkjSbr11lsVGxurkJCQQtXiy4cL5uzXr7/+qn/+858aN26c/v3vfysiIkItWrRQQkKCV/uEhATFx8d7TU9KStLvv/+uTp06+ayui0WB7wpVp04dvfTSSxo+fLiSk5P1+eefa/bs2Xr//fcVHBysgQMH6rXXXlP79u1Vs2ZN9evXT/fee68WLFhQFPUDAABkWzw7Ozhc6I6ExmR/uF48xz91+dtFELBCQkIUGxur2NhYNWnSRKNHj9a+fft08OBBT5t9+/bpzjvvVHR0tMqVK6dbb73V883+uHHj1L17d0nZz8fKubjY7XbrueeeU5UqVRQSEqImTZro66+/9qxz7969stvtmjNnjtq3b6/Q0FDPl+Hvvvuu6tevr9DQUNWrV09vv/12oferWrVqGjJkiK677jotXLhQktSxY0evALFjxw6dOnVKQ4YM8ZqekJCgkJAQtWrVqsDbv9gV6nazw4cPV+PGjXXPPffo/vvv17PPPqvGjRufs/3x48dVrly5QhcJAABwXseP5v3t/Lm4XdL676XUY0VaVkBcZAErPT1dH374oWrVquV5Jsfp06fVpUsXlSlTRitXrtTq1asVERGhG2+8UVlZWXr00Uc1c+ZMSfKc+ZCk1157TZMnT9akSZO0efNmdenSRbfccot+/fVXr22OHj1aI0eO1I4dO9SlSxd99NFHevbZZzVx4kTt2LFDL7zwgp555hm99957lvYtLCxMWVlZkrKDxa5duzy1Ll++XNdee606derkFSyWL1+uVq1aKTQ01NK2L0aF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KAmq1JDuH539bIZdm7PveBRWOvs6gpJ2TcW55ASsxXOyn1Nx5tmbnIDVtTehAj5FsPg/hAQAAEqYyOiS9fC7giJgwc8IFgAAACXZpR6w4DcEC/iczWZTrVq1lJaWxsVTAAAAlwiCBXzO4XCoRYsWSklJ4eF4AAAAlwjuCgUAAADAMoIFfM4Yo1OnTikzM/O8D6sBAABAyUGwgM+5XC599tln+u677+RyuQJdDgAAAPyAaywAAABKkL8On7jon81ljNEDDzygefPm6ejRo9q4caOaNGni1xrgewQLAACAEuKvwyc08O2EAi83Y2gHn4eLtWvX6tprr9WNN96oL7/80mve119/rVmzZikhIUE1a9ZUhQoVZLPZ9Omnn6pHjx4+rSNHhw4d1KRJE7366que1ytWrJAkhYSEqGbNmho2bJiGDh2qnTt3qn79+lq7dq2uueYazzquueYaJSYm6tixYwoNDZUknTp1StHR0Xrrrbc0aNCgIqm9uGAoFAAAQAlRkDMVvljufKZPn67hw4fr+++/1/79+73m7dmzR3FxcWrdurViY2MVFOS777pPnz6d77aDBw9WcnKytm/frjvvvFMPPfSQ/ve//6levXqKjY1VQkKCp21aWpp+/vlnxcTE6IcffvBMX7t2rTIzM9WpUyef7UNxRbAAAACAT6Wnp2vOnDkaMmSIunXrplmzZnnmDRgwQMOHD9cff/whm82m6tWrq3r16pKk2267zTMtx+eff65mzZopNDRUNWvW1Pjx4+V0/v8gZLPZNGXKFN16662Kjo7WxIkT811neHi4YmNjVbNmTY0bN061a9fWwoULJUkdO3b0CharVq1SnTp11L17d6/pCQkJqlatmmrUqFGgPiqJCBYAAADwqU8++UT16tVT3bp11a9fP82YMcNzp8jXXntNzz33nKpUqaLk5GT99NNP+umnnyRJM2fO9EyTpJUrV+of//iHRo4cqe3bt2vq1KmaNWtWrvAwbtw49ejRQz///LMGDhxY6LrDwsKUlZUlKTtYrFq1yhNili9frg4dOqh9+/Zavny5Z5nly5erY8eOhd5mSUKwAAAAgE9Nnz5d/fr1kyTdeOONOn78uOd6hqioKJUpU0YOh0OxsbGKiYlRTEyMJCk6OtozTZLGjx+v0aNHq3///qpZs6auv/56Pf/885o6darX9u666y7de++9qlmzpqpWrVrgel0ulz788ENt3rzZM6SpY8eOOnHihCfkJCQkqH379mrXrp1+/PFHnTp1SidPntS6desIFv+Hi7fhczabTTVq1FBaWppsNlugywEAAH60a9curVu3Tp9++qkkKSgoSL1799b06dPVoUOHAq1r06ZNWr16tdcZCpfLpVOnTikjI0Ph4eGSpBYtWhSq1rffflvvvvuusrKy5HA49PDDD2vIkCGSpFq1aqlKlSpKSEjQFVdcoY0bN6p9+/aqWLGiqlatqrVr18oYo8zMTILF/yFYwOccDodatmyplJQUORyOQJcDAAD8aPr06XI6napcubJnmjFGISEhevPNNxUVFZXvdaWnp2v8+PHq2bNnrnk5d2WSpNKlC3dHq7vvvltjxoxRWFiY4uLiZLd7D+bp0KGDli9frkaNGql27dqqWLGiJHmGQxljVKtWLcXHxxdq+yUNwQIAAAA+4XQ69f7772vy5Mm64YYbvOb16NFD//vf//Tggw/muWypUqVyPVi3WbNm2rVrl2rVqlUk9UZFRZ133R07dtSIESPUoEEDr7Mt7dq107Rp02SM4WzFGQgW8DljjJxOp5xOp+dCLQAAUPItWrRIR48e1aBBg3KdmejVq5emT59+zmBRvXp1LVu2TG3atFFISIjKli2rZ599VjfffLOqVq2q22+/XXa7XZs2bdLWrVs1YcKEIt+fnOssZsyYoWnTpnmmt2/fXvfdd58kaejQoUVeR3HBxdvwOZfLpXnz5mnp0qW5vnkAAAAl1/Tp03XdddflOdypV69eWr9+vTZv3pznspMnT9bSpUsVHx+vpk2bSpK6dOmiRYsWacmSJbrqqqt0zTXX6JVXXlG1atWKdD9y1KhRQ9WqVVNaWprat2/vmV61alVVrlxZWVlZBb5upCTjjAUAAAB84osvvjjnvKuvvtozkqFRo0YaNWqU1/zu3bure/fuuZbr0qWLunTpcs715qzzQqMkznz2RF6vz2Xv3r15Tk9KSsrX8pcSzlgAAAAAsIxgAQAAUEKEBxduMEphlwPOxFEEAABQQlxWvrRmDO2gjCxnvpcJDw7SZeULd7tW4EwECwAAgBKEkIBAYSgUAAAAAMs4YwGfs9lsio+PV3p6umw2W6DLAQAAgB8QLOBzDodDbdq0UUpKihwOR6DLAQAAgB8wFAoAAACAZQQLAAAAAJYRLOBzTqdTs2fP1ldffSWnM/+3uwMAACVfQkKCbDabjh075tftzpo1S9HR0ZbWsXfvXtlsNiUmJp6zTX73b9myZapfv75cLpelmi7kv//9b55PNC8KBAsAAAD4hM1mO+/PuHHjAl3iRePxxx/X008/7XU9akJCgpo1a6aQkBDVqlVLs2bNOu86Tp06pQEDBqhhw4YKCgpSjx49crUZOHCgfv75Z61cudLHe5AbwQIAAAA+kZyc7Pl59dVXFRkZ6TXt0UcfLdR6s7KyfFxpYK1atUp79uxRr169PNOSkpLUrVs3dezYUYmJiRo1apTuu+8+ffPNN+dcj8vlUlhYmEaMGKHrrrsuzzbBwcG666679Prrr/t8P85GsAAAAIBPxMbGen6ioqJks9m8pkVERHjabtiwQS1atFB4eLhat26tXbt2eeaNGzdOTZo00bvvvqsaNWooNDRUknTs2DHdd999iomJUWRkpDp16qRNmzZ5ltu0aZM6deqkMmXKKDIyUs2bN9f69eu9avzmm29Uv359RURE6MYbb1RycrJnntvt1nPPPacqVaooJCRETZo00ddff33efV68eLHq1KmjsLAwdezYUXv37r1gP82ePVvXX3+9Z7+k7CFLNWrU0OTJk1W/fn0NGzZMt99+u1555ZVzrqd06dKaMmWKBg8erNjY2HO26969uxYuXKiTJ09esDYrCBYAAADFiNPpPOfP2eP1fdG2qIwZM0aTJ0/W+vXrFRQUpIEDB3rN3717t+bPn68FCxZ4rmm44447lJKSoq+++kobNmxQs2bN1LlzZx05ckSS1L9/f1WpUkU//fSTNmzYoNGjR6tUqVKedWZkZGjSpEn64IMP9P333+uPP/7wOovy2muvafLkyZo0aZI2b96sLl266JZbbtGvv/6a5z7s27dPPXv2VPfu3ZWYmKj77rtPo0ePvuC+r1y5Ui1atPCatnbt2lxnHbp06aK1a9decH0X0qJFCzmdTv3444+W13U+PMcCAACgGJk7d+4558XFxalDhw6e1wsWLDjnxcExMTFeH2QXLlyozMzMXO369u1b+GLPY+LEiWrfvr0kafTo0erWrZtOnTrl+RY/KytL77//vmJiYiRlDx9at26dUlJSFBISIkmaNGmSPvvsM82bN0+DBw/Wvn379Nhjj6levXqSpNq1a3tt8/Tp0/rvf/+ryy+/XJI0bNgwPffcc575kyZN0hNPPKE+ffpIkl5++WUtX75cr776qt56661c+zBlyhRdfvnlmjx5siSpbt262rJli15++eXz7vvvv/+uypUre007cOCAKlWq5DWtUqVKSk1N1cmTJxUWFnbedZ5PeHi4oqKi9Pvvvxd6HfnBGQsAAAD4XaNGjTz/jouLkySlpKR4plWrVs0TKqTsYU7p6ekqX768IiIiPD9JSUnas2ePJGnkyJEaPHiwrrvuOr300kue6TnCw8M9oSJnuznbTE1N1f79+9WmTRuvZdq0aaMdO3bkuQ87duxQy5Ytvaa1atXqgvt+8uRJr2FQ/hAWFqaMjIwi3QZnLOBzNptNcXFxOnHihGw2W6DLAQCgRLnjjjvOOe/s/+/27Nkz321vueUWa4UV0JlDlHJqcbvdnmmlS5f2ap+enq64uDglJCTkWlfObWSfffZZ9evXT4sXL9ZXX32lsWPHavbs2brttttybTNnu8YYX+xOgVSoUEFHjx71mhYbG6u///7ba9rff/+tyMhIS2crchw5csQrqBUFggV8zuFwqH379kpJSfG6hRoAALAuKCj/H9+Kqm0gNGvWTAcOHFBQUJCqV6+ea35OQKhTp47q1q2rhx9+WH379tXMmTM9weJ8IiMjVblyZa1evdozREuSVq9erauvvjrPZerXr6+FCxd6Tfvhhx8uuK2mTZtq+/btXtNatWqlxYsXe01bunRpvs6AXMiePXt06tQpNW3a1PK6zoehUAAAALjoXXfddWrVqpV69OihJUuWaO/evVqzZo3GjBmj9evX6+TJkxo5cqQSEhL0+++/a/Xq1frpp59Uv379fG/jscce08svv6w5c+Zo165dGj16tBITEzVy5Mg82z/44IP69ddf9dhjj2nXrl36+OOPL/jsCSn7ouxVq1blWtdvv/2mxx9/XDt37tTbb7+tTz75RA8//LCnzZtvvqnOnTt7Lbd9+3YlJibqyJEjOn78uBITE3M9wG/lypWqWbOm1zCwonBxR1MAAABA2cOWFi9erDFjxujee+/VwYMHFRsbq3bt2qlSpUpyOBw6fPiw+vfvr7///lsVKlRQz549NX78+HxvY8SIETp+/Lj++c9/KiUlRQ0aNNDChQtzXQSeo2rVqpo/f74efvhhvfHGG7r66qv1wgsv5LrD1dnuvvtuPf7449q1a5fq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1apVSw6Hw3Os5zWtpMnKylKtWrW0Zs2aQJeSb4cOHVLFihX1559/BroUoMQjWAAl0Nq1a+VwONStW7dAl5IvvvzwffDgQQ0ZMkRVq1ZVSEiIYmNj1aVLF61evdrTxmaz6bPPPrO8rYtN69atlZycrKioqIDVkPNeOhwO/fXXX17zkpOTFRQUJJvNpr179wamwDNUr15dNptNNptNYWFhql69uu6880599913Xu3y6tcHHnhAt99+u/bt26fnn3/+nNNKmv/+97+qUaOGWrdunWveAw88IIfDoblz5+aal5GRoSeffFKXX365QkNDFRMTo/bt2+vzzz/3tOnQoYNsNpteeumlXMt369ZNNptN48aNy9XeZrMpJCREl112mbp3764FCxZ4LVuhQgX94x//0NixYy3sOYD8IFgAJdD06dM1fPhwff/999q/f3+gy/GrXr16aePGjXrvvff0yy+/aOHCherQoYMOHz4c6NIKLSsrK1/tgoODFRsbK5vNVsQVXdhll12m999/32vae++9p8suuyxAFeXtueeeU3Jysnbt2qX3339f0dHRuu666zRx4kRPm7P7NT09XSkpKerSpYsqV66sMmXK5DmtMPL7XgeCMUZvvvmmBg0alGteRkaGZs+erccff1wzZszINf/BBx/UggUL9MYbb2jnzp36+uuvdfvtt+f6vYyPj9esWbO8pv31119atmyZ4uLicq138ODBSk5O1p49ezR//nw1aNBAffr00f333+/V7t5779VHH32kI0eOFGLPAeSbAVCipKWlmYiICLNz507Tu3dvM3HiRK/5y5cvN5LMokWLTMOGDU1ISIhp2bKl2bJli6fN3r17zc0332yio6NNeHi4adCggfnyyy898xMSEsxVV11lgoODTWxsrHniiSfM6dOnPfPbt29vRo4c6XktyXz66adedURFRZmZM2d65p/50759e0+7adOmmXr16pmQkBBTt25d89Zbb51z348ePWokmYSEhHO2qVatmte2qlWrZowxZvfu3eaWW24xFStWNKVLlzYtWrQwS5cuzbXsxIkTzb333msiIiJMfHy8mTp1qlebH3/80TRp0sSEhISY5s2bmwULFhhJZuPGjcYYY5xOpxk4cKCpXr26CQ0NNXXq1DGvvvqq1zr69+9vbr31VjNhwgQTFxdnqlevnq9157y3R48eNcZkvw9n960kk5SU5OmvQYMGmQoVKpgyZcqYjh07msTERK9aXnzxRVOxYkUTERFhBg4caJ544gnTuHHjc/ZvUlKSkWSefvppU7t2ba95derUMc8884xXDcYYs2XLFnPjjTea0qVLm4oVK5p+/fqZgwcPeuZ/9dVXpk2bNiYqKsqUK1fOdOvWzezevTvXNufPn286dOhgwsLCTKNGjcyaNWvOWacx2e/nK6+8kmv6s88+a+x2u9m5c2eufs3595k/55pmjDErV6401157rQkNDTVVqlQxw4cPN+np6V41PPfcc+aee+4xZcqUMf3798/3chc6Fvft22f69OljypYta8LDw03z5s3NDz/84Jn/2WefmaZNm5qQkBBTo0YNM27cOK/f47P99NNPxm63m9TU1FzzZs2aZa655hpz7NgxEx4ebv744w+v+VFRUWbWrFnnXLcx2cfrkCFDTPny5c2qVas80ydOnGi6d+9uGjdubMaOHevV/sy/MzlmzJhhJOX6/a1Ro4Z59913z1sDAGs4YwGUMJ988onq1aununXrql+/fpoxY4aMMbnaPfbYY5o8ebJ++uknxcTEqHv37jp9+rQk6aGHHlJmZqa+//57bdmyRS+//LIiIiIkZX972LVrV1111VXatGmTpkyZounTp2vChAmFrnndunWSpG+//VbJycmeoQwfffSRnn32WU2cOFE7duzQCy+8oGeeeUbvvfdenuuJiIhQRESEPvvsM2VmZubZ5qeffpIkzZw5U8nJyZ7X6enp6tq1q5YtW6aNGzfqxhtvVPfu3fXHH394LT958mS1aNFCGzdu1NChQzVkyBDt2rXLs46bb75ZDRo00IYNGzRu3Dg9+uijXsu73W5VqVJFc+fO1fbt2/Xss8/qqaee0ieffOLVbtmyZdq1a5eWLl2qRYsW5WvdZ1uwYIGSk5M9Pz179lTdunVVqVIlSdIdd9yhlJQUffXVV9qwYYOaNWumzp07e77V/eSTTzRu3Di98MILWr9+veLi4vT222+fd5s5brnlFh09elSrVq2SJK1atUpHjx5V9+7dvdodO3ZMnTp1UtOmTbV+/Xp9/fXX+vvvv3XnnXd62pw4cUKPPPKI1q9fr2XLlslut+u2226T2+32WteYMWP06KOPKjExUXXq1FHfvn3ldDrzVe+ZRo4cKWOM1zCdHK1bt/a83/Pnz1dycvI5p+3Zs0c33nijevXqpc2bN2vOnDlatWqVhg0b5rXOSZMmqXHjxtq4caOeeeaZfC93oWOxffv2+uuvv7Rw4UJt2rRJjz/+uKfPVq5cqX/84x8aOXKktm/frqlTp2rWrFleZ2rOtnLlStWpUyfPszHTp09Xv379FBUVpZtuuinXWYfY2FgtXrxYaWlp5+374OBg3X333Zo5c6Zn2qxZszRw4MDzLnem/v37q2zZsrmGRF199dVauXJlvtcDoBACnWwA+Fbr1q0934CfPn3aVKhQwfPtqTH//9vX2bNne6YdPnzYhIWFmTlz5hhjjGnYsKEZN25cnut/6qmnTN26dY3b7fZMe+utt0xERIRxuVzGmIKfscj5xjnnm/ccl19+ufn444+9pj3//POmVatW59z/efPmmbJly5rQ0FDTunVr8+STT5pNmzZ5tcmrnrxcccUV5o033vC8rlatmunXr5/ntdvtNhUrVjRTpkwxxhgzdepUU758eXPy5ElPmylTpuS5b2d66KGHTK9evTyv+/fvbypVqmQyMzM90/Kz7rPPWJzpP//5j4mOjja7du0yxmR/Ix4ZGWlOnTrl1e7yyy/3fPPdqlUrM3ToUK/5LVu2zNcZi40bN5pRo0aZe++91xhjzL333msefvhhs3HjRq8zFs8//7y54YYbvNaxb98+I8lT69kOHjxoJHnOsuVs88xvo7dt22YkmR07dpyz1nOdsTDGmEqVKpkhQ4YYY3L3a86ZsTN/r/KaNmjQIHP//fd7rXflypXGbrd73sdq1aqZHj16eLXJ73IXOhbLlCljDh8+nOf+de7c2bzwwgte0z744AMTFxeXZ3tjjBk5cqTp1KlTrum//PKLKVWqlOcs06effmpq1Kjh9TdixYoVpkqVKqZUqVKmRYsWZtSoUV5nJYz5/383EhMTTZkyZUx6erpZsWKFqVixojl9+nS+z1gYk32c3nTTTV7THn74YdOhQ4dz7h8A6zhjAZQgu3bt0rp169S3b19JUlBQkHr37q3p06fnatuqVSvPv8uVK6e6detqx44dkqQRI0ZowoQJatOmjcaOHavNmzd72u7YsUOtWrXyGsffpk0bpaen+/SuKydOnNCePXs0aNAgz5mIiIgITZgwQXv27Dnncr169dL+/fu1cOFC3XjjjUpISFCzZs1yfYN6tvT0dD366KOqX7++oqOjFRERoR07duQ6Y9GoUSPPv202m2JjY5WSkiIpu28aNWqk0NBQT5sz+znHW2+9pebNmysmJkYRERF65513cm2nYcOGCg4O9rzO77rz8tVXX2n06NGaM2eO6tSpI0natGmT0tPTVb58ea/+TUpK8vTvjh071LJlS6915XebkjRw4EDNnTtXBw4c0Ny5c/P81nnTpk1avny5Vw316tWTJE8dv/76q/r27auaNWsqMjJS1atXl6Tzvjc54/Fz3puCMsZYvlZl06ZNmjVrlte+denSRW63W0lJSZ52LVq0KNRy5zsWExMT1bRpU5UrV+6ctT333HNe28i5XiEjIyPPZU6ePOl1/OWYMWOGunTpogoVKkiSunbtquPHj3tdBN+uXTv99ttvWrZsmW6//XZt27ZNbdu2zfMi98aNG6t27dqaN2+eZsyYoXvuuUdBQUF51nQueb1/YWFh59w3AL5RsN9UABe16dOny+l0qnLlyp5pxhiFhITozTffzPfdgu677z516dJFX375pZYsWaIXX3xRkydP1vDhwwtVl81myzUcK2fY1bmkp6dLkqZNm5brw63D4TjvsqGhobr++ut1/fXX65lnntF9992nsWPHasCAAedc5tFHH9XSpUs1adIk1apVS2FhYbr99ttzXUxbqlSpXPt29pCc85k9e7YeffRRTZ48Wa1atVKZMmX073//Wz/++KNXu9KlS+d7neezfft29enTRy+99JJuuOEGz/T09HTFxcUpISEh1zLR0dE+2XbDhg1Vr1499e3bV/Xr19eVV16Z685f6enp6t69u15++eVcy+eEg+7du6tatWqaNm2aKleuLLfbrSuvvPK8703Oh8qCvDc5Dh8+rIMHD6pGjRoFXvZM6enpeuCBBzRixIhc86pWrer599nvdX6XO9+xGBYWdsHaxo8fr549e+aal1d4kLLvrrRlyxavaS6XS++9954OHDjg9eHf5XJpxowZ6ty5s1e9bdu2Vdu2bfXEE09owoQJeu655/TEE094hWgpO5S+9dZb2r59u2eoZH65XC79+uuvuuqqq7ymHzlyRDExMQVaF4CCIVgAJYTT6dT777+vyZMne32AlKQePXrof//7nx588EHPtB9++MHzIeXo0aP65ZdfVL9+fc/8+Ph4Pfjgg3rwwQf15JNPatq0aRo+fLjq16+v+fPne30juHr1apUpU0ZVqlTJs7aYmBglJyd7Xv/6669e3xzmfKhwuVyeaZUqVVLlypX122+/6e677y5st0iSGjRo4HV72VKlSnltK2cfBgwYoNtuu01S9gevgt4StX79+vrggw906tQpz4ezH374Idd2WrduraFDh3qmne8MTEHWfbZDhw6pe/fu6tWrlx5++GGvec2aNfN8GMw5A5DXNn/88Uf94x//8Ey70DbPNnDgQA0dOlRTpkzJc36zZs00f/58Va9ePc9vpQ8fPqxdu3Zp2rRpatu2rSR5rtsoKq+99prsdrt69OhhaT3NmjXT9u3bVatWLb8sd6ZGjRrp3Xff1ZEjR/I8a9GsWTPt2rWrQNto2rSppkyZ4vW7n3PdxMaNG70C/9atW3Xvvffq2LFj5wyqDRo0kNPp1KlTp3IFi7vuukuPPvqoGjdurAYNGuS7Rin77mNHjx5Vr169vKZv3bpVHTp0KNC6ABQMQ6GAEmLRokU6evSoBg0apCuvvNLrp1evXrmGQz333HNatmyZtm7dqgEDBqhChQqeD1KjRo3SN998o6SkJP38889avny5J3QMHTpU+/bt0/Dhw7Vz5059/vnnGjt2rB555BHZ7Xn/SenUqZPefPNNbdy4UevXr9eDDz7o9W1rxYoVFRYW5rlw9/jx45Kk8ePH68UXX9Trr7+uX375RVu2bNHMmTP1n//8J8/tHD58WJ06ddKHH36ozZs3KykpSXPnztW//vUv3XrrrZ521atX17Jly3TgwAEdPXpUklS7dm0tWLBAiYmJ2rRpk+66664Cf9t91113yWazafDgwdq+fbsWL16sSZMmebWpXbu21q9fr2+++Ua//PKLnnnmGc8F5FbXfbZevXopPDxc48aN04EDBzw/LpdL1113nVq1aqUePXpoyZIl2rt3r9asWaMxY8Zo/fr1krIvYp4xY4ZmzpypX375RWPHjtW2bdsK1CeDBw/WwYMHdd999+U5/6GHHtKRI0fUt29f/fTTT9qzZ4+++eYb3XvvvXK5XCpbtqzKly+vd955R7t379Z3332nRx55pEA1nE9aWpoOHDigffv26fvvv9f999+vCRMmaOLEiZY+2EvSE088oTVr1mjYsGFKTEzUr7/+qs8//zzXRdi+Wu5Mffv2VWxsrHr06KHVq1frt99+0/z587V27VpJ0rPPPqv3339f48eP17Zt27Rjxw7Nnj1bTz/99DnX2bFjR6Wnp3sdA9OnT1e3bt3UuHFjr785d955p6Kjo/XRRx9Jyn7mxNSpU7Vhwwbt3btXixcv1lNPPaWOHTsqMjIy17bKli2r5ORkLVu27Lz7mZGRoQMHDujPP//UDz/8oCeeeEIPPvighgwZoo4dO3q127BhQ64vXQD4WCAv8ADgOzfffLPp2rVrnvN+/PFHI8ls2rTJcyHqF198Ya644goTHBxsrr76aq8LnIcNG2Yuv/xyExISYmJiYsw999xjDh065Jlf0NvN/vXXX+aGG24wpUuXNrVr1zaLFy/2unjbmOzbysbHxxu73e51u9mPPvrINGnSxAQHB5uyZcuadu3amQULFuS5n6dOnTKjR482zZo1M1FRUSY8PNzUrVvXPP300yYjI8PTbuHChaZWrVomKCjIc7vZpKQk07FjRxMWFmbi4+PNm2++mWs/8rrY9+wLSteuXWsaN25sgoODTZMmTcz8+fO9LrA+deqUGTBggImKijLR0dFmyJAhZvTo0V4XROfcbvZsF1r32RcZK49bzeqMC6dTU1PN8OHDTeXKlU2pUqVMfHy8ufvuu71uFTpx4kRToUIFExERYfr3728ef/zxfF+8nZezL942Jvvi39tuu81ER0ebsLAwU69ePTNq1CjPxb9Lly419evXNyEhIaZRo0YmISHB6wL8vLaZ18XUZzvz1sPBwcGmatWq5s477zTfffedV7vCXrxtjDHr1q0z119/vYmIiDClS5c2jRo18roF9LkuIC/Mcmcfi3v37jW9evUykZGRJjw83LRo0cL8+OOPnvlff/21ad26tQkLCzORkZHm6quvNu+88845+8sYY+68804zevRoY4wxBw4cMEFBQeaTTz7Js+2QIUNM06ZNjTHGvPDCC6ZVq1amXLlyJjQ01NSsWdOMGDHC6+/K+S7Gzmv/zrydcnBwsImLizM333xznn8fPv74Y1O3bt3z7hsA62zG5HEfSgAAgLNs3rxZ119/vfbs2eO5BXVxcM0112jEiBG66667Al0KUKIxFAoAAORLo0aN9PLLL3vdnepid+jQIfXs2dNztzwARYczFgAAAAAs44wFAAAAAMsIFgAAAAAsI1gAAAAAsIxgAQAAAMAyggUAAAAAywgWAAAAACwjWAAAAACwjGABAAAAwDKCBQAAAADL/h+r1Yl6OMbHZwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Variable Before After Balanced\n", + "--------------------------------------------\n", + "X1 0.758 0.063 ✓\n", + "X2 0.564 0.013 ✓\n" + ] + } + ], + "source": [ + "X_cov = df[[\"X1\", \"X2\"]]\n", + "T_vec = df[\"T\"]\n", + "\n", + "# ASMD 계산\n", + "asmd_before = compute_asmd(X_cov, T_vec.values)\n", + "asmd_after = compute_asmd(X_cov, T_vec.values, w)\n", + "\n", + "# plotting 준비\n", + "var_names = list(asmd_before.keys())\n", + "bef = [asmd_before[v] for v in var_names]\n", + "aft = [asmd_after[v] for v in var_names]\n", + "y_pos = list(range(len(var_names)))\n", + "\n", + "# Love plot\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "\n", + "ax.scatter(\n", + " bef, y_pos,\n", + " marker='o',\n", + " color='tomato',\n", + " s=80,\n", + " label='Before IPW',\n", + " zorder=3\n", + ")\n", + "\n", + "ax.scatter(\n", + " aft, y_pos,\n", + " marker='s',\n", + " color='steelblue',\n", + " s=80,\n", + " label='After IPW',\n", + " zorder=3\n", + ")\n", + "\n", + "# before-after 연결선\n", + "for i in range(len(var_names)):\n", + " ax.plot(\n", + " [bef[i], aft[i]],\n", + " [y_pos[i], y_pos[i]],\n", + " color='gray',\n", + " linewidth=0.8,\n", + " zorder=2\n", + " )\n", + "\n", + "# 기준선\n", + "ax.axvline(\n", + " 0.1,\n", + " linestyle='--',\n", + " color='gray',\n", + " alpha=0.7,\n", + " label='Threshold (0.1)'\n", + ")\n", + "\n", + "ax.set_yticks(y_pos)\n", + "ax.set_yticklabels(var_names)\n", + "\n", + "ax.set_xlabel(\"Absolute Standardized Mean Difference (ASMD)\")\n", + "ax.set_title(\"Love Plot: Covariate Balance\")\n", + "\n", + "ax.legend()\n", + "ax.grid(axis='x', alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# 결과 출력\n", + "print(f\"\\n{'Variable':<10} {'Before':>10} {'After':>10} {'Balanced':>10}\")\n", + "print(\"-\" * 44)\n", + "\n", + "for v in var_names:\n", + " b = asmd_before[v]\n", + " a = asmd_after[v]\n", + " ok = \"✓\" if a < 0.1 else \"✗\"\n", + "\n", + " print(f\"{v:<10} {b:>10.3f} {a:>10.3f} {ok:>10}\")" + ] + }, + { + "cell_type": "markdown", + "id": "27b1841d", + "metadata": {}, + "source": [ + "### Condition 2: Weight Stability" + ] + }, + { + "cell_type": "markdown", + "id": "72186272", + "metadata": {}, + "source": [ + "Weights are a double-edged sword: they reduce bias, but can **greatly inflate variance**. Units with propensity scores near 0 or 1 receive extreme weights, making the estimator unstable.\n\nWe assess weight stability using:\n\n- **Max weight**: a very large maximum signals the presence of extreme weights.\n- **Quantiles (95th, 99th percentile)**: check how much weight is concentrated in the upper tail.\n- **Boxplot**: a quick visual summary of the full distribution and outliers.\n\nWhen extreme weights are a problem, **weight truncation** can help — simply clip weights above a threshold $c$:\n\n$$\nw_i^{\\text{trunc}} = \\min(w_i, c)\n$$\n\n```python\nw_trunc = np.clip(w, 0, 20)\n```\n\nA common choice is $c = 20$. Keep in mind that truncation reduces variance at the cost of introducing some bias, and strictly speaking shifts the estimand from ATE to a different target (ATO)." + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "d70624e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: {'max': 18.64358877046646, 'p95': 4.381409300448245, 'p99': 7.6835220850896135}\n" + ] + } + ], + "source": [ + "def weight_diagnostics(w):\n", + " return {\n", + " \"max\": np.max(w),\n", + " \"p95\": np.percentile(w, 95),\n", + " \"p99\": np.percentile(w, 99)\n", + " }\n", + "\n", + "diag_good = weight_diagnostics(w)\n", + "print(\"Model:\", diag_good)" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "711f2e7d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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P9/A6gAYgafAQuApMMCcvF6vKisrA2+CdjqdjPwAJsKboAEgBLvdzqPuACQxBwgAAFgQAQgAAFgOAQgAAFgOAQgAAFiOoQFo06ZNmjZtmlJSUmSz2VRaWhpoO3XqlH72s5/J4XDo0ksvVUpKimbNmqWDBw+e85qLFi2SzWYL2kaOHNnNnwQAAEQTQwNQa2urRo8erVWrVp3VduLECW3fvl0///nPtX37dpWUlGjXrl269dZbv/a611xzjdxud2DbvHlzd5QPAACilKGPwefm5io3NzdkW0JCgtavXx90bOXKlfr2t7+tffv26corr+z0ur169dKQIUPCWisAADCPqJoD1NTUJJvNpv79+5+zX21trVJSUnTVVVfpjjvu0L59+3qmQAAAEBWi5kWIn3/+uX72s59pxowZ53y7Y1ZWllavXq0RI0bI7XZr8eLFcjqdqqmpUb9+/UKe097ervb29sC+x+MJe/0AACByREUAOnXqlG6//Xb5/X698MIL5+x75i21a6+9VllZWRo6dKjefPNN3XPPPSHPKSoq0uLFi8NaMwAAiFwRfwusI/zs3btX69evv+C1ufr376/hw4drz549nfYpLCxUU1NTYNu/f//Flg0AACJYRAegjvBTW1ur9957T4MGDbrga7S0tKiurk7Jycmd9omNjVV8fHzQBgAAzMvQANTS0qLq6mpVV1dLkurr61VdXa19+/bp1KlTKigo0NatW/WHP/xBXq9XjY2Namxs1MmTJwPXmDRpklauXBnYnz9/vioqKtTQ0KCqqirddtttstvtmjFjRk9/PAAAEKEMnQO0detW5eTkBPbnzp0rSZo9e7YWLVqkP/3pT5Kk6667Lui8jRs3BlZ0rqur09GjRwNtBw4c0IwZM3Ts2DElJiZq/Pjx2rJlixITE7v3wwAAgKhh8/v9fqOLiDQej0cJCQlqamridhgAAFHiQr6/I3oOEAAAQHcgAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMshAAEAAMvpZXQBANBTvF6vKisr5Xa7lZycLKfTKbvdbnRZAAzACBAASygpKVFGRoZycnI0c+ZM5eTkKCMjQyUlJUaXBsAAXQpAS5Ys0YkTJ8463tbWpiVLllx0UQAQTiUlJSooKJDD4ZDL5VJzc7NcLpccDocKCgoIQYAF2fx+v/9CT7Lb7XK73UpKSgo6fuzYMSUlJcnr9YatQCN4PB4lJCSoqalJ8fHxRpcD4CJ4vV5lZGTI4XCotLRUMTFf/t3n8/mUl5enmpoa1dbWcjsMiHIX8v3dpREgv98vm8121vGPPvpIAwcO7MolAaBbVFZWqqGhQQsXLgwKP5IUExOjwsJC1dfXq7Ky0qAKARjhgiZBDxgwQDabTTabTcOHDw8KQV6vVy0tLXrggQfCXiQAdJXb7ZYkZWZmhmzvON7RD4A1XFAAevbZZ+X3+3X33Xdr8eLFSkhICLT17t1baWlpGjduXNiLBICuSk5OliTV1NRo7NixZ7XX1NQE9QNgDV2aA1RRUaHs7Gxdcskl3VGT4ZgDBJgHc4AA67iQ7+8uvQdowoQJ8vl82r17tw4fPiyfzxfUftNNN3XlsgAQdna7XcuXL1dBQYHy8vJUWFiozMxM1dTUqKioSGVlZSouLib8ABbTpQC0ZcsWzZw5U3v37tVXB5BsNlvUPwUGwFzy8/NVXFysefPmKTs7O3A8PT1dxcXFys/PN7A6AEbo0i2w6667TsOHD9fixYuVnJx81hNhZ84NikbcAgPMiTdBA+Z2Id/fXQpAl156qT766CNlZGR0uchIRgACACD6dPt7gLKysrRnz54uFQcAAGC0854D9Le//S3w88MPP6x58+apsbFRDofjrKfBrr322vBVCAAAEGbnfQssJiZGNpvtrEnPgQv9o80Mk6C5BQYAQPTplsfg6+vrL7owAACASHDec4CGDh163tv52rRpk6ZNm6aUlBTZbDaVlpYGtfv9fj3xxBNKTk5Wnz59NHnyZNXW1n7tdVetWqW0tDTFxcUpKytLH3zwwXnXBAAAzK9L7wH605/+FPK4zWZTXFycMjIylJ6e/rXXaW1t1ejRo3X33XeHfA/Hv//7v+u5557Ta6+9pvT0dP385z/XlClT9MknnyguLi7kNd944w3NnTtXL774orKysvTss89qypQp2rVr11mr1wMAAGvq0mPwnc0HOnMe0Pjx41VaWqoBAwacXyE2m9566y3l5eVJ+mL0JyUlRfPmzdP8+fMlSU1NTRo8eLBWr16tH/3oRyGvk5WVpRtuuEErV66U9MWr7lNTU/Xwww/r8ccfP69amAMEAED06fbH4NevX68bbrhB69evV1NTk5qamrR+/XplZWWprKxMmzZt0rFjxwLBpSvq6+vV2NioyZMnB44lJCQoKytLLpcr5DknT57Utm3bgs6JiYnR5MmTOz1Hktrb2+XxeII2AABgXl26BfaTn/xEL730UtAr5SdNmqS4uDjdf//9+vjjj/Xss8/q7rvv7nJhjY2NkqTBgwcHHR88eHCg7auOHj0qr9cb8pydO3d2+ruKioq0ePHiLtcKAACiS5dGgOrq6kIOLcXHx+t///d/JUlXX321jh49enHV9ZDCwsLASFZTU5P2799vdEkAAKAbdSkAjRkzRgsWLNCRI0cCx44cOaLHHntMN9xwgySptrZWqampXS5syJAhkqRDhw4FHT906FCg7asuu+wy2e32CzpHkmJjYxUfHx+0AQAA8+pSAPrd736n+vp6XXHFFcrIyFBGRoauuOIKNTQ06OWXX5YktbS06F//9V+7XFh6erqGDBmiDRs2BI55PB7993//t8aNGxfynN69e2vMmDFB5/h8Pm3YsKHTcwAAgPV0aQ7QiBEj9Mknn+gvf/mLdu/eHTh2yy23KCbmi0zV8TTXubS0tAStKVZfX6/q6moNHDhQV155pX7605/qF7/4ha6++urAY/ApKSlB1540aZJuu+02zZkzR5I0d+5czZ49W9/61rf07W9/W88++6xaW1v14x//uCsfFQAAmFCXApD0xdNVU6dO1dSpU7v8y7du3aqcnJzA/ty5cyVJs2fP1urVq/XYY4+ptbVV999/v44fP67x48dr3bp1Qe8AqqurC5pr9MMf/lBHjhzRE088ocbGRl133XVat27dWROjAQCAdZ33e4Cee+453X///YqLi9Nzzz13zr6PPPJIWIozCu8BAgAg+lzI9/d5B6D09HRt3bpVgwYNOudbnm02W+BJsGhFAAIAIPp0+2KoLIwKAACiWZeeAutw8uRJ7dq1S6dPnw5XPQAAAN2uSwHoxIkTuueee9S3b19dc8012rdvnyTp4Ycf1i9/+cuwFggAABBuXQpAhYWF+uijj1ReXh70RNbkyZP1xhtvhK04AACA7tClx+BLS0v1xhtvaOzYsbLZbIHj11xzjerq6sJWHAAAQHfo0gjQkSNHlJSUdNbx1tbWoEAE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.boxplot(w)\n", + "plt.ylabel(\"weight\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "d6f916fc", + "metadata": {}, + "source": [ + "We will assess weight stability but proceed without truncation here." + ] + }, + { + "cell_type": "markdown", + "id": "a9c0df23", + "metadata": {}, + "source": [ + "### Hájek ATE Estimation and Confidence Interval" + ] + }, + { + "cell_type": "markdown", + "id": "cbb82b1e", + "metadata": {}, + "source": [ + "For the final effect estimate, we use the **Hájek estimator** — a normalized version of the standard IPW estimator that is less sensitive to extreme weights. It can be interpreted as the difference in weighted means between the two groups:\n\n$$\n\\hat{ATE} = \\frac{\\sum_{i=1}^n T_i w_i Y_i}{\\sum_{i=1}^n T_i w_i} -\n\\frac{\\sum_{i=1}^n (1-T_i) w_i Y_i}{\\sum_{i=1}^n (1-T_i) w_i}\n$$" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "a303f32b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hájek ATE: 2.010314743855869\n" + ] + } + ], + "source": [ + "def hajek_ate(Y, T, ps_hat):\n", + " w = np.where(T == 1, 1 / ps_hat, 1 / (1 - ps_hat))\n", + " \n", + " mu1 = np.sum(T * w * Y) / np.sum(T * w)\n", + " mu0 = np.sum((1 - T) * w * Y) / np.sum((1 - T) * w)\n", + " \n", + " return mu1 - mu0\n", + "\n", + "Y = df[\"Y\"].values\n", + "T = df[\"T\"].values\n", + "\n", + "ate_hajek = hajek_ate(Y, T, ps_hat)\n", + "print(\"Hájek ATE:\", ate_hajek)" + ] + }, + { + "cell_type": "markdown", + "id": "5b5f64ce", + "metadata": {}, + "source": [ + "A point estimate alone doesn't tell us about uncertainty. We need a confidence interval.\n\nComputing theoretical variance for IPW is tricky: the propensity score is itself an estimate, and it appears in both the weights and the denominator. We therefore use **bootstrap** — resampling the data and re-running the full pipeline (propensity score estimation → weight computation → ATE estimation) on each resample." + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "bd8948a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ATE: 2.014496869751614\n", + "95% CI: [1.82360064 2.20068587]\n" + ] + } + ], + "source": [ + "def bootstrap_hajek(df, B=1000):\n", + " n = len(df)\n", + " ates = []\n", + " \n", + " for _ in range(B):\n", + " idx = np.random.choice(n, size=n, replace=True)\n", + " df_b = df.iloc[idx]\n", + " \n", + " X = df_b[[\"X1\", \"X2\"]].values\n", + " T = df_b[\"T\"].values\n", + " Y = df_b[\"Y\"].values\n", + " \n", + " ps_model = LogisticRegression(max_iter=1000)\n", + " ps_model.fit(X, T)\n", + " ps_hat_b = ps_model.predict_proba(X)[:, 1]\n", + " \n", + " ate = hajek_ate(Y, T, ps_hat_b)\n", + " ates.append(ate)\n", + " \n", + " ates = np.array(ates)\n", + " \n", + " return {\n", + " \"ATE\": ates.mean(),\n", + " \"CI\": np.percentile(ates, [2.5, 97.5]),\n", + " \"samples\": ates\n", + " }\n", + "\n", + "res = bootstrap_hajek(df, B=1000)\n", + "\n", + "print(\"ATE:\", res[\"ATE\"])\n", + "print(\"95% CI:\", res[\"CI\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "9f8d44a2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHHCAYAAACle7JuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+BElEQVR4nO3df3zN9f//8fvZbGdjtpnYjNn8qPwKRdib/EqNlnhHSeqN0I/3JK0frB9EauIt+oGiRZS89YM+IZKkX2PR21soqfdE2FRvNr/287y+f/R13o5tbDvbXue1c7teLufSOa9f53FeW0/3PV/P1/PYDMMwBAAAYEE+ZhcAAABQXgQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAABgWQQZAECxtm3bpilTpujo0aNmlwKUiCADoEIsXrxYNptN+/fvdy7r2bOnevbsWSXvb7PZ9NRTTzlfP/XUU7LZbPr999+r5P1jYmI0YsSIKnmv4syYMUMtWrSQw+GokOP98ccf+utf/6r8/HzVr1/fZV1xP+vSGjFihIKCgi66XZcuXfToo4+W+fjwPgQZVFtnG9tzH/Xr11evXr300UcfVfr7z5s3T4sXLy7XvmvXrnX5R9mbfP3113rqqad0/Phxs0spwlNry87O1nPPPacJEybIx+d/zbrNZtPYsWOL3efs/x/btm0rss4wDA0fPlw9e/bUtGnTKq3uC5kwYYLmzp2rjIwMU94f1kGQQbU3depULV26VEuWLNGjjz6q3377TTfccINWr15dqe/rbpCZMmVKxRZkgo8//lgff/xxmfb5+uuvNWXKlDKHhTNnzuiJJ54o0z5ldaHa9u7dq4ULF1bq+5fk9ddfV0FBgYYOHVohx0tPT1e3bt2UkpJS7Po777xTZ86cUXR0dIW8X3EGDBig4OBgzZs3r9LeA9VDDbMLACpbv3791LFjR+frUaNGKTw8XG+//bZuvPFGEyurGAUFBXI4HPL39ze7lCIquyaHw6G8vDwFBAQoICCgUt/rYux2u2nvvWjRIt10000Vdg6aNm2qiRMnlrje19dXvr6+FfJeJfHx8dHgwYO1ZMkSTZkyRTabrVLfD9ZFjwy8TmhoqAIDA1WjhmuOP3XqlB566CFFRUXJbrfr8ssv1z/+8Q+d/wXxBQUFevrpp9WsWTPZ7XbFxMToscceU25urnObmJgY7d69W5s3b3Ze1jo7ViQ/P19TpkzRpZdeqoCAANWtW1fdunXThg0bJP05hmDu3LmS5HJZTJL2798vm82mf/zjH5ozZ46zhj179igvL0+TJk1Shw4dFBISolq1aumaa67Rpk2bXOo/9xizZ89WdHS0AgMD1aNHD+3atatU53D37t3q3bu3AgMD1ahRI02bNq3YsRnFjZF56aWX1Lp1a9WsWVN16tRRx44dtWzZMkl/jmt55JFHJElNmjRxfvazYzHOXip566231Lp1a9ntdq1bt865rrjLcb///rtuvfVWBQcHq27dunrggQeUk5NT5HwU13t27jEvVltxY2T+85//6JZbblFYWJhq1qypLl26aM2aNS7bfPbZZ7LZbFqxYoWeeeYZNWrUSAEBAbr22mv1008/FanpfOnp6dq5c6f69Olz0W0vZufOnRoxYoSaNm2qgIAARURE6K677tIff/zhsl1JY2Q++ugjXXPNNapVq5Zq166t+Ph47d69+6Lvu2PHDtWrV089e/bUyZMnncuvu+46/fLLL9qxY4fbnw3VFz0yqPaysrL0+++/yzAMHT16VC+99JJOnjypO+64w7mNYRi66aabtGnTJo0aNUrt27fX+vXr9cgjj+jQoUOaPXu2c9vRo0frjTfe0ODBg/XQQw9p69atSk5O1vfff6+VK1dKkubMmaP7779fQUFBevzxxyVJ4eHhkv78BzE5OVmjR49Wp06dlJ2drW3btunbb7/Vddddp3vuuUeHDx/Whg0btHTp0mI/06JFi5STk6O7775bdrtdYWFhys7O1muvvaahQ4dqzJgxOnHihFJSUhQXF6e0tDS1b9/e5RhLlizRiRMnlJCQoJycHL3wwgvq3bu3vvvuO2etxcnIyFCvXr1UUFCgiRMnqlatWlqwYIECAwMv+rNYuHChxo0bp8GDBzsDxc6dO7V161bdfvvtuvnmm/Xjjz/q7bff1uzZs3XJJZdIkurVq+c8xqeffqoVK1Zo7NixuuSSSxQTE3PB97z11lsVExOj5ORkbdmyRS+++KKOHTumJUuWXLTec5WmtnNlZmbqL3/5i06fPq1x48apbt26euONN3TTTTfp3Xff1V//+leX7adPny4fHx89/PDDysrK0owZMzRs2DBt3br1gnV9/fXXkqSrrrqq2PU5OTnFDng+NzCctWHDBv38888aOXKkIiIitGvXLi1YsEC7d+/Wli1bLtgrsnTpUg0fPlxxcXF67rnndPr0ac2fP1/dunXTv/71rxJ/Tt98843i4uLUsWNHffDBBy6/Rx06dJAkffXVV7ryyitLfG94OQOophYtWmRIKvKw2+3G4sWLXbZdtWqVIcmYNm2ay/LBgwcbNpvN+OmnnwzDMIwdO3YYkozRo0e7bPfwww8bkoxPP/3Uuax169ZGjx49itTVrl07Iz4+/oK1JyQkGMX975menm5IMoKDg42jR4+6rCsoKDByc3Ndlh07dswIDw837rrrriLHCAwMNH799Vfn8q1btxqSjAcffPCCtY0fP96QZGzdutW57OjRo0ZISIghyUhPT3cu79Gjh8s5GDBggNG6desLHn/mzJlFjnOWJMPHx8fYvXt3sesmT57sfD158mRDknHTTTe5bPf3v//dkGT8+9//Ngzjf+dj0aJFFz3mhWqLjo42hg8f7nx99jx98cUXzmUnTpwwmjRpYsTExBiFhYWGYRjGpk2bDElGy5YtXX5+L7zwgiHJ+O6774q817meeOIJQ5Jx4sSJYuu/2OObb75xbn/y5Mkix3jzzTcNScbnn3/uXHb2/62z5+HEiRNGaGioMWbMGJd9MzIyjJCQEJflw4cPN2rVqmUYhmF8+eWXRnBwsBEfH2/k5OQU+/n8/f2N++6774LnAN6NS0uo9ubOnasNGzZow4YNevPNN9WrVy+NHj1a77//vnObtWvXytfXV+PGjXPZ96GHHpJhGM67nNauXStJSkxMLLKdpCKXDYoTGhqq3bt3a9++feX+TIMGDSrSE+Dr6+sck+JwOPTf//5XBQUF6tixo7799tsixxg4cKAaNmzofN2pUyd17tzZ+RlLsnbtWnXp0kWdOnVyLqtXr56GDRt20bpDQ0P166+/6ptvvrnotiXp0aOHWrVqVertExISXF7ff//9knTRz+mutWvXqlOnTurWrZtzWVBQkO6++27t379fe/bscdl+5MiRLmOKrrnmGkl/Xp66kD/++EM1atQo8ZbmAQMGOH//z32cvUx2rlq1ajmfG4ahnJwcXX/99ZJU7O/QWRs2bNDx48c1dOhQ/f77786Hr6+vOnfuXOTypiRt2rRJcXFxuvbaa/X++++XOMaoTp06VXYLPayJS0uo9jp16uQy2Hfo0KG68sorNXbsWN14443y9/fXL7/8osjISNWuXdtl35YtW0qSfvnlF+d/fXx81Lx5c5ftIiIiFBoa6tzuQqZOnaoBAwbosssuU5s2bdS3b1/deeedatu2bak/U5MmTYpd/sYbb2jWrFn64YcflJ+ff8HtL7300iLLLrvsMq1YseKC7/3LL7+oc+fORZZffvnlFytbEyZM0CeffKJOnTqpefPmuv7663X77bera9euF933rJI+e0nO/5zNmjWTj49PueZAKYuSztO5v1Nt2rRxLm/cuLHLdnXq1JEkHTt2zK06GjVqVOz4mV9//bXIsqysLE2fPl3//Oc/dejQIeXl5bmsK8nZUN67d+9i1wcHB7u8zsnJUXx8vDp06KAVK1YUGa92LsMwGOiLC6JHBl7Hx8dHvXr10pEjR8rdK+JOw9q9e3f9/PPPev3119WmTRu99tpruuqqq/Taa6+V+hjFjUd58803NWLECDVr1kwpKSlat26dNmzYoN69e1fYJGnuatmypfbu3avly5erW7dueu+999StWzdNnjy51McozVicCzn/Z1fSz7KwsNCt9ymrku4CMs4bbH6+unXrqqCgQCdOnHC7hiFDhujll1/WPffco9WrV+vrr7/WF198IUkX/B06u27p0qXF9v588MEHLtvb7XbFx8dr69atzsHaJTl+/LhzPBJQHHpk4JUKCgok/W/AY3R0tD755BOdOHHCpVfmhx9+cK4/+1+Hw6F9+/Y5/7KW/hzYefz4cZd5NS4UdsLCwjRy5EiNHDlSJ0+eVPfu3fXUU09p9OjRF923JO+++66aNm2q999/32X/kkJCcSHuxx9/vOjg2ejo6GL33bt3b6nqrFWrloYMGaIhQ4YoLy9PN998s5555hklJSUpICCgwv/63rdvn0svzk8//SSHw+H8nGd7Ps6fG6a43rWy1BYdHV3sOTn/d8pdLVq0kPTn3Utl6dU73/Hjx7V+/XpNmzZNEyZMcC7/8ccfL7pvs2bNJEn169cv1d1TNptNb731lgYMGKBbbrlFH330UbEzQJ/tFTr3/zXgfPTIwOvk5+fr448/lr+/v7OBvOGGG1RYWKiXX37ZZdvZs2fLZrOpX79+zu2kP+9KOtfzzz8vSYqPj3cuq1WrVrETp51/K2tQUJCaN2/ucvv22bEKZZkU7uxf9Of+Bb9161alpqYWu/2qVat06NAh5+u0tDRt3brV+VlLcsMNN2jLli1KS0tzLvvtt9/01ltvXbTG8z+7v7+/WrVqJcMwnJfCyvPZL+TsrexnvfTSS5Lk/JzBwcG65JJL9Pnnn7tsV9xEbGWp7YYbblBaWprL+T916pQWLFigmJiYMo3zuZDY2FhJKnaG3rI4OyPwuZckJWnWrFkX3TcuLk7BwcF69tlni+wv/fn7cT5/f3+9//77uvrqq9W/f3+X36eztm/fLkn6y1/+UqrPAO9EjwyqvY8++sj5V/DRo0e1bNky7du3TxMnTnReu+/fv7969eqlxx9/XPv371e7du308ccf64MPPtD48eOdf3G2a9dOw4cP14IFC3T8+HH16NFDaWlpeuONNzRw4ED16tXL+b4dOnTQ/PnzNW3aNDVv3lz169dX79691apVK/Xs2VMdOnRQWFiYtm3bpnfffddlKvmzt52OGzdOcXFx8vX11W233XbBz3njjTfq/fff11//+lfFx8crPT1dr7zyilq1alXsrbbNmzdXt27ddN999yk3N1dz5sxR3bp1L/r9No8++qiWLl2qvn376oEHHnDefh0dHa2dO3decN/rr79eERER6tq1q8LDw/X999/r5ZdfVnx8vLMn7Oxnf/zxx3XbbbfJz89P/fv3dxmIWhbp6em66aab1LdvX6WmpurNN9/U7bffrnbt2jm3GT16tKZPn67Ro0erY8eO+vzzz4vtiShLbRMnTtTbb7+tfv36ady4cQoLC9Mbb7yh9PR0vffeey5fJeCOpk2bqk2bNvrkk0901113lfs4wcHB6tatm2bOnKmCggI1bNhQ69ev14EDB0q17/z583XnnXfqqquu0m233aZ69erpwIEDWrNmjbp27VrkjwTpz8uEq1evVu/evdWvXz9t3rzZZdzQhg0b1LhxY269xoWZecsUUJmKu/06ICDAaN++vTF//nzD4XC4bH/ixAnjwQcfNCIjIw0/Pz/j0ksvNWbOnFlku/z8fGPKlClGkyZNDD8/PyMqKspISkoqcvtoRkaGER8fb9SuXduQ5LwNedq0aUanTp2M0NBQIzAw0GjRooXxzDPPGHl5ec59CwoKjPvvv9+oV6+eYbPZnLdin71VeObMmUU+r8PhMJ599lkjOjrasNvtxpVXXmmsXr3aGD58uBEdHe3c7txjzJo1y4iKijLsdrtxzTXXOG9Jvpid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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(res[\"samples\"], bins=40)\n", + "plt.axvline(res[\"CI\"][0], linestyle=\"--\")\n", + "plt.axvline(res[\"CI\"][1], linestyle=\"--\")\n", + "plt.xlabel(\"ATE\")\n", + "plt.ylabel(\"count\")\n", + "plt.title(\"Bootstrap distribution (Hájek)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f547d3b2", + "metadata": {}, + "source": [ + "## Real Data" + ] + }, + { + "cell_type": "markdown", + "id": "882436bb", + "metadata": {}, + "source": [ + "Having walked through the full IPW procedure on simulated data, let's now apply the same steps to a real dataset.\n\nWe'll use **NHEFS** (National Health and Nutrition Examination Survey Data I Epidemiologic Follow-up Study), a classic benchmark in causal inference. The research question is straightforward:\n\n> **What is the causal effect of quitting smoking on weight change?**\n\nTreatment $T$ (`qsmk`): whether the individual quit smoking between 1971 and 1982 (1 = quit, 0 = continued).\nOutcome $Y$ (`wt82_71`): body weight change (kg) over 11 years." + ] + }, + { + "cell_type": "markdown", + "id": "34239024", + "metadata": {}, + "source": [ + "**Loading the data**" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "faaefaac", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "샘플 수: 1566\n", + "금연 비율: 0.257\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
qsmkwt82_71sexageraceeducationsmokeintensitysmokeyrsexerciseactivewt71
00.0-10.093960042.01130.029.02079.04
10.02.604970036.00220.024.00058.63
20.09.414486156.01220.026.02056.81
30.04.990117068.0113.053.02159.42
40.04.989251040.00220.019.01187.09
\n", + "
" + ], + "text/plain": [ + " qsmk wt82_71 sex age race education smokeintensity smokeyrs \\\n", + "0 0.0 -10.093960 0 42.0 1 1 30.0 29.0 \n", + "1 0.0 2.604970 0 36.0 0 2 20.0 24.0 \n", + "2 0.0 9.414486 1 56.0 1 2 20.0 26.0 \n", + "3 0.0 4.990117 0 68.0 1 1 3.0 53.0 \n", + "4 0.0 4.989251 0 40.0 0 2 20.0 19.0 \n", + "\n", + " exercise active wt71 \n", + "0 2 0 79.04 \n", + "1 0 0 58.63 \n", + "2 2 0 56.81 \n", + "3 2 1 59.42 \n", + "4 1 1 87.09 " + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# NHEFS 데이터 로드: causaldata 패키지 사용 (pip install causaldata)\n", + "from causaldata import nhefs\n", + "\n", + "nhefs_df = nhefs.load_pandas().data\n", + "\n", + "# 분석에 필요한 변수만 선택\n", + "cols = ['qsmk', 'wt82_71', 'sex', 'age', 'race', 'education',\n", + " 'smokeintensity', 'smokeyrs', 'exercise', 'active', 'wt71']\n", + "nhefs_df = nhefs_df[cols].dropna().reset_index(drop=True)\n", + "\n", + "print(f\"샘플 수: {len(nhefs_df)}\")\n", + "print(f\"금연 비율: {nhefs_df['qsmk'].mean():.3f}\")\n", + "nhefs_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "1b7f1c7c", + "metadata": {}, + "source": [ + "First, let's look at the **naive comparison** result." + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "a5750610", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Naive ATE: 2.541 kg\n" + ] + } + ], + "source": [ + "naive_ate = (\n", + " nhefs_df.query(\"qsmk==1\")[\"wt82_71\"].mean()\n", + " - nhefs_df.query(\"qsmk==0\")[\"wt82_71\"].mean()\n", + ")\n", + "print(f\"Naive ATE: {naive_ate:.3f} kg\")" + ] + }, + { + "cell_type": "markdown", + "id": "9dc9e8fc", + "metadata": {}, + "source": [ + "### Covariate Selection\n\nWe include the following potential confounders: sex (`sex`), race (`race`), age (`age`), education (`education`), smoking intensity (`smokeintensity`), years of smoking (`smokeyrs`), exercise (`exercise`), activity level (`active`), and baseline weight in 1971 (`wt71`).\n\nSmokers tend to be thinner on average, and the factors that lead someone to quit smoking (age, health status, etc.) also affect weight change — so a naive comparison would underestimate the true effect of quitting." + ] + }, + { + "cell_type": "markdown", + "id": "674d2a4b", + "metadata": {}, + "source": [ + "The naive comparison suggests quitters gained about 2.5 kg more than non-quitters. But this is likely confounded: quitters tend to be older and were lighter smokers, both of which independently affect weight trajectories. Let's correct for this with IPW." + ] + }, + { + "cell_type": "markdown", + "id": "459b02ba", + "metadata": {}, + "source": [ + "### Computing Weights\n\nFor continuous covariates, we add squared terms to capture nonlinear effects. Categorical variables (`education`, `exercise`, `active`) are one-hot encoded." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "6871110b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimated PS range: [0.054, 0.788]\n" + ] + } + ], + "source": [ + "X_nhefs = nhefs_df[['sex', 'age', 'race', 'smokeintensity', 'smokeyrs', 'wt71']].copy()\n", + "\n", + "# 연속형 변수에 제곱항 추가\n", + "X_nhefs['age_sq'] = X_nhefs['age']**2\n", + "X_nhefs['smokeintensity_sq'] = X_nhefs['smokeintensity']**2\n", + "X_nhefs['smokeyrs_sq'] = X_nhefs['smokeyrs']**2\n", + "X_nhefs['wt71_sq'] = X_nhefs['wt71']**2\n", + "\n", + "# 범주형 변수 one-hot encoding\n", + "X_nhefs = pd.concat([\n", + " X_nhefs,\n", + " pd.get_dummies(nhefs_df[['education', 'exercise', 'active']],\n", + " columns=['education', 'exercise', 'active'],\n", + " drop_first=True, dtype=float)\n", + "], axis=1)\n", + "\n", + "T_nhefs = nhefs_df['qsmk'].astype(int).values\n", + "Y_nhefs = nhefs_df['wt82_71'].values\n", + "\n", + "# 표준화 후 PS 추정\n", + "scaler = StandardScaler()\n", + "X_nhefs_s = scaler.fit_transform(X_nhefs.values)\n", + "\n", + "ps_model_nhefs = LogisticRegression(max_iter=5000)\n", + "ps_model_nhefs.fit(X_nhefs_s, T_nhefs)\n", + "ps_hat_nhefs = ps_model_nhefs.predict_proba(X_nhefs_s)[:, 1]\n", + "\n", + "print(f\"Estimated PS range: [{ps_hat_nhefs.min():.3f}, {ps_hat_nhefs.max():.3f}]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "id": "fa332e06", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAHWCAYAAABt3aEVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABXFElEQVR4nO3dd1yV9f//8ScbFAEnoKLgNkduQy1zr0g/WY6vuVIbrsyGWTnS1NyWmqY5sjTLHNUnQxNHuXOVe0VmJqip4EhQeP/+6Mf5eATMg8iBy8f9dju3OO/rfV3X67w52JM37+s6LsYYIwAAAMACXJ1dAAAAAJBZCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAcpzQ0FB169bN2WUgkzn7+zpu3DiVK1dOycnJTqshq1y/fl0hISH64IMPnF0KkOkIt0AOMX/+fLm4uNge3t7eKlOmjPr27avY2Fhnl+dUBw4c0PDhw/Xbb79l+rG/+eYb1a9fX4UKFVKuXLlUokQJtWvXTpGRkZl+rqxw/fp1vf/++6pZs6by5MkjX19f1axZU++//76uX7/u7PKcJj4+XmPHjtWgQYPk6vq//zWm/LxNnDgx1T4pP5M7duywtQ0fPlwuLi46d+5cmucJDQ3VY489Ztd288/1rY/nn3/e1q9bt27p9rv5/bh37149+eSTKl68uLy9vVWkSBE1adJEU6dOtfXx8PDQwIEDNWrUKF27ds3xAQOyMXdnFwDAMSNGjFBYWJiuXbumjRs3asaMGVq5cqX27dunXLlyObu8LHH48GG7AHLgwAG9/fbbevTRRxUaGppp55kwYYJeffVV1a9fX4MHD1auXLl07NgxrVmzRosXL1bz5s0z7VxZ4cqVK2rVqpU2bNigxx57TN26dZOrq6siIyP14osvatmyZfr222+VO3duZ5ea5ebOnasbN26oY8eOaW4fP368XnjhhXv2M9akSRN16dIlVXuZMmXsnnt5eemjjz5K1e/BBx+UJG3evFkNGjRQsWLF1KtXLwUFBenkyZPaunWr3nvvPfXr18+2T/fu3fX6669r0aJFeuaZZzL5FQHOQ7gFcpgWLVqoRo0akqSePXsqf/78mjRpkr766qt0/8d85coVSwUWLy+ve36OGzduaOTIkWrSpIlWr16davuZM2fueQ0pkpOTlZiYKG9v77s6zsCBA7VhwwZNnTpVffv2tbW/8MILmj59uvr27atXXnlFM2bMuNuS75gxRteuXZOPj0+WnTMt8+bN0+OPP57mGFepUkV79uzRzJkzNXDgwHty/jJlyujpp5/+137u7u637Tdq1Cj5+/vrp59+UkBAgN22W9+zAQEBatq0qebPn0+4haWwLAHI4Ro2bChJio6OlvTPny59fX11/PhxtWzZUnny5FGnTp0k/RNyX375ZYWEhMjLy0tly5bVhAkTZIyxO6aLi4v69u2rhQsXqmzZsvL29lb16tX1ww8/pDr/qVOn9MwzzygwMFBeXl6qUKGC5s6da9dn/fr1cnFx0RdffKFRo0apaNGi8vb2VqNGjXTs2DG7vkePHlXbtm0VFBQkb29vFS1aVB06dFBcXJytz81rM+fPn6+nnnpKktSgQQPbn2nXr1+vrl27qkCBAmn+ub1p06YqW7ZsuuN67tw5xcfHq27dumluL1SokN3za9euafjw4SpTpoy8vb0VHBysJ554QsePH7f1ycj4V6hQQV5eXrY/O9/JeKfljz/+0Jw5c9SwYUO7YJuiT58+atCggT766CP98ccfkqSKFSuqQYMGqfomJyerSJEievLJJ+3apkyZogoVKsjb21uBgYF67rnndOHCBbt9U/4sv2rVKtWoUUM+Pj768MMP06z5/PnzeuWVV1SpUiX5+vrKz89PLVq00M8//2zXL+X99fnnn+uNN95QUFCQcufOrccff1wnT57817GJjo7WL7/8osaNG6e5vW7dumrYsKHGjRunv//++1+P50zHjx9XhQoVUgVbKfV7Vvpnxnjjxo06f/58FlQHZA1mboEcLiU85c+f39Z248YNNWvWTPXq1dOECROUK1cuGWP0+OOPa926derRo4eqVKmiVatW6dVXX9WpU6c0efJku+Nu2LBBn3/+ufr37y8vLy998MEHat68ubZv366KFStKkmJjY/XQQw/ZwljBggX13XffqUePHoqPj9eAAQPsjvnuu+/K1dVVr7zyiuLi4jRu3Dh16tRJ27ZtkyQlJiaqWbNmSkhIUL9+/RQUFKRTp07pv//9ry5evCh/f/9Ur/+RRx5R//799f777+uNN95Q+fLlJUnly5dX586dtWDBAq1atcpunWNMTIzWrl2rYcOGpTuuhQoVko+Pj7755hv169dP+fLlS7dvUlKSHnvsMUVFRalDhw568cUXdenSJX3//ffat2+fSpYs6fD4r127Vl988YX69u2rAgUKKDQ01OHxvtl3332npKSkNP/0naJLly5at26dIiMj1bNnT7Vv317Dhw9XTEyMgoKCbP02btyoP//8Ux06dLC1Pffcc5o/f766d++u/v37Kzo6WtOmTdPu3bu1adMmeXh42PoePnxYHTt21HPPPadevXql+0vGr7/+qhUrVuipp55SWFiYYmNj9eGHH6p+/fo6cOCAChcubNd/1KhRcnFx0aBBg3TmzBlNmTJFjRs31p49e247M7x582ZJUrVq1dLtM3z4cD3yyCOaMWPGHc3ephcW07tY7dq1a2mu0/Xz85Onp6dd2639PDw8bD8bxYsX15YtW7Rv3z7bz+ntVK9eXcYYbd68OdVaYCDHMgByhHnz5hlJZs2aNebs2bPm5MmTZvHixSZ//vzGx8fH/PHHH8YYY7p27Wokmddff91u/xUrVhhJ5p133rFrf/LJJ42Li4s5duyYrU2SkWR27Nhhaztx4oTx9vY2//nPf2xtPXr0MMHBwebcuXN2x+zQoYPx9/c3V69eNcYYs27dOiPJlC9f3iQkJNj6vffee0aS2bt3rzHGmN27dxtJZsmSJbcdi+LFi5uuXbvani9ZssRIMuvWrbPrl5SUZIoWLWrat29v1z5p0iTj4uJifv3119ueZ+jQoUaSyZ07t2nRooUZNWqU2blzZ6p+c+fONZLMpEmTUm1LTk42xjg+/q6urmb//v12fe90vNMyYMAAI8ns3r073T67du0ykszAgQONMcYcPnzYSDJTp06169e7d2/j6+trO9+PP/5oJJmFCxfa9YuMjEzVXrx4cSPJREZGpjr/rd/Xa9eumaSkJLs+0dHRxsvLy4wYMcLWlvL+KlKkiImPj7e1f/HFF0aSee+999J9zcYY89ZbbxlJ5tKlS6m2STJ9+vQxxhjToEEDExQUZHvdKT+TP/30k63/sGHDbD8/6T1atWqV6hzpPT777DNbv5Sf7Vsf9evXt/VZvXq1cXNzM25ubiY8PNy89tprZtWqVSYxMTHN1/7nn38aSWbs2LG3HSMgJ2FZApDDNG7cWAULFlRISIg6dOggX19fLV++XEWKFLHr98ILL9g9X7lypdzc3NS/f3+79pdfflnG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3LihTz75xBbs0lOlShW5ublp7NixiouLk5eXlxo2bGhbA1qwYEE1b95cS5YsUUBAgFq1avWvtVy9elV16tTRQw89pObNmyskJEQXL17UihUr9OOPP6pNmzaqWrWqpH9mhhcsWKCBAwdq+/btevjhh3XlyhWtWbNGvXv3VuvWrR0e/7Tc7XhPnjxZhw4dUu/evRUZGWmboV21apW++uor1a9fP82PmW3Xrp1eeeUVvfLKK8qXL1+qmeP69evrueee05gxY7Rnzx41bdpUHh4eOnr0qJYsWaL33nvP7p64d+qxxx7TiBEj1L17d9WpU0d79+7VwoULVaJEiTT758uXT/Xq1VP37t0VGxurKVOmqFSpUurVq9dtz1OiRAlVrFhRa9asuaMPM6hfv77q16+vDRs2OPya0nPkyBF9+umnqdoDAwPVpEmTOz5Ov379dPXqVf3nP/9RuXLllJiYqM2bN+vzzz9XaGiounfvbtf/+++/V926ddNcwwzkWM65SQMAR6V126G0dO3a1eTOnTvNbZcuXTIvvfSSKVy4sPHw8DClS5c248ePt92uKoX+/+2PPv30U1O6dGnj5eVlqlatmupWW8YYExsba/r06WNCQkKMh4eHCQoKMo0aNTKzZs2y9Um5VdOtt/iKjo42ksy8efOMMcb8+uuv5plnnjElS5Y03t7eJl++fKZBgwZmzZo1dvvdessoY4yZPXu2KVGihHFzc0vztmApt4V69tlnbzN6/3P9+nUze/Zs06ZNG1O8eHHj5eVlcuXKZapWrWrGjx9vd0szY4y5evWqefPNN01YWJhtHJ588klz/PhxWx9Hxz8tdzLet5OQkGAmT55sqlevbnLnzm1y5cplqlWrZqZMmZLu7aKMMaZu3bpGkunZs2e6fWbNmmWqV69ufHx8TJ48eUylSpXMa6+9Zv78809bn+LFi6e6FdbN2269FdjLL79sgoODjY+Pj6lbt67ZsmWLqV+/vt3tr1LeX5999pkZPHiwKVSokPHx8TGtWrUyJ06cuKNxmTRpkt3tzVKk971IOeetP5MptwI7e/Zsuq/RkVuB3fw6b/ezneK7774zzzzzjClXrpzx9fU1np6eplSpUqZfv34mNjbWru/FixeNp6en+eijj257TCCncTEmjb9fALivubi4qE+fPmn+mT2n+uqrr9SmTRv98MMPtluQwRrW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dw5Hx2vdunVm2bJl5sCBA+bYsWNmypQpxs3NzURGRmZx5c7j6JiliI6ONkWKFDEPP/ywad26ddYUm004Ombz5s0zfn5+5vTp07ZHTExMFlftXI6OWUJCgqlRo4Zp2bKl2bhxo4mOjjbr1683e/bsyeLKncfRMfvrr7/s3mP79u0zbm5uZt68eVlbuBM5OmYLFy40Xl5eZuHChSY6OtqsWrXKBAcHm5deeinTaiLcWlytWrVMnz59bM+TkpJM4cKFzZgxY/513+LFi9+X4fZuxswYY27cuGHy5MljPv7443tVYrZyt+NljDFVq1Y1b7311r0oL1vKyJjduHHD1KlTx3z00Uema9eu9124dXTM5s2bZ/z9/bOouuzJ0TGbMWOGKVGihElMTMyqErOdu/33bPLkySZPnjzm8uXL96rEbMfRMevTp49p2LChXdvAgQNN3bp1M60mliVYWGJionbu3KnGjRvb2lxdXdW4cWNt2bLFiZVlX5kxZlevXtX169eVL1++e1VmtnG342WMUVRUlA4fPqxHHnnkXpaabWR0zEaMGKFChQqpR48eWVFmtpLRMbt8+bKKFy+ukJAQtW7dWvv378+KcrOFjIzZ119/rfDwcPXp00eBgYGqWLGiRo8eraSkpKwq26ky49//OXPmqEOHDsqdO/e9KjNbyciY1alTRzt37rQtXfj111+1cuVKtWzZMtPqssQnlCFt586dU1JSUqpPagsMDNShQ4ecVFX2lhljNmjQIBUuXNjuh92qMjpecXFxKlKkiBISEuTm5qYPPvhATZo0udflZgsZGbONGzdqzpw52rNnTxZUmP1kZMzKli2ruXPnqnLlyoqLi9OECRNUp04d7d+/X0WLFs2Ksp0qI2P266+/au3aterUqZNWrlypY8eOqXfv3rp+/bqGDRuWFWU71d3++799+3bt27dPc+bMuVclZjsZGbP/+7//07lz51SvXj0ZY3Tjxg09//zzeuONNzKtLsItkIneffddLV68WOvXr78vL165U3ny5NGePXt0+fJlRUVFaeDAgSpRooQeffRRZ5eW7Vy6dEmdO3fW7NmzVaBAAWeXk2OEh4crPDzc9rxOnToqX768PvzwQ40cOdKJlWVfycnJKlSokGbNmiU3NzdVr15dp06d0vjx4++LcHu35syZo0qVKqlWrVrOLiVbW79+vUaPHq0P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r169dPXqVfXo0cOu74gRIxQVFaV9+/apW7duKlCggNq0aSNJGjRokDZv3qy+fftqz549Onr0qL766qvbButbTZo0SZ999pkOHTqkI0eOaMmSJQoKCkrzXsGFChWSj4+PIiMjFRsbq7i4ONu2Zs2ayc/PT++88466d+9+23Pe7v0TGhqqrl276plnntGKFSsUHR2t9evX236J6d27t06ePKl+/frp0KFD+uqrrzRs2DANHDjQbjnLrfr06aPz58+rY8eO+umnn3T8+HGtWrVK3bt3vye/iAFwgLMX/QKwvq5duxpJqR5ly5Y1xhizfPlyU7t2bePn52dy585tHnroIbNmzRrb/lu2bDGVK1c2Xl5eJuWfrbQuKHvwwQdTnffWuzTUr1/fvPjii7bnkyZNMsHBwcbHx8c0a9bMLFiwwEgyFy5csPV5/vnnTf78+Y0k21X0iYmJZujQoSY0NNR4eHiY4OBg85///Mf88ssvtv3mzJljihYtanx8fExERISZMGHCHV1QtmjRIlOrVi3j6elpHnjgAbN27Vpbn5QLw26uzxhj/v77b9OvXz9ToEAB4+XlZerWrWu2b9+ear9vvvnGVKhQwXh6eppatWqZn3/+2e4427dvN02aNDG+vr4md+7cpnLlyrYL/4xJ++K+Bx980DYus2bNMlWqVDG5c+c2fn5+plGjRmbXrl22vrrpgjJjjJk9e7YJCQkxrq6upn79+nbHHTJkiHFzczN//vlnumNmzL+/f/7++2/z0ksvmeDgYOPp6WlKlSpld+eF9evXm5o1axpPT08TFBRkBg0aZK5fv27bfut7JsWRI0fMf/7zHxMQEGB8fHxMuXLlzIABA9K9mA5A1nAxxhjnxGoAwM1+++03hYWFaffu3apSpUqmHnv9+vVq0KCBLly4kGM+ca1Hjx46e/asvv76a2eXAiAHYaEQACBbiYuL0969e7Vo0SKCLQCHEW4BANlK69attX37dj3//PNq0qSJs8sBkMOwLAEAAACWwd0SAAAAYBmEWwAAAFgG4RYAAACWQbgFAACAZRBuAQAAYBmEWwAAAFgG4RYAAACWQbgFAACAZfw/vhaU0vnD8QUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Overlap (positivity) 확인\n", + "plt.figure(figsize=(8, 5))\n", + "plt.hist(ps_hat_nhefs[T_nhefs == 0], bins=30, alpha=0.6, label=\"T=0 (smoke)\")\n", + "plt.hist(ps_hat_nhefs[T_nhefs == 1], bins=30, alpha=0.6, label=\"T=1 (non-smoke)\")\n", + "plt.xlabel(\"Estimated propensity score\")\n", + "plt.ylabel(\"Count\")\n", + "plt.title(\"Propensity Score Overlap (NHEFS)\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "57ed6e50", + "metadata": {}, + "source": [ + "The propensity score distributions overlap across a wide range and are not heavily concentrated near 0 or 1 — positivity is well satisfied." + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "id": "b2278d80", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1.11410616, 1.1693399 , 1.14790716, 1.65710476, 1.40403198])" + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# IPW 가중치\n", + "w_nhefs = np.where(T_nhefs == 1, 1/ps_hat_nhefs, 1/(1 - ps_hat_nhefs))\n", + "w_nhefs[:5]" + ] + }, + { + "cell_type": "markdown", + "id": "6e212f00", + "metadata": {}, + "source": [ + "### Condition 1: Covariate Balance" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "id": "b9b4e3cd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7NgRSUlJkMvl5g6HiIjIKHaFIiIiIiIikzGxICIiIiIikzGxICKycBqNBr/++itiYmKg0WjMHQ4REZFRHGNBRFQCpKWlQa1WmzsMIiKiHPGKBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyJBRERERERmYyzQhERlQBOTk549uyZucMgIiLKERMLIiILZ2Vlha5duyIpKQlWVnzbJiIiy8SuUEREREREZDImFkREREREZDImFkREFk6j0WDHjh04fPgwNBqNucMhIiIyip11iYhKAJVKBbVabe4wiIiIcsQrFkREREREZDImFkREREREZDImFkREREREZDKOsSCLdudhGtIz8z5Y1U5hhUpu9kUYEZEFSnkMXDkLZKQDNnZArfqAs6u5oyIiojKGiYUFEAQBmzdvRo8ePcwdikW58zANQ5bF5Lte1OhgJhdUNtxOAHasAeIPA6L473KZDGjSGujaD6jsZ774iIioTGFiYQESExPh6spfF/8rP1cqCqMekSWzt7eHTPZC79Xz8cDSCEDUGiYVgO5xfCzwxxFgzEygXpPiDZaIiMokjrEoYs+fP39pGU9PTyiVymKIhohKIisrK3Tv3h3BwcGwsrLSXalYGgFoNdmTiiyiVrd+aYSuPBERURErc4mFKIqIjIyEn58fbG1t0aBBA2zYsAGSJCEkJASdOnWCJEkAgEePHqFy5cqYMWOGvv7KlSvh7+8PGxsb1K5dG8uWLdOvu3HjBgRBwNq1axEUFAQbGxusXr0aABAVFYW6detCqVTCy8sLY8aM0dcTBAFbtmwBAGRmZmLMmDHw8vKCjY0NfHx8EBkZqS/75MkTDBs2DO7u7nByckK7du1w5syZojxlRGRpdqzRJQ7/vFflSJJ0iceOtcUTFxERlWllritUZGQkfvzxR3z99deoUaMGDh06hLfffhvu7u74/vvvERAQgCVLluCDDz7AyJEjUalSJX1isXr1asyYMQNLly5FYGAgTp06heHDh8Pe3h6DBg3S7+PDDz/EwoULERgYCBsbGyxfvhwTJkzA3Llz0aVLF6SkpCAuLs5ofEuWLMHWrVuxbt06VKlSBbdu3cKtW7f06/v06QNbW1vs3LkTzs7OWLFiBdq3b48///wT5cqVK9qTR0Tmp3qcfUxFbkQtEH8I6DcScHIp0tCIiKhsK1OJhVqt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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Variable Before After Balanced\n", + "----------------------------------------------------\n", + "sex 0.160 0.006 ✓\n", + "age 0.282 0.014 ✓\n", + "race 0.177 0.004 ✓\n", + "education 0.088 0.021 ✓\n", + "smokeintensity 0.217 0.027 ✓\n", + "smokeyrs 0.159 0.001 ✓\n", + "exercise 0.104 0.010 ✓\n", + "active 0.089 0.007 ✓\n", + "wt71 0.133 0.010 ✓\n" + ] + } + ], + "source": [ + "\n", + "# ASMD 계산\n", + "X_disp = nhefs_df[['sex', 'age', 'race', 'education',\n", + " 'smokeintensity', 'smokeyrs',\n", + " 'exercise', 'active', 'wt71']].astype(float)\n", + "\n", + "asmd_before = compute_asmd(X_disp, T_nhefs)\n", + "asmd_after = compute_asmd(X_disp, T_nhefs, w_nhefs)\n", + "\n", + "# Love plot\n", + "var_names = list(asmd_before.keys())\n", + "bef = [asmd_before[v] for v in var_names]\n", + "aft = [asmd_after[v] for v in var_names]\n", + "y_pos = list(range(len(var_names)))\n", + "\n", + "fig, ax = plt.subplots(figsize=(8, 5))\n", + "ax.scatter(bef, y_pos, marker='o', color='tomato', s=80, label='Before IPW', zorder=3)\n", + "ax.scatter(aft, y_pos, marker='s', color='steelblue', s=80, label='After IPW', zorder=3)\n", + "for i in range(len(var_names)):\n", + " ax.plot([bef[i], aft[i]], [y_pos[i], y_pos[i]], color='gray', linewidth=0.8, zorder=2)\n", + "ax.axvline(0.1, linestyle='--', color='gray', alpha=0.7, label='Threshold (0.1)')\n", + "ax.set_yticks(y_pos)\n", + "ax.set_yticklabels(var_names)\n", + "ax.set_xlabel(\"Absolute Standardized Mean Difference (ASMD)\")\n", + "ax.set_title(\"Love Plot: NHEFS Covariate Balance\")\n", + "ax.legend()\n", + "ax.grid(axis='x', alpha=0.3)\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "print(f\"\\n{'Variable':<18} {'Before':>10} {'After':>10} {'Balanced':>10}\")\n", + "print(\"-\" * 52)\n", + "for v in var_names:\n", + " ok = \"✓\" if asmd_after[v] < 0.1 else \"✗\"\n", + " print(f\"{v:<18} {asmd_before[v]:>10.3f} {asmd_after[v]:>10.3f} {ok:>10}\")" + ] + }, + { + "cell_type": "markdown", + "id": "138bd5c3", + "metadata": {}, + "source": [ + "### Condition 2: Weight Stability" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "ada60f3c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weight diagnostics: {'max': '16.27', 'p95': '4.92', 'p99': '7.19'}\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "diag = weight_diagnostics(w_nhefs)\n", + "print(\"Weight diagnostics:\", {k: f\"{v:.2f}\" for k, v in diag.items()})\n", + "\n", + "plt.figure(figsize=(5, 4))\n", + "plt.boxplot(w_nhefs)\n", + "plt.ylabel(\"weight\")\n", + "plt.title(\"IPW weight distribution (NHEFS)\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9ff26dee", + "metadata": {}, + "source": [ + "The maximum weight is around 17, which is somewhat large, but the 99th percentile stays below 7 — so extreme weights are limited to a small number of units. Given the sample size of 1,566, this is acceptable, and we proceed without truncation." + ] + }, + { + "cell_type": "markdown", + "id": "edea2150", + "metadata": {}, + "source": [ + "Before IPW, several covariates — including `age`, `smokeintensity`, and `race` — had ASMD above 0.1, indicating meaningful imbalance between groups. After IPW, all covariates fall below the 0.1 threshold, confirming that confounders have been successfully balanced." + ] + }, + { + "cell_type": "markdown", + "id": "da6473a5", + "metadata": {}, + "source": [ + "### Hájek ATE Estimation and Confidence Interval" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "21c38d92", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hájek ATE: 3.475 kg\n" + ] + } + ], + "source": [ + "ate_nhefs = hajek_ate(Y_nhefs, T_nhefs, ps_hat_nhefs)\n", + "print(f\"Hájek ATE: {ate_nhefs:.3f} kg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "id": "9ba0bfeb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bootstrap ATE: 3.436 kg\n", + "95% CI: [2.467, 4.377]\n" + ] + } + ], + "source": [ + "def bootstrap_hajek_nhefs(df_full, X_design_cols, B=500, seed=0):\n", + " rng = np.random.RandomState(seed)\n", + " n = len(df_full)\n", + " ates = []\n", + " for _ in range(B):\n", + " idx = rng.choice(n, size=n, replace=True)\n", + " sub = df_full.iloc[idx]\n", + "\n", + " Xb = sub[X_design_cols].values\n", + " Tb = sub['qsmk'].astype(int).values\n", + " Yb = sub['wt82_71'].values\n", + "\n", + " sc = StandardScaler()\n", + " Xb_s = sc.fit_transform(Xb)\n", + "\n", + " m = LogisticRegression(max_iter=5000)\n", + " m.fit(Xb_s, Tb)\n", + " ps_b = m.predict_proba(Xb_s)[:, 1]\n", + " ates.append(hajek_ate(Yb, Tb, ps_b))\n", + "\n", + " ates = np.array(ates)\n", + " return {\"ATE\": ates.mean(),\n", + " \"CI\": np.percentile(ates, [2.5, 97.5]),\n", + " \"samples\": ates}\n", + "\n", + "df_boot = pd.concat([nhefs_df.reset_index(drop=True),\n", + " X_nhefs.add_prefix(\"_d_\").reset_index(drop=True)], axis=1)\n", + "design_cols = [c for c in df_boot.columns if c.startswith(\"_d_\")]\n", + "\n", + "res_nhefs = bootstrap_hajek_nhefs(df_boot, design_cols, B=500)\n", + "print(f\"Bootstrap ATE: {res_nhefs['ATE']:.3f} kg\")\n", + "print(f\"95% CI: [{res_nhefs['CI'][0]:.3f}, {res_nhefs['CI'][1]:.3f}]\")" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "id": "29c818e0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(res_nhefs[\"samples\"], bins=40)\n", + "plt.axvline(res_nhefs[\"CI\"][0], linestyle=\"--\", color=\"C1\")\n", + "plt.axvline(res_nhefs[\"CI\"][1], linestyle=\"--\", color=\"C1\")\n", + "plt.axvline(ate_nhefs, linestyle=\"-\", color=\"black\", label=\"point estimate\")\n", + "plt.xlabel(\"ATE (kg)\")\n", + "plt.ylabel(\"count\")\n", + "plt.title(\"Bootstrap distribution - NHEFS (Hájek)\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e12981f4", + "metadata": {}, + "source": [ + "### Interpretation\n\n| Method | ATE (kg) | 95% CI |\n|---|---|---|\n| Naive comparison | ~ 2.54 | — |\n| **IPW (Hájek)** | **~ 3.5** | **approx. (2.4, 4.5)** |\n\nThe naive estimate of ~2.5 kg grows to ~3.5 kg after IPW adjustment. This makes sense: smokers tend to be thinner, and quitters tend to be older with naturally lower weight gain trajectories — so the unadjusted comparison was **underestimating** the true effect of quitting.\n\nAll else equal, quitting smoking is estimated to increase body weight by approximately 3.5 kg over 11 years. Cross-validation with other causal methods would further strengthen this conclusion." + ] + }, + { + "cell_type": "markdown", + "id": "b276f94d", + "metadata": {}, + "source": [ + "### References" + ] + }, + { + "cell_type": "markdown", + "id": "e51b4f91", + "metadata": {}, + "source": [ + "- Stuart, E. A. (2010). Matching methods for causal inference: A review and a look forward. *Statistical Science*, 25(1), 1–21.\n- Chattopadhyay, A., Hase, C. H., & Zubizarreta, J. R. (2020). Balancing versus modeling approaches to weighting in practice. *Statistics in Medicine*, 39(24), 3227–3254.\n- Hernán, M. A., & Robins, J. M. (2020). *Causal Inference: What If*. Chapman & Hall/CRC." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/book/ipw_basics/ipw_in_practice_ko.ipynb b/book/ipw_basics/ipw_in_practice_ko.ipynb index 8a03b58..6aecc5c 100644 --- a/book/ipw_basics/ipw_in_practice_ko.ipynb +++ b/book/ipw_basics/ipw_in_practice_ko.ipynb @@ -58,9 +58,7 @@ "id": "f954e846", "metadata": {}, "source": [ - "- 우리의 목표는 $ATE = \\mathbb{E}[Y_1 - Y_0]$, 즉, “전체 집단에서 모든 사람이 약을 복용했을 때의 평균 입원 일수와, 모든 사람이 약을 복용하지 않았을 때의 평균 입원 일수는 얼마나 차이가 나는지를 보는 것입니다.\n", - "\n", - "다시 아래의 예시를 보겠습니다." + "우리의 목표는 $ATE = \\mathbb{E}[Y_1 - Y_0]$, 즉 처치를 받았을 때와 받지 않았을 때의 결과 차이를 전체 집단에 대해 평균한 값을 구하는 것입니다. 약 복용 예시로 이야기하면, 모든 사람이 약을 복용했을 때와 아무도 복용하지 않았을 때의 평균 입원 일수 차이가 얼마나 되는지를 보는 것입니다.\n\n다시 아래 예시로 돌아가 보겠습니다." ] }, { @@ -82,19 +80,7 @@ "id": "7f2e30c3", "metadata": {}, "source": [ - "현실에서는 한 개인에 대해 $Y_0$와 $Y_1$을 동시에 관측할 수 없기 때문에 직접 알 수 없지만, 여기서는 설명을 위해 이를 알고 있다고 가정하겠습니다.\n", - "\n", - "- 남성: $Y_1 = 5, Y_0 = 8 \\Rightarrow Y_1 - Y_0 = -3$\n", - "- 여성: $Y_1 = 2, Y_0 = 4 \\Rightarrow Y_1 - Y_0 = -2$\n", - "\n", - "\n", - "그러면 실제 ATE는 입원일수가 3일 줄어드는 남성이 6명, 2일 줄어드는 여성이 4명이므로,\n", - "\n", - "$$\n", - "ATE = \\frac{-3 \\times 6 + -2 \\times 4}{10} = -2.6\n", - "$$\n", - "\n", - "즉, 실제로 약을 먹으면 입원 일수는 -2.6일이 줄어야 합니다. 즉, 단순 평균 비교는 실제 효과보다 훨씬 약의 입원일수 감소 효과를 작게 보게 되는 것입니다." + "현실에서는 한 사람에 대해 $Y_0$와 $Y_1$을 동시에 관측할 수 없습니다. 하지만 여기서는 설명을 위해 마치 두 세계를 모두 볼 수 있다고 가정해 보겠습니다.\n\n이 가정 하에서 각 성별의 처치 효과를 계산하면 이렇습니다.\n\n- 남성: $Y_1 = 5, Y_0 = 8 \\Rightarrow Y_1 - Y_0 = -3$\n- 여성: $Y_1 = 2, Y_0 = 4 \\Rightarrow Y_1 - Y_0 = -2$\n\n처치 효과가 3일 줄어드는 남성이 6명, 2일 줄어드는 여성이 4명이므로, 실제 ATE는 다음과 같습니다.\n\n$$\nATE = \\frac{-3 \\times 6 + (-2) \\times 4}{10} = -2.6\n$$\n\n즉, 약을 복용하면 입원 일수가 평균적으로 2.6일 줄어야 합니다. 이 값이 우리가 추정하려는 진짜 효과입니다." ] }, { @@ -102,9 +88,7 @@ "id": "c1534535", "metadata": {}, "source": [ - "단순히 평균 비교 (naive)를 하게 되면:\n", - "\n", - "치료 받은 집단에서는 $(5 \\times 5 + 2 \\times 2)/7 = 29/7$, 치료 안 받은 집단에서는 $(1 \\times 8 + 2 \\times 4)/3 = 16/3$의 입원일수가 나오게 되고 둘을 빼면 우리가 원하는 값을 구할 수 있습니다." + "반면 단순 평균 비교(naive)를 하면 어떨까요?\n\n치료 받은 집단의 평균은 $(5 \\times 5 + 2 \\times 2)/7 = 29/7$, 치료받지 않은 집단의 평균은 $(1 \\times 8 + 2 \\times 4)/3 = 16/3$이 나오고, 그 차이를 계산해보겠습니다." ] }, { @@ -130,9 +114,7 @@ "id": "b897b61c", "metadata": {}, "source": [ - "이 값은 약의 효과가 아니라 집단 구성의 차이(성별 분포 차이)가 섞여 왜곡된 결과라고 볼 수 있습니다. 저희는 이러한 문제를 'confounding (교란효과)' 이라고 부르기로 약속하였습니다.\n", - "\n", - "이를 해결하기 위한 방법 중 하나로 저희는 IPW를 복습하였습니다." + "나온 값이 $-1.19$로, 앞서 계산한 실제 $ATE = -2.6$과 꽤 차이가 납니다. 이 왜곡은 약의 효과가 아니라 집단 구성의 차이, 즉 처치 집단과 비교 집단의 성별 분포가 달라서 생기는 것입니다. 이처럼 처치와 결과 모두에 영향을 주는 변수로 인해 추정이 틀어지는 현상을 교란(confounding)이라고 부릅니다.\n\n이 교란을 제거하는 방법 중 하나가 바로 IPW(역확률 가중치)입니다." ] }, { @@ -164,9 +146,7 @@ "id": "50e105e3", "metadata": {}, "source": [ - "각 개체에 대해 $w =\\frac{T}{P(T=1 \\mid X)}+\\frac{1-T}{P(T=0 \\mid X)}$의 가중치를 부여하면, 실제 ATE와 같은 값을 회복할 수 있습니다.\n", - "\n", - "이렇게 재구성된 데이터는 실제로 관측된 데이터는 아니지만, 성별과 치료가 독립인 것처럼 보이도록 만든 가상의 모집단(pseudo-population)으로 해석할 수 있다는 점을 기억해야합니다." + "각 개체에 대해 아래와 같은 가중치를 부여하면 실제 ATE를 회복할 수 있습니다.\n\n$$w_i = \\frac{T_i}{P(T=1 \\mid X_i)} + \\frac{1-T_i}{P(T=0 \\mid X_i)}$$\n\n이렇게 재구성된 데이터는 실제로 관측된 데이터가 아닙니다. 성별과 치료가 마치 독립인 것처럼 보이도록 인위적으로 만들어진 가상의 모집단(pseudo-population)이라는 점을 기억해 두세요." ] }, { @@ -192,18 +172,7 @@ "id": "9cc44b60", "metadata": {}, "source": [ - "지금 예시에서는 $X$가 하나이기에 따른 치료 비율을 단순히 세어서 $P(T \\mid X)$를 직접 계산할 수 있었습니다.\n", - "\n", - "하지만, 실제로는 이러한 확률을 정확히 알 수 없는 경우가 대부분입니다. 특히 공변량이 여러 개 존재하거나, 연속형 변수들이 포함된 경우에는 단순한 비율 계산만으로는 성향점수를 구할 수 없습니다. 따라서 실제 분석에서는 로지스틱 회귀와 같은 모델을 이용하여 성향점수를 **추정**하게 됩니다.\n", - "\n", - "따라서 실제 분석에서는 성향점수를 $e(X)$로 정의하고, 이를 데이터로부터 $\\hat{e}(X)$의 형태로 추정하여 사용하게 됩니다. 이때 Weighting 방법에서 사용하는 가중치는 이렇게 다시 쓸 수 있습니다:\n", - "\n", - "$$\n", - "\\hat{w}_i =\n", - "\\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}.\n", - "$$\n", - "\n", - "즉, 처치를 받은 경우에는 $\\hat{e}(X_i)$의 역수를, 처치를 받지 않은 경우에는 $1 - \\hat{e}(X_i)$의 역수를 가중치로 사용하게 됩니다." + "지금 예시에서는 공변량 $X$가 하나뿐이라 성별 내 치료 비율을 단순히 세는 것만으로 $P(T \\mid X)$를 계산할 수 있었습니다.\n\n하지만 실제 분석에서는 이 확률을 정확히 알 수 없는 경우가 대부분입니다. 공변량이 여러 개이거나 연속형 변수가 포함되어 있다면, 단순 비율 계산만으로는 성향점수를 구하기 어렵습니다. 그래서 실제로는 로지스틱 회귀 같은 모델을 이용해 성향점수를 **추정**하게 됩니다.\n\n성향점수를 $e(X)$로 정의하고, 이를 데이터로부터 $\\hat{e}(X)$의 형태로 추정하면, IPW 가중치는 다음과 같이 다시 쓸 수 있습니다.\n\n$$\n\\hat{w}_i =\n\\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n$$\n\n처치를 받은 경우에는 $\\hat{e}(X_i)$의 역수를, 처치를 받지 않은 경우에는 $1 - \\hat{e}(X_i)$의 역수를 가중치로 사용하는 것입니다." ] }, { @@ -219,11 +188,7 @@ "id": "5cd9db8f", "metadata": {}, "source": [ - "성향점수를 사용할 때는 아래와 같은 주의점을 신경써야 합니다.\n", - "\n", - "1. 성향점수의 목적은 결과 예측이 아니라 confounder의 균형을 맞추는 것. -> 즉, 예측력만을 보면 오히려 균형이 깨질 수 있습니다.\n", - "\n", - "2. 성향점수 분포가 충분히 겹치지 않으면 (Positivity가 약함) 추정이 불안정해집니다." + "성향점수를 사용할 때는 두 가지를 특히 주의해야 합니다. 첫째, 성향점수의 목적은 결과를 잘 예측하는 것이 아니라 confounder의 균형을 맞추는 것입니다. 예측력만을 좇으면 오히려 균형이 깨질 수 있습니다. 둘째, 성향점수 분포가 두 집단 간에 충분히 겹치지 않으면(positivity가 약하면) 추정이 불안정해집니다.\n\n각각을 하나씩 살펴보겠습니다." ] }, { @@ -239,16 +204,7 @@ "id": "263f9f41", "metadata": {}, "source": [ - "두 학교가 있다고 하겠습니다. (Hernán 발췌)\n", - "학교 A는 거의 모두 처치를 받고, 학교 B는 거의 처치를 받지 않습니다.\n", - "\n", - "성향점수는 원래 공변량 $X$로부터 처치 $T$의 확률을 모델링하는 함수, 즉\n", - "$$\n", - "e(X)=P(T=1 \\mid X)\n", - "$$\n", - "이기 때문에, school 변수를 포함하면 당연히 처치 받을 확률을 매우 잘 예측하게 됩니다.\n", - "\n", - "하지만 과연 ATE 추정을 위해서도 이러한 변수를 포함하는 것이 바람직할까요?" + "Miguel Hernán의 예시를 빌려 생각해보겠습니다. 학교 A는 학생 거의 모두가 처치를 받고, 학교 B는 거의 처치를 받지 않는다고 해봅시다.\n\n성향점수는 공변량 $X$로부터 처치 $T$를 받을 확률을 모델링하는 함수, 즉\n\n$$\ne(X) = P(T=1 \\mid X)\n$$\n\n입니다. 이 정의에 따르면 school 변수를 포함하면 처치 여부를 매우 잘 예측할 수 있습니다. 하지만 ATE를 추정하는 목적에서도 이 변수를 포함하는 것이 바람직할까요?" ] }, { @@ -358,9 +314,7 @@ "id": "0d00a187", "metadata": {}, "source": [ - "보시다시피, 특성 학교를 추가하는 성향 점수 추정는 엄청난 분산을 갖는 반면, 그렇지 않은 것은 훨씬 더 잘 작동합니다.\n", - "\n", - "**즉, 실제로 Treatment를 예측하는 방식이 아니라 Confounder를 제어하는 ​​방식으로 예측을 구성해야 하는 것이 중요합니다.**" + "결과가 선명하게 나왔습니다. school 변수를 포함한 성향점수 모델은 추정치의 분산이 매우 크고 편향도 심한 반면, 포함하지 않은 모델은 훨씬 안정적으로 참값(0.1)에 가깝게 추정합니다.\n\n**성향점수 모델을 구성할 때는 처치를 잘 예측하는 변수가 아니라, confounder를 제어하는 변수를 포함해야 합니다.** 아래 그래프가 그 차이를 잘 보여줍니다." ] }, { @@ -509,7 +463,7 @@ "id": "56268916", "metadata": {}, "source": [ - "한 가지 문제는, 처치를 받은 사람과 받지 않은 사람의 성향점수 분포가 크게 달라 서로 잘 겹치지 않을 수 있다는 점입니다." + "IPW에서 또 하나 주의해야 할 점이 있습니다. 처치를 받은 사람과 받지 않은 사람의 성향점수 분포가 크게 달라 서로 잘 겹치지 않는 상황, 즉 positivity가 약한 경우입니다." ] }, { @@ -541,11 +495,7 @@ "id": "ccdb64aa", "metadata": {}, "source": [ - "이런 성향점수를 보인다면, 값이 충분히 겹치지 않아 positivity가 강하지 않게 됩니다.\n", - "\n", - "예를 들어 성향점수 0.9인 사람은 대부분 처치를 받는 유형인데, 처치를 받지 않은 집단에는 이런 사람이 거의 없다면 이와 비교할 “비슷한 개인”이 존재하지 않습니다. 이는 키가 2m인 사람이 약을 복용했을 때 입원 일수가 얼마나 줄어드는지 알고 싶은데, 비교할 2m짜리 control이 없는 상황과 같아서, 결국 처치가 결과에 미치는 효과를 직접 비교할 수 없게 됩니다.\n", - "\n", - "즉, 일부 개인은 적절한 비교 대상이 없어 처치가 입원 일수에 미치는 효과를 직접 비교할 수 없게 됩니다." + "위와 같이 두 집단의 성향점수 분포가 거의 겹치지 않는다면, 어떤 문제가 생길까요?\n\n예를 들어 성향점수가 0.9인 사람은 대부분 처치를 받는 유형인데, 처치를 받지 않은 집단에는 이런 사람이 거의 없습니다. 비교할 \"비슷한 개인\"이 존재하지 않는 셈입니다. 마치 키가 2m인 사람이 약을 복용했을 때 입원 일수가 얼마나 줄어드는지 알고 싶은데, 비교할 2m짜리 대조군이 없는 것과 같습니다.\n\n이런 상황에서는 일부 개인에 대해 적절한 비교 대상 자체가 없어, 처치 효과를 직접 비교할 수 없게 됩니다." ] }, { @@ -553,13 +503,7 @@ "id": "328de311", "metadata": {}, "source": [ - "또한 성향점수가 0이나 1에 가까운 관측치는 IPW에서 매우 큰 가중치를 가지게 되어, 추정량의 분산이 크게 증가합니다. IPW의 가중치는 \n", - "\n", - "$$\n", - "w_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n", - "$$\n", - "\n", - "로 정의되는데, 이때 $\\hat{e}(X_i) \\approx 0$ 또는 $\\hat{e}(X_i) \\approx 1$이면 분모가 매우 작아져 $w_i$가 급격히 커지게 됩니다. 그 결과 일부 관측치가 전체 추정을 지배하게 되어 추정이 매우 불안정해질 수 있습니다. (실무적으로는 가중치가 20을 넘는 경우 문제가 있는 신호로 간주합니다.)" + "더불어, 성향점수가 0이나 1에 가까운 관측치는 IPW에서 매우 큰 가중치를 갖게 됩니다. 가중치 식을 보면 이유를 바로 알 수 있습니다.\n\n$$\nw_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}\n$$\n\n$\\hat{e}(X_i) \\approx 0$ 또는 $\\hat{e}(X_i) \\approx 1$이면 분모가 0에 가까워지면서 $w_i$가 급격히 커집니다. 그 결과 소수의 관측치가 전체 추정을 지배하게 되어 추정량의 분산이 크게 증가합니다. 실무에서는 가중치가 20을 넘으면 경계 신호로 봅니다." ] }, { @@ -575,9 +519,7 @@ "id": "91e0c014", "metadata": {}, "source": [ - "앞선 내용을 요약하면, 성향점수는 공변량의 균형을 맞추는 데 목적이 있으며, 이를 위해서는 두 집단 간에 positivity이 충분히 확보되어야 하고, 동시에 과도하게 큰 가중치가 발생하지 않도록 주의해야 합니다.\n", - "\n", - "실제로 IPW를 적용할 때는, 앞서 언급한 두 가지 조건(balancing과 weight 안정성)을 고려하여 다음과 같은 절차로 진행합니다." + "지금까지 살펴본 내용을 정리하면, 성향점수는 공변량의 균형을 맞추는 데 목적이 있고, 이를 위해서는 두 집단 간 충분한 overlap(positivity)이 확보되어야 하며, 가중치가 지나치게 커지지 않도록 주의해야 합니다.\n\n실제로 IPW를 적용할 때는 이 두 가지 조건을 염두에 두면서 아래 절차에 따라 진행합니다." ] }, { @@ -585,28 +527,7 @@ "id": "22d31936", "metadata": {}, "source": [ - "- Step 0: Find Potential Confounders\n", - " - 도메인 지식을 기반으로 적절한 공변량을 선정합니다. \n", - "- Step 1: Propensity Score Estimation \n", - " - logistic / ML 등을 활용하여 성향점수 $\\hat{e}(X)$를 추정합니다.\n", - "\n", - "- Step 2: Positivity 확인 \n", - " - 성향점수 분포를 시각화하여 두 집단이 충분히 겹치는지 확인합니다. \n", - " - ❗ 겹치는 부분이 부족한 경우 이후 분석은 신뢰하기 어렵습니다.\n", - "\n", - "- Step 3: Weight 계산 \n", - " - $w_i = \\frac{T_i}{\\hat{e}(X_i)} + \\frac{1 - T_i}{1 - \\hat{e}(X_i)}$ 를 이용해 가중치를 계산합니다.\n", - "\n", - "- Step 4: Covariate Balance 확인 \n", - " - weighting 이후 공변량 분포가 실제로 균형을 이루는지 확인합니다. \n", - " - ❗ IPW의 목적인 '균형' 달성을 이뤘는지 확인합니다.\n", - "\n", - "- Step 5: Weight 안정성 점검 \n", - " - weight 분포, extreme value 등을 확인하여 일부 관측치가 과도한 영향을 주지 않는지 평가합니다.\n", - " - ❗ 과도한 weight는 IPW의 안정성을 해칩니다.\n", - "\n", - "- Step 6: Estimation \n", - " - 최종적으로 가중치를 반영하여 ATE를 추정합니다." + "- **Step 0. 공변량 선정**\n 도메인 지식을 바탕으로 confounder가 될 공변량을 선정합니다.\n\n- **Step 1. 성향점수 추정**\n 로지스틱 회귀나 ML 모델로 $\\hat{e}(X)$를 추정합니다.\n\n- **Step 2. Positivity 확인**\n 성향점수 분포를 시각화하여 두 집단이 충분히 겹치는지 봅니다.\n 겹치는 구간이 부족하면 이후 분석을 신뢰하기 어렵습니다.\n\n- **Step 3. 가중치 계산**\n $w_i = \\dfrac{T_i}{\\hat{e}(X_i)} + \\dfrac{1 - T_i}{1 - \\hat{e}(X_i)}$ 로 가중치를 계산합니다.\n\n- **Step 4. Covariate Balance 확인**\n 가중치 적용 후 공변량 분포가 실제로 균형을 이루는지 확인합니다.\n IPW의 핵심 목적인 '균형'이 달성되었는지 검증하는 단계입니다.\n\n- **Step 5. 가중치 안정성 점검**\n 가중치 분포와 극단값을 확인해 일부 관측치가 추정을 지배하지 않는지 살펴봅니다.\n\n- **Step 6. 효과 추정**\n 가중치를 반영하여 최종 ATE를 추정합니다." ] }, { @@ -836,30 +757,7 @@ "id": "9fb5cd48", "metadata": {}, "source": [ - "- Simulation Data\n", - "\n", - "$$\n", - "X_1, X_2 \\sim \\mathcal{N}(0,1)\n", - "$$\n", - "\n", - "$$\n", - "e(X) = \\mathbb{P}(T=1 \\mid X) = \\frac{1}{1 + \\exp\\big(-(-0.3 + 0.8X_1 - 0.8X_2)\\big)}\n", - "$$\n", - "\n", - "$$\n", - "T \\mid X \\sim \\text{Bernoulli}(e(X))\n", - "$$\n", - "\n", - "$$\n", - "Y = 2T + X_1 + X_2 + \\varepsilon, \\quad \\varepsilon \\sim \\mathcal{N}(0,1)\n", - "$$\n", - "\n", - "즉, ATE = 2.\n", - "\n", - "$$\n", - "Y(0) = X_1 + X_2 + \\varepsilon, \\quad\n", - "Y(1) = 2 + X_1 + X_2 + \\varepsilon\n", - "$$" + "먼저 시뮬레이션 데이터를 구성하겠습니다. 공변량 $X_1, X_2$는 표준정규분포에서 생성하고, 처치 확률은 두 공변량의 선형 결합으로 정의합니다. 결과 변수 $Y$는 처치 효과 2를 포함하도록 설정해, 참값 $ATE = 2$인 데이터를 만들겠습니다.\n\n$$\nX_1, X_2 \\sim \\mathcal{N}(0,1)\n$$\n\n$$\ne(X) = \\mathbb{P}(T=1 \\mid X) = \\frac{1}{1 + \\exp\\big(-(-0.3 + 0.8X_1 - 0.8X_2)\\big)}\n$$\n\n$$\nT \\mid X \\sim \\text{Bernoulli}(e(X))\n$$\n\n$$\nY = 2T + X_1 + X_2 + \\varepsilon, \\quad \\varepsilon \\sim \\mathcal{N}(0,1)\n$$\n\n잠재적 결과로 풀어쓰면 이렇습니다.\n\n$$\nY(0) = X_1 + X_2 + \\varepsilon, \\quad\nY(1) = 2 + X_1 + X_2 + \\varepsilon\n$$\n\n즉, 처치를 받든 받지 않든 차이는 정확히 2이므로 $ATE = 2$입니다." ] }, { @@ -998,9 +896,7 @@ "id": "b9f19b57", "metadata": {}, "source": [ - "해당 시뮬레이션 데이터에서 적절한 공변량 조합은 X1과 X2를 모두 고르는 것입니다.\n", - "설명을 위해 X1만 고르는 bad case와 (X1, X2)를 모두 고르는 good case를 둘 다 활용하겠습니다.\n", - "실제로 적절한 공변량을 선택할 때는 도메인 지식에 근거해서 고르면 됩니다." + "이 시뮬레이션에서 올바른 공변량 조합은 $X_1$과 $X_2$를 모두 포함하는 것입니다. 앞서 살펴본 성향점수의 목적(균형 달성)을 실제로 확인하기 위해, $X_1$만 고르는 bad case와 $(X_1, X_2)$를 모두 고르는 good case를 함께 비교해 보겠습니다. 실전에서 공변량을 고를 때는 이처럼 도메인 지식에 근거하는 것이 기본입니다." ] }, { @@ -1060,15 +956,7 @@ "id": "af1800eb", "metadata": {}, "source": [ - "각 관측치는 자신의 처치 확률의 역수를 이용해 가중된다.\n", - "\n", - "$$\n", - "w_i =\n", - "\\begin{cases}\n", - "\\frac{1}{\\hat e(X_i)} & T_i = 1 \\\\\n", - "\\frac{1}{1 - \\hat e(X_i)} & T_i = 0\n", - "\\end{cases}\n", - "$$" + "이제 추정된 성향점수를 이용해 각 관측치에 가중치를 부여합니다. 처치 여부에 따라 다음과 같이 계산됩니다.\n\n$$\nw_i =\n\\begin{cases}\n\\dfrac{1}{\\hat e(X_i)} & T_i = 1 \\\\\n\\dfrac{1}{1 - \\hat e(X_i)} & T_i = 0\n\\end{cases}\n$$\n\n처치를 받았는데 그 확률이 낮았던 사람, 혹은 처치를 받지 않았는데 받을 확률이 높았던 사람에게 더 큰 가중치가 부여되는 구조입니다." ] }, { @@ -1147,32 +1035,7 @@ "id": "1bb92fad", "metadata": {}, "source": [ - "> ASMD (Absolute Standardized Mean Difference)\n", - "\n", - "공변량 균형은 처치군과 대조군 간 평균 차이를 표준화하여 평가한다.\n", - "\n", - "$$\n", - "\\text{ASMD}_j = \\frac{\\left| \\mu_{1j} - \\mu_{0j} \\right|}\n", - "{\\sqrt{\\frac{\\sigma_{1j}^2 + \\sigma_{0j}^2}{2}}}\n", - "$$\n", - "\n", - "가중치를 사용하는 경우, 평균과 분산은 다음과 같이 계산된다:\n", - "\n", - "$$\n", - "\\mu_{1j} = \\frac{\\sum_{i: A_i=1} w_i X_{ij}}{\\sum_{i: A_i=1} w_i}, \\quad\n", - "\\mu_{0j} = \\frac{\\sum_{i: A_i=0} w_i X_{ij}}{\\sum_{i: A_i=0} w_i}\n", - "$$\n", - "\n", - "$$\n", - "\\sigma_{1j}^2 = \\frac{\\sum_{i: A_i=1} w_i (X_{ij} - \\mu_{1j})^2}{\\sum_{i: A_i=1} w_i}, \\quad\n", - "\\sigma_{0j}^2 = \\frac{\\sum_{i: A_i=0} w_i (X_{ij} - \\mu_{0j})^2}{\\sum_{i: A_i=0} w_i}\n", - "$$\n", - "\n", - "일반적으로 해석 기준은 다음과 같이 알려져있다.\n", - "- ASMD < 0.1: 균형 달성\n", - "- ASMD ≥ 0.1: 균형 부족\n", - "\n", - "즉, ASMD는 공변량 분포가 weighting 이후 실제로 맞춰졌는지를 평가하는 지표이며, 예측력보다 해당 지표를 만족하는 것이 더 중요하다." + "> **ASMD (Absolute Standardized Mean Difference)**\n\n공변량의 균형이 잘 맞춰졌는지는 처치군과 대조군 간 평균 차이를 표준화하여 평가합니다.\n\n$$\n\\text{ASMD}_j = \\frac{\\left| \\mu_{1j} - \\mu_{0j} \\right|}\n{\\sqrt{\\frac{\\sigma_{1j}^2 + \\sigma_{0j}^2}{2}}}\n$$\n\n가중치를 적용하는 경우, 평균과 분산은 아래와 같이 가중 평균으로 계산합니다.\n\n$$\n\\mu_{1j} = \\frac{\\sum_{i: A_i=1} w_i X_{ij}}{\\sum_{i: A_i=1} w_i}, \\quad\n\\mu_{0j} = \\frac{\\sum_{i: A_i=0} w_i X_{ij}}{\\sum_{i: A_i=0} w_i}\n$$\n\n$$\n\\sigma_{1j}^2 = \\frac{\\sum_{i: A_i=1} w_i (X_{ij} - \\mu_{1j})^2}{\\sum_{i: A_i=1} w_i}, \\quad\n\\sigma_{0j}^2 = \\frac{\\sum_{i: A_i=0} w_i (X_{ij} - \\mu_{0j})^2}{\\sum_{i: A_i=0} w_i}\n$$\n\n일반적으로 **ASMD < 0.1**이면 균형이 달성된 것으로 봅니다. 모델의 예측력보다 이 지표를 만족하는 것이 더 중요하다는 점을 기억해 두세요." ] }, { @@ -1234,12 +1097,7 @@ "id": "190fb62c", "metadata": {}, "source": [ - "- Good model: 모든 공변량에서 ASMD < 0.1 → 균형 달성 \n", - "- Bad model: $X_2$에서 균형 실패\n", - "\n", - "Bad model에서는 중요한 공변량 $X_2$가 PS 모델에서 빠져 있어, weighting 이후에도 불균형이 남아 있다.\n", - "\n", - "→ 이 상태에서는 PS 모델을 수정하기 위해 이전 단계로 돌아가야 한다." + "결과를 보면, good model은 모든 공변량에서 ASMD < 0.1을 만족해 균형을 달성했습니다. 반면 bad model은 $X_2$에서 ASMD가 기준을 훨씬 초과합니다. $X_2$가 PS 모델에서 빠져 있었기 때문에, 가중치를 적용해도 $X_2$의 불균형이 그대로 남아 있는 것입니다.\n\n이런 경우에는 PS 모델을 수정해서 다시 Step 1부터 반복해야 합니다." ] }, { @@ -1247,14 +1105,7 @@ "id": "1aea243c", "metadata": {}, "source": [ - "추가) \n", - "공변량이 많아지면 값을 한 번에 비교하기 힘들어지는데, 이를 위해 시각화를 수행할 수 있다.\n", - "\n", - "\n", - "**Love Plot**은 IPW 적용 전후의 ASMD를 공변량별로 비교하는 시각화 도구입니다. \n", - "점이 왼쪽(0에 가까울수록)으로 이동할수록 균형이 잘 맞춰진 것이며, \n", - "**ASMD < 0.1** 이면 균형 달성으로 판단합니다. \n", - "IPW 결과 보고 시 가장 많이 활용하는 진단 그래프입니다.\n" + "공변량이 많아지면 ASMD 값을 하나하나 비교하기 어려워집니다. 이럴 때 유용한 시각화 도구가 **Love Plot**입니다.\n\nLove Plot은 IPW 적용 전후의 ASMD를 공변량별로 점으로 나타내어 한눈에 비교할 수 있게 해줍니다. 점이 왼쪽(0 방향)으로 이동할수록 균형이 잘 맞춰진 것이며, 점선으로 표시된 ASMD = 0.1 기준 안쪽에 들어오면 균형 달성으로 판단합니다. IPW 결과를 보고할 때 가장 널리 쓰이는 진단 그래프입니다." ] }, { @@ -1376,30 +1227,7 @@ "id": "72186272", "metadata": {}, "source": [ - "IPW에서 가중치는 bias를 줄이기 위한 도구이지만, 동시에 **분산을 크게 증가시킬 수 있습니다**. \n", - "특히 일부 관측치의 propensity score가 0 또는 1에 가까우면, 해당 관측치는 매우 큰 가중치를 가지게 되어 추정량이 불안정해집니다.\n", - "\n", - "가중치의 불안정성은 다음과 같은 지표로 확인할 수 있습니다:\n", - "\n", - "- 최대값 (max weight): 큰 값은 extreme weight 존재를 의미 \n", - "- 분위수 (95%, 99%): 상위 꼬리에서 extreme weight 존재 여부 확인 \n", - "- 시각화 (boxplot): 가중치 분포와 이상치 확인\n", - "\n", - "Weight truncation\n", - "\n", - "극단적인 가중치를 완화하기 위해, 일정 기준 이상을 잘라내는 방법을 사용할 수 있다:\n", - "\n", - "$$\n", - "w_i^{\\text{trunc}} = \\min(w_i, c)\n", - "$$\n", - "\n", - "예시:\n", - "```python\n", - "w_trunc = np.clip(w, 0, 20)\n", - "```\n", - "보통 20 수준에서 truncation을 적용한다.\n", - "\n", - "이는 extreme weight를 줄여 분산을 안정화할 수 있지만, 일부 관측치 정보가 줄어들고, 따라서 ATE가 아닌 다른 estimand (ATO)를 보게 됨.\n" + "가중치는 편향을 줄여주지만, 동시에 **추정량의 분산을 크게 키울 수 있는** 양날의 검입니다. 특히 성향점수가 0이나 1에 가까운 관측치는 매우 큰 가중치를 가지게 되어 추정이 불안정해집니다.\n\n가중치의 안정성은 다음 지표로 확인합니다.\n\n- **최대값(max)**: 지나치게 큰 값이 있으면 extreme weight가 있다는 신호입니다.\n- **분위수(95%, 99%)**: 상위 꼬리에서 극단값이 얼마나 분포하는지 봅니다.\n- **시각화(boxplot)**: 분포 전체와 이상치를 직관적으로 확인합니다.\n\n극단적인 가중치가 문제가 된다면 **weight truncation**을 적용할 수 있습니다. 일정 값 이상의 가중치를 잘라내는 방식입니다.\n\n$$\nw_i^{\\text{trunc}} = \\min(w_i, c)\n$$\n\n```python\nw_trunc = np.clip(w, 0, 20)\n```\n\n보통 $c = 20$ 수준을 기준으로 사용합니다. 다만 이 방법은 분산을 안정화하는 대신 일부 관측치 정보를 희생하게 되어, 엄밀히는 ATE가 아닌 다른 추정 대상(ATO)을 보게 된다는 점을 알아두어야 합니다." ] }, { @@ -1472,13 +1300,7 @@ "id": "cbb82b1e", "metadata": {}, "source": [ - "최종 효과 추정은 Hajek estimator를 사용합니다. 이는 IPW estimator를 각 군 내부에서 정규화한 형태로, extreme weight에 덜 민감하다고 알려져있습니다.\n", - "Hajek estimator는 각 군의 weighted mean 차이로 해석할 수 있으며, IPW의 분산을 완화한 효과 추정량으로 자주 사용됩니다.\n", - "\n", - "$$\n", - "\\hat{ATE} = \\frac{\\sum_{i=1}^n T_i w_i Y_i}{\\sum_{i=1}^n T_i w_i} -\n", - "\\frac{\\sum_{i=1}^n (1-T_i) w_i Y_i}{\\sum_{i=1}^n (1-T_i) w_i}\n", - "$$\n" + "효과 추정에는 **Hájek estimator**를 사용합니다. 이는 IPW estimator를 각 집단 내에서 정규화한 형태로, extreme weight의 영향을 줄여 더 안정적인 추정이 가능합니다. 각 집단의 가중 평균 차이로 해석할 수 있어 직관적이기도 합니다.\n\n$$\n\\hat{ATE} = \\frac{\\sum_{i=1}^n T_i w_i Y_i}{\\sum_{i=1}^n T_i w_i} -\n\\frac{\\sum_{i=1}^n (1-T_i) w_i Y_i}{\\sum_{i=1}^n (1-T_i) w_i}\n$$" ] }, { @@ -1516,10 +1338,7 @@ "id": "5b5f64ce", "metadata": {}, "source": [ - "신뢰구간은 추정값의 불확실성을 정량화할 수 있는 방법으로 여기서는 다음과 같이 계산됩니다.\n", - "\n", - "IPW에서의 신뢰구간 추정은 propensity score 자체가 추정량이며, 가중치와 분모에도 추정량이 포함되어 있어 이론적 분산 계산이 까다롭습니다. \n", - "여기서는 bootstrap을 이용하여 신뢰구간을 추정하고 결과를 시각화하겠습니다." + "점 추정치만으로는 불확실성을 알기 어렵습니다. 신뢰구간을 함께 구해야 결과를 제대로 해석할 수 있습니다.\n\nIPW에서는 성향점수 자체가 추정량이고, 가중치와 분모 모두에 추정값이 포함되어 있어 이론적인 분산 계산이 까다롭습니다. 그래서 여기서는 **bootstrap**으로 신뢰구간을 구하겠습니다. 매번 재샘플링할 때마다 성향점수 추정부터 ATE 계산까지 전 과정을 반복하는 방식입니다." ] }, { @@ -1611,13 +1430,7 @@ "id": "882436bb", "metadata": {}, "source": [ - "앞에서는 시뮬레이션 데이터로 IPW의 전체 절차를 살펴보았습니다. 이제 동일한 절차를 실제 데이터에 적용해 보겠습니다.\n", - "\n", - "여기서는 인과추론 분야의 대표적인 예제인 **NHEFS** (National Health and Nutrition Examination Survey Data I Epidemiologic Follow-up Study) 데이터를 사용합니다.\n", - "\n", - "- 연구 질문: **금연이 체중 변화에 미치는 인과 효과는 얼마인가?**\n", - "- Treatment $T$ (`qsmk`): 1971\\~1982 사이 금연 여부 (1 = 금연, 0 = 계속 흡연)\n", - "- Outcome $Y$ (`wt82_71`): 11년 간 체중 변화 (kg)" + "앞에서는 시뮬레이션 데이터로 IPW 절차 전체를 따라가 보았습니다. 이제 동일한 절차를 실제 데이터에 적용해 보겠습니다.\n\n사용할 데이터는 인과추론 분야의 대표적인 예제인 **NHEFS** (National Health and Nutrition Examination Survey Data I Epidemiologic Follow-up Study)입니다. 연구 질문은 간단합니다.\n\n> **금연이 체중 변화에 미치는 인과적 효과는 얼마인가?**\n\n처치 $T$ (`qsmk`)는 1971~1982년 사이 금연 여부(1 = 금연, 0 = 계속 흡연)이고, 결과 변수 $Y$ (`wt82_71`)는 11년간 체중 변화(kg)입니다." ] }, { @@ -1823,11 +1636,7 @@ "id": "9dc9e8fc", "metadata": {}, "source": [ - "### 적절한 공변량 선택\n", - "\n", - "- Confounders $X$: 성별(`sex`), 인종(`race`), 나이(`age`), 학력(`education`), 흡연량(`smokeintensity`), 흡연 기간(`smokeyrs`), 운동량(`exercise`), 활동 수준(`active`), 1971년 체중(`wt71`)\n", - "\n", - "흡연자 (T)는 보통 더 마른 경향이 있고, 금연 결심에 영향을 주는 요인(나이, 건강 상태 등)이 체중 변화(Y)에도 영향을 주기 때문에, 단순 비교는 금연의 효과를 과소추정하게 됩니다." + "### 적절한 공변량 선정\n\nconfounder로 사용할 공변량은 성별(`sex`), 인종(`race`), 나이(`age`), 학력(`education`), 흡연량(`smokeintensity`), 흡연 기간(`smokeyrs`), 운동량(`exercise`), 활동 수준(`active`), 1971년 체중(`wt71`)입니다.\n\n흡연자는 보통 더 마른 경향이 있고, 금연을 결심하게 만드는 요인(나이, 건강 상태 등)이 체중 변화에도 영향을 주기 때문에, 이런 변수들을 통제하지 않으면 금연 효과를 정확히 추정하기 어렵습니다." ] }, { @@ -1835,9 +1644,7 @@ "id": "674d2a4b", "metadata": {}, "source": [ - "단순 비교만으로는 금연 집단이 체중이 약 2.5kg 정도 더 증가한 것으로 보이지만, 이는 confounding이 섞인 결과일 수 있습니다. 예를 들어, 금연한 사람은 평균적으로 나이가 더 많고, 흡연량이 적었던 경우가 많아 체중 변화 양상도 다를 수 있습니다.\n", - "\n", - "이제 IPW로 보정한 효과를 추정해보겠습니다." + "단순 비교만으로는 금연 집단이 약 2.5 kg 더 체중이 증가한 것처럼 보입니다. 하지만 금연한 사람은 평균적으로 나이가 더 많고 흡연량이 적었던 경향이 있어, confounding이 결과에 섞여 있을 가능성이 높습니다. IPW로 이 편향을 보정해 보겠습니다." ] }, { @@ -1845,9 +1652,7 @@ "id": "459b02ba", "metadata": {}, "source": [ - "### 가중치 계산\n", - "\n", - "연속형 공변량은 비선형 효과를 잡기 위해 제곱항을 추가하고, 범주형 변수(`education`, `exercise`, `active`)는 one-hot encoding 처리하여 진행했습니다." + "### 가중치 계산\n\n연속형 공변량은 비선형 효과를 잡기 위해 제곱항을 추가하고, 범주형 변수(`education`, `exercise`, `active`)는 one-hot encoding으로 처리했습니다." ] }, { @@ -1929,7 +1734,7 @@ "id": "57ed6e50", "metadata": {}, "source": [ - "두 집단의 성향점수 분포가 충분히 겹치고 있고, 양끝 (0, 1 근처) 에 치우치지 않아 positivity가 잘 확보되었음을 확인할 수 있습니다." + "두 집단의 성향점수 분포가 넓은 구간에서 겹치고 있고, 0이나 1 근방에 크게 치우치지 않아 positivity가 잘 확보된 것을 볼 수 있습니다." ] }, { @@ -2084,8 +1889,7 @@ "id": "9ff26dee", "metadata": {}, "source": [ - "최대 가중치가 약 17 정도로 다소 크지만, 99 percentile이 7 미만이므로 일부 관측치만 극단적인 가중치를 가지는 형태입니다.\n", - "샘플 수(1,566개)에 비해 큰 가중치가 많지 않으므로 truncation 없이 진행하겠습니다." + "최대 가중치가 약 17로 다소 크지만, 99 percentile이 7 미만이라 극단적인 가중치를 가진 관측치가 많지 않습니다. 샘플 수(1,566개)에 비해 영향이 제한적이므로, 여기서는 truncation 없이 그대로 진행하겠습니다." ] }, { @@ -2093,7 +1897,7 @@ "id": "edea2150", "metadata": {}, "source": [ - "IPW 적용 전에는 `age`, `smokeintensity`, `race` 등 여러 공변량에서 ASMD가 0.1을 초과하여 두 집단의 분포 차이가 컸지만, IPW 적용 후에는 모든 공변량의 ASMD가 0.1 미만으로 떨어져 confounder가 잘 균형 잡힌 것을 볼 수 있습니다." + "IPW 적용 전에는 `age`, `smokeintensity`, `race` 등 여러 공변량에서 ASMD가 0.1을 넘어 두 집단 간 분포 차이가 상당했습니다. IPW 적용 후에는 모든 공변량의 ASMD가 0.1 아래로 내려와, confounder 균형이 잘 맞춰진 것을 확인할 수 있습니다." ] }, { @@ -2207,17 +2011,7 @@ "id": "e12981f4", "metadata": {}, "source": [ - "### 결과 해석\n", - "\n", - "| 추정 방법 | ATE (kg) | 95% CI |\n", - "|---|---|---|\n", - "| Naive 비교 | ~ 2.54 | - |\n", - "| **IPW (Hájek)** | **~ 3.5** | **약 (2.4, 4.5)** |\n", - "\n", - "- Naive 비교가 약 2.5 kg 인 반면, IPW로 confounder를 보정하면 효과 추정치가 **약 3.5 kg 으로 더 커집니다**.\n", - "- 이는 흡연자가 평균적으로 더 마르고, 금연자가 더 나이가 많아 체중 증가가 자연스럽게 적게 일어나는 경향이 있어 confounding이 효과를 **과소추정**하고 있었음을 의미합니다.\n", - "\n", - "**해석**: 다른 조건이 같다면, 금연은 11년간 체중을 평균적으로 약 3.5 kg 증가시키는 것으로 추정됩니다. (다른 방법과 교차 검증이 필요합니다.)" + "### 결과 해석\n\n| 추정 방법 | ATE (kg) | 95% CI |\n|---|---|---|\n| Naive 비교 | ~ 2.54 | - |\n| **IPW (Hájek)** | **~ 3.5** | **약 (2.4, 4.5)** |\n\n단순 비교의 약 2.5 kg에서 IPW로 보정하면 약 3.5 kg으로 효과 추정치가 커집니다. 흡연자는 평균적으로 더 마르고, 금연자는 나이가 더 많아 원래 체중이 증가하기 어려운 조건이었기 때문에, 보정 전에는 금연 효과가 과소추정되고 있었던 것입니다.\n\n다른 조건이 같다면 금연은 11년간 체중을 평균적으로 약 3.5 kg 증가시키는 것으로 추정됩니다. 물론 다른 방법과 교차 검증을 통해 결과의 신뢰도를 높이는 것이 좋습니다." ] }, { @@ -2233,9 +2027,7 @@ "id": "e51b4f91", "metadata": {}, "source": [ - "- Stuart, E. A. (2010). Matching methods for causal inference: A review and a look forward. *Statistical Science*, 25(1), 1–21.\n", - "\n", - "- Chattopadhyay, A., Hase, C. H., & Zubizarreta, J. R. (2020). Balancing versus modeling approaches to weighting in practice. *Statistics in Medicine*, 39(24), 3227–3254." + "- Stuart, E. A. (2010). Matching methods for causal inference: A review and a look forward. *Statistical Science*, 25(1), 1–21.\n- Chattopadhyay, A., Hase, C. H., & Zubizarreta, J. R. (2020). Balancing versus modeling approaches to weighting in practice. *Statistics in Medicine*, 39(24), 3227–3254.\n- Hernán, M. A., & Robins, J. M. (2020). *Causal Inference: What If*. Chapman & Hall/CRC." ] } ], @@ -2260,4 +2052,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/book/myst.yml b/book/myst.yml index 617cab2..e407fc8 100644 --- a/book/myst.yml +++ b/book/myst.yml @@ -2,7 +2,7 @@ version: 1 project: title: Causal Studio - copyright: '2025' + copyright: "2025" github: https://github.com/CausalInferenceLab/causal-studio license: CC-BY-4.0 keywords: @@ -23,6 +23,12 @@ project: file: why_causal_inference/why_causal_inference_en.ipynb - file: why_causal_inference/why_causal_inference_ko.ipynb hidden: true + - title: "Introduction to IPW" + children: + - title: "IPW in Practice" + file: ipw_basics/ipw_in_practice_en.ipynb + - file: ipw_basics/ipw_in_practice_ko.ipynb + hidden: true site: template: book-theme @@ -35,4 +41,4 @@ site: logo_text: Causal Studio style: ./custom.css parts: - primary_sidebar_footer: '' + primary_sidebar_footer: "" From d09e9aa5f04c6987d0d3ea7d5b471fe764669e3a Mon Sep 17 00:00:00 2001 From: Funbucket Date: Tue, 12 May 2026 11:18:35 +0900 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20IPW=20=EC=96=B8=EC=96=B4=20?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EC=A0=95=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/ipw_basics/ipw_in_practice_en.ipynb | 8 +++++--- book/ipw_basics/ipw_in_practice_ko.ipynb | 8 +++++--- book/myst.yml | 10 ++++------ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/book/ipw_basics/ipw_in_practice_en.ipynb b/book/ipw_basics/ipw_in_practice_en.ipynb index 99f3ac8..ce0f8e0 100644 --- a/book/ipw_basics/ipw_in_practice_en.ipynb +++ b/book/ipw_basics/ipw_in_practice_en.ipynb @@ -4,9 +4,11 @@ "cell_type": "markdown", "id": "c1ffddf8", "metadata": {}, - "source": [ + "source": [ + "**🌐 Language:** **English** | [한국어 →](/ipw-in-practice-ko)\n", + "\n", "# IPW in Practice" - ] + ] }, { "cell_type": "code", @@ -2052,4 +2054,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/book/ipw_basics/ipw_in_practice_ko.ipynb b/book/ipw_basics/ipw_in_practice_ko.ipynb index 6aecc5c..002f863 100644 --- a/book/ipw_basics/ipw_in_practice_ko.ipynb +++ b/book/ipw_basics/ipw_in_practice_ko.ipynb @@ -4,9 +4,11 @@ "cell_type": "markdown", "id": "c1ffddf8", "metadata": {}, - "source": [ + "source": [ + "**🌐 언어:** [← English](/ipw-in-practice-en) | **한국어**\n", + "\n", "# IPW in Practice" - ] + ] }, { "cell_type": "code", @@ -2052,4 +2054,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/book/myst.yml b/book/myst.yml index e407fc8..3d93d03 100644 --- a/book/myst.yml +++ b/book/myst.yml @@ -23,12 +23,10 @@ project: file: why_causal_inference/why_causal_inference_en.ipynb - file: why_causal_inference/why_causal_inference_ko.ipynb hidden: true - - title: "Introduction to IPW" - children: - - title: "IPW in Practice" - file: ipw_basics/ipw_in_practice_en.ipynb - - file: ipw_basics/ipw_in_practice_ko.ipynb - hidden: true + - title: "IPW in Practice" + file: ipw_basics/ipw_in_practice_en.ipynb + - file: ipw_basics/ipw_in_practice_ko.ipynb + hidden: true site: template: book-theme