{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Compositional Abstraction Error\n", "\n", "One of the key requirement we imposed on abstraction is *compositionality*. We have two forms of compositionality:\n", "- If $\\alpha_1$ is a zero-error abstraction from $\\mathcal{M}$ to $\\mathcal{M'}$, and $\\alpha_2$ is a zero-error abstraction from $\\mathcal{M'}$ to $\\mathcal{M''}$, then we want the composition $\\alpha_1 \\circ \\alpha_1$ to be a zero-error abstraction from $\\mathcal{M}$ to $\\mathcal{M''}$.\n", "- If $\\alpha_1$ is an abstraction from $\\mathcal{M}$ to $\\mathcal{M'}$ with error $e_1$, and $\\alpha_2$ is an abstraction from $\\mathcal{M'}$ to $\\mathcal{M''}$ with error $e_2$, then we want the composition $\\alpha_1 \\circ \\alpha_1$ to be an abstraction from $\\mathcal{M}$ to $\\mathcal{M''}$ with error bounded by $e_1+e_2$.\n", "\n", "In this notebook we show the importance of selecting a proper metric to evaluate the abstraction error by showing how different metrics may fail in guaranteeing compositionality. To do this we implement the example of SCM abstraction presented in Section 1 of [Rischel2021]. In particular we confirm experimentally that measures of abstraction error relying on KL divergence are not composable, while JS distance may provide a suitable measure.\n", "\n", "This notebook was developed in order to offer a practical implementation of the ideas about abstraction error discussed in [Rischel2020] and [Rischel2021], and to lay stonger foundations to further work with the idea of abstraction of causal models. The notebook is structured as follows: \n", "- Setup of standard and custom libraries (Section 2)\n", "- Definition of the models M0 and M1 (Section 3)\n", "- Evaluation of abstraction error between M0 and M1 using different metrics (Section 4)\n", "- Introduction of model M2 (Section 5)\n", "- Evaluation of abstraction error between M1 and M2 using different metrics (Section 6)\n", "- Evaluation of composed abstraction error computed as the sum of the abstraction error from M0 to M1 plus the abstraction error from M1 to M2 agains the abstraction error from M0 to M2 using different metrics (Section 7)\n", "- Theoretical considerations about the choice of the metrics (Section 8)\n", "\n", "DISCLAIMER 1: the notebook refers to ideas from *causality* and *category theory* for which only a quick definition is offered. Useful references for causality are [Pearl2009,Peters2017], while for category theory are [Spivak2014,Fong2018].\n", "\n", "DISCLAIMER 2: mistakes are in all likelihood due to misunderstandings by the notebook author in reading [Rischel2020] and [Rischel2021]. Feedback very welcome! :)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Setup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Importing libraries and defining parameters\n", "\n", "We start by importing libraries." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import scipy\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tqdm.notebook import tqdm\n", "from scipy import stats\n", "from scipy.spatial import distance\n", "import networkx as nx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We select a number of samples for our simulations." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "n_samples = 10**6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For reproducibility, and for discussing our results in this notebook, we set a random seed to $1985$." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "np.random.seed(1985)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that in this notebook we write simple implementations of our models without relying on *pgmpy*. Also we do not import our own Abstraction objects from *src.SCMMappings* because all abstractions will be trivial identities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Models M0 and M1\n", "\n", "## SCM M0\n", "\n", "We start by defining the SCM for Model $\\mathcal{M}$ specified in the example in Section 1.4 of [Rischel2021].\n", "\n", "A SCM [Pearl2009] is defined by a set of *exogenous variables* $\\mathcal{E}$, a set of *endogenous variables* $\\mathcal{X}$, a set of structural functions $\\mathcal{F}$ associated with the endogenous variables, and a set of probability distribution $\\mathcal{P}$ associated with the exogenous variables.\n", "\n", "In the case of our model $\\mathcal{M}$ we have:\n", "- $\\mathcal{E} = \\{E_{A1}, E_{A2}, E_{T}\\}$\n", "- $\\mathcal{X} = \\{{A1}, {A2}, {T}\\}$\n", "- $\\mathcal{F} = \\{f_{A1}(E_{A1}), f_{A2}(E_{A2}), f_{T}({A1}, {A2}, E_{T})\\}$\n", "- $\\mathcal{P} = \\{P_{E_{A1}}, P_{E_{A2}}, P_{E_T}\\}$\n", "\n", "Let's visualize the DAG associated with $\\mathcal{M}$:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAQvUlEQVR4nO3dX2ydBf3H8W//rFIoMjen04wxwT8kRUlQWSZGZ9gfxMB2sxIYMYqgky0kRi8IahyKSmw0Jk4dkaitAgbQLeAS50iG4IVBgplT49DEEQhmNAtTl63b2p7fhb8VKmM93c45z/Oc7+uV9GJt2fnixfP2c9xqR61WqwUAJNFZ9AEA0ErCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKsIHQCrCB0AqwgdAKoWGb9GiRdHb2xt9fX2THxs2bJj2n3v00Uejo6MjvvGNb7zia5/85CfjHe94R3R2dsaPf/zjJlwN0J4a/Ux++umnY9WqVTFv3ryYM2dOrFy5Mvbs2dOs8+tW+OJ7+OGH4+DBg5MfmzZtmvafGRoaijlz5sTQ0NArvnbxxRfH9773vbjkkkuacS5AW2vkM/nAgQNx9dVXx549e2Lfvn1x6aWXxqpVq5p1et0KD99MHTp0KB588MH47ne/G3/729/iySefnPL19evXx+WXXx5nnHFGQRcC5HGyZ/Kll14an/jEJ2LOnDkxa9as+MxnPhN79uyJ/fv3F3hxBcP385//PPr6+mLNmjWxcuXKGB4eLvokgLRm8kx+7LHHYv78+TF37twWXvhKhYdv9erVMXv27MmPH/zgByf9/qGhobjmmmuiq6srrrvuurjvvvvi2LFjLboWoL0165n83HPPxfr16+Nb3/pWs06vW+Hh27p1axw4cGDy46abbnrV73322Wdj586dsXbt2oiIWLVqVYyOjsa2bdtadS5AW2vGM3lkZCRWrFgRN998c1x77bVNvb8ehYdvJn7yk5/ExMREXHXVVTF//vw4//zzY3R01NudAAWo55n84osvxooVK+Lqq6+Oz3/+8wVe+5Luog+YieHh4fjSl74U69atm/zcE088EWvWrIn9+/fH3Llz4+jRozExMRG1Wi2OHTsWo6Oj0dPTE52dlWo8QOlN90yeNWtWrFy5Mi677LK48847C7x0qo5arVYr6sUXLVoU+/bti66ursnPLV++PLZs2fKK7/3d734XS5cujWeffTbmzZs35Wv9/f3x6U9/OjZs2BBLly6N3/zmN1O+vnPnzli6dGlT/h0A2kWjn8lnn312fOxjH4szzzwzOjo6Jr/+l7/8JRYuXNi8f5FpFBo+AGg17/8BkErpwrdu3bopPy7n+MfL30MGoDXa8ZnsrU4AUind4gOAZhI+AFIRPgBSET4AUhE+AFKpXPgOHz4c4+PjRZ8BQFTzmVy58K1ataoU/9f1AESsWbMm/vSnPxV9xoxULnwvvPBCHD16tOgzAIj/PpOPHDlS9BkzUrnwAcDpED4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSqUz4Vq9eHT09PbFr165473vfG319ffHCCy8UfRZASgMDA9HT0xNPPvlkXHbZZXHWWWfF888/X/RZdalM+K688sqYNWtWRESMjY3FBRdcEPPmzSv4KoCcPvKRj0RPT0/UarUYGxuL8847L970pjcVfVZdOmq1Wq3oI+px9OjRWLBgQYyMjERvb2889NBDsWzZsqLPAkhpbGwsFi5cGP/85z+jt7c3HnzwwbjyyiuLPqsulVl8PT09cccdd0RExLnnnhuXX355wRcB5NXd3R1f//rXIyLijW98Y3z4wx8u+KL6VWbxRUQcO3YsZs+eHXfddVdcf/31RZ8DkNrY2FjMnj07vv3tb8eNN95Y9Dl1q1T4IiJqtVp0dHQUfQYAUc1ncuXCBwCnozL/Gx8ANILwAZCK8AGQivABkIrwAZCK8AGQivABkIrwAZBK6cO3dOnSeN3rXhdHjhyZ/NzOnTvjQx/6UJxzzjmxaNGi4o4DSOZEz+TBwcG46KKL4uyzz463vOUtMTg4WOCF0yt1+Pbu3RuPP/54dHR0xEMPPTT5+bPOOituuOGG0v+HC9BOXu2ZXKvVYnh4OF588cX41a9+FZs2bYqf/exnBV56cqX+kWVf/vKXY/v27bF48eJ4+umn45e//OWUrz/yyCNx4403xt69e4s5ECCR6Z7Jx91yyy1Rq9XiO9/5TosvrE+pF9/w8HCsXbs21q5dG9u3b499+/YVfRJAWvU8k2u1Wjz++OPR399fwIX1KW34fvvb38YzzzwTAwMD8e53vzsuuOCCuPfee4s+CyClep/JGzdujImJifj4xz9ewJX1KW34hoaGYsWKFfH6178+IiKuu+66GBoaKvgqgJzqeSZv2rQphoeHY9u2bfGa17ymiDPr0l30ASdy+PDhuP/++2N8fDzmz58fERFHjhyJAwcOxK5du+Liiy8u+EKAPOp5Jv/whz+MO++8Mx577LFYsGBBwRefXCnDt3Xr1ujq6ordu3dHT0/P5OcHBgZieHg4BgcH4+jRo3Hs2LGo1WoxOjoanZ2dU74XgMaY7pl8ySWXxG233RY7d+6M888/v8BL61PKP9V5xRVXRH9/f3zzm9+c8vn7778/brnllvjpT38ay5cvn/K1D37wg/Hoo4+28EqAHKZ7Jvf29sZzzz035e3N66+/PjZv3tzqU+tSyvABQLOU9g+3AEAzCB8AqaQI39jYWNEnAJTeyMhI3HXXXW3/zGz78E1MTMTvf//7+NSnPhX//ve/iz4HoJQeeOCBeOc73xl///vfo6Ojo+hzmqqUf52hkTo7O6O/vz/Gx8fjXe96V9x9992xbNmyos8CKIWRkZFYv359/PGPf4wtW7bEkiVLij6p6dp+8UVEvPa1r4277747Nm/eHDfccIP1BxAvrbzzzjsv/vCHP6SIXkSS8B13xRVXxO7duyfX3yOPPFL0SQAtNzIyEgMDA/HFL34xtmzZEoODg9Hb21v0WS2TKnwREeecc471B6SVdeW9XLrwHWf9AZlkX3kvlzZ8EdYfkIOVN1Xq8B1n/QHtyMo7MeH7f9Yf0E6svFcnfP/D+gOqzMqbnvCdgPUHVJGVVx/hOwnrD6gCK29mhG8a1h9QZlbezAlfnaw/oEysvFMnfDNg/QFlYOWdHuE7BdYfUAQrrzGE7xRZf0ArWXmNI3ynyfoDmsnKazzhawDrD2gGK685hK+BrD+gEay85hK+BrP+gNNh5TWf8DWJ9QfMhJXXOsLXRNYfUA8rr7WErwWsP+BErLxiCF+LWH/Ay1l5xRG+FrP+IDcrr3jCVwDrD3Ky8spB+Apk/UEOVl65CF/BrD9ob1Ze+QhfSVh/0F6svPISvhKx/qA9WHnlJnwlZP1BNVl51SB8JWX9QbVYedUhfCVn/UG5WXnVI3wVYP1BOVl51SR8FWL9QTlYedUmfBVj/UGxrLzqE76Ksv6gtay89iF8FWb9QWtYee1F+NqA9QfNYeW1J+FrE9YfNJaV176Er81Yf3B6rLz2J3xtyPqDU2Pl5SB8bcz6g/pYebkIX5uz/uDkrLx8hC8J6w+msvLyEr5ErD/4LysvN+FLyPojKyuPCOFLy/ojGyuP44QvOeuPdmfl8b+ED+uPtmXlcSLCxyTrj3Zh5XEywscU1h9VZ+UxHeHjhKw/qsbKo17Cx6uy/qgKK4+ZED6mZf1RVlYep0L4qIv1R9lYeZwq4WNGrD+KZuVxuoSPGbP+KIqVRyMIH6fM+qNVrDwaSfg4LdYfzWbl0WjCR0NYfzSalUezCB8NY/3RKFYezSR8NJz1x6my8mgF4aMprD9mysqjVYSPprL+mI6VR6sJH01n/fFqrDyKIHy0jPXHcVYeRRI+Wsr6w8qjaMJHIay/fKw8ykL4KIz1l4eVR5kIH4Wz/tqXlUcZCR+lYP21HyuPshI+SsX6qz4rj7ITPkrH+qsuK48qED5Ky/qrDiuPKhE+Ss36Kz8rj6oRPirB+isfK4+qEj4qw/orDyuPKhM+Ksf6K46VRzsQPirJ+ms9K492IXxUmvXXfFYe7Ub4qDzrr3msPNqR8NE2rL/GsfJoZ8JHW7H+Tp+VR7sTPtqS9TdzVh5ZCB9ty/qrn5VHJsJH27P+Xp2VR0bCRwrW3ytZeWQlfKRi/Vl5IHykk3n9WXkgfCSWaf1ZefAS4SO1DOvPyoOphA+iPdeflQcnJnzw/9pp/Vl58OqED/5HldeflQfTEz44gSquPysP6iN8cBLTrb9arVbIXS9/XSsPZkb4YBqvtv7uu+++ePvb3x5Hjhxp6T1f/epX4wMf+EBMTExYeXAKOmpF/VdWqKB//etf8dnPfja2b98e+/fvj4mJidi4cWPceuutLXn9559/Pt72trfFxMREXHjhhXH48OH40Y9+JHgwA8IHM1Sr1eI973lPPPXUUxERceaZZ8Y//vGPeMMb3tD01x4YGIhf/OIXMT4+Ht3d3bF79+648MILm/660E681Qkz9Otf/zqeeuqp6OrqioiIQ4cOxdq1a5v+ujt27IgHHnggxsfHJz/3uc99rumvC+2mu+gDoGqWLFkS9957b+zduzf++te/xhNPPBG7du1q+utu27Yt5s6dG4sXL46LLroo3vrWt8bixYub/rrQbrzVCUAq3uoEIBXhAyAV4YMW6uvrm/zo7OyM3t7eyV/fc889RZ8HKZQqfIsWLZryIOjr64sNGzac8Hu/9rWvTX7PGWecEV1dXZO/7u/vb/HlUJ+DBw9OfixcuDAefvjhyV+34k+GAiULX0RMeRAcPHgwNm3adMLvu+222ya/Z/PmzbFkyZLJX//5z39u8dVksHXr1rjjjjviP//5T9GnAKehdOGDstq+fXts3Lgx3vzmN8dXvvIVAYSKSvX3+EZHR+Pmm2+O/fv3F30KFbRr164YHx+PgwcPxsaNG+P222+Pe+65J6655pqiTwNmoHThW716dXR3v3TW4OBg3HTTTQ35vbu7u+Paa6+NQ4cONeT3I5fvf//78cwzz0RXV1d0dXXF+9///njf+95X9FnADJUufFu3bo1ly5Y15ffu7u6O5cuXN+X3pv3t2LEjduzYER/96Efj9ttvj3PPPbfok4BTULrwQVl94QtfiFtvvTUWLFhQ9CnAaRA+qNP8+fOLPgFogNKF76qrrpr8qfcREcuXL48tW7YUeBE0x969e4s+AVLyQ6oBSMXf4wMgldKHb926dVN+hNnxj3Xr1hV9GgAV5K1OAFIp/eIDgEYSPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBSET4AUhE+AFIRPgBS+T/RcRVhGeseiQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.DiGraph()\n", "G.graph['dpi'] = 120\n", "\n", "nodes = ['E_A1', 'E_A2', 'E_T', 'A1', 'A2', 'T']\n", "edges = [('E_A1','A1'), ('E_A2','A2'), ('E_T','T'), ('A1','T'), ('A2','T')]\n", "nodes_pos = {'E_A1':(-1, 2), 'E_A2':(1, 2), 'E_T':(-1, 0), 'A1':(-1, 1), 'A2':(1, 1), 'T':(0, 0)}\n", "nodes_lbl = {'E_A1':'E_A1', 'E_A2':'E_A2', 'E_T':'E_T', 'A1':'A1', 'A2':'A2', 'T':'T'}\n", "\n", "G.add_nodes_from(nodes)\n", "G.add_edges_from(edges)\n", "nx.draw(G,nodes_pos,node_size=800,node_color='white')\n", "_ = nx.draw_networkx_labels(G,nodes_pos,nodes_lbl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In model $\\mathcal{M}$, the probability distributions are specified as:\n", "- $P_{E_{A1}} = \\mathtt{Unif}(1,100)$\n", "- $P_{E_{A2}} = \\mathtt{Unif}(1,100)$\n", "- $P_{E_{T}} = p_T$\n", "\n", "where $\\mathtt{Unif}(1,100)$ is a uniform discrete distribution on $\\{1,2,...,100\\}$, and $p_T$ is a custom distribution.\n", "\n", "Moreover, the structural function are specified as:\n", "- $f_{A1}(E_{A1}) = E_{A1}$\n", "- $f_{A2}(E_{A2}) = E_{A2}$\n", "- $f_{T}(E_{A1},E_{A2},T) = p_T$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simplified SCM M0\n", "\n", "Performing a push-forward of the probability distributions from the exogenous nodes over the endogenous nodes, we can simplify the model and consider only the set of variables $\\mathcal{X}$. We can then represent the same model $\\mathcal{M}$ as:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAO70lEQVR4nO3dTYjV9R7H8e/YHR+oKCOioMDS2hiEtWgVFZTlpmmRZhlBUTsV2kWrsI0hNYVCIiU4ZJkrkYIEQ8mksQKRVgqFgUFCTG1qfGg8d2Fjo87DmfP0f/i+XnAX1y6HH3dxvvczb/X2NRqNRgBAEnOKfgAA9JLDB0AqDh8AqTh8AKTi8AGQisMHQCoOHwCpOHwApOLwAZCKwwdAKg4fAKk4fACk4vABkIrDB0AqDh8AqTh8AKTi8AGQisMHQCoOHwCpOHwApOLwAZCKwwdAKg4fAKk4fACk4vABkIrDB0AqpT98jzzySCxcuDDOnj176dcOHDgQjz76aNxwww2xaNGi4h4HkMxk38mbNm2Ke++9N66//vq48847Y9OmTQW+cGalPnwnT56MQ4cORV9fX+zdu/fSr1977bXx8ssvl/6/XIA6meo7udFoxNDQUPzxxx/x5ZdfxpYtW2LXrl0FvnR6fY1Go1H0I6ayYcOG2LdvXzz44INx4sSJ+Pzzzy/75/v3749XXnklTp48WcwDARKZ6Tt53Pr166PRaMTmzZt7/MLmlHrxDQ0NxZo1a2LNmjWxb9++OH36dNFPAkirme/kRqMRhw4diqVLlxbwwuaU9vB988038csvv8SqVavigQceiMWLF8cnn3xS9LMAUmr2O/nNN9+MCxcuxEsvvVTAK5tT2sO3Y8eOWL58edx8880REfH888/Hjh07Cn4VQE7NfCdv2bIlhoaG4osvvoh58+YV8cym/K/oB0xmdHQ0du/eHWNjY3HrrbdGRMTZs2fjzz//jGPHjsV9991X8AsB8mjmO3n79u2xcePG+Prrr+P2228v+MXTK+Xh27NnT1xzzTXx448/xty5cy/9+qpVq2JoaCg2bdoU586di/Pnz0ej0YgzZ87EnDlzLvvPAtAZM30n33///fHGG2/EgQMH4q677irwpc0p5e/qfPLJJ2Pp0qXxzjvvXPbru3fvjvXr18fHH38cjz/++GX/7OGHH46DBw/28JUAOcz0nbxgwYI4derUZT/efOGFF2Lr1q29fmpTSnn4AKBbSvubWwCgGxw+AFJx+ABIxeEDIBWHD4BUHD4AJlXX3/Rfy8N37ty5GBsbK/oZAJXVaDTi9ddfv+z/d68uann4fv/991ixYkWMjo4W/RSAShocHIyDBw9GX19f0U/puFoevttuuy1uuummeO2114p+CkDlDA8Px9tvvx2fffZZLf8qyFoevr6+vti2bVt89dVX8emnnxb9HIDKGBkZidWrV8e2bdti0aJFRT+nK2r9V5YdPXo0li9fHocPH4577rmn6OcAlFqj0YiBgYFYsmRJvPvuu0U/p2tqufjGLVu2LN56661YtWqV3gcwg8HBwTh9+nRs3Lix6Kd0Va0XX8TF/wXz3HPPxY033ljavykcoGjDw8MxMDAQR44cqe2POMfVevFF6H0AM8nQ9Saq/eIbp/cBXC1L15uo9otvnN4HcLUsXW+iNIsvQu8DmChT15sozeKL0PsAxmXrehOlWnzj9D4gs4xdb6JUi2+c3gdklrHrTZRy8UXofUBOWbveRCkXX4TeB+STuetNlHbxjdP7gAyyd72J0i6+cXofkEH2rjdR+sUXofcB9abrXS794ovQ+4D60vWuZvFNoPcBdaLrTc7im0DvA+pE15ucxXcFvQ+oA11vahbfFfQ+oOp0velZfFPQ+4Aq0vVmZvFNQe8DqkjXm5nFNw29D6gSXa85Ft809D6gKnS95ll8TdD7gDLT9WbH4muC3geUma43OxZfk/Q+oIx0vdmz+Jqk9wFlo+u1xuKbJb0PKANdr3UW3yzpfUAZ6Hqts/haoPcBRdL12mPxtUDvA4qi67XP4muD3gf0kq7XGRZfG/Q+oJd0vc6w+Nqk9wG9oOt1jsXXJr0P6DZdr7Msvg7R+4Bu0PU6z+LrEL0P6AZdr/Msvg7S+4BO0vW6w+LrIL0P6BRdr3ssvi7Q+4B26HrdZfF1gd4HtEPX6y6Lr0v0PqAVul73WXxdovcBs6Xr9YbF12V6H9AMXa93LL4u0/uAZuh6vWPx9YDeB0xH1+sti68H9D5gKrpe71l8PaT3ARPpesWw+HpI7wMm0vWKYfH1mN4HROh6RbL4ekzvA3S9Yll8BdH7ICddr3gWX0H0PshJ1yuexVcgvQ9y0fXKweIrkN4Heeh65WHxlYDeB/Wm65WLxVcCeh/Um65XLhZfSeh9UE+6XvlYfCWh90H96HrlZPGVjN4H9aDrlZfFVzJ6H9SDrldeFl8J6X1QbbpeuVl8JaT3QXXpeuVn8ZWY3gfVoutVg8VXYnofVIuuVw0WX8npfVANul51WHwlN7H37dq1q+jnAJPQ9arF4quIo0ePxhNPPBGHDx+Ou+++u+jnAP9qNBrx9NNPx+LFi3W9irD4KmLZsmWxYcOGWLlyZZw5c6bo5wD/eu+99+K3337T9SrE4quQ8d63cOHC+OCDD4p+DqR35MiReOqpp3S9irH4KmS89+3fv1/vg4KNjIzEs88+q+tVkMVXQXofFEvXqzaLr4L0PiiWrldtFl9F6X1QDF2v+iy+itL7oPd0vXqw+CpO74Pe0PXqw+KrOL0PekPXqw+Lrwb0PuguXa9eLL4a0Puge3S9+rH4akTvg87S9erJ4qsRvQ86S9erJ4uvZvQ+6Axdr74svprR+6B9ul69WXw1pfdBa3S9+rP4akrvg9boevVn8dWY3gezo+vlYPHVmN4HzdP18rD4EtD7YHq6Xi4WXwJ6H0xP18vF4ktC74PJ6Xr5WHxJ6H1wNV0vJ4svGb0PLtL18rL4ktH74CJdLy+LLyG9j+x0vdwsvoT0PjLT9bD4EtP7yEbXI8LiS03vIxtdjwiLLz29jyx0PcZZfMnpfWSg6zGRxUdE6H3Ul67HlSw+IkLvo750Pa5k8XGJ3kfd6HpMxuLjEr2POhkZGYnVq1frelzF4uMqeh9Vp+sxHYuPq+h9VJ2ux3QsPial91FVuh4zsfiYlN5HFfnzejTD4mNaeh9VoevRLIuPael9VIWuR7MsPmak91F2uh6zYfExI72PMtP1mC2Lj6bpfZSNrkcrLD6apvdRNroerbD4mBW9j7LQ9WiVxces6H2Uga5HOyw+WqL3URRdj3ZZfLRE76Mouh7tsvhomd5Hr+l6dILFR8v0PnpJ16NTLD7apvfRbboenWTx0Ta9j27T9egki4+O0PvoFl2PTrP46Ai9j27Q9egGi4+O0vvoFF2PbrH46Ci9j04ZHBzU9egKi4+O0/to1/DwcAwMDOh6dIXFR8fpfbRjZGQkVq9erevRNRYfXaP3MVuNRiMGBgZiyZIluh5dY/HRNXofszU4OBinT5/W9egqi4+u0vtolq5Hr1h8dJXeRzN0PXrJ4qMn9D6mouvRaxYfPaH3MRVdj16z+OgZvY8r6XoUweKjZ/Q+JtL1KIrFR8/pfeh6FMnio+f0PnQ9imTxUQi9Ly9dj6JZfBRC78tJ16MMLD4KpffloetRFhYfhdL78tD1KAuLj8LpffWn61EmFh+F0/vqTdejbCw+SkPvqx9djzKy+CgNva9+dD3KyOKjVPS++tD1KCuLj1LR++pB16PMLD5KSe+rLl2PsrP4KCW9r7p0PcrO4qO09L7q0fWoAouP0tL7qkXXoyosPkpP7ys/XY8qsfgoPb2v/HQ9qsTioxL0vvLS9agai49K0PvKSdejiiw+KkXvKw9dj6qy+KgUva88dD2qyuKjcvS+4ul6VJnFR+XofcXS9ag6i4/K0vt6T9ejDiw+Kkvv6z1djzqw+Kg0va93dD3qwuKj0vS+3tD1qBOLj1rQ+7pH16NuLD5qQe/rHl2PurH4qA29r/N0PerI4qM29L7O0vWoK4uP2tH72qfrUWcWH7Wj97VP16POLD5qSe9rna5H3Vl81JLe1xpdjwwsPmpN72uerkcWFh+1pvc1T9cjC4uP2tP7ZqbrkYnFR+3pfdPT9cjG4iMNve9quh4ZWXykofddTdcjI4uPVPS+/+h6ZGXxkYred5GuR2YWHyll7n26HtlZfKSUuffpemRn8ZFWxt6n64HFR2LZep+uBxdZfKSXoffpevAfi4/0MvQ+XQ/+Y/FB1Lv36XpwOYsPor69T9eDq1l8MEGdep+uB5Oz+GCCOvU+XQ8mZ/HBFerQ+3Q9mJrFB1eoeu/T9WB6Fh9MoYq9T9eDmVl8MIUq9j5dD2Zm8cE0qtT7dD1ojsUH06hK79P1oHkWHzShzL1P14PZsfigCWXufboezI7FB00qY+/T9WD2LD5oUtl6n64HrbH4YJbK0Pt0PWidxQezVIbep+tB6yw+aEGRvU/Xg/ZYfNCConqfrgfts/igDb3sfboedIbFB224svf99ddf8fPPP3fs8//+++/46aefIkLXg06x+KBN472v0WjE8PBwzJ8/P44fP96Rz966dWusXbs21q1bFzt37ozvvvvOjzihTf8r+gFQdX19ffHQQw/FunXrotFoRH9/f5w/fz76+/vb/uxvv/02xsbG4v33349ly5bFwoULO/BiyM2POqFNe/fujbVr18b4D0/6+/vjxIkTHfnsH374ISIurspjx47FypUrO/K5kJnDB21asWJFbNu2LW655ZaYN29ejI6Oxvfff9/25164cOHSj0znz58fL774Ynz00Udtfy5k5/BBm/r7++PVV1+NU6dOxebNm2Pu3LmxZ8+etj/3119/jbGxsXjmmWfi+PHjsX379rjjjjvafzAk5ze3QIf9888/ceHChZg7d27bnzU6OhoLFizowKuAcQ4fAKn4UScAqTh8AKTi8AGQisMHQCoOHwCpOHzQQ9ddd92lf82ZMycWLFhw6d/v3Lmz6OdBCv44AxRk0aJF8eGHH8Zjjz1W9FMgFYsPgFQcPgBScfgASMXhAyAVhw+AVBw+AFJx+ABIxZ/jAyAViw+AVBw+AFJx+ABIxeEDIBWHD4BUHD4AUnH4AEjF4QMgFYcPgFQcPgBScfgASMXhAyAVhw+AVBw+AFJx+ABIxeEDIBWHD4BUHD4AUnH4AEjF4QMgFYcPgFQcPgBScfgASMXhAyAVhw+AVBw+AFJx+ABI5f+FJfjOjvhKtgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.DiGraph()\n", "G.graph['dpi'] = 120\n", "\n", "nodes = ['A1', 'A2', 'T']\n", "edges = [('A1','T'), ('A2','T')]\n", "nodes_pos = {'A1':(-1, 1), 'A2':(1, 1), 'T':(0, 0)}\n", "nodes_lbl = {'A1':'A1', 'A2':'A2', 'T':'T'}\n", "\n", "G.add_nodes_from(nodes)\n", "G.add_edges_from(edges)\n", "nx.draw(G,nodes_pos,node_size=800,node_color='white')\n", "_ = nx.draw_networkx_labels(G,nodes_pos,nodes_lbl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consistently with [Rischel2021], we have:\n", "- $A1$ and $A2$ as random variables with distribution $\\mathtt{Unif}(1,100)$\n", "- $T$ as a random variable with a probability distribution specified by:\n", "\n", "$$\n", "\\begin{cases}\n", "P(T=n\\vert A{1}=100,A{2}=100)=\\frac{1}{Z_{1}}\\frac{1}{n^{2}}\\\\\n", "P(T=n\\vert A{1}=100,A{2}\\neq100)=\\frac{1}{Z_{2}}\\frac{1}{n^{3}}\\\\\n", "P(T=n\\vert A{1}\\neq100)=\\frac{1}{Z_{3}}\\frac{1}{100^{n}}\n", "\\end{cases}\n", "$$\n", "\n", "where $Z_1,Z_2,Z_3$ are normalizing constants." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation of M0\n", "\n", "We can now implement the model as a simple class with two methods:\n", "- *\\__init__()*: setting up the probability distributions of interest by computing normalizing constants and the distributions; notice that because of underflow the probability distribution *px3* has to be cut and manually set to zero.\n", "- *sample()*: returning a sample from the model." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class model0():\n", " def __init__(self):\n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " self.px1 = (1/Z1) / Ts**2\n", " self.px2 = (1/Z2) / Ts**3\n", " self.px3 = (1/Z3) / 100**Ts\n", " self.px3[np.isinf(self.px3)]=0\n", " self.px3[self.px3<5e-15]=0\n", " \n", " def sample(self):\n", " A1 = scipy.random.randint(1,101)\n", " A2 = scipy.random.randint(1,101)\n", " \n", " if(A1==100 and A2==100): \n", " sample = scipy.random.multinomial(1,self.px1)\n", " \n", " elif(A1==100):\n", " sample = scipy.random.multinomial(1,self.px2)\n", " \n", " else:\n", " sample = scipy.random.multinomial(1,self.px3)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M}$." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/2617224678.py:10: RuntimeWarning: divide by zero encountered in true_divide\n", " self.px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M0 = model0()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running M0\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████| 1000000/1000000 [00:11<00:00, 90177.92it/s]\n" ] } ], "source": [ "data0 = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data0[i,:] = M0.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We plot the distributions of $A1$, $A2$ and $T$." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'P(T)')" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(1,3, figsize=(14,4))\n", "\n", "ax[0].hist(data0[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0].set_title('P(A1)')\n", "\n", "ax[1].hist(data0[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1].set_title('P(A2)')\n", "\n", "ax[2].hist(data0[:,2],bins=np.array(list(range(11)))+1,density=True)\n", "ax[2].set_title('P(T)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As obvious, $A1$ and $A2$ are approximately uniformly distributed in the interval $[1,100]$. $P(T)$ is heavily skewed towards $0$ and we plot it only on the sub-domain $[1,10]$.\n", "\n", "We can also analyze the conditional distribution of $P(T \\vert A1=k)$ for all the values of $k$ in $[1,100]$." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(15,15))\n", "for i in range(1, 101):\n", " plt.subplot(10, 10, i)\n", " mask = (data0[:,0] == i)\n", " plt.hist(data0[mask,2],bins=np.array(list(range(101)))+1,density=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The graphs are sparse but show a similar distribution for almost all values of $k$ with the exception, as expected, of $k=100$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SCM M1\n", "\n", "Let's move on to consider an abstraction of $\\mathcal{M}$ obtained by suppressing the causal edge connecting $A2$ and $T$.\n", "\n", "Formally, the abstraction $(R,a,\\alpha)$ from $\\mathcal{M}$ to $\\mathcal{M'}$ is trivially:\n", "- $R={A1,A2,T}$: all variables are relevant;\n", "- $a$: maps a low-level varible to the high-level variable with the same name;\n", "- $\\alpha_X$: all the $\\alpha_X$ mappings are identities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simplified SCM M1\n", "\n", "The new abstracted model $\\mathcal{M'}$ is defined on the same nodes, but it has lost an edge. We can represent this new model as:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.DiGraph()\n", "G.graph['dpi'] = 120\n", "\n", "nodes = ['A1', 'A2', 'T']\n", "edges = [('A1','T')]\n", "nodes_pos = {'A1':(-1, 1), 'A2':(1, 1), 'T':(0, 0)}\n", "nodes_lbl = {'A1':'A1', 'A2':'A2', 'T':'T'}\n", "\n", "G.add_nodes_from(nodes)\n", "G.add_edges_from(edges)\n", "nx.draw(G,nodes_pos,node_size=800,node_color='white')\n", "_ = nx.draw_networkx_labels(G,nodes_pos,nodes_lbl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two random variable $A1$ and $A2$ still have the same distribution $\\mathtt{Unif}(1,100)$. However the distribution on the random variable of $T$ is modified so that $P_\\mathcal{M'}(T \\vert A1)$ is as close as possible to $P_\\mathcal{M}(T \\vert A1)$. \n", "\n", "Let's then express $P_\\mathcal{M'}(T \\vert A1)$. For $A1 \\neq 100$ we simply have:\n", "\n", "$$\n", "P(T=n\\vert A{1}\\neq100)=\\frac{1}{Z_{3}}\\frac{1}{100^{n}}.\n", "$$\n", "\n", "For $A1 = 100$ we have:\n", "\n", "$$\\begin{cases}\n", "P(T=n\\vert A{1}=100)=\\frac{1}{Z_{1}}\\frac{1}{n^{2}} & \\textrm{with probability 0.01}\\\\\n", "P(T=n\\vert A{1}=100)=\\frac{1}{Z_{2}}\\frac{1}{n^{3}} & \\textrm{with probability 0.99}\n", "\\end{cases}$$\n", "\n", "with a proper normalization.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation of M1\n", "\n", "We can now implement the model $\\mathcal{M'}$ as its own class. We still have two methods:\n", "- *\\__init__()*: setting up the probability distributions of interest; notice that we compute normalization constants, perform a mixture of distributions, and further normalize.\n", "- *sample()*: returning a sample from the model." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "class model1():\n", " def __init__(self):\n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " px1 = (1/Z1) / Ts**2\n", " px2 = (1/Z2) / Ts**3\n", " px = .01*px1 + .99*px2 \n", " self.px = px / np.sum(px)\n", " \n", " Z3 = np.sum((1./100)**Ts)\n", " self.px3 = (1/Z3) / 100**Ts\n", " self.px3[np.isinf(self.px3)]=0\n", " self.px3[self.px3<5e-15]=0\n", " \n", " def sample(self):\n", " A1 = scipy.random.randint(1,101)\n", " A2 = scipy.random.randint(1,101)\n", " \n", " if(A1==100): \n", " sample = scipy.random.multinomial(1,self.px)\n", " \n", " else:\n", " sample = scipy.random.multinomial(1,self.px3)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M'}$." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/2249347113.py:14: RuntimeWarning: divide by zero encountered in true_divide\n", " self.px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M1 = model1()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running M1\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████| 1000000/1000000 [00:11<00:00, 90896.32it/s]\n" ] } ], "source": [ "data1 = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data1[i,:] = M1.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now plot the distributions of $A1$, $A2$ and $T$ computed by $\\mathcal{M}$ and $\\mathcal{M'}$ side by side." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'M2: P(T)')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(2,3, figsize=(14,8))\n", "\n", "ax[0,0].hist(data0[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,0].set_title('M1: P(A1)')\n", "\n", "ax[0,1].hist(data0[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,1].set_title('M1: P(A2)')\n", "\n", "ax[0,2].hist(data0[:,2],bins=np.array(list(range(10)))+1,density=True)\n", "ax[0,2].set_title('M1: P(T)')\n", "\n", "ax[1,0].hist(data1[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,0].set_title('M2: P(A1)')\n", "\n", "ax[1,1].hist(data1[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,1].set_title('M2: P(A2)')\n", "\n", "ax[1,2].hist(data1[:,2],bins=np.array(list(range(10)))+1,density=True)\n", "ax[1,2].set_title('M2: P(T)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The distributions in the two models look similar; specifically $P(A1)$ and $P(A2)$ are in both case randomly uniform, while $P(T)$ is heavily skewed towards $1$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Models M0 and M1 under intervention\n", "\n", "When abstracting the model $\\mathcal{M}$ to $\\mathcal{M'}$ we are particularly interested in the (consistency of its) behavious under (specific) interventions [Rubenstein2017].\n", "\n", "In our case, we are specifically interested in the intervention $do(A1=100,A2=100)$ and in the ensuing interventional distribution:\n", "\n", "$$ P(T \\vert do(A1=100,A2=100)). $$\n", "\n", "Recall that, in general, *observational* and *interventional* distribution are not identitical. In other words, $P(T \\vert do(A1=100,A2=100)) \\neq P(T \\vert A1=100,A2=100)$. \n", "\n", "The intervention $do(A1=100,A2=100)$ is best understood as an intervention on model $\\mathcal{M}$ (or $\\mathcal{M'}$) leading to the definition of a new model $\\mathcal{M_\\iota}$ (or $\\mathcal{M'_\\iota}$). \n", "In the PSCM of $\\mathcal{M}$, the intervention $do(A1=100,A2=100)$ corresponds to setting the values of the endogenous variables $A1$ and $A2$ to $100$, and cutting the edge from $E_A1$ to $A1$ and the edge from $E_A2$ to $A2$. Graphically this corresponds to the new model $\\mathcal{M_\\iota}$:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAfE0lEQVR4nO3deVTVdeL/8Rfgmpq5pTZkuKWOlhdQwaVxySVr3I6pI6gpiHulWTm5ZO4kpam4gwgimGma+4JCkimKQjWjopY2WmbupYKg3N8fv4lvTqVowudy38/HOfwhkLwaz/k85315hy52u90uAAAM4Wr1AAAA8hPhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKJaGz8PDQ8WLF1fJkiVz3oYNG3bXfy4hIUEuLi6aPn36bz42YMAA1apVS66urlq6dGkerAYA5/Sgn8lHjx5Vp06dVKFCBZUtW1bt2rVTWlpaXs3PNctPfOvXr9fVq1dz3kJDQ+/6z0RGRqps2bKKjIz8zcfq16+vefPmycvLKy/mAoBTe5DP5MuXL6tjx45KS0vT2bNn1ahRI3Xq1Cmvpuea5eG7V9evX9eqVas0d+5cHTt2TMnJybd9fOjQoXr22WdVrFgxixYCgDnu9Exu1KiRAgMDVbZsWRUuXFgjRoxQWlqaLly4YOHiAhi+1atXq2TJkurWrZvatWunqKgoqycBgLHu5Zm8a9cuVapUSeXKlcvHhb9lefg6d+6sRx55JOdt8eLFd/z8yMhI9ejRQ25ubvLz81NsbKyysrLyaS0AOLe8eiafPn1aQ4cO1YwZM/Jqeq5ZHr61a9fq8uXLOW9BQUF/+LmnTp1SfHy8/P39JUmdOnVSRkaGNm7cmF9zAcCp5cUz+dy5c2rbtq2GDBminj175un+3LA8fPdi2bJlys7OVocOHVSpUiVVq1ZNGRkZvNwJABbIzTP50qVLatu2rTp27KgxY8ZYuPb/FLJ6wL2IiorS+PHjNWjQoJz37du3T926ddOFCxdUrlw5ZWZmKjs7W3a7XVlZWcrIyFCRIkXk6lqgGg8ADu9uz+TChQurXbt2atq0qYKDgy1cejsXu91ut+qLe3h46OzZs3Jzc8t5X5s2bbRmzZrffO7evXvVokULnTp1ShUqVLjtY3Xr1tXgwYM1bNgwtWjRQp9++ultH4+Pj1eLFi3y5N8BAJzFg34mlypVSn379tVDDz0kFxeXnI8fOnRIVapUybt/kbuwNHwAAOQ3Xv8DABjF4cI3aNCg235czi9vv34NGQCQP5zxmcxLnQAAozjciQ8AgLxE+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARiF8AACjED4AgFEIHwDAKIQPAGAUwgcAMArhAwAYhfABAIxC+AAARnH48LVo0UJlypTRjRs3ct4XHx+vli1bqnTp0vLw8LBuHAAY5veeySEhIapXr55KlSqlqlWrKiQkxMKFd+fQ4Tt58qQSExPl4uKidevW5by/RIkSCggIcPj/cQHAmfzRM9lutysqKkqXLl3Sli1bFBoaqhUrVli49M5c7Ha73eoRf2TixInaunWrfHx8dPToUW3YsOG2j8fFxal///46efKkNQMBwCB3eyb/4pVXXpHdbtecOXPyeWHuOPSJLyoqSv7+/vL399fWrVt19uxZqycBgLFy80y22+1KTExU3bp1LViY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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.DiGraph()\n", "G.graph['dpi'] = 120\n", "\n", "nodes = ['E_A1', 'E_A2', 'E_T', 'A1', 'A2', 'T']\n", "edges = [('E_T','T'), ('A1','T'), ('A2','T')]\n", "nodes_pos = {'E_A1':(-1, 2), 'E_A2':(1, 2), 'E_T':(-1, 0), 'A1':(-1, 1), 'A2':(1, 1), 'T':(0, 0)}\n", "nodes_lbl = {'E_A1':'E_A1', 'E_A2':'E_A2', 'E_T':'E_T', 'A1':'A1', 'A2':'A2', 'T':'T'}\n", "\n", "G.add_nodes_from(nodes)\n", "G.add_edges_from(edges)\n", "nx.draw(G,nodes_pos,node_size=800,node_color='white')\n", "_ = nx.draw_networkx_labels(G,nodes_pos,nodes_lbl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the simplified PSCM, after the pushforward of the probability distributions in $\\mathcal{M_\\iota}$, this trivially correspond to the model where the random variables $A1$ and $A2$ are set to $100$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation of intervened M0\n", "\n", "We now implement the model $\\mathcal{M}$ after the intervention $do(A1=100,A2=100)$. Notice that, while for computational reasons we could simplify and shorten the code, we opt for an implementation that follows the semantic of intervention more closely. That is, we keep exactly the same model, but in the *sample()* function we substitute the sampling of a uniform distribution with the fixed value of $100$.\n", "\n", "Because of the definition of the model $\\mathcal{M}$ we know the analytic formula for $P(T \\vert do(A1=100,A2=100))$ in $\\mathcal{M}$:\n", "\n", "$$ P_{\\mathcal{M}}(T \\vert do(A1=100,A2=100)) = \\frac{1}{Z_{1}}\\frac{1}{n^{2}} $$" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "class model0_do():\n", " def __init__(self):\n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " self.px1 = (1/Z1) / Ts**2\n", " self.px2 = (1/Z2) / Ts**3\n", " self.px3 = (1/Z3) / 100**Ts\n", " self.px3[np.isinf(self.px3)]=0\n", " self.px3[self.px3<5e-15]=0\n", " \n", " def sample(self):\n", " A1 = 100\n", " A2 = 100\n", " \n", " if(A1==100 and A2==100): \n", " sample = scipy.random.multinomial(1,self.px1)\n", " \n", " elif(A1==100):\n", " sample = scipy.random.multinomial(1,self.px2)\n", " \n", " else:\n", " sample = scipy.random.multinomial(1,self.px3)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M}_\\iota$." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/3399709989.py:10: RuntimeWarning: divide by zero encountered in true_divide\n", " self.px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M0_do = model0_do()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running of intervened M0\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████| 1000000/1000000 [00:07<00:00, 127678.00it/s]\n" ] } ], "source": [ "data0_do = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data0_do[i,:] = M0_do.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation of intervened M1\n", "\n", "In the same way we implement the model $\\mathcal{M'}$ after the intervention $do(A1=100,A2=100)$.\n", "\n", "Because of the definition of the model $\\mathcal{M'}$ we know the analytic formula for $P(T \\vert do(A1=100,A2=100))$ in $\\mathcal{M'}$:\n", "\n", "$$ P_{\\mathcal{M'}}(T \\vert do(A1=100,A2=100)) = \\frac{1}{Z} \\left[ 0.01\\frac{1}{Z_1}\\frac{1}{n^{2}} + 0.99\\frac{1}{Z_2}\\frac{1}{n^{3}} \\right] $$\n", "\n", "that is a mixture of the distribution $\\frac{1}{Z_{1}}\\frac{1}{n^{2}}$ (with weight $0.01$) and $\\frac{1}{Z_{2}}\\frac{1}{n^{3}}$ (with weight $0.99$)." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "class model1_do():\n", " def __init__(self):\n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " px1 = (1/Z1) / Ts**2\n", " px2 = (1/Z2) / Ts**3\n", " px = .01*px1 + .99*px2 \n", " self.px = px / np.sum(px)\n", " \n", " self.px3 = (1/Z3) / 100**Ts\n", " self.px3[np.isinf(self.px3)]=0\n", " self.px3[self.px3<5e-15]=0\n", " \n", " def sample(self):\n", " A1 = 100\n", " A2 = 100\n", " \n", " if(A1==100): \n", " sample = scipy.random.multinomial(1,self.px)\n", " \n", " else:\n", " sample = scipy.random.multinomial(1,self.px3)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M'}_\\iota$." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/3455843883.py:13: RuntimeWarning: divide by zero encountered in true_divide\n", " self.px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M1_do = model1_do()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running of intervened M1\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████| 1000000/1000000 [00:07<00:00, 128162.01it/s]\n" ] } ], "source": [ "data1_do = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data1_do[i,:] = M1_do.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparison of M0 and M1 under intervention\n", "\n", "Before moving to the formal computation of the abstraction error, we want to get an intuition of the difference between our models by plotting side by side distributions of interest, that is, $P(A1 \\vert do(A1=100,A2=100))$, $P(A1 \\vert do(A1=100,A2=100))$ and $P(T \\vert do(A1=100,A2=100))$, both in for $\\mathcal{M}_\\iota$ and $\\mathcal{M'}_\\iota$." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'M2: P(T|do(A1=100,A2=100))')" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(2,3, figsize=(14,8))\n", "\n", "ax[0,0].hist(data0_do[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,0].set_title('M1: P(A1|do(A1=100,A2=100))')\n", "\n", "ax[0,1].hist(data0_do[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,1].set_title('M1: P(A2|do(A1=100,A2=100))')\n", "\n", "ax[0,2].hist(data0_do[:,2],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,2].set_title('M1: P(T|do(A1=100,A2=100))')\n", "\n", "ax[1,0].hist(data1_do[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,0].set_title('M2: P(A1|do(A1=100,A2=100))')\n", "\n", "ax[1,1].hist(data1_do[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,1].set_title('M2: P(A2|do(A1=100,A2=100))')\n", "\n", "ax[1,2].hist(data1_do[:,2],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,2].set_title('M2: P(T|do(A1=100,A2=100))')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not surprisingly, $P(A1 \\vert do(A1=100,A2=100))$ and $P(A1 \\vert do(A1=100,A2=100))$ are trivially identical because both random variables $A1$ and $A2$ were intervened on in the same way in both models $\\mathcal{M}$ and $\\mathcal{M'}$.\n", "\n", "$P(T \\vert do(A1=100,A2=100))$, instead, shows a different distribution, which follows from the fact discussed above that:\n", "\n", "$$ P_{\\mathcal{M}}(T \\vert do(A1=100,A2=100)) \\neq P_{\\mathcal{M'}}(T \\vert do(A1=100,A2=100))$$\n", "\n", "This intuitively makes sense since intervening on $A2$ affects $\\mathcal{M}$ but not $\\mathcal{M'}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Evaluating abstraction error\n", "\n", "In order to evaluate properly our abstraction error we will now consider the intervention of interest and measure the distance between the interventional distributions generated by following the upper and lower path in the following diagram:\n", "\n", "$$\n", "\\begin{array}{ccc}\n", "\\mathcal{\\mathcal{M}}\\left[A1,A2\\right] & \\overset{\\mathcal{\\mathcal{M}}\\left[\\phi_{T}\\right]}{\\longrightarrow} & \\mathcal{\\mathcal{M}}\\left[T\\right]\\\\\n", "\\sideset{}{\\alpha_{A1,A2}}\\downarrow & & \\sideset{}{\\alpha_{T}}\\downarrow\\\\\n", "\\mathcal{\\mathcal{M}}'\\left[A1,A2\\right] & \\overset{\\mathcal{\\mathcal{M}}'\\left[\\phi_{T}\\right]}{\\longrightarrow} & \\mathcal{\\mathcal{M}}'\\left[T\\right]\n", "\\end{array}\n", "$$\n", " \n", "Notice that since $\\alpha_{A1,A2}$ and $\\alpha_{T}$ are identities, we will just compare the distance between the interventional distributions encoded by $\\mathcal{\\mathcal{M}}\\left[\\phi_{T}\\right]$ and $\\mathcal{\\mathcal{M'}}\\left[\\phi_{T}\\right]$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KL divergence\n", "\n", "We can quantitatively evaluate the difference between $ P_{\\mathcal{M}}(T \\vert do(A1=100,A2=100)) $ and $ P_{\\mathcal{M'}}(T \\vert do(A1=100,A2=100))$ computing the (empirical) KL divergence. To do this, we first compute the *empirical* distributions by simple binning:\n", "\n", "$$D_{KL}( \\hat{P}_{\\mathcal{M}}(T \\vert do) \\parallel \\hat{P}_{\\mathcal{M}'}(T \\vert do))$$\n", "\n", "where $D_{KL}$ is the KL divergence, $\\hat{P}$ is the empirical distribution, and $do$ is a shortening for $do(A1=100,A2=100)$.\n", "\n", "Notice that since some values of the empirical distribution of $\\mathcal{M'}$ we have to restrict the domain over which we compute the KL divergence." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.21759784431229037\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "p_M0 = plt.hist(data0_do[:,2],bins=np.array(list(range(101)))+1,density=True)[0]\n", "p_M1 = plt.hist(data1_do[:,2],bins=np.array(list(range(101)))+1,density=True)[0]\n", "\n", "domain = np.where(p_M1!=0)\n", "\n", "KL_M0_M1 = scipy.stats.entropy(p_M0[domain],p_M1[domain])\n", "print(KL_M0_M1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This nicely fit with the expected KL value of $0.22$ (see [Rischel2021])." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## JSD distance\n", "We also carry the same quantitative analysis of the distribution of interest using the JSD distance:\n", "\n", "$$D_{JSD}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}'}(T \\vert do))$$\n", "\n", "where now $D_{JSD}$ is the Jensen-Shannon distance." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.199117784122986\n" ] } ], "source": [ "JSD_M0_M1 = distance.jensenshannon(p_M0,p_M1)\n", "print(JSD_M0_M1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wasserstein distance\n", "Finally we consider the use of the Wasserstein distance:\n", "\n", "$$D_{W}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}'}(T \\vert do))$$\n", "\n", "where $D_{W}$ is the Wasserstein distance." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.004350320000000003\n" ] } ], "source": [ "WD_M0_M1 = stats.wasserstein_distance(p_M0,p_M1)\n", "print(WD_M0_M1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model M2\n", "\n", "We further abstract $\\mathcal{M'}$ by suppressing the causal edge connecting $A1$ and $T$. The new abstraction from $\\mathcal{M'}$ to $\\mathcal{M''}$ is also trivial defined by a new tuple $(R,a,\\alpha)$ where:\n", "- $R={A1,A2,T}$: all variables are relevant;\n", "- $a$: maps a low-level varible to the high-level variable with the same name;\n", "- $\\alpha_X$: all the $\\alpha_X$ mappings are identities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SCM M2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Simplified SCM M2\n", "\n", "The new abstracted model $\\mathcal{M''}$ is defined on the same nodes, but it has no edge. We can represent this new model as:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAG/klEQVR4nO3dv0uVCxzH8a+nSyElETQ0OJiNBoINjRVU9Bc4ZEvi7B/QFE3BwUmHhgg8VIRTREFCoGT/QLQ1GbQ02VYm9tzpCsK96PCc1Pt5veAM53kO5/s905vncH4MNE3TFACE6Bz0AgDwJwkfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQpW/hu3r1ap05c6Y2Nzd3jq2srNS1a9fq9OnTNTIy0q/RABxy/9aIbrdbFy9erKGhoTp//nx1u92+zO5L+NbX12ttba0GBgbq1atXO8dPnjxZ09PTfXsxABx+/9WIpmmq1+vVxsZGvX37thYWFurFixetzx/oxx/RPnjwoJaXl+vy5cv1+fPnev369a7z7969q5mZmVpfX297NACH3F6N+Mfs7Gw1TVPz8/Otzu/LFV+v16upqamampqq5eXl+vbtWz/GAHAE7acRTdPU2tpajY2NtT6/9fB9+PChvnz5UpOTk3Xp0qW6cOFCPX/+vO0xABxB+23E/fv36/fv33X37t3Wd2g9fIuLi3Xz5s06e/ZsVVXdvn27FhcX2x4DwBG0n0YsLCxUr9erN2/e1IkTJ1rf4a82n+zHjx+1tLRU29vbde7cuaqq2tzcrO/fv9fHjx9rfHy8zXEAHCH7acSTJ0/q4cOH9f79+xoeHu7LHq2G7+XLl3Xs2LH69OlTHT9+fOf45ORk9Xq96na79evXr9ra2qqmaernz5/V6XR2PRaA/6e9GjExMVH37t2rlZWVGh0d7dserX6q89atWzU2NlZzc3O7ji8tLdXs7Gw9ffq0bty4sevclStXanV1ta0VADik9mrE4OBgff36ddfbm3fu3KlHjx61ukdfvs4AAIeVnywDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AoggfAFGED4AowgdAFOEDIIrwARBF+ACIInwARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPviDTp06tXPrdDo1ODi4c//Zs2cHvR5EGGiapjnoJSDRyMhIPX78uK5fv37Qq0AUV3wARBE+AKIIHwBRhA+AKMIHQBThAyCK8AEQxff4AIjiig+AKMIHQBThAyCK8AEQRfgAiCJ8AEQRPgCiCB8AUYQPgCjCB0AU4QMgivABEEX4AIgifABEET4AovwNbDUNzeLabm4AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.DiGraph()\n", "G.graph['dpi'] = 120\n", "\n", "nodes = ['A1', 'A2', 'T']\n", "edges = []\n", "nodes_pos = {'A1':(-1, 1), 'A2':(1, 1), 'T':(0, 0)}\n", "nodes_lbl = {'A1':'A1', 'A2':'A2', 'T':'T'}\n", "\n", "G.add_nodes_from(nodes)\n", "G.add_edges_from(edges)\n", "nx.draw(G,nodes_pos,node_size=800,node_color='white')\n", "_ = nx.draw_networkx_labels(G,nodes_pos,nodes_lbl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two random variable $A1$ and $A2$ keep the same distribution $\\mathtt{Unif}(1,100)$. Instead we modify the distribution on the random variable of $T$ so that $P_\\mathcal{M''}(T)$ is as close as possible to $P_\\mathcal{M'}(T)$. \n", "\n", "Let's then express $P_\\mathcal{M'}(T)$: For $A1 \\neq 100$ we simply have:\n", "\n", "$$\n", "P(T=n)= \\frac{1}{100}\\frac{1}{100} \\left[ \\frac{1}{Z_{1}}\\frac{1}{n^{2}} \\right] +\n", " \\frac{1}{100}\\frac{99}{100} \\left[ \\frac{1}{Z_{2}}\\frac{1}{n^{3}} \\right] + \n", " \\frac{99}{100} \\left[ \\frac{1}{Z_{3}}\\frac{1}{100^{n}} \\right]\n", "$$\n", "\n", "with a proper normalization.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation M2\n", "\n", "We can now implement the model $\\mathcal{M''}$ as its own class. We still have two methods:\n", "- *\\__init__()*: setting up the probability distributions of interest.\n", "- *sample()*: returning a sample from the model." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "class model2():\n", " def __init__(self):\n", " \n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " px1 = (1/Z1) / Ts**2\n", " px2 = (1/Z2) / Ts**3\n", " px3 = (1/Z3) / 100**Ts\n", " px3[np.isinf(px3)]=0\n", " px3[px3<5e-15]=0\n", " \n", " px = .01*.01*px1 + .01*.99*px2 + .99*px3 \n", " self.px = px / np.sum(px)\n", " \n", " def sample(self):\n", " A1 = scipy.random.randint(1,101)\n", " A2 = scipy.random.randint(1,101)\n", " \n", " sample = scipy.random.multinomial(1,self.px)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M''}$." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/1897159575.py:11: RuntimeWarning: divide by zero encountered in true_divide\n", " px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M2 = model2()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running M2\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████| 1000000/1000000 [00:10<00:00, 92428.88it/s]\n" ] } ], "source": [ "data2 = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data2[i,:] = M2.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now plot the distributions of $A1$, $A2$ and $T$ computed by $\\mathcal{M}$, $\\mathcal{M'}$, $\\mathcal{M''}$ side by side." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'M3: P(T)')" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(3,3, figsize=(14,8))\n", "\n", "ax[0,0].hist(data0[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,0].set_title('M1: P(A1)')\n", "\n", "ax[0,1].hist(data0[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,1].set_title('M1: P(A2)')\n", "\n", "ax[0,2].hist(data0[:,2],bins=np.array(list(range(10)))+1,density=True)\n", "ax[0,2].set_title('M1: P(T)')\n", "\n", "ax[1,0].hist(data1[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,0].set_title('M2: P(A1)')\n", "\n", "ax[1,1].hist(data1[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,1].set_title('M2: P(A2)')\n", "\n", "ax[1,2].hist(data1[:,2],bins=np.array(list(range(10)))+1,density=True)\n", "ax[1,2].set_title('M2: P(T)')\n", "\n", "ax[2,0].hist(data2[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[2,0].set_title('M3: P(A1)')\n", "\n", "ax[2,1].hist(data2[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[2,1].set_title('M3: P(A2)')\n", "\n", "ax[2,2].hist(data2[:,2],bins=np.array(list(range(10)))+1,density=True)\n", "ax[2,2].set_title('M3: P(T)')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, the distributions in the two models look similar: $P(A1)$ and $P(A2)$ are in both case uniformly random, while $P(T)$ is heavily skewed towards $1$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model M2 under intervention" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Implementation of intervened M2\n", "We now consider the usual intervention $do(A1=100,A2=100)$ for model $\\mathcal{M''}$ too.\n", "\n", "Because of the graph of the model $\\mathcal{M''}$ we know that the distribution of $T$ is independent from $A1$ and $A2$; so, under the above intervention, we will still have:\n", "\n", "$$\n", "P_{\\mathcal{M''}}(T \\vert do(A1=100,A2=100))= \n", " \\frac{1}{100}\\frac{1}{100} \\left[ \\frac{1}{Z_{1}}\\frac{1}{n^{2}} \\right] +\n", " \\frac{1}{100}\\frac{99}{100} \\left[ \\frac{1}{Z_{2}}\\frac{1}{n^{3}} \\right] + \n", " \\frac{99}{100} \\left[ \\frac{1}{Z_{3}}\\frac{1}{100^{n}} \\right].\n", "$$\n", "\n", "We always implement the intervened model by simply hard-coding the setting of $A1$ and $A2$ to $100$." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "class model2_do():\n", " def __init__(self):\n", " \n", " Ts = np.array(list(range(100)))+1\n", " Z1 = np.sum((1./Ts)**2)\n", " Z2 = np.sum((1./Ts)**3)\n", " Z3 = np.sum((1./100)**Ts)\n", " \n", " px1 = (1/Z1) / Ts**2\n", " px2 = (1/Z2) / Ts**3\n", " px3 = (1/Z3) / 100**Ts\n", " px3[np.isinf(px3)]=0\n", " px3[px3<5e-15]=0\n", " \n", " px = .01*.01*px1 + .01*.99*px2 + .99*px3 \n", " self.px = px / np.sum(px)\n", " \n", " def sample(self):\n", " A1 = 100\n", " A2 = 100\n", " \n", " sample = scipy.random.multinomial(1,self.px)\n", " \n", " return A1, A2, np.where(sample==1)[0][0] + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We instantiate model $\\mathcal{M''}_\\iota$." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/26/t485z2v13gxcnm9hq0qjdj9h0000gn/T/ipykernel_3318/170723240.py:11: RuntimeWarning: divide by zero encountered in true_divide\n", " px3 = (1/Z3) / 100**Ts\n" ] } ], "source": [ "M2_do = model2_do()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running intervened M2\n", "\n", "To examine the model we run a Monte Carlo-like simulation collecting $10^6$ samples." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|█████████████████████████████| 1000000/1000000 [00:07<00:00, 125059.37it/s]\n" ] } ], "source": [ "data2_do = np.zeros((n_samples,3))\n", "\n", "for i in tqdm(range(n_samples)):\n", " data2_do[i,:] = M2_do.sample()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparison of M0, M1 and M2 under intervention\n", "\n", "As before, let us get an intuition of how the distributions are behaving by plotting side by side the distributions of interest, that is, $P(A1 \\vert do(A1=100,A2=100))$, $P(A1 \\vert do(A1=100,A2=100))$ and $P(T \\vert do(A1=100,A2=100))$, for $\\mathcal{M}_\\iota$, $\\mathcal{M'}_\\iota$ and $\\mathcal{M''}_\\iota$." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'M3: P(T|do(A1=100,A2=100))')" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig,ax = plt.subplots(3,3, figsize=(14,8))\n", "\n", "ax[0,0].hist(data0_do[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,0].set_title('M1: P(A1|do(A1=100,A2=100))')\n", "\n", "ax[0,1].hist(data0_do[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,1].set_title('M1: P(A2|do(A1=100,A2=100))')\n", "\n", "ax[0,2].hist(data0_do[:,2],bins=np.array(list(range(101)))+1,density=True)\n", "ax[0,2].set_title('M1: P(T|do(A1=100,A2=100))')\n", "\n", "ax[1,0].hist(data1_do[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,0].set_title('M2: P(A1|do(A1=100,A2=100))')\n", "\n", "ax[1,1].hist(data1_do[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,1].set_title('M2: P(A2|do(A1=100,A2=100))')\n", "\n", "ax[1,2].hist(data1_do[:,2],bins=np.array(list(range(101)))+1,density=True)\n", "ax[1,2].set_title('M2: P(T|do(A1=100,A2=100))')\n", "\n", "ax[2,0].hist(data2_do[:,0],bins=np.array(list(range(101)))+1,density=True)\n", "ax[2,0].set_title('M3: P(A1|do(A1=100,A2=100))')\n", "\n", "ax[2,1].hist(data2_do[:,1],bins=np.array(list(range(101)))+1,density=True)\n", "ax[2,1].set_title('M3: P(A2|do(A1=100,A2=100))')\n", "\n", "ax[2,2].hist(data2_do[:,2],bins=np.array(list(range(101)))+1,density=True)\n", "ax[2,2].set_title('M3: P(T|do(A1=100,A2=100))')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As before, $P(A1 \\vert do(A1=100,A2=100))$ and $P(A1 \\vert do(A1=100,A2=100))$ are trivially identical for all models.\n", "\n", "$P(T \\vert do(A1=100,A2=100))$, instead, shows a different distribution." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Evaluating abstraction error\n", "\n", "Exactly as before we will evaluate distances along the upper and lower path of the following diagram:\n", "\n", "$$\n", "\\begin{array}{ccc}\n", "\\mathcal{\\mathcal{M}}\\left[A1,A2\\right] & \\overset{\\mathcal{\\mathcal{M}}\\left[\\phi_{T}\\right]}{\\longrightarrow} & \\mathcal{\\mathcal{M}}\\left[T\\right]\\\\\n", "\\sideset{}{\\alpha_{A1,A2}}\\downarrow & & \\sideset{}{\\alpha_{T}}\\downarrow\\\\\n", "\\mathcal{\\mathcal{M}}'\\left[A1,A2\\right] & \\overset{\\mathcal{\\mathcal{M}}'\\left[\\phi_{T}\\right]}{\\longrightarrow} & \\mathcal{\\mathcal{M}}'\\left[T\\right]\n", "\\end{array}\n", "$$\n", " \n", "with the knowledge that $\\alpha_{A1,A2}$ and $\\alpha_{T}$ are identities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KL divergence\n", "\n", "We can now quantitatively evaluate the difference between $ P_{\\mathcal{M}}(T \\vert do(A1=100,A2=100)) $, $P_{\\mathcal{M'}}(T \\vert do(A1=100,A2=100))$ and $P_{\\mathcal{M''}}(T \\vert do(A1=100,A2=100))$ computing the (empirical) KL divergence.\n", "Let us first compute the *empirical* distributions for $\\mathcal{M''}$ and compute the KL divergence from $\\mathcal{M'}$ to $\\mathcal{M''}$:\n", "\n", "$$D_{KL}( \\hat{P}_{\\mathcal{M'}}(T \\vert do) \\parallel \\hat{P}_{\\mathcal{M}''}(T \\vert do)).$$" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.38111891699109246\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "p_M2 = plt.hist(data2_do[:,2],bins=np.array(list(range(101)))+1,density=True)[0]\n", "\n", "domain = np.where(p_M2!=0)\n", "\n", "KL_M1_M2 = scipy.stats.entropy(p_M1[domain],p_M2[domain])\n", "print(KL_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, the KL divergence we compute is very close to the value of $0.39$ in [Rischel2021]." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## JSD distance\n", "We now repeat the above analysis for the JSD distance using the empirical distributions estimated above. We first compute the distance between $\\mathcal{M}'$ and $\\mathcal{M}''$:\n", "\n", "$$D_{JSD}( \\hat{P}_{\\mathcal{M'}}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.2151218853041973\n" ] } ], "source": [ "JSD_M1_M2 = distance.jensenshannon(p_M1,p_M2)\n", "print(JSD_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wasserstein distance\n", "Last we conduct the comparison using the Wasserstein distance. We start by computing the distance between $\\mathcal{M}'$ and $\\mathcal{M}''$:\n", "\n", "$$D_{W}( \\hat{P}_{\\mathcal{M}'}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0031672200000000027\n" ] } ], "source": [ "WD_M1_M2 = stats.wasserstein_distance(p_M1,p_M2)\n", "print(WD_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Evaluating composed abstraction\n", "\n", "Now that we have computed the abstraction errors $e_1$ from $\\mathcal{M}$ to $\\mathcal{M'}$ and $e_2$ from $\\mathcal{M'}$ to $\\mathcal{M''}$, we can compare the sum of these distances with the direct distance $e_0$ from $\\mathcal{M}$ to $\\mathcal{M''}$, and verify if $e_1 + e_2$ provides a bound for $e_0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## KL distance\n", "\n", "Let us start with KL distance. We can assess the composed KL divergence as:\n", "\n", "$$D_{KL}( \\hat{P}_{\\mathcal{M}}(T \\vert do) \\parallel \\hat{P}_{\\mathcal{M}'}(T \\vert do))+\n", "D_{KL}( \\hat{P}_{\\mathcal{M'}}(T \\vert do) \\parallel \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5987167613033828\n" ] } ], "source": [ "print(KL_M0_M1 + KL_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And try to compare it with the KL divergence from $\\mathcal{M}$ directly to $\\mathcal{M''}$:\n", "\n", "$$\n", "D_{KL}( \\hat{P}_{\\mathcal{M}}(T \\vert do) \\parallel \\hat{P}_{\\mathcal{M}''}(T \\vert do))\n", "$$" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.4205480999102162\n" ] } ], "source": [ "KL_M0_M2 = scipy.stats.entropy(p_M0[domain],p_M2[domain])\n", "print(KL_M0_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This value is also close to the value of $1.52$ computed in [Rischel2021], and indeed it confirms that KL divergences do not compose to provide an upper bound for the distance between distributions of interest in different models, that is:\n", "\n", "$$ D_{KL}( P_{\\mathcal{M}}(T \\vert do) \\parallel P_{\\mathcal{M}''}(T \\vert do)) > \n", " D_{KL}( P_{\\mathcal{M}}(T \\vert do) \\parallel P_{\\mathcal{M}'}(T \\vert do)) + \n", " D_{KL}( P_{\\mathcal{M}'}(T \\vert do) \\parallel P_{\\mathcal{M}''}(T \\vert do)).$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## JSD distance\n", "\n", "We can now evaluate the composed distance using JSD distance from $\\mathcal{M}$ to $\\mathcal{M}''$:\n", "\n", "$$D_{JSD}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}'}(T \\vert do))+\n", "D_{JSD}( \\hat{P}_{\\mathcal{M}'}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.41423966942718327\n" ] } ], "source": [ "print(JSD_M0_M1 + JSD_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And then compute directly the JSD distance from $\\mathcal{M}$ to $\\mathcal{M}''$:\n", "\n", "$$D_{JSD}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.37158968973860923\n" ] } ], "source": [ "JSD_M0_M2 = distance.jensenshannon(p_M0,p_M2)\n", "print(JSD_M0_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case composition seems to hold in the sense that we can estimate an upper bound on the error (wrt to the distribution of interest) of the direct abstraction (from $\\mathcal{M}$ to $\\mathcal{M}''$) through the composition of the error of intermediate abstractions:\n", "\n", "$$ D_{JSD}( P_{\\mathcal{M}}(T \\vert do), P_{\\mathcal{M}''}(T \\vert do)) \\leq \n", " D_{JSD}( P_{\\mathcal{M}}(T \\vert do), P_{\\mathcal{M}'}(T \\vert do)) + \n", " D_{JSD}( P_{\\mathcal{M}'}(T \\vert do), P_{\\mathcal{M}''}(T \\vert do)).$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wasserstein distance\n", "\n", "Finally we evaluate the composed Wasserstein distance from $\\mathcal{M}$ to $\\mathcal{M}''$:\n", "\n", "$$D_{W}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}'}(T \\vert do))+\n", "D_{W}( \\hat{P}_{\\mathcal{M}'}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.007517540000000006\n" ] } ], "source": [ "print(WD_M0_M1+WD_M1_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And compare to the Wasserstein distance from $\\mathcal{M}$ to $\\mathcal{M}''$:\n", "\n", "$$D_{W}( \\hat{P}_{\\mathcal{M}}(T \\vert do), \\hat{P}_{\\mathcal{M}''}(T \\vert do))$$" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.007517540000000006\n" ] } ], "source": [ "WD_M0_M2 = stats.wasserstein_distance(p_M0,p_M2)\n", "print(WD_M0_M2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Interestingly, the two distance are equivalent, thus actually satisfying our requirement of bound on the error:\n", "\n", "$$ D_{W}( P_{\\mathcal{M}}(T \\vert do), P_{\\mathcal{M}''}(T \\vert do)) \\leq \n", " D_{W}( P_{\\mathcal{M}}(T \\vert do), P_{\\mathcal{M}'}(T \\vert do)) + \n", " D_{W}( P_{\\mathcal{M}'}(T \\vert do), P_{\\mathcal{M}''}(T \\vert do)).$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Theoretical Considerations\n", "\n", "We have measured the *abstraction error* between SCM models as a *statistical distance* wrt to a interventional distirbution of interest $P(T\\vert do)$. Our desideratum was to have a property of consistent composition between *abstraction errors*.\n", "\n", "As explained in Section 2.4 of [Rischel2021], the critical requirement to have the property we desire is the existence of a bound on the composition of distances of the following form: given a distance $D$, $\\forall p_1, p_2, p_3$ we want $D(p_1,p_3)^t \\leq D(p_1,p_2)^t + D(p_2,p_3)^t$.\n", "\n", "A specific case of this property for $t=1$ is the *triangle inequality*. All proper metrics (like JSD or Wasserstein) satisfy this requirement, but not the KL distance. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bibliography\n", "\n", "[Rischel2021] Rischel, Eigil F., and Sebastian Weichwald. \"Compositional Abstraction Error and a Category of Causal Models.\" arXiv preprint arXiv:2103.15758 (2021).\n", "\n", "[Rischel2020] Rischel, Eigil Fjeldgren. \"The Category Theory of Causal Models.\" (2020).\n", "\n", "[Rubenstein2017] Rubenstein, Paul K., et al. \"Causal consistency of structural equation models.\" arXiv preprint arXiv:1707.00819 (2017).\n", "\n", "[Pearl2009] Pearl, Judea. Causality. Cambridge university press, 2009.\n", "\n", "[Peters2017] Peters, Jonas, Dominik Janzing, and Bernhard Schölkopf. Elements of causal inference: foundations and learning algorithms. The MIT Press, 2017.\n", "\n", "[Spivak2014] Spivak, David I. Category theory for the sciences. MIT Press, 2014.\n", "\n", "[Fong2018] Fong, Brendan, and David I. Spivak. \"Seven sketches in compositionality: An invitation to applied category theory.\" arXiv preprint arXiv:1803.05316 (2018)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(**TODO**: work more on the theoretical justifications for different metrics.)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.10" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "284px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }