{ "cells": [ { "cell_type": "markdown", "id": "d88ea68e", "metadata": {}, "source": [ "# Conditional dependence\n", "\n", "Patterns of inference as evidence changes\n" ] }, { "cell_type": "code", "execution_count": null, "id": "377da5df", "metadata": {}, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "from memo import memo\n", "from memo import domain as product\n", "from enum import IntEnum\n", "from matplotlib import pyplot as plt" ] }, { "cell_type": "markdown", "id": "c1af31c1", "metadata": {}, "source": [ "In the [previous chapter](conditioning.qmd), we saw that two variables can be statistically dependent—knowing one changes what we should believe about the other. But dependence is not a fixed property. It can appear or disappear depending on what else we know. Two variables that are dependent can become independent once we learn the value of a third variable (_screening off_), and two variables that are independent can become dependent once we learn something else (_explaining away_). These shifts are determined by the causal structure connecting the variables. This chapter introduces the basic causal motifs—fork, pipe, collider, and descendent—and shows how each one governs the way dependence changes with evidence.\n" ] }, { "cell_type": "markdown", "id": "c0925970", "metadata": {}, "source": [ "### The Fork\n", "\n", "![](generated/conditional-dependence/fork.png)\n", "\n", "$Z$ is a “common cause” of $A$ and $B$\n", "\n", "- $A$ and $B$ are associated: $A \\not\\perp B$\n", "- Share a common cause $Z$\n", "- Once stratified by $Z$ (conditioned on $Z$), no association: $A \\perp B \\mid Z$\n" ] }, { "cell_type": "markdown", "id": "0f541d45", "metadata": {}, "source": [ "### The Pipe\n", "\n", "![](generated/conditional-dependence/pipe.png)\n", "\n", "$Z$ is a “mediator” of $A$ and $B$\n", "\n", "- $A$ and $B$ are associated: $A \\not\\perp B$\n", "- Influence of $A$ on $B$ transmitted through $Z$\n", "- Once stratified by $Z$, no association: $A \\perp B \\mid Z$\n" ] }, { "cell_type": "markdown", "id": "7cc60697", "metadata": {}, "source": [ "### The Collider (Immorality)\n", "\n", "![](generated/conditional-dependence/collider.png)\n", "\n", "$Z$ is a “collider” of $A$ and $B$\n", "\n", "- $A$ and $B$ are not associated (no shared causes): $A \\perp B$\n", "- $A$ and $B$ both influence $Z$\n", "- Once stratified by $Z$, $A$ and $B$ are associated: $A \\not\\perp B \\mid Z$\n" ] }, { "cell_type": "markdown", "id": "4ada1888", "metadata": {}, "source": [ "### The Descendent\n", "\n", "![](generated/conditional-dependence/descendent.png)\n", "\n", "$C$ is a “descendent”\n", "\n", "- $A$ and $B$ are causally associated through $Z$: $A \\not\\perp B$\n", "- $C$ carries information about $Z$\n", "- Conditioning on $C$ partially screens off $A$ from $B$, since $C$ provides indirect evidence about $Z$\n" ] }, { "cell_type": "markdown", "id": "79fa801c", "metadata": {}, "source": [ "### Conditional independence\n", "\n", "Recall the definition of [(in)dependence](conditioning.qmd#defining-statistical-independence). We define _conditional_ (in)dependence in effectively the same way, just conditioning everything on a new random variable, $Z$. So whereas (marginal) independence is defined as ${ A \\perp B \\iff P(A, \\, B) = P(A) \\; P(B) }$, _conditional_ independence is defined as:\n", "\n", "$$\n", "A \\perp B \\mid Z \\iff P(A, \\, B \\mid Z) = P(A \\mid Z) \\; P(B \\mid Z) \\\\\n", "\\text{where}~~~ P(Z) > 0 \\\\\n", "\\forall~ (a, b, z) \\in \\{ \\mathcal{A} \\times \\mathcal{B} \\times \\mathcal{Z} \\}\n", "$$\n", "\n", "And in the same way as we saw for marginal independence,\n", "\n", "$$\n", "A \\perp B \\mid Z ~~\\iff~~ P(A \\mid B, \\, Z) = P(A \\mid Z)\n", "$$\n", "\n", "**Exercise:** Show that, if ${A \\perp B \\mid Z}$, then ${P(B \\mid A, \\, Z) = P(B \\mid Z)}$. _Hint_: Follow the chain rule.\n" ] }, { "cell_type": "markdown", "id": "2491addf", "metadata": {}, "source": [ "# From _A Priori_ Dependence to Conditional Dependence\n", "\n", "The relationships between causal structure and statistical dependence become particularly interesting and subtle when we look at the effects of additional observations or assumptions. Events that are statistically dependent _a priori_ may become independent when we condition on some observation; this is called _screening off_. Also, events that are statistically independent _a priori_ may become dependent when we condition on observations; this is known as _explaining away_. The dynamics of screening off and explaining away are extremely important for understanding patterns of inference—reasoning and learning—in probabilistic models.\n" ] }, { "cell_type": "markdown", "id": "95aa7609", "metadata": {}, "source": [ "## Screening off\n", "\n", "_Screening off_ refers to a pattern of statistical inference that is quite common in both scientific and intuitive reasoning. If the statistical dependence between two events $A$ and $B$ is only indirect, mediated strictly by one or more other events $Z$, then conditioning on (observing) $Z$ should render $A$ and $B$ statistically independent. This can occur if $A$ and $B$ are connected by one or more causal chains, and all such chains run through the set of events $Z$, or if $Z$ comprises all of the common causes of $A$ and $B$.\n" ] }, { "attachments": { "generated/conditional-dependence/fork1.png": { "image/png": "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\n" } }, "cell_type": "markdown", "id": "35760b6d", "metadata": {}, "source": [ "### Fork\n", "\n", "For instance, let’s look at a common cause example (a _“fork”_). Here, $A$ and $B$ are associated (${A \\not\\perp B}$). We can determine this by observing that ${ P(A \\mid B{=}\\mathtt{true}) \\neq P(A \\mid B{=}\\mathtt{false}) }$.\n", "\n", "![](attachment:generated/conditional-dependence/fork1.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "264e1552", "metadata": {}, "outputs": [], "source": [ "class A(IntEnum):\n", " FALSE = 0\n", " TRUE = 1\n", "\n", "class B(IntEnum):\n", " FALSE = 0\n", " TRUE = 1\n", "\n", "class Z(IntEnum):\n", " FALSE = 0\n", " TRUE = 1\n", "\n", "@memo\n", "def fork[_a: A, _b: B]():\n", " agent: knows(_a, _b)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(z in Z, wpp=1),\n", " friend: chooses(a in A, wpp=(\n", " 1 if z == {Z.TRUE} \n", " else (0.9 if a == {A.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE}\n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", "\n", " ### this observes statement is just here to\n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a]]\n", "\n", "res = fork(print_table=True, return_aux=True, return_xarray=True)\n", "\n", "resx = res.aux.xarray\n", "print(\"\\n\")\n", "for a in A:\n", " for b in B:\n", " a_, b_ = a.name, b.name\n", " print(f\"P(A={a_} | B={b_}) = {resx.loc[a_, b_].item():0.4f}\")\n", " print(\"---\")" ] }, { "cell_type": "markdown", "id": "c301ca1c", "metadata": {}, "source": [ "> **Conditioning on $B$**\n", ">\n", "> **Note:** The DAG above shows the model ${P(A, B, Z)}$. However, the `@memo` (`fork`) is conditioned on $B$ — this done purely because it’s easier to visually inspect if ${ P(A \\mid B) = P(A \\mid \\neg B) = P(A) }$ than it is to inspect if ${ P(A, B) = P(A) \\; P(B) }$.\n", ">\n", "> The conceptually important part is what happens when the model is conditioned on $Z$, so while I am conditioning the model on $B$, I’m not shading the $B$ node in the DAG.\n", ">\n", "> We could, of course, run the model that’s actually shown in the DAG by removing the `agent: observes [friend.b] is _b` line, and then check if ${ P(A, B) = P(A) \\; P(B) }$ (see the _Without extra conditional_ details below for a demonstration).\n" ] }, { "cell_type": "markdown", "id": "3b86efb8", "metadata": {}, "source": [ "
\n", "Without extra conditional\n", "\n", "In the joint model, ${ P(A, B) \\neq P(A) \\; P(B) }$.\n", "\n", "```python\n", "@memo\n", "def fork_joint[_a: A, _b: B]():\n", " agent: knows(_a, _b)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(z in Z, wpp=1),\n", " friend: chooses(a in A, wpp=(\n", " 1 if z == {Z.TRUE}\n", " else (0.9 if a == {A.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE}\n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", "\n", " ### without observes statement\n", " # agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a, friend.b == _b]]\n", "\n", "res = fork_joint(print_table=True, return_aux=True, return_xarray=True)\n", "\n", "resx = res.aux.xarray\n", "print(\"\\nCompare:\")\n", "for a in A:\n", " for b in B:\n", " a_, b_ = a.name, b.name\n", " print(\"\\n\")\n", " print(f\"P(A={a_}, B={b_}) = {resx.loc[a_, b_].item():0.4f}\")\n", " print(f\"P(A={a_}) P(B={b_}) = {resx.loc[a_, :].sum().item() * resx.loc[:, b_].sum().item():0.4f}\")\n", "```\n", "\n", " +-------+-------+----------------------+\n", " | _a: A | _b: B | fork_joint |\n", " +-------+-------+----------------------+\n", " | FALSE | FALSE | 0.2549999952316284 |\n", " | FALSE | TRUE | 0.04500000178813934 |\n", " | TRUE | FALSE | 0.4950000047683716 |\n", " | TRUE | TRUE | 0.20499999821186066 |\n", " +-------+-------+----------------------+\n", "\n", " Compare:\n", "\n", "\n", " P(A=FALSE, B=FALSE) = 0.2550\n", " P(A=FALSE) P(B=FALSE) = 0.2250\n", "\n", "\n", " P(A=FALSE, B=TRUE) = 0.0450\n", " P(A=FALSE) P(B=TRUE) = 0.0750\n", "\n", "\n", " P(A=TRUE, B=FALSE) = 0.4950\n", " P(A=TRUE) P(B=FALSE) = 0.5250\n", "\n", "\n", " P(A=TRUE, B=TRUE) = 0.2050\n", " P(A=TRUE) P(B=TRUE) = 0.1750\n", "\n", "But once stratified by $Z$ (i.e., conditioned on $Z$), ${ P(A, B \\mid Z) }$ _is_ always equal to ${ P(A \\mid Z) \\; P(B \\mid Z) }$.\n", "\n", "```python\n", "@memo\n", "def fork_joint__z[_z: Z, _a: A, _b: B]():\n", " agent: knows(_a, _b, _z)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(z in Z, wpp=1),\n", " friend: chooses(a in A, wpp=(\n", " 1 if z == {Z.TRUE}\n", " else (0.9 if a == {A.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE}\n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", "\n", " agent: observes [friend.z] is _z\n", "\n", " ### without observes statement\n", " # agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a, friend.b == _b]]\n", "\n", "res = fork_joint__z(print_table=True, return_aux=True, return_xarray=True)\n", "\n", "resx = res.aux.xarray\n", "\n", "print(\"\\nCompare:\")\n", "for z in Z:\n", " for a in A:\n", " for b in B:\n", " z_, a_, b_ = z.name, a.name, b.name\n", " print(\"\\n\")\n", " print(f\" P(A={a_}, B={b_} | Z={z_}) = {resx.loc[z_, a_, b_].item():0.4f}\")\n", " print(f\" P(A={a_} | Z={z_}) P(B={b_} | Z={z_}) = {resx.loc[z_, a_, :].sum().item() * resx.loc[z_, :, b_].sum().item():0.4f}\")\n", "```\n", "\n", " +-------+-------+-------+----------------------+\n", " | _z: Z | _a: A | _b: B | fork_joint__z |\n", " +-------+-------+-------+----------------------+\n", " | FALSE | FALSE | FALSE | 0.06000000238418579 |\n", " | FALSE | FALSE | TRUE | 0.04000000283122063 |\n", " | FALSE | TRUE | FALSE | 0.5400000214576721 |\n", " | FALSE | TRUE | TRUE | 0.35999998450279236 |\n", " | TRUE | FALSE | FALSE | 0.44999998807907104 |\n", " | TRUE | FALSE | TRUE | 0.05000000074505806 |\n", " | TRUE | TRUE | FALSE | 0.44999998807907104 |\n", " | TRUE | TRUE | TRUE | 0.05000000074505806 |\n", " +-------+-------+-------+----------------------+\n", "\n", " Compare:\n", "\n", "\n", " P(A=FALSE, B=FALSE | Z=FALSE) = 0.0600\n", " P(A=FALSE | Z=FALSE) P(B=FALSE | Z=FALSE) = 0.0600\n", "\n", "\n", " P(A=FALSE, B=TRUE | Z=FALSE) = 0.0400\n", " P(A=FALSE | Z=FALSE) P(B=TRUE | Z=FALSE) = 0.0400\n", "\n", "\n", " P(A=TRUE, B=FALSE | Z=FALSE) = 0.5400\n", " P(A=TRUE | Z=FALSE) P(B=FALSE | Z=FALSE) = 0.5400\n", "\n", "\n", " P(A=TRUE, B=TRUE | Z=FALSE) = 0.3600\n", " P(A=TRUE | Z=FALSE) P(B=TRUE | Z=FALSE) = 0.3600\n", "\n", "\n", " P(A=FALSE, B=FALSE | Z=TRUE) = 0.4500\n", " P(A=FALSE | Z=TRUE) P(B=FALSE | Z=TRUE) = 0.4500\n", "\n", "\n", " P(A=FALSE, B=TRUE | Z=TRUE) = 0.0500\n", " P(A=FALSE | Z=TRUE) P(B=TRUE | Z=TRUE) = 0.0500\n", "\n", "\n", " P(A=TRUE, B=FALSE | Z=TRUE) = 0.4500\n", " P(A=TRUE | Z=TRUE) P(B=FALSE | Z=TRUE) = 0.4500\n", "\n", "\n", " P(A=TRUE, B=TRUE | Z=TRUE) = 0.0500\n", " P(A=TRUE | Z=TRUE) P(B=TRUE | Z=TRUE) = 0.0500\n", "\n", "
\n" ] }, { "attachments": { "generated/conditional-dependence/fork2.png": { "image/png": "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\n" } }, "cell_type": "markdown", "id": "44752bae", "metadata": {}, "source": [ "Now let’s assume that we _already_ know the value of `Z`:\n", "\n", "![](attachment:generated/conditional-dependence/fork2.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "951d6b8e", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def fork__z[_z: Z, _a: A, _b: B]():\n", " agent: knows(_a, _b, _z)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(z in Z, wpp=1),\n", " friend: chooses(a in A, wpp=(\n", " 1 if z == {Z.TRUE} \n", " else (0.9 if a == {A.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE} \n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", "\n", " agent: observes [friend.z] is _z\n", "\n", " ### this observes statement is just here to \n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a]]\n", "\n", "res = fork__z(print_table=True, return_aux=True, return_xarray=True)" ] }, { "cell_type": "markdown", "id": "a01c4f3c", "metadata": {}, "source": [ "We see that ${A \\perp B \\mid Z}$. While $A$ and $B$ are _marginally_ *de*pendent, they are _conditionally independent_ given knowledge of `Z`.\n", "\n", "E.g.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "730b1699", "metadata": {}, "outputs": [], "source": [ "print(f\"if A and B are conditionally independent given Z, then...\")\n", "resx = res.aux.xarray\n", "for z in Z:\n", " for a in A:\n", " print(\"\\nThese should be the same:\")\n", " for b in B:\n", " z_, a_, b_ = z.name, a.name, b.name\n", " print(f\" P(A={a_} | B={b_}, Z={z_}) = {resx.loc[z_, a_, b_].item():0.4f}\")" ] }, { "cell_type": "markdown", "id": "34c4e238", "metadata": {}, "source": [ "#### Continuous Fork\n" ] }, { "attachments": { "generated/conditional-dependence/fork3.png": { "image/png": "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\ngg==\n" } }, "cell_type": "markdown", "id": "c60f0d7c", "metadata": {}, "source": [ "![](attachment:generated/conditional-dependence/fork3.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "6392c5b9", "metadata": {}, "outputs": [], "source": [ "### Import \n", "def lobf(x, y):\n", " import numpy as np\n", " return (np.unique(x), np.poly1d(jnp.polyfit(x, y, 1))(np.unique(x)))\n", "\n", "def jointprob_facetgrid(P, support_dim0=None, support_dim1=None, origin=True, corr=True, cmap=\"BuPu\", dim0: dict | None = None, dim1: dict | None = None, **kwargs):\n", " import seaborn as sns\n", " import numpy as np\n", " import matplotlib.pyplot as plt\n", "\n", " if support_dim0 is None:\n", " support_dim0 = np.arange(P.shape[0])\n", " if support_dim1 is None:\n", " support_dim1 = np.arange(P.shape[1])\n", " if isinstance(dim0, dict) and \"support\" in dim0:\n", " support_dim0 = dim0[\"support\"]\n", " if isinstance(dim1, dict) and \"support\" in dim1:\n", " support_dim1 = dim1[\"support\"]\n", " \n", " label_dim0 = \"dim 0\"\n", " label_dim1 = \"dim 1\"\n", " lim_dim0 = None\n", " lim_dim1 = None\n", "\n", " label_dim0 = kwargs.get(\"label_dim0\", label_dim0)\n", " label_dim1 = kwargs.get(\"label_dim1\", label_dim1)\n", "\n", " lim_dim0 = kwargs.get(\"lim_dim0\", lim_dim0)\n", " lim_dim1 = kwargs.get(\"lim_dim0\", lim_dim1)\n", "\n", " title = kwargs.get(\"title\", None)\n", "\n", " if isinstance(dim0, dict):\n", " label_dim0 = dim0.get(\"label\", label_dim0)\n", " lim_dim0 = dim0.get(\"lim\", lim_dim0)\n", " if isinstance(dim1, dict):\n", " label_dim1 = dim1.get(\"label\", label_dim1)\n", " lim_dim1 = dim0.get(\"lim\", lim_dim1)\n", "\n", " assert len(P.shape) == 2\n", " assert len(support_dim0.shape) == 1\n", " assert len(support_dim1.shape) == 1\n", "\n", " # Create the grid for the joint plot with shared axes\n", " g = sns.JointGrid(ratio=8, height=4)\n", " g.ax_marg_x.sharex(g.ax_joint)\n", " g.ax_marg_y.sharey(g.ax_joint)\n", "\n", " # Plot the main density with contours\n", " contour = g.ax_joint.contourf(support_dim0, support_dim1, P.T, levels=20, cmap=cmap, norm=\"linear\", )\n", " g.ax_joint.contour(support_dim0, support_dim1, P.T, levels=10, colors=\"white\", alpha=0.3, linewidths=0.5)\n", "\n", " xlim = g.ax_joint.get_xlim()\n", " ylim = g.ax_joint.get_ylim()\n", "\n", " if origin:\n", " _ = g.ax_joint.axhline(0, color=\"white\", linewidth=0.5, alpha=0.3)\n", " _ = g.ax_joint.axvline(0, color=\"white\", linewidth=0.5, alpha=0.3)\n", "\n", " # Plot marginal distributions with aligned axes\n", " g.ax_marg_x.set_facecolor('#f0f0f0')\n", " g.ax_marg_y.set_facecolor('#f0f0f0')\n", " g.ax_marg_x.fill_between(support_dim0, P.sum(axis=1), alpha=0.3)\n", " g.ax_marg_y.fill_betweenx(support_dim1, P.sum(axis=0), alpha=0.3)\n", "\n", " if corr:\n", " # Calculate expected values\n", " A, B = np.meshgrid(support_dim0, support_dim1)\n", " E_a = np.sum(A * P.T) / np.sum(P)\n", " E_b = np.sum(B * P.T) / np.sum(P)\n", " \n", " # Calculate covariance\n", " cov_ab = np.sum((A - E_a) * (B - E_b) * P.T) / np.sum(P)\n", " var_a = np.sum((A - E_a)**2 * P.T) / np.sum(P)\n", " var_b = np.sum((B - E_b)**2 * P.T) / np.sum(P)\n", " \n", " # Calculate correlation\n", " correlation = cov_ab / np.sqrt(var_a * var_b)\n", " \n", " # Calculate line of best fit\n", " slope = cov_ab / var_a\n", " intercept = E_b - slope * E_a\n", " \n", " # Plot line of best fit\n", " line_x = np.array([support_dim0[0], support_dim0[-1]])\n", " line_y = slope * line_x + intercept\n", " g.ax_joint.plot(line_x, line_y, \"w--\", linewidth=1, label=f'r = {correlation:.2f}')\n", " # g.ax_joint.legend()\n", "\n", " g.ax_joint.set_xlim(xlim)\n", " g.ax_joint.set_ylim(ylim)\n", "\n", " E_d0 = np.sum(support_dim0 * P.sum(axis=1))\n", " E_d1 = np.sum(support_dim1 * P.sum(axis=0))\n", " g.ax_marg_x.scatter(E_d0, 0.0, color=\"red\", s=15, marker=\"v\", label=\"E[d0]\")\n", " g.ax_marg_y.scatter(0.0, E_d1, color=\"red\", s=15, marker=\"<\", label=\"E[d1]\")\n", "\n", "\n", " g.ax_marg_y.tick_params(labelleft=False, direction='in')\n", "\n", " # Remove ticks from marginal plots\n", " # g.ax_marg_x.tick_params(labelbottom=False)\n", " # g.ax_marg_y.tick_params(labelleft=False)\n", "\n", " g.ax_marg_x.tick_params(labelbottom=False, direction='in')\n", " g.ax_marg_y.tick_params(labelleft=False, direction='in')\n", "\n", " if label_dim0 is not None:\n", " _ = g.ax_joint.set_xlabel(label_dim0)\n", " if label_dim0 is not None:\n", " _ = g.ax_joint.set_ylabel(label_dim1)\n", "\n", " if lim_dim0 is not None:\n", " _ = g.ax_joint.set_xlim(lim_dim0)\n", " if lim_dim1 is not None:\n", " _ = g.ax_joint.set_ylim(lim_dim1)\n", " \n", " if title:\n", " _ = g.figure.suptitle(title, y=1.03)\n", "\n", " return g" ] }, { "cell_type": "code", "execution_count": null, "id": "4a28eae0", "metadata": {}, "outputs": [], "source": [ "from jax.scipy.stats.norm import pdf as normpdf\n", "\n", "normpdfjit = jax.jit(normpdf)\n", "\n", "W = jnp.linspace(-3, 3, 11)\n", "T = jnp.linspace(-3, 3, 11)\n", "R = jnp.arange(2)\n", "\n", "@memo\n", "def viz_fork_joint[_w: W, _t: T]():\n", " agent: knows(_w, _t)\n", " agent: thinks[\n", " friend: chooses(r in R, wpp=1),\n", " friend: chooses(w in W, wpp=normpdfjit(w, 2*r-1, 0.5)),\n", " friend: chooses(t in T, wpp=normpdfjit(t, 2*r-1, 0.5)),\n", " ]\n", " return agent[Pr[friend.w == _w, friend.t == _t]]\n", "\n", "fig = jointprob_facetgrid(viz_fork_joint(), W, T, \n", " label_dim0=\"W\", label_dim1=\"T\", title=r\"$P(W, T)$\", cmap=\"inferno\")" ] }, { "attachments": { "generated/conditional-dependence/fork4.png": { "image/png": "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\nV/4nSeLk8oQAAAAASUVORK5CYII=\n" } }, "cell_type": "markdown", "id": "74620a2a", "metadata": {}, "source": [ "But, when we stratify by $R$, now ${W \\perp T \\mid R}$.\n", "\n", "![](attachment:generated/conditional-dependence/fork4.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "e6f681f3", "metadata": {}, "outputs": [], "source": [ "from jax.scipy.stats.norm import pdf as normpdf\n", "\n", "normpdfjit = jax.jit(normpdf)\n", "\n", "W = jnp.linspace(-3, 3, 11)\n", "T = jnp.linspace(-3, 3, 11)\n", "R = jnp.arange(2)\n", "\n", "@memo\n", "def viz_fork_stratified[_w: W, _t: T, _r: R]():\n", " agent: knows(_w, _t)\n", " agent: thinks[\n", " friend: chooses(r in R, wpp=1),\n", " friend: chooses(w in W, wpp=normpdfjit(w, 2*r-1, 0.5)),\n", " friend: chooses(t in T, wpp=normpdfjit(t, 2*r-1, 0.5)),\n", " ]\n", " agent: observes [friend.r] is _r\n", " return agent[Pr[friend.w == _w, friend.t == _t]]\n", "\n", "res = viz_fork_stratified()\n", "\n", "fig = jointprob_facetgrid(\n", " res[:, :, 0], \n", " W, \n", " T, \n", " label_dim0=\"W\", \n", " label_dim1=\"T\", \n", " title=r\"$P(W, T \\mid R{=}0)$\",\n", " cmap=\"inferno\")\n", "fig = jointprob_facetgrid(\n", " res[:, :, 1], \n", " W, \n", " T, \n", " label_dim0=\"W\", \n", " label_dim1=\"T\", \n", " title=r\"$P(W, T \\mid R{=}1)$\",\n", " cmap=\"inferno\")" ] }, { "attachments": { "generated/conditional-dependence/pipe1.png": { "image/png": "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\n" } }, "cell_type": "markdown", "id": "c33e857a", "metadata": {}, "source": [ "### Pipe\n", "\n", "Screening off is a purely statistical phenomenon. For example, consider the causal chain model, where $A$ directly causes $Z$, which in turn directly causes $B$ ($Z$ is a _“mediator”_).\n", "\n", "![](attachment:generated/conditional-dependence/pipe1.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "3187193f", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def pipe[_a: A, _b: B]():\n", " agent: knows(_a, _b)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(a in A, wpp=1),\n", " friend: chooses(z in Z, wpp=(\n", " 1 if a == {A.TRUE} \n", " else (0.9 if z == {Z.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE} \n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", " ### this observes statement is just here to \n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", " return agent[Pr[friend.a == _a]]\n", "\n", "_ = pipe(print_table=True)" ] }, { "attachments": { "generated/conditional-dependence/pipe2.png": { "image/png": "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\nD9DUp56fgsPJAAAAAElFTkSuQmCC\n" } }, "cell_type": "markdown", "id": "c49fb15c", "metadata": {}, "source": [ "We can observe that $A$ and $B$ are associated.\n", "\n", "But observing $Z$, the event that mediates an _indirect_ causal relation between $A$ and $B$, renders $A$ and $B$ independent. $A$ and $B$ are still causally dependent in our model, it is just our beliefs about the states of $A$ and $B$ that become conditionally independent.\n", "\n", "![](attachment:generated/conditional-dependence/pipe2.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "d513b8fe", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def pipe[_z: Z, _a: A, _b: B]():\n", " agent: knows(_a, _b, _z)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(a in A, wpp=1),\n", " friend: chooses(z in Z, wpp=(\n", " 1 if a == {A.TRUE} \n", " else (0.9 if z == {Z.TRUE} else 0.1))),\n", " friend: chooses(b in B, wpp=(\n", " (\n", " 0.1 if b == {B.TRUE} else 0.9\n", " ) if z == {Z.TRUE} \n", " else (0.4 if b == {B.TRUE} else 0.6))),\n", " ]\n", "\n", " agent: observes [friend.z] is _z\n", "\n", " ### this observes statement is just here to \n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a]]\n", "\n", "_ = pipe(print_table=True)" ] }, { "attachments": { "generated/conditional-dependence/collider0.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAO\nxAAADsQBlSsOGwAAFKZJREFUeJztnXtQlcUbxxdERElJTU0Bw2ve8AKaAmqgzthU3mpMHfMCoqYN\nlt2tmUanP37emCwtyykv6GReGi0zNWs0tTRBNPMKlJYKiCigAiKX/c33mfadfeEInPMeznnfPXxm\n3jh5YPfZ3ed99vY8u16cc87qqcdBvB39w3rqAT51VQ33799n169fZ/fu3WNlZWXMz8+PNWvWjLVs\n2bK+5uuQmzdvstu3b1O9+/j4UL23adOG+fr6mluB0tPT2YEDB9iJEyfoOX36NCstLa3ye+3atWPh\n4eH0DBgwgA0fPpw1atTIWWJ4FCUlJeznn39mycnJVOcpKSksKyuryu9BeUJDQ7V6j4mJYV26dHGO\nENwApaWlfPv27XzYsGEYRzn0tGrVii9YsIBfvnzZiCgexaVLl/g777xDdedovQ8fPpx/88031IZG\n8MJ/7FW68vJytnLlSrZs2TKWmZlZ5fsWLVqQpnfv3p35+/uzBg0a0NuCLi01NZWdO3eOVVRU6P7G\ny8uLjRo1itLs2rWrsbdCUS5evMjefPNN9v333+PF133n7e3NevTowcLCwqjLglVHOxUWFrLz58+T\nhbp161aVNAMDA9kbb7zBEhISqJ3sxl6NO3/+PB80aFAVjYYV2rRpE70dFRUV1aZx9+5d/uuvv/K3\n3nqLt2zZUpeOn58fT0xM5GVlZQbeC7UoKyvjy5cvp7qR6wp1hzpEXaJOqwNtgrZBG9nqMSIiIviF\nCxfslq3WClReXk6FaNSokZZpkyZN+CuvvEJK5SjFxcU8KSmJh4eH6woUGRnJ09LSuKeTlpZGdSHX\nDepq48aNVHeOcu7cOT5v3jxqQ/nlRRujrZ2qQPfv3+cvvviirhBPPvkkz8jI4M4CQn/00Ue8cePG\nWh7Nmzfnx44d457K0aNHqQ7kF/bjjz+2q4FrAm04dOhQXdtOmTKl1mMjVhvlGTdunK4QK1eudGoh\nZNLT0/mQIUO0/Pz9/fnhw4e5p3Ho0CEqu6gH1IkzX1gZtCUUU7ZGaPPaKBGrKWHZ8qDPTUlJ4XUN\n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\n/8b7JqChwgAAAABJRU5ErkJggg==\n" } }, "cell_type": "markdown", "id": "4992eaa7", "metadata": {}, "source": [ "## Explaining away\n", "\n", "“Explaining away” (Pearl, 2014) refers to a complementary pattern of statistical inference which is somewhat more subtle than screening off. If two events $A$ and $B$ are causally independent (and hence, _a priori_, statistically independent), but they are both causes of one or more other events $Z$, then conditioning on (observing) $Z$ can render $A$ and $B$ statistically dependent. Here is an example where $A$ and $B$ have a common _effect_ (they _collide_ on $Z$). Before we observe $Z$, $A$ and $B$ are independent:\n", "\n", "![](attachment:generated/conditional-dependence/collider0.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "7c2adb91", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def collider_marginal[_a: A, _b: B]():\n", " agent: knows(_a, _b)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(a in A, wpp=1),\n", " friend: chooses(b in B, wpp=1),\n", " friend: chooses(z in Z, wpp=(\n", " (\n", " 0.9 if z == {Z.TRUE} else 0.1\n", " ) if (a == {A.TRUE} or b == {B.TRUE})\n", " else (0.2 if z == {Z.TRUE} else 0.8))),\n", " ]\n", "\n", " ### this observes statement is just here to\n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a]]\n", "\n", "_ = collider_marginal(print_table=True)" ] }, { "attachments": { "generated/conditional-dependence/collider1.png": { "image/png": "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\nxApYmfB/uGp8czKl+F4AAAAASUVORK5CYII=\n" } }, "cell_type": "markdown", "id": "16ab10d3", "metadata": {}, "source": [ "Without conditioning on $Z$, $A$ and $B$ are independent: ${ P(A \\mid B{=}\\mathtt{true}) = P(A \\mid B{=}\\mathtt{false}) }$.\n", "\n", "But once we observe the value of $Z$:\n", "\n", "![](attachment:generated/conditional-dependence/collider1.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b6526be8", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def collider[_z: Z, _a: A, _b: B]():\n", " agent: knows(_a, _b, _z)\n", " agent: thinks[\n", " friend: knows(_a, _b),\n", " friend: chooses(a in A, wpp=1),\n", " friend: chooses(b in B, wpp=1),\n", " friend: chooses(z in Z, wpp=(\n", " (\n", " 0.9 if z == {Z.TRUE} else 0.1\n", " ) if (a == {A.TRUE} or b == {B.TRUE})\n", " else (0.2 if z == {Z.TRUE} else 0.8))),\n", " ]\n", "\n", " agent: observes [friend.z] is _z\n", "\n", " ### this observes statement is just here to \n", " ### make it easier to inspect the results\n", " agent: observes [friend.b] is _b\n", "\n", " return agent[Pr[friend.a == _a]]\n", "\n", "_ = collider(print_table=True)" ] }, { "cell_type": "markdown", "id": "2f8e3019", "metadata": {}, "source": [ "As with screening off, we only induce statistical dependence from learning about `Z`, not causal dependence: when we observe `Z`, `A` and `B` remain causally independent in our model of the world; it is our beliefs about $A$ and $B$ that become statistically dependent.\n" ] }, { "cell_type": "markdown", "id": "748f3c0a", "metadata": {}, "source": [ "The most typical pattern of explaining away we see in causal reasoning is a kind of _anti-correlation_: the probabilities of two possible causes for the same effect increase when the effect is observed, but they are conditionally anti-correlated, so that observing additional evidence in favor of one cause should lower our degree of belief in the other cause. (This pattern is where the term explaining away comes from.) However, the coupling induced by conditioning on common effects depends on the nature of the interaction between the causes, it is not always an anti-correlation. Explaining away takes the form of an anti-correlation when the causes interact in a roughly disjunctive or additive form: the effect tends to happen if any cause happens; or the effect happens if the sum of some continuous influences exceeds a threshold. The following simple mathematical examples show this and other patterns.\n", "\n", "The model below defines two independent variables $X$ and $Y$ both of which are used to define the value of our data. Suppose we condition on observing the sum of two integers drawn uniformly from 0 to 9:\n" ] }, { "cell_type": "code", "execution_count": null, "id": "fdf24b27", "metadata": {}, "outputs": [], "source": [ "from jax.scipy.stats.norm import pdf as normpdf\n", "\n", "normpdfjit = jax.jit(normpdf)\n", "\n", "X = jnp.arange(10)\n", "Y = jnp.arange(10)\n", "\n", "@memo\n", "def f[_x: X, _y: Y]():\n", " agent: knows(_x, _y)\n", " agent: thinks[\n", " selection: chooses(x in X, wpp=1),\n", " selection: chooses(y in Y, wpp=1),\n", " ]\n", " agent: observes_that[ selection.x + selection.y == 9 ]\n", "\n", " return agent[Pr[selection.x == _x, selection.y == _y]]\n", "\n", "g = jointprob_facetgrid(\n", " f(),\n", " X,\n", " Y,\n", " label_dim0=\"X\",\n", " label_dim1=\"Y\",\n", " title=r\"$P(X, Y \\mid X+Y=9)$\",\n", " cmap=\"inferno\")" ] }, { "cell_type": "markdown", "id": "defd1322", "metadata": {}, "source": [ "This gives perfect anti-correlation in conditional inferences for `X` and `Y`. But suppose we instead condition on observing that `X` and `Y` are equal:\n" ] }, { "cell_type": "code", "execution_count": null, "id": "0f1ed99c", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def ff[_x: X, _y: Y]():\n", " agent: knows(_x, _y)\n", " agent: thinks[\n", " selection: chooses(x in X, wpp=1),\n", " selection: chooses(y in Y, wpp=1),\n", " ]\n", " agent: observes_that[ selection.x == selection.y ]\n", "\n", " return agent[Pr[selection.x == _x, selection.y == _y]]\n", "\n", "g = jointprob_facetgrid(\n", " ff(),\n", " X,\n", " Y,\n", " label_dim0=\"X\",\n", " label_dim1=\"Y\",\n", " title=r\"$P(X, Y \\mid X=Y)$\",\n", " cmap=\"inferno\")" ] }, { "cell_type": "markdown", "id": "c043ac67", "metadata": {}, "source": [ "Now, of course, X and Y go from being independent _a priori_ to being perfectly correlated in the conditional distribution. Try out these other conditions to see other possible patterns of conditional dependence for _a priori_ independent functions:\n", "\n", " selection.x - selection.y < 2\n", " selection.x + selection.y >= 9 and selection.x + selection.y <= 11\n", " abs(selection.x - selection.y) == 3\n", " (selection.x - selection.y) % 10 == 3\n", " selection.x % 2 == selection.y % 2\n", " selection.x % 5 == selection.y % 5\n", " selection.x % 2 == selection.y % 3\n" ] }, { "cell_type": "code", "execution_count": null, "id": "b4fc875f", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def fff[_x: X, _y: Y]():\n", " agent: knows(_x, _y)\n", " agent: thinks[\n", " selection: chooses(x in X, wpp=1),\n", " selection: chooses(y in Y, wpp=1),\n", " ]\n", " agent: observes_that[ abs(selection.x - selection.y) == 3 ]\n", "\n", " return agent[Pr[selection.x == _x, selection.y == _y]]\n", "\n", "g = jointprob_facetgrid(\n", " fff(),\n", " X,\n", " Y,\n", " label_dim0=\"X\",\n", " label_dim1=\"Y\",\n", " title=r\"$P(X, Y \\mid |X-Y|=3)$\",\n", " cmap=\"inferno\")" ] }, { "cell_type": "markdown", "id": "491f5220", "metadata": {}, "source": [ "### Collider bias - selection and survivorship bias\n" ] }, { "attachments": { "generated/conditional-dependence/restaurant_joint.png": { "image/png": "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\n" } }, "cell_type": "markdown", "id": "c76d9207", "metadata": {}, "source": [ "#### Restaurants\n", "\n", "This model looks at the effect of conditioning on a collider.\n", "\n", "It is not uncommon that restaurants with amazing food require some effort to get to, while convenient locations are filled with mediocre restaurants that somehow stay in business.\n", "\n", "A restaurant’s popularity depends both on its food and its location. Restaurants with exceptional food can thrive in out-of-the-way locations because people will make the extra effort to visit them. Restaurants in prime locations (think busy downtowns and tourist hotspots) can get away with serving subpar food because they get plenty of foot traffic or it’s hard for people to go elsewhere (think airports, music festivals, and rural college campuses).\n", "\n", "The model represents this by measuring both food quality and location on a scale where 0 is “average,” positive numbers are “better than average,” and negative numbers are “worse than average.” Popularity is modeled as the combination of food and location. The `popularity_value` function sums the food and location values for a given restaurant. A restaurant is more likely to be popular if the food is good and if it’s easy to get to. This function also represents the idea that popularity isn’t perfectly determined by food and location alone. There are other factors that influence a restaurant’s popularity (things like ambiance, live music and staff). These other factors are modeled as isomorphic Gaussian noise centered on $\\text{food} + \\text{location}$:\n", "\n", "$$\n", "\\begin{align*}\n", "\\text{food} ~\\sim& ~~\\mathcal{N}(\\mu{=}0, \\sigma_{\\text{food}}) \\\\\n", "\\text{location} ~\\sim& ~~\\mathcal{N}(\\mu{=}0, \\sigma_{\\text{location}}) \\\\\n", "\\text{popularity} ~\\sim& ~~\\mathcal{N}(\\mu{=}\\text{food}+\\text{location}, \\sigma_{\\text{popularity}})\n", "\\end{align*}\n", "$$\n", "\n", "![](attachment:generated/conditional-dependence/restaurant_joint.png)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "913e1ddc", "metadata": {}, "outputs": [], "source": [ "from jax.scipy.stats.norm import pdf as normpdf\n", "\n", "normpdfjit = jax.jit(normpdf)\n", "\n", "Food = jnp.linspace(-2, 2, 11)\n", "Location = jnp.linspace(-2, 2, 11)\n", "Popularity = product(\n", " food=len(Food),\n", " loc=len(Location),\n", ")\n", "\n", "@jax.jit\n", "def popularity_value(p):\n", " y_food = Popularity.food(p)\n", " y_loc = Popularity.loc(p)\n", " return y_food + y_loc\n", "\n", "@jax.jit\n", "def popularity_pdf(p, f, l):\n", " return normpdf(popularity_value(p), f + l, 0.4)\n", "\n", "@memo\n", "def critic_joint[_f: Food, _l: Location](cutoff=1):\n", " critic: knows(_f, _l)\n", " critic: thinks[\n", " restaurant: knows(_f, _l),\n", " restaurant: chooses(f in Food, wpp=normpdfjit(f, 0, 0.4)),\n", " restaurant: chooses(l in Location, wpp=normpdfjit(l, 0, 0.4)),\n", " clientele: knows(restaurant.f, restaurant.l),\n", " clientele: chooses(p in Popularity, wpp=popularity_pdf(p, restaurant.f, restaurant.l))\n", " ]\n", "\n", " return critic[Pr[restaurant.f == _f, restaurant.l == _l]]\n", "\n", "g = jointprob_facetgrid(\n", " critic_joint(), \n", " Food, \n", " Location, \n", " label_dim0=\"Location\", \n", " label_dim1=\"Food\", \n", " title=r\"$P(Location,Food)$\",\n", " cmap=\"inferno\")" ] }, { "attachments": { "generated/conditional-dependence/restaurant.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAO\nxAAADsQBlSsOGwAAE7BJREFUeJztnXtQVFUcxw9PFRJCKnmp5DMxSdNGEJVBa3SmwbJEcUYSEHxk\n4DQ9pmZ6TPVPEzg+qCyz1KAX6pBWI9hDAowMAzVBZWm0TMAnYBgEuKf5numeObuswO7eXe49y2dm\nZeVx73n89ntev9/vulFKKRlgABtxt/UPBxgAeDqqGTo6OsjFixdJe3s76erqIoMHDyZ+fn4kMDBw\noOUdyNWrV8n169dZu3t6erJ2Hz58OPH29ta2ARkMBnLo0CHy66+/steJEydIZ2dnt98LCQkh06ZN\nY68HHniAzJs3jwwaNEitYrgU//77L/n+++9JRUUFa/OjR4+ShoaGbr8H45k8eTJv97i4ODJu3Dh1\nCkHtoLOzk+7Zs4fOnTsX8yibXnfeeSd98cUX6blz5+wpiktx9uxZ+sILL7C2s7Xd582bR/fu3cv6\n0B7c8I+1Rnfz5k2Sk5NDsrKySH19fbefDxs2jFn6xIkTia+vL/Hw8GCfFgxplZWVpKamhhiNRpO/\ncXNzI/Hx8eya48ePt+9TISlnzpwhzz33HPn666/xwTf5mbu7O4mIiCD3338/G7Kg6uinGzdukFOn\nTjGFunbtWrdrhoaGkmeffZZkZGSwfrIaay3u1KlTNCoqqptFQ4Xy8vLYp8NoNPZ4jdbWVnr48GH6\n/PPP08DAQJPrDB48mG7YsIF2dXXZ8bmQi66uLpqdnc3aRmwrtB3aEG2JNu0J9An6Bn1kacSIjo6m\np0+ftrpsfTagmzdvskoMGjSI39THx4euX7+eGZWttLW10Y8//phOmzbNpEIzZ86ktbW11NWpra1l\nbSG2DdoqNzeXtZ2t1NTU0MzMTNaH4ocXfYy+VtWAOjo66PLly00qERsbS+vq6qhaoNCbN2+mQ4YM\n4fcICAigP//8M3VVysvLWRuIH9gtW7ZY1cG9gT6cM2eOSd8mJSX1eW5E+mI8ixYtMqlETk6OqpUQ\nMRgMdPbs2fx+vr6+tLS0lLoaJSUlrO5KO6BN1PzAiqAvYZiiGqHP+2JEpLcLi8qDMffo0aPU0aDg\nKSkp/L5+fn60srKSugqVlZWszkr9U1NT7V4t9YWKigqTOSmUqDeh6NGAMB6KxlNdXU2dBQq+Zs0a\nfv+wsDDa3NxMZae5uZnVVan32rVre12UqMnJkydNjAg2YJMBYWKsTJghbc5QHktGtHTpUl6ZtLQ0\nKjsrV67k9UXdHTVV6E2JlOEME+ueVmfkVstGLOuUimDO01+0tLTQkSNH8rIUFhZSWTlw4ACvJ+qM\nuvcXmBOJS/xbbatYNKCNGzearLb641MgcvDgQZOhrLc9Dz3S2tpqMnR9++23/Voe9Lm4Otu0aVPf\nDAirrpCQED50OWrmby3p6em8Mtu2baOy8f777/P6rVq1imoB9L0ylIWGhlqcyHczIJxtKRXBRpNW\nqK+vp56enqxc9913n1Mnlo7GaDTSyMhIVjfUsaGhgWqFjIwMbg84O+vVgMRtbnt2mB3BkiVLeNmw\nfS8LZWVlJhNnLYEda/EAtkcDwra5eLZlDzt27LjlSbCt43txcbHJHoUsJCUl8Xr9+OOPqrQ7NmTV\nIi4ujpfP/HjJxB8I/jwKqampRA12795NwsLCTL6HU2NbmDNnDhkzZgz5/fffTcqqd3744Qf2dezY\nsWT27NlEa6xcuZK3d3FxsYkvkYkB4chfISYmRpWbT5kyhTWMGsDlIzo6mhnQX3/9xdxD4LqgZxob\nG8mFCxfYe9QNddQaM2fONLGR9PR0yz7RigHBn2fUqFFEi8DPyJLB65VfhTqIddMS4eHhJCAgwGKb\nu4s+zHBDVSqi1icBTk3wiVZe+L89TJ8+XVoDmi7UTUvAFhTjho3AVroZEIYDxYcZnoRqcc899xAv\nLy/+io2Ntet6YtnOnz9P9M55oQ5qtrvaKPNWGM+lS5e6z4Hgxa8AN1S1KCgoMJlEDx061K7riWVr\na2sjeqdNqIOa7a42Pj4+xJKtcAPC8KJgk2/sLbj33ntVm0Sbl00ss17pclC7q82t2p0PYYgfUoAD\nvFYRrV8ss14ZLNRBrJvWEG1CLDM3IAT9ifMhrSKWTSyzXvH399ddu4vTED6EIWIUQX8I00HojVYR\nyxYZGUn0zuTJk03qho1SNSgsLCRBQUHdjPWhhx6yq90RBiRGF5tsJGKpBgNC3BbiibQ4qdPDvok9\n+1oJCQlEDRDnZc6kSZPIyZMnrb6WEltmqc1NNhKVHyLo7/jx48QekpOTWfCbmhNo0YAQOIcG0TuT\nJk3icetq7Gsp7W7pZYvxgGPHjvFA0B4NCLHqCvv27SNa48qVK6SsrIwfkWBfSe94e3uTqVOnsvel\npaUsOYLW2L9/v0UbYYgnq+3t7fSOO+5gp674ak/gmiN46623+KkwYshkYdOmTbxeWVlZVEvABhQn\ne8Tiw0Z69AdC0L5SGUQ/agW4WN59993cU7KpqYnKQlNTEw+oHD16dL+7EIsgalixByTBMKebASF+\n2s3NjYfQaqUyBQUFvCJwb5WNtLQ0Xr8vv/ySagH0vRJyDpuwlEHFolN9fHy8poYK81ipqqoqKhtV\nVVW8fiNGjOjXiAxLQ+vChQst/o5FA0IckJIJAtKqpnebvZ9OGdVHi/VEnyvDKmzhzJkz1gUWilGp\niMt2RmitJRAHprVPprOUtrCfYuDQ12J+AqTbuRW3NCAEkolpRRCf7exICPMY8aKiIio7hcIHxt/f\n3+nDNeY9Yl6CmJiYHnM19RgbDwdqMb0I4rSdNamG8ShbCnghD5GrkJmZyeuNpbOzjMg8HwH6vrcc\nTb2md0F+HjHNCMJOHD2M4FOIT59yz2XLlmlmNegMurq6aGJiookSOXo4Q5+KeQjQ533JzdSnBFPI\nzyMOJYjbRrixI+YA4kRSMR5Ey7oaHR0drO5iW2Bi7YgPL/pSzD+Avu5rTiZizZAiTvCUCiFi1F6g\nLtjnMb8+hi1XUh5LSoQ2ENsECwm0lRrtgr4TQ8aV3APW5GIi1iqEmH5ECcVFxCiC/qydZF++fJkd\nTyg7zGIjucKEua+gLdAmYhthxxptd+XKFWoN6CP0VUJCAg8VV15Qf2tzMNmU5reoqIikpaWx2CwR\n+LIgtgkntogwENP8wttOSfOrJCPHwai59yNijrKzs6VwFlOTlpYWlo53+/btJt+HV8KsWbN4EnEl\nzS+8BsU0v0hCjjYvLy9ncXUi8FnHdefPn299wagd6UiQUUJJCmDPC2dbSCPj7u6umWwgWsRgMLA2\nQluJ+QxtfSFJBTKd2JMux65M9YokItEB4ruRAqSvhUf2sxkzZrCjEhwmYvNqzJgxbA9iAMskJyez\nNkJboc3QdmhDMfVyby/McdBX6DM19vVsGsJ6AsOUMkQh5glhK+LDVuCGCqmFI5W5P8+uXbtYHDYy\nsqvl2ikLdXV1LMbuww8/JCtWrDD5GeL5qqur+TNKxIetDBkyhIwYMYIPcWqHgqtuQPYAQ0MjIYnC\nRx991N/F0RQpKSnM4ez06dPMMDQD1Rg7d+6kHh4eA3Mhs7kP2gRtozU0pUBgQIV0pD6AapABFdKH\n+mhSgcCACulEfQDVKAMqRDWvPppVIDCgQkT76gOohnFlFTLoQH00rUCurkIpelAfQDWOK6qQQSfq\no3kFclUVStGL+gCqA1xJhQw6Uh9dKJCrqVCKntQHUJ3gCipk0Jn66EaBXEWFUvSmPoDqCJlVyKBD\n9dGVAsmuQil6VB9AdYaMKmTQqfroToFkVaEUvaoPoDpEJhUy6Fh9dKlAsqlQip7VB1CdIoMKGXSu\nPrpVIFlUKEXv6gOojtGzCtXV1elefXStQKIK4UG1O3bsIHoiNTWVlJSU6Ft9ANU5elShOknUR/cK\npNe5UKos6gOoBOhJheokUh8pFEhvKpQqk/oAKgl6UKE6ydRHGgXSiwqlyqY+gEqEllWoTkL1kUqB\ntK5CqTKqD6CSoUUVqpNUfaRTIK2qUKqs6gOohGhJheokVh8pFUhrKpQqs/oAKilaUKE6ydUHSGtA\nlvJO44nDW7duZQ8W6ekhatayYcMGdk1cW3yqMe6t5HWWFWkNSFSh6upq1rlBQUEs0zseIJuRkaHa\nfTIyMtg1cW3cA/fCPWVXH+kNCCn88dA6PPsTnatka/fy8lLdgLy8vPj1cS/cE/e25zECesCdSAge\n4PLee++RsWPHkqtXr7Js+Uaj0Wn3NxqN7J64N8qAspg/VEYWpDIgKCo6Kzw8nDz55JOksbGRfa8/\ny9PY2EjWrVvHyoSyybbolcqA8FijtWvX9rvhWFIklAllQxllQioDioiIIJ9++il7wIiW9lw8/3/o\nyWeffcbKKBNSGRBYtmwZOXbsGBk/fjx70F1/4+Hhwcpy/PhxkpiYSGRDOgMC6DA8oQ+7wP1NWloa\newzTuHHjiIxIaUAAQ8a2bdssDmmOmB9R4ZrikIWJM56VJivamSg4cEjDg9YWLVrEHmSH54haWtLD\nAPAsUahFVVUVuXTpEntoG4AB3HXXXWTq1KnsWngYnpubm8nfK9dUhqyCggL2VXqoi/DPP/+YPOL6\niSeeYM9mz8/PpwsWLKD+/v59fmwkfhd/k5+fz66Bayk/W716NW1ra6OugssYkEJubi7r6PDwcBoc\nHGz3g2uDg4PZtfA+Ly+PuhrSD2EiGL4uX77MHpV97tw5k59heY3nuMINBI8rDwkJ4XMXDGX19fVs\nDwduGXg+aU1NDftZQ0MD+4prYtjDPbSw+nMWUvoDWaK2tpatyg4fPsy/N3ToUBIfH08ef/xxMmrU\nKKuu98cff5C9e/eSr776ivz999/8+zExMSxOX9ZVl0saUG5uLlm1ahWfFEMtsCu8ePFiu1dI7e3t\nZM+ePWTr1q38vAvX/OCDD8jy5cuJ7EhvQFu2bCHr16/n/8dK6pVXXmGPwlaTP//8k7z++utsE1Nh\n8+bNJDMzk8iM1Ab0zjvvkKeeeor/H50JVXB3d8z2l9FoZGqXk5PDv/fuu+8ytZMVaQ0Iw0pCQgJ7\nD4N59dVXycMPP+yUe3/zzTfktddeYwaF/aLdu3ezeZaMSGlAWBlhRdXU1MT+D+PBZNmZ7N+/nw1p\nICAggK3cgoODiWxId5SBz8Pq1au58SAPobONByxcuJDdG6Asa9as0ZSLiVpIZ0CffPIJW1oDHDmk\np6f3W1nS09PJ6NGjuSLhXE42pBrCsKQeOXIk2yzEZt7OnTvZpmB/UlNTw5QIG4w4T8NqDdsIsuAu\n28QZxgOWLl3a78aj7HAvWbKEvcdONcooE1IZEJbMACsfLTlvJSYm8tN7pYyyII0BwQWjvLycvZ81\naxY7y7IVzKGmT5/OXwiRhlvIF198wcKmrSU0NJQdcYCffvrJZLNR70hzmPr555/z9ziiUIM333yT\nDB8+nNy4cYN89913JCsri6+orGXx4sWkrKyMvYej2ZQpU4gMSGNAv/zyC/uKCeqMGTNUueaECRP4\nkUdUVBQ5f/4863xbDCgqKoqVDedlFRUVRBakGMKw41tZWcnewwvQUREZmBBDja5du2b133p6evIT\nepRVlsWvFAYEV9Tr16+z9/DncRTwCcL2gI+Pj01/P/H/VWFLSwsrswxIYUC//fYbf6+mAWHvBpNm\nGCd8fw4dOsQm6La6gEyYMIG/P3HiBJEBKeZAivqAwMBA1a4rTsZxILtgwQLyzDPP2Hy9QKFsohOa\nnpHCgBRHMeDl5aXadbOzs9nuMYYsHITau4PsJZRNLLOekcKAxEmzmlk4cJampuOZUSiblkKviavP\ngcQ5CdKqaJV2QXVkCTaUwoBElTCPttASZ8+e5e/VdqntL6QwIPg5K2g5fcqp/8uGczGxzHpGCgPy\n8/PjYcRqGBAc0JCcQW2VOPV/2VBWhBTJgBQGBHDoCZDICW4TWuPixYvsJZZVBqQxoLlz5/L38P7T\nGvuFMsXFxRFZkMYjsbW1lblNYFMRezfoMK0slbu6utiwCGc3DLc4EvH19SUyII0C3XbbbWTFihXs\nPYaw0tJSohVKSkq4p2RycrI0xiOVAgEkPlAOLLEJmJeXp+rOtC10dHSQpKQkfniKMopnYnpHGgVS\nDlIfffRR9h4dtn379v4uEkEZFONBkiuZjEc6BQKYXyCosLm5mble7Nq1y6EuHr0t2zFk4VRf1uBC\nqRQIwBcaCRUAOu6ll15ixuRsmpubycsvv8zKAFAm2YxHSgUCqNIjjzzCAwyhSEi0gIm2s1aE69at\nY4oDsALbt29ft7yKMiClAQE4v8fGxnJnM0yukTXj9ttvd/h9MzIy2GQZREZGkuLiYjaEyYh0Q5gC\nOuzgwYMmRxxI7XLkyBGH3fPIkSNsxaUYD+5dVFQkrfFIrUAKOD6YP38+yxSv8Nhjj7GkU2rtx7S2\ntrJkUkjtq4CwHRgPNjVlRnoDAtidfvrpp02en4qORcgx5kq2KkRTUxOb2+Tn55ucvyEX48aNG9mu\ns+y4hAEpHDhwgGXMuHDhAv8eNhoffPBB5u+MsJ3ejAlGg4QJhYWFLNiws7OT/ywsLIzlRsS1XAWX\nMiBleY0ciVAjxHiZExQUxNP8ent7891kJc0vTvvN8fX1ZarzxhtvEH9/f+JSUBelubmZ5uTk0IkT\nJ9qcZDwiIoK+/fbbtKWlhboqLqdA5qD6WD0hMQOcyPCsDOSUNm8W7OFgVQVfHjwvIzo6moVQy7i3\nYw0ub0C3WlUhfFlx0MeTd4YNG+a0jUg9MWBAA9iFtBuJAxCn8B90uv0dnfNuyQAAAABJRU5ErkJg\ngg==\n" } }, "cell_type": "markdown", "id": "0ae98287", "metadata": {}, "source": [ "This plot shows the probability density of ${ P(\\text{location}, \\text{food}) }$, as well as the marginal distributions ${ P(\\text{location}) }$ above and ${ P(\\text{food}) }$ to the right. The dashed red line is the correlation between Location and Food.\n", "\n", "As you can see, there is no _a priori_ association between the quality of food and the location.\n", "\n", "However, in order for a restaurant to survive, it must attract a certain number of clientele.\n", "\n", "In the model below, we introduce a _selection criterion_. Restaurants that do not exceed the minimum popularity `cutoff` go out of business.\n", "\n", "![](attachment:generated/conditional-dependence/restaurant.png)\n", "\n", "Below, we condition the model on ${\\text{popularity} > 1}$. Restaurants more popular than the cutoff survive while the others go out of business. We depict this conditioning by shading the “popularity” node in the DAG.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "c6a23942", "metadata": {}, "outputs": [], "source": [ "@memo\n", "def critic_posterior[_f: Food, _l: Location](cutoff=1):\n", " critic: knows(_f, _l)\n", " critic: thinks[\n", " restaurant: knows(_f, _l),\n", " restaurant: chooses(f in Food, wpp=normpdfjit(f, 0, 0.4)),\n", " restaurant: chooses(l in Location, wpp=normpdfjit(l, 0, 0.4)),\n", "\n", " clientele: knows(restaurant.f, restaurant.l),\n", " clientele: chooses(p in Popularity, wpp=popularity_pdf(p, restaurant.f, restaurant.l))\n", " ]\n", "\n", " critic: observes_that[ popularity_value(clientele.p) > cutoff ]\n", "\n", " return critic[Pr[restaurant.f == _f, restaurant.l == _l]]\n", "\n", "cutoff_ = 1\n", "g = jointprob_facetgrid(\n", " critic_posterior(cutoff=cutoff_), \n", " Food, \n", " Location, \n", " label_dim0=\"Location\", \n", " label_dim1=\"Food\", \n", " title=fr\"$P(Location,Food \\mid popularity > {cutoff_})$\",\n", " cmap=\"inferno\")" ] }, { "cell_type": "markdown", "id": "1e46e27b", "metadata": {}, "source": [ "The selection criterion induces a negative correlation between Location and Food. Try changing the cutoff value and see what happens to the correlation. The more stringent the selection, the stronger the correlation.\n", "\n", "Really good restaurants can survive in bad locations because they’re worth the effort of getting to, and terrible restaurants can survive in Hanover because it’s hard for the population to go elsewhere.\n", "\n", "This simple example illustrates a very common phenomenon in causal inference: selection on a variable changes associations between the variable’s causal antecedents. In this case, conditioning on the collider $P$ induced statistical dependence between the causally independent variables, $F$ and $L$.\n" ] }, { "cell_type": "markdown", "id": "cefac6c4", "metadata": {}, "source": [ "## Summary\n", "\n", "The key patterns of conditional dependence are determined by causal structure:\n", "\n", "| Motif | Structure | Marginal | Conditional on $Z$ |\n", "| ---------------------------- | ------------------------------- | --------------- | ---------------------- |\n", "| **Fork** (common cause) | $A \\leftarrow Z \\rightarrow B$ | $A \\not\\perp B$ | $A \\perp B \\mid Z$ |\n", "| **Pipe** (mediator) | $A \\rightarrow Z \\rightarrow B$ | $A \\not\\perp B$ | $A \\perp B \\mid Z$ |\n", "| **Collider** (common effect) | $A \\rightarrow Z \\leftarrow B$ | $A \\perp B$ | $A \\not\\perp B \\mid Z$ |\n", "\n", "- **Screening off**: Conditioning on a common cause or mediator renders its effects conditionally independent. The intuition is that $Z$ carries all the information that $A$ and $B$ share, so once $Z$ is known, $A$ provides no additional information about $B$.\n", "- **Explaining away**: Conditioning on a common effect induces dependence between its causes. Learning that $Z$ occurred, together with information about one cause, changes what we should believe about the other cause.\n" ] }, { "cell_type": "markdown", "id": "3d29c6fc", "metadata": {}, "source": [ "## References\n", "\n", "Pearl, Judea. (2014). _Probabilistic Reasoning in Intelligent Systems: Networks of Plausible Inference_ (1. Aufl). Elsevier Reference Monographs.\n" ] }, { "cell_type": "markdown", "id": "78405977", "metadata": {}, "source": [ "## Exercises\n", "\n", "1. Consider a medical scenario: a disease (D) causes both a fever (F) and a rash (R). Draw the DAG. Are F and R marginally dependent or independent? What happens to the dependence between F and R if you learn the patient’s disease status?\n", "\n", "2. Now consider: both a cold (C) and allergies (A) can cause a runny nose (N). Draw the DAG. Are C and A marginally dependent or independent? What happens when you learn the patient has a runny nose?\n", "\n", "3. A university admits students based on a combination of test scores (T) and interview performance (I). Among the general applicant population, T and I are independent. What pattern of dependence would you expect between T and I _among admitted students_? Which causal motif does this correspond to?\n" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.14.3" } }, "nbformat": 4, "nbformat_minor": 5 }