{ "cells": [ { "cell_type": "markdown", "id": "4cc6761d-dc6e-4356-90bb-0ab585c06dc6", "metadata": {}, "source": [ "# Stage 3: Counterfactual prediction\n", "\n", "In this tutorial, we will walk through how to use the CASCADE model trained\n", "in [stage 2](training.ipynb) to conduct counterfactual inference." ] }, { "cell_type": "code", "execution_count": 1, "id": "4ce5fe21-bb6d-4f1f-913c-154ef60f767e", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:32.257466Z", "iopub.status.busy": "2025-03-20T14:30:32.257018Z", "iopub.status.idle": "2025-03-20T14:30:37.078870Z", "shell.execute_reply": "2025-03-20T14:30:37.077980Z", "shell.execute_reply.started": "2025-03-20T14:30:32.257420Z" } }, "outputs": [], "source": [ "import anndata as ad\n", "import networkx as nx\n", "import numpy as np\n", "import scanpy as sc\n", "import seaborn as sns\n", "\n", "from cascade.data import configure_dataset, encode_regime, get_configuration\n", "from cascade.graph import annotate_explanation, core_explanation_graph, prep_cytoscape\n", "from cascade.model import CASCADE\n", "from cascade.plot import set_figure_params" ] }, { "cell_type": "code", "execution_count": 2, "id": "1d698607-eb9b-444e-8839-5b9fd6a3cba3", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:37.080190Z", "iopub.status.busy": "2025-03-20T14:30:37.079728Z", "iopub.status.idle": "2025-03-20T14:30:37.089966Z", "shell.execute_reply": "2025-03-20T14:30:37.089229Z", "shell.execute_reply.started": "2025-03-20T14:30:37.080165Z" } }, "outputs": [], "source": [ "set_figure_params()" ] }, { "cell_type": "markdown", "id": "e096b394-a954-4f3a-bbaf-8aae48262871", "metadata": {}, "source": [ "## Read data and model" ] }, { "cell_type": "code", "execution_count": 3, "id": "6e965b63-6dca-45e2-83a1-a3a011d6cae4", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:37.090969Z", "iopub.status.busy": "2025-03-20T14:30:37.090758Z", "iopub.status.idle": "2025-03-20T14:30:42.044911Z", "shell.execute_reply": "2025-03-20T14:30:42.043894Z", "shell.execute_reply.started": "2025-03-20T14:30:37.090950Z" } }, "outputs": [], "source": [ "adata = sc.read_h5ad(\"adata.h5ad\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "b0fddc6e-96fb-4df8-9d1b-85a45a242116", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:42.046333Z", "iopub.status.busy": "2025-03-20T14:30:42.046114Z", "iopub.status.idle": "2025-03-20T14:30:42.576659Z", "shell.execute_reply": "2025-03-20T14:30:42.575741Z", "shell.execute_reply.started": "2025-03-20T14:30:42.046314Z" } }, "outputs": [], "source": [ "cascade = CASCADE.load(\"tune.pt\")" ] }, { "cell_type": "code", "execution_count": 5, "id": "90e869da-4c66-4956-90b7-e53e22b160d0", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:42.578453Z", "iopub.status.busy": "2025-03-20T14:30:42.578007Z", "iopub.status.idle": "2025-03-20T14:30:46.737700Z", "shell.execute_reply": "2025-03-20T14:30:46.736849Z", "shell.execute_reply.started": "2025-03-20T14:30:42.578426Z" } }, "outputs": [], "source": [ "scaffold = nx.read_gml(\"scaffold.gml.gz\")\n", "graph = nx.read_gml(\"discover.gml.gz\")" ] }, { "cell_type": "markdown", "id": "66c8a476-c921-4c19-b5f6-5e3bdd81eb80", "metadata": {}, "source": [ "## Specify counterfactual condition\n", "\n", "Suppose we want to predict the counterfactual effect of triple gene perturbation\n", "`\"CEBPB,KLF1,MAPK1\"` for the negative control cells, we'll need to first extract\n", "some control cells, and then specify the perturbation in a column in `adata.obs`\n", "(e.g., `\"my_pert\"`), in the same comma-separated format as the `\"knockup\"` column:" ] }, { "cell_type": "code", "execution_count": 6, "id": "5a15621c-2984-46b8-8f0c-ea528ea2b92f", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:46.740134Z", "iopub.status.busy": "2025-03-20T14:30:46.739917Z", "iopub.status.idle": "2025-03-20T14:30:46.780473Z", "shell.execute_reply": "2025-03-20T14:30:46.779677Z", "shell.execute_reply.started": "2025-03-20T14:30:46.740115Z" } }, "outputs": [], "source": [ "ctrl = adata[adata.obs[\"knockup\"] == \"\"]\n", "sc.pp.subsample(ctrl, n_obs=1000)\n", "ctrl.obs[\"my_pert\"] = \"CEBPB,KLF1,MAPK1\"" ] }, { "cell_type": "markdown", "id": "15f77fe6-671f-476e-8a66-1568bd51176b", "metadata": {}, "source": [ "Then we call [encode_regime](api/cascade.data.encode_regime.rst) again to\n", "encode this counterfactual perturbation into a binary regime matrix,\n", "here in a new layer called `\"ctfact\"`:" ] }, { "cell_type": "code", "execution_count": 7, "id": "02c85109-5c4d-49e9-95fd-3e40a9f2aa89", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:46.781654Z", "iopub.status.busy": "2025-03-20T14:30:46.781336Z", "iopub.status.idle": "2025-03-20T14:30:46.856585Z", "shell.execute_reply": "2025-03-20T14:30:46.855846Z", "shell.execute_reply.started": "2025-03-20T14:30:46.781635Z" } }, "outputs": [], "source": [ "encode_regime(ctrl, \"ctfact\", key=\"my_pert\")" ] }, { "cell_type": "markdown", "id": "07489735-504f-40e2-aaa3-21247abbccd4", "metadata": {}, "source": [ "We'd also need to call [configure_dataset](api/cascade.data.configure_dataset.rst)\n", "again to let the model use this new regime:" ] }, { "cell_type": "code", "execution_count": 8, "id": "98bacafd-8794-4525-b6dc-e7a647c05323", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:46.857602Z", "iopub.status.busy": "2025-03-20T14:30:46.857397Z", "iopub.status.idle": "2025-03-20T14:30:46.864782Z", "shell.execute_reply": "2025-03-20T14:30:46.864106Z", "shell.execute_reply.started": "2025-03-20T14:30:46.857582Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m22:30:46.858\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mdata\u001b[0m:\u001b[36mconfigure_dataset\u001b[0m - \u001b[33m\u001b[1mOverwriting existing `regime` = \"interv\".\u001b[0m\n" ] }, { "data": { "text/plain": [ "{'covariate': 'covariate',\n", " 'layer': 'counts',\n", " 'regime': 'ctfact',\n", " 'size': 'ncounts'}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "configure_dataset(ctrl, use_regime=\"ctfact\")\n", "get_configuration(ctrl)" ] }, { "cell_type": "markdown", "id": "73347548-94b4-42ae-a037-f13f2f32152f", "metadata": {}, "source": [ "## Run counterfactual prediction\n", "\n", "Now we use the `counterfactual` method to perform counterfactual prediction\n", "with this newly specified perturbation:" ] }, { "cell_type": "code", "execution_count": 9, "id": "6023871a-1e3a-4174-b5f8-c248623be190", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:46.865572Z", "iopub.status.busy": "2025-03-20T14:30:46.865396Z", "iopub.status.idle": "2025-03-20T14:30:49.578851Z", "shell.execute_reply": "2025-03-20T14:30:49.578063Z", "shell.execute_reply.started": "2025-03-20T14:30:46.865556Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m22:30:46.885\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mutils\u001b[0m:\u001b[36mautodevice\u001b[0m - \u001b[1mUsing GPU [3] as computation device.\u001b[0m\n", "\u001b[32m22:30:47.051\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mcore\u001b[0m:\u001b[36mpredict_mode\u001b[0m - \u001b[1mNumber of topological generations: [68, 88, 70, 101]\u001b[0m\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "371da51767e44dfb817024b79cdc7ab7", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Predicting: | …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ctfact = cascade.counterfactual(ctrl, sample=True)" ] }, { "cell_type": "markdown", "id": "f525a369-0fd1-4104-ae27-663f213604fd", "metadata": {}, "source": [ "Here we specified `sample=True` to make the model output random samples from the\n", "counterfactual negative binomial distribution, which would better represent\n", "the distribution than a simple mean.\n", "\n", "The prediction will be saved in both `ctfact.X` and `ctfact.layers[\"X_ctfact\"]`,\n", "where `ctfact.X` is the average prediction across SVGD particles, and\n", "`ctfact.layers[\"X_ctfact\"]` contains the per-particle predictions with shape\n", "`(n_obs, n_vars, n_particles)`. Note that both of these are in raw count scale." ] }, { "cell_type": "code", "execution_count": 10, "id": "4309b965-b1cd-48fc-acad-2751e9b92e46", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:49.580781Z", "iopub.status.busy": "2025-03-20T14:30:49.580156Z", "iopub.status.idle": "2025-03-20T14:30:49.587641Z", "shell.execute_reply": "2025-03-20T14:30:49.587044Z", "shell.execute_reply.started": "2025-03-20T14:30:49.580746Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 6.5 , 16.5 , ..., 0. , 0. , 72.25],\n", " [ 1. , 10.5 , 23.25, ..., 0. , 0. , 140. ],\n", " [ 0. , 11.75, 32.75, ..., 0. , 0. , 157.5 ],\n", " ...,\n", " [ 0.25, 6. , 19.5 , ..., 0. , 0. , 59.25],\n", " [ 0.25, 9. , 19.5 , ..., 0. , 0. , 90.75],\n", " [ 0.5 , 4.5 , 18. , ..., 0. , 0. , 77.25]],\n", " dtype=float32)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctfact.X" ] }, { "cell_type": "code", "execution_count": 11, "id": "83835396-0e73-499c-9c74-4210f343b8af", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:49.588578Z", "iopub.status.busy": "2025-03-20T14:30:49.588346Z", "iopub.status.idle": "2025-03-20T14:30:49.594830Z", "shell.execute_reply": "2025-03-20T14:30:49.593951Z", "shell.execute_reply.started": "2025-03-20T14:30:49.588555Z" } }, "outputs": [ { "data": { "text/plain": [ "(1000, 1064, 4)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctfact.layers[\"X_ctfact\"].shape" ] }, { "attachments": {}, "cell_type": "markdown", "id": "fb8c7a2a-4503-460d-9d06-85f9bdfea91b", "metadata": {}, "source": [ "> For counterfactual prediction of [CASCADE designs](design.ipynb), you would\n", "> also need to specify the `design` argument to the `counterfactual` method.\n", "\n", "Please visit the documentation of\n", "[counterfactual](api/cascade.model.CASCADE.counterfactual.rst)\n", "for more details.\n", "\n", "The same can also be achieved using the\n", "[command line interface](cli.rst#counterfactual-deduction),\n", "with the following command:\n", "\n", "```sh\n", "cascade counterfactual -d ctrl.h5ad -m tune.pt -p ctfact.h5ad [other options]\n", "```\n", "\n", "## Counterfactual differential expression comparison\n", "\n", "To check for counterfactual effects, we are expected to compare the predicted\n", "dataset (`ctfact`) with the input dataset (`ctrl`). However, to avoid artifacts\n", "caused by model prediction biases, it is recommended to compare the predicted\n", "dataset (`ctfact`) with a \"nil prediction\", i.e., model prediction with the\n", "original perturbation labels.\n", "\n", "Here, we can go back to use the `\"interv\"` regime to obtain the \"nil prediction\":" ] }, { "cell_type": "code", "execution_count": 12, "id": "a23a0494-93fd-495f-9c8a-279baf5775ea", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:49.595984Z", "iopub.status.busy": "2025-03-20T14:30:49.595741Z", "iopub.status.idle": "2025-03-20T14:30:49.603594Z", "shell.execute_reply": "2025-03-20T14:30:49.602734Z", "shell.execute_reply.started": "2025-03-20T14:30:49.595961Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m22:30:49.596\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mdata\u001b[0m:\u001b[36mconfigure_dataset\u001b[0m - \u001b[33m\u001b[1mOverwriting existing `regime` = \"ctfact\".\u001b[0m\n" ] }, { "data": { "text/plain": [ "{'covariate': 'covariate',\n", " 'layer': 'counts',\n", " 'regime': 'interv',\n", " 'size': 'ncounts'}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "configure_dataset(ctrl, use_regime=\"interv\")\n", "get_configuration(ctrl)" ] }, { "cell_type": "code", "execution_count": 13, "id": "7a5fff11-85c0-4da5-8c77-2f8d87eff28d", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:49.604760Z", "iopub.status.busy": "2025-03-20T14:30:49.604533Z", "iopub.status.idle": "2025-03-20T14:30:51.809545Z", "shell.execute_reply": "2025-03-20T14:30:51.808543Z", "shell.execute_reply.started": "2025-03-20T14:30:49.604739Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m22:30:49.790\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mcore\u001b[0m:\u001b[36mpredict_mode\u001b[0m - \u001b[1mNumber of topological generations: [68, 88, 70, 101]\u001b[0m\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7a20c015a98d4bf4abd61a34c37275f3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Predicting: | …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nil = cascade.counterfactual(ctrl, sample=True)" ] }, { "cell_type": "markdown", "id": "a9267e9c-bf1c-48b7-86c1-aa441754c549", "metadata": {}, "source": [ "Now we combine and log-normalize both predictions to perform differential\n", "expression analysis:" ] }, { "cell_type": "code", "execution_count": 14, "id": "dd55957f-c075-4900-8d3a-133faab1c4c9", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:51.811022Z", "iopub.status.busy": "2025-03-20T14:30:51.810783Z", "iopub.status.idle": "2025-03-20T14:30:51.868684Z", "shell.execute_reply": "2025-03-20T14:30:51.867795Z", "shell.execute_reply.started": "2025-03-20T14:30:51.810999Z" } }, "outputs": [ { "data": { "text/plain": [ "AnnData object with n_obs × n_vars = 2000 × 1064\n", " obs: 'guide_id', 'gemgroup', 'ncounts', 'knockup', 'my_pert', 'role'\n", " obsm: 'X_pca', 'covariate'\n", " layers: 'counts', 'interv', 'ctfact', 'X_ctfact'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined = ad.concat({\"nil\": nil, \"ctfact\": ctfact}, label=\"role\", index_unique=\"-\")\n", "combined.X = np.log1p(combined.X * (1e4 / combined.obs[[\"ncounts\"]].to_numpy()))\n", "combined" ] }, { "cell_type": "code", "execution_count": 15, "id": "6b471dd7-d1ab-442b-91e3-70889a766c6a", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:51.869927Z", "iopub.status.busy": "2025-03-20T14:30:51.869701Z", "iopub.status.idle": "2025-03-20T14:30:51.986242Z", "shell.execute_reply": "2025-03-20T14:30:51.985352Z", "shell.execute_reply.started": "2025-03-20T14:30:51.869907Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/rd1/user/caozj/CASCADE/conda/lib/python3.11/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in log10\n", " result = getattr(ufunc, method)(*inputs, **kwargs)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namesscoreslogfoldchangespvalspvals_adjpct_nz_group-logfdr
0KLF1207.0350041.9519550.00.01.0350.0
1PNMT171.3830872.3641750.00.01.0350.0
2CEBPB152.7144932.1311280.00.01.0350.0
3TMSB10144.0048831.2323790.00.01.0350.0
4MAPK1134.2145841.0472040.00.01.0350.0
\n", "
" ], "text/plain": [ " names scores logfoldchanges pvals pvals_adj pct_nz_group -logfdr\n", "0 KLF1 207.035004 1.951955 0.0 0.0 1.0 350.0\n", "1 PNMT 171.383087 2.364175 0.0 0.0 1.0 350.0\n", "2 CEBPB 152.714493 2.131128 0.0 0.0 1.0 350.0\n", "3 TMSB10 144.004883 1.232379 0.0 0.0 1.0 350.0\n", "4 MAPK1 134.214584 1.047204 0.0 0.0 1.0 350.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sc.tl.rank_genes_groups(combined, \"role\", reference=\"nil\", rankby_abs=True, pts=True)\n", "de_df = sc.get.rank_genes_groups_df(combined, \"ctfact\").query(\"pct_nz_group > 0.05\")\n", "de_df[\"-logfdr\"] = -np.log10(de_df[\"pvals_adj\"]).clip(lower=-350)\n", "de_df.head()" ] }, { "cell_type": "code", "execution_count": 16, "id": "d09be7f2-3d84-4cac-86bf-a67414f39549", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:51.987575Z", "iopub.status.busy": "2025-03-20T14:30:51.987281Z", "iopub.status.idle": "2025-03-20T14:30:52.153651Z", "shell.execute_reply": "2025-03-20T14:30:52.152845Z", "shell.execute_reply.started": "2025-03-20T14:30:51.987554Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 302, "width": 322 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ax = sns.scatterplot(data=de_df, x=\"logfoldchanges\", y=\"-logfdr\", edgecolor=None, s=5)" ] }, { "cell_type": "markdown", "id": "3dae1376-b45b-403b-9465-6675551e7141", "metadata": {}, "source": [ "## Explain counterfactual prediction\n", "\n", "To understand why CASCADE made the above prediction, we can use the `explain`\n", "method to decompose the contribution into individual components in the model.\n", "\n", "The method needs both a factual dataset (`ctrl`) and a counterfactual\n", "prediction (`ctfact`), properly configured as below:" ] }, { "cell_type": "code", "execution_count": 17, "id": "63a55788-22eb-4fa6-ab4f-d662163d9134", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:52.154493Z", "iopub.status.busy": "2025-03-20T14:30:52.154303Z", "iopub.status.idle": "2025-03-20T14:30:52.159895Z", "shell.execute_reply": "2025-03-20T14:30:52.159104Z", "shell.execute_reply.started": "2025-03-20T14:30:52.154476Z" } }, "outputs": [ { "data": { "text/plain": [ "{'covariate': 'covariate',\n", " 'layer': 'counts',\n", " 'regime': 'interv',\n", " 'size': 'ncounts'}" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "configure_dataset(ctrl, use_regime=\"interv\")\n", "get_configuration(ctrl)" ] }, { "cell_type": "code", "execution_count": 18, "id": "5f694a09-b0f0-4edb-88db-5248d7608e83", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:52.160901Z", "iopub.status.busy": "2025-03-20T14:30:52.160695Z", "iopub.status.idle": "2025-03-20T14:30:52.167567Z", "shell.execute_reply": "2025-03-20T14:30:52.166760Z", "shell.execute_reply.started": "2025-03-20T14:30:52.160882Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\u001b[32m22:30:52.161\u001b[0m | \u001b[33m\u001b[1mWARNING \u001b[0m | \u001b[33m1633490\u001b[0m:\u001b[36mdata\u001b[0m:\u001b[36mconfigure_dataset\u001b[0m - \u001b[33m\u001b[1mOverwriting existing `layer` = \"counts\".\u001b[0m\n" ] }, { "data": { "text/plain": [ "{'covariate': 'covariate',\n", " 'layer': 'X_ctfact',\n", " 'regime': 'ctfact',\n", " 'size': 'ncounts'}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "configure_dataset(ctfact, use_layer=\"X_ctfact\")\n", "get_configuration(ctfact)" ] }, { "cell_type": "code", "execution_count": 19, "id": "5cb1e286-77fe-4026-ad0c-f534c57bc294", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:52.168550Z", "iopub.status.busy": "2025-03-20T14:30:52.168355Z", "iopub.status.idle": "2025-03-20T14:30:57.709280Z", "shell.execute_reply": "2025-03-20T14:30:57.708573Z", "shell.execute_reply.started": "2025-03-20T14:30:52.168531Z" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d2a9085620904ba2ab06f42eb4269b17", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Predicting: | …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "AnnData object with n_obs × n_vars = 1000 × 1064\n", " obs: 'guide_id', 'gemgroup', 'ncounts', 'knockup', 'my_pert'\n", " var: 'perturbed', 'highly_variable', 'highly_variable_rank', 'means', 'variances', 'variances_norm', 'selected'\n", " uns: '__CASCADE__', 'hvg', 'log1p', 'pca'\n", " obsm: 'X_pca', 'covariate'\n", " varm: 'PCs'\n", " layers: 'counts', 'interv', 'ctfact', 'X_ctfact', 'X_nil', 'X_ctrb_i', 'X_ctrb_s', 'X_ctrb_z', 'X_ctrb_ptr', 'X_tot'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "explanation = cascade.explain(ctrl, ctfact)\n", "explanation" ] }, { "cell_type": "markdown", "id": "d7e833e5-aa93-41e5-bfaa-751b2ee85878", "metadata": {}, "source": [ "The explanation is also an `AnnData` dataset with predictions from individual\n", "model components saved in separate layers.\n", "\n", "We can pass this explanation dataset to the\n", "[annotate_explanation](api/cascade.graph.annotate_explanation.rst) function\n", "to annotate the contributions on graph nodes and edges:" ] }, { "cell_type": "code", "execution_count": 20, "id": "4d3e1d66-f47b-4a2a-9326-37870de30fa4", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:57.710752Z", "iopub.status.busy": "2025-03-20T14:30:57.710488Z", "iopub.status.idle": "2025-03-20T14:30:58.442840Z", "shell.execute_reply": "2025-03-20T14:30:58.442093Z", "shell.execute_reply.started": "2025-03-20T14:30:57.710724Z" } }, "outputs": [ { "data": { "text/plain": [ "(1064, 12294)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "explanation_graph = annotate_explanation(\n", " graph, explanation, cascade.export_causal_map()\n", ")\n", "explanation_graph.number_of_nodes(), explanation_graph.number_of_edges()" ] }, { "cell_type": "markdown", "id": "63038ba9-d36c-4ef2-be3c-a151c82e34c4", "metadata": {}, "source": [ "Note that `annotate_explanation` has a `cutoff` argument (by default 0.2)\n", "that you may want to adjust, which specifies an cutoff of predicted effect\n", "(in log-normalized expression space), below which the effect is deemed too\n", "small to explain.\n", "\n", "We can then extract a core subgraph that explains expression changes for a\n", "specific list of genes (e.g., top 10 genes with the most prominent changes),\n", "using the [core_explanation_graph](api/cascade.graph.core_explanation_graph.rst)\n", "function:" ] }, { "cell_type": "code", "execution_count": 21, "id": "593cc1d5-7289-4be2-be59-78710ba89b66", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:58.445630Z", "iopub.status.busy": "2025-03-20T14:30:58.445424Z", "iopub.status.idle": "2025-03-20T14:30:58.451536Z", "shell.execute_reply": "2025-03-20T14:30:58.450840Z", "shell.execute_reply.started": "2025-03-20T14:30:58.445611Z" } }, "outputs": [ { "data": { "text/plain": [ "['KLF1',\n", " 'PNMT',\n", " 'CEBPB',\n", " 'TMSB10',\n", " 'MAPK1',\n", " 'S100A11',\n", " 'ISG15',\n", " 'SH3BGRL3',\n", " 'FCER1G',\n", " 'S100A10',\n", " 'GMFG',\n", " 'IL2RG',\n", " 'PIM1',\n", " 'NPW',\n", " 'BLVRB',\n", " 'ACTB',\n", " 'EMP3',\n", " 'NTRK1',\n", " 'LGALS1',\n", " 'RELN']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "response = de_df[\"names\"].head(20).to_list()\n", "response" ] }, { "cell_type": "code", "execution_count": 22, "id": "5ac858a8-0896-4984-8d9c-4262a8b508fd", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:58.452365Z", "iopub.status.busy": "2025-03-20T14:30:58.452189Z", "iopub.status.idle": "2025-03-20T14:30:58.462276Z", "shell.execute_reply": "2025-03-20T14:30:58.461579Z", "shell.execute_reply.started": "2025-03-20T14:30:58.452349Z" } }, "outputs": [ { "data": { "text/plain": [ "(50, 107)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "core_subgraph = core_explanation_graph(explanation_graph, response)\n", "core_subgraph.number_of_nodes(), core_subgraph.number_of_edges()" ] }, { "cell_type": "markdown", "id": "a5ba31b6-bd8b-4211-82b1-65048a4886f6", "metadata": {}, "source": [ "This core subgraph can be exported to [Cytoscape](https://cytoscape.org/)\n", "for visualization using the utility function\n", "[prep_cytoscape](api/cascade.graph.prep_cytoscape.rst):" ] }, { "cell_type": "code", "execution_count": 23, "id": "c3853472-eedd-4866-9381-d85f0cb1c6ea", "metadata": { "execution": { "iopub.execute_input": "2025-03-20T14:30:58.463041Z", "iopub.status.busy": "2025-03-20T14:30:58.462871Z", "iopub.status.idle": "2025-03-20T14:30:58.473348Z", "shell.execute_reply": "2025-03-20T14:30:58.472610Z", "shell.execute_reply.started": "2025-03-20T14:30:58.463025Z" } }, "outputs": [], "source": [ "nx.write_gml(\n", " prep_cytoscape(core_subgraph, scaffold, [\"CEBPB\", \"KLF1\", \"MAPK1\"], response),\n", " \"cytoscape.gml\",\n", ")" ] }, { "cell_type": "markdown", "id": "15af28e9-82f6-4171-9dea-b776a8ee48c1", "metadata": {}, "source": [ "You may download a template Cytoscape file containing corresponding styles from:\n", "\n", "- http://ftp.cbi.pku.edu.cn/pub/cascade-download/template.cys\n", "\n", "Click here to apply style:\n", "\n", "![style](style.png)\n", "\n", "Below is an example visualization of the above core explanation graph:\n", "\n", "![cytoscape](cytoscape.png)" ] } ], "metadata": { "jupytext": { "formats": "ipynb,py:percent" }, "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.11.9" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0f1d788bed1c4d8697011ea4071f9cfc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "125f147fd0464b09beda57280a3e3b62": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_1e983bcc805d43579cf629f29c07fb56", "style": "IPY_MODEL_ab6de4b1e6a04f2caaacb63f13ba77f9", "value": "Predicting DataLoader 0: 100%" } }, "1bb1b60182cf4ef4adf18bca655a149a": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "flex": "2" } }, "1e983bcc805d43579cf629f29c07fb56": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "28a254701fc14ac993a01cb1575818d7": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_7ce1cce07ff44d139b997ba79dad62a7", "style": "IPY_MODEL_306458bd0f454ed5b7f300e1cba4a3f9", "value": "Predicting DataLoader 0: 100%" } }, "306458bd0f454ed5b7f300e1cba4a3f9": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "371da51767e44dfb817024b79cdc7ab7": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_125f147fd0464b09beda57280a3e3b62", "IPY_MODEL_da507ec17fc04c81b949bbab5e611615", "IPY_MODEL_e81cc4db6bd147bbae5c2b9fa8456db3" ], "layout": "IPY_MODEL_3d71e59f742041b98210aa43bf5be879" } }, "3d71e59f742041b98210aa43bf5be879": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "display": "inline-flex", "flex_flow": "row wrap", "width": "100%" } }, "45aae0caff6d4001b36858e515aef625": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_a64bf78151694e9b8ca42f97c8dbe2cd", "max": 8, "style": "IPY_MODEL_83822011bcf1489c91679ed8a9af5437", "value": 8 } }, "4f87c774ceb3404ea5ec86e1dbec4972": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "552a372f615149ee994cd18dceed7ffc": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "573961df20774dba85968739efc199bc": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "6d927556d8264ee7ab7c391a7ab1b8de": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "7a20c015a98d4bf4abd61a34c37275f3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_28a254701fc14ac993a01cb1575818d7", "IPY_MODEL_ac5e5a6e472c4d999f2ef122982b3cbe", "IPY_MODEL_b6725a8af7fd410ab6eb1eff251dbef6" ], "layout": "IPY_MODEL_e1e8049263504f5fa1f40e7676d4ea73" } }, "7ce1cce07ff44d139b997ba79dad62a7": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "83822011bcf1489c91679ed8a9af5437": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "8a45696884ad4fc1b33f66a65ebdb6c4": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "flex": "2" } }, "8ec6b0227f0a40d2b6adc9a115a0cf48": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "922a3f7efe2841c4979850c0863a6a5f": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": {} }, "a35a27f447be4739a801f0c2c6ded9c2": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "display": "inline-flex", "flex_flow": "row wrap", "width": "100%" } }, "a64bf78151694e9b8ca42f97c8dbe2cd": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "flex": "2" } }, "ab6de4b1e6a04f2caaacb63f13ba77f9": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "ac5e5a6e472c4d999f2ef122982b3cbe": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_8a45696884ad4fc1b33f66a65ebdb6c4", "max": 8, "style": "IPY_MODEL_8ec6b0227f0a40d2b6adc9a115a0cf48", "value": 8 } }, "b0bd890f09924498b3b4005e1fd3e627": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } }, "b6725a8af7fd410ab6eb1eff251dbef6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_4f87c774ceb3404ea5ec86e1dbec4972", "style": "IPY_MODEL_573961df20774dba85968739efc199bc", "value": " 8/8 [00:01<00:00,  5.39it/s]" } }, "bd8e35959e96498fad4a16af61034ee4": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_0f1d788bed1c4d8697011ea4071f9cfc", "style": "IPY_MODEL_b0bd890f09924498b3b4005e1fd3e627", "value": " 8/8 [00:04<00:00,  1.65it/s]" } }, "d2a9085620904ba2ab06f42eb4269b17": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_dc7214b96486478986528cef0bfaebe6", "IPY_MODEL_45aae0caff6d4001b36858e515aef625", "IPY_MODEL_bd8e35959e96498fad4a16af61034ee4" ], "layout": "IPY_MODEL_a35a27f447be4739a801f0c2c6ded9c2" } }, "da507ec17fc04c81b949bbab5e611615": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_1bb1b60182cf4ef4adf18bca655a149a", "max": 8, "style": "IPY_MODEL_f22261696d94452594d7a703b2029c75", "value": 8 } }, "dc7214b96486478986528cef0bfaebe6": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_922a3f7efe2841c4979850c0863a6a5f", "style": "IPY_MODEL_6d927556d8264ee7ab7c391a7ab1b8de", "value": "Predicting DataLoader 0: 100%" } }, "e1e8049263504f5fa1f40e7676d4ea73": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "display": "inline-flex", "flex_flow": "row wrap", "width": "100%" } }, "e81cc4db6bd147bbae5c2b9fa8456db3": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_552a372f615149ee994cd18dceed7ffc", "style": "IPY_MODEL_fa44dbb9bc414f3abc1dc2367d176856", "value": " 8/8 [00:01<00:00,  4.25it/s]" } }, "f22261696d94452594d7a703b2029c75": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "fa44dbb9bc414f3abc1dc2367d176856": { "model_module": "@jupyter-widgets/controls", "model_module_version": "2.0.0", "model_name": "HTMLStyleModel", "state": { "description_width": "", "font_size": null, "text_color": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }