{ "cells": [ { "cell_type": "markdown", "id": "072b9717-5c25-4985-a446-b288ad927380", "metadata": {}, "source": [ "# Double counterfactual prediction" ] }, { "cell_type": "markdown", "id": "f476ed9d-9ff3-43b3-b86f-228a41a03852", "metadata": {}, "source": [ "## We will be performing a double counterfactual prediction in this tutorial, recreating the CellDISECT results from benchmarking scenario 2 of the paper on the Eraslan et al. data." ] }, { "cell_type": "code", "execution_count": 1, "id": "6bf2e169-803b-4b90-aafe-240b83fb8f4c", "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Global seed set to 0\n", "Global seed set to 0\n" ] } ], "source": [ "# enable autoreload\n", "%load_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "\n", "import os\n", "import random\n", "\n", "import scvi\n", "scvi.settings.seed = 0\n", "import scanpy as sc\n", "import anndata as ad\n", "import torch\n", "import numpy as np\n", "import pandas as pd\n", "import gc\n", "import scipy\n", "from scipy.stats import pearsonr\n", "from scipy.stats import wasserstein_distance\n", "torch.set_float32_matmul_precision('medium')\n", "import matplotlib.pyplot as plt\n", "from matplotlib.pyplot import rc_context\n", "import seaborn as sns\n", "\n", "import warnings\n", "from tqdm import tqdm\n", "warnings.simplefilter(\"ignore\", UserWarning)\n", "warnings.filterwarnings(\"ignore\")\n", "\n", "\n", "from celldisect import CellDISECT" ] }, { "cell_type": "code", "execution_count": 2, "id": "eb124178-9876-4e7b-adc5-23a47cdc8220", "metadata": { "tags": [] }, "outputs": [], "source": [ "RANDOM_SEED = 42\n", "\n", "adata = sc.read_h5ad('/lustre/scratch126/cellgen/team205/aa34/Arian/Dis2P/eraslan_preprocessed1212_split_deg.h5ad')\n", "adata = adata[adata.layers['counts'].sum(1) != 0].copy()\n", "if scipy.sparse.issparse(adata.X):\n", " adata.X = adata.X.todense()\n", "if scipy.sparse.issparse(adata.layers['counts']):\n", " adata.layers['counts'] = adata.layers['counts'].todense()\n", " \n", "adata.X = adata.layers['counts'].copy()\n", "\n", "cats = ['tissue', 'Sample ID', 'sex', 'Age_bin']" ] }, { "cell_type": "code", "execution_count": 3, "id": "ba1b37d8-e281-4c00-9f01-0808b2090f86", "metadata": { "tags": [] }, "outputs": [], "source": [ "cell_type_included = False # Set to True if you have provided a cell type annotation in the cats list\n", "\n", "if not cell_type_included:\n", " adata.obs[\"_cluster\"] = (\n", " \"0\" # Dummy obs for inference (not-training) time, to avoid computing neighbors and clusters again in setup_anndata | AVOID ADDING BEFORE TRAINING\n", " )" ] }, { "cell_type": "code", "execution_count": 4, "id": "634d1137-52b6-4196-ac25-800d7bc24471", "metadata": { "tags": [] }, "outputs": [], "source": [ "n_samples_from_source_max = 500" ] }, { "cell_type": "markdown", "id": "2b280004-0d17-4a40-a6a2-acaa38244e20", "metadata": {}, "source": [ "## We have already trained the model without cell type information using the default parameters as in the example:\n", "https://github.com/Lotfollahi-lab/CellDISECT/blob/main/examples/training_example.py" ] }, { "cell_type": "code", "execution_count": 5, "id": "48373c42-6c80-4d17-af4e-66016ec197cb", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[34mINFO \u001b[0m File \n", " \u001b[35m/lustre/scratch126/cellgen/team205/aa34/Arian/Dis2P/models/\u001b[0m\u001b[35m/dis2p_cE_split_2/pretrainAE_0_maxEpochs_1000_s\u001b[0m\n", " \u001b[35mplit_split_2_reconW_20_cfWeight_0.8_beta_0.003_clf_0.05_adv_0.014_advp_5_n_cf_1_lr_0.003_wd_5e-05_new_cf_T\u001b[0m\n", " \u001b[35mrue_dropout_0.1_n_hidden_128_n_latent_32_n_layers_2batch_size_256_NoCT/\u001b[0m\u001b[95mmodel.pt\u001b[0m already downloaded \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Cluster covariate already present in adata.obs, remove in case you want to re-run, skipping!\n" ] } ], "source": [ "pre_path = '/lustre/scratch126/cellgen/team205/aa34/Arian/Dis2P/models/'\n", "\n", "split_name = 'split_2'\n", "gc.collect()\n", "\n", "celldisect_model_path = (\n", " f'dis2p_cE_{split_name}/'\n", "f'pretrainAE_0_maxEpochs_1000_split_{split_name}_reconW_20_cfWeight_0.8_beta_0.003_clf_0.05_adv_0.014_advp_5_n_cf_1_lr_0.003_wd_5e-05_new_cf_True_dropout_0.1_n_hidden_128_n_latent_32_n_layers_2batch_size_256_NoCT'\n", ")\n", "\n", "model = CellDISECT.load(f\"{pre_path}/{celldisect_model_path}\", adata=adata)" ] }, { "cell_type": "markdown", "id": "9a8a792f-9787-4bac-9019-538ca2c0eb91", "metadata": {}, "source": [ "## We are aiming to predict, what would Epithelial female breast cells look like, given if they were male prostate gland cells.\n", "### So this is a double counterfactual, aiming to change 2 of the covariates at the same time in the cells, `sex`, and `tissue` in this case.\n", "We are also using just the Epithelial subset of the dataset, since we want to do the counterfactuals on this group of cells.\n", "You can take a look at the documentation of the `predict_counterfactuals` method for more details." ] }, { "cell_type": "code", "execution_count": 6, "id": "93dd56ef-d90d-4e49-b571-799dc44368b2", "metadata": { "tags": [] }, "outputs": [], "source": [ "cell_type_to_check = 'Epithelial cell (luminal)'\n", "n_samples_from_source = min(n_samples_from_source_max, len(adata[(adata.obs['Broad cell type'] == cell_type_to_check) &\n", " (adata.obs['tissue'] == 'breast') & (adata.obs['sex'] == 'female')]))\n", "\n", "\n", "cov_names = ['sex', 'tissue']\n", "cov_values = ['female', 'breast']\n", "cov_values_cf = ['male', 'prostate gland']\n", "\n", "adata_ = adata[adata.obs['Broad cell type'] == cell_type_to_check].copy()" ] }, { "cell_type": "code", "execution_count": 7, "id": "e5cf0c77-a029-4be9-925a-0a21d9926aa2", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[34mINFO \u001b[0m AnnData object appears to be a copy. Attempting to transfer setup. \n", "\u001b[34mINFO \u001b[0m AnnData object appears to be a copy. Attempting to transfer setup. \n" ] } ], "source": [ "x_ctrl, x_true, x_pred = model.predict_counterfactuals(\n", " adata_,\n", " cov_names=cov_names,\n", " cov_values=cov_values,\n", " cov_values_cf=cov_values_cf,\n", " cats=cats,\n", " n_samples_from_source=n_samples_from_source,\n", " seed=RANDOM_SEED,\n", " )\n", "\n", "x_ctrl, x_true, x_pred = np.log1p(x_ctrl), np.log1p(x_true), np.log1p(x_pred)" ] }, { "cell_type": "markdown", "id": "6f45ff01-6971-4fd0-b37f-ba3048fb4db3", "metadata": {}, "source": [ "The `predict_counterfactuals` method gave us the `control cells (female breast)`, `true cells (actual male prostate)`, and `CellDISECT's prediction of female breast --> male prostate` as output." ] }, { "cell_type": "markdown", "id": "f28f75f0-7601-4948-8a66-94be8690365c", "metadata": {}, "source": [ "We have the differentially expressed genes related to this transformation precomputed. You can compute these genes with the code in the following notebook:\n", "https://github.com/stathismegas/CellDISECT_reproducibility/blob/main/figure_notebooks/eraslan/eraslan_preprocess_scenario_splits.ipynb" ] }, { "cell_type": "code", "execution_count": 8, "id": "ccf2671f-8510-4fe1-b0bd-767e4e7a2330", "metadata": { "tags": [] }, "outputs": [], "source": [ "deg_list = adata.uns['rank_genes_groups_split_2']['male_prostate gland']" ] }, { "cell_type": "code", "execution_count": 9, "id": "16cd35f2-9320-4733-8fc8-841b10041510", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array(['KLK4', 'AC005152.3', 'LINC01152', 'HP', 'CD177', 'KLK3',\n", " 'PLA2G2A', 'XIST', 'KLK2', 'CPLX3', 'NKX3-1', 'RP11-395B7.2',\n", " 'MSMB', 'ATOH8', 'ACPP', 'MT1G', 'S100P', 'ANKRD30A', 'NEFH',\n", " 'IFI6', 'PCAT4', 'PGC', 'FTL', 'SLC45A3', 'CKB', 'GP2',\n", " 'LINC01297', 'SLC38A11', 'MT1M', 'RPS4Y1', 'FGL1', 'RP1-288H2.2',\n", " 'PLPP1', 'SORD', 'AKAP12', 'CYP1B1', 'SFN', 'ADIRF', 'CPNE4',\n", " 'GPX3', 'UBA52', 'TIMP1', 'KIT', 'TMEFF2', 'TRPM8', 'ATP5E',\n", " 'GABRP', 'HSPA1A', 'STAC2', 'UQCR10', 'MT2A', 'HERPUD1', 'S100A11',\n", " 'SCD', 'RP11-33A14.1', 'SLC4A4', 'MT1E', 'PSCA', 'RP11-126O1.4',\n", " 'UBB', 'VTCN1', 'IFITM3', 'AGR2', 'SCNN1G', 'TMSB10', 'NDUFA4',\n", " 'SCHLAP1', 'AMD1', 'B2M', 'NDRG1', 'PSAP', 'KRT15', 'RP11-384F7.2',\n", " 'STEAP2', 'CPE', 'COX7C', 'FAU', 'PRDX1', 'AQP3', 'ALOX15B',\n", " 'GADD45G', 'SHROOM1', 'SERF2', 'LSAMP', 'DHCR24', 'UQCRB', 'ZNF90',\n", " 'C19orf48', 'POLR2L', 'COX6B1', 'CST3', 'TXNRD1', 'ESR1', 'OOEP',\n", " 'HGD', 'TPT1', 'NDUFS5', 'TSPO', 'AC009478.1', 'RNF19B', 'PART1',\n", " 'UQCRQ', 'FN1', 'APOO', 'MTRNR2L8', 'ANKRD36C', 'BARX2',\n", " 'RP11-356O9.1', 'COX5B', 'FOLH1', 'FXYD3', 'BMPR1B', 'TMPRSS2',\n", " 'SYNM', 'DHFR', 'FADS2', 'TBC1D3P1-DHX40P1', 'CSTB', 'SEPW1',\n", " 'GAPDH', 'SYT1', 'SERPINA3', 'EEF1A1', 'H2AFJ', 'ALDOA',\n", " 'RP11-608O21.1', 'GABRG3', 'ATP5L', 'ADAMTS9', 'CRISPLD1', 'PFN1',\n", " 'GRM7', 'RP11-368L12.1', 'GRN', 'FTH1', 'SDC1', 'SELM', 'DBI',\n", " 'COX7A2', 'TACSTD2', 'PPDPF', 'CYP4F22', 'C14orf2', 'ALDH1A2',\n", " 'UQCRH', 'COX4I1', 'MTRNR2L12', 'SOD2', 'PDE11A', 'PRUNE2', 'PDK4',\n", " 'ARHGAP40', 'PERP', 'XPO5', 'CTSB', 'ACTG1', 'PI15', 'RNF144B',\n", " 'GLUL', 'CACNA1C', 'KRT19', 'SLC39A6', 'LMO7', 'FASN', 'SPDEF',\n", " 'BAIAP2L1', 'ACSM3', 'TMEM178B', 'CACNB2', 'TFCP2L1', 'ELF3',\n", " 'MGP', 'MYL6', 'MRPL41', 'ESRRG', 'KRT7', 'THBS1', 'MBOAT2',\n", " 'CD24', 'AC072062.1', 'PLEKHA7', 'HSPB1', 'AZGP1', 'CLDN4', 'DSP',\n", " 'TTC6', 'SOX4', 'PLAT', 'XBP1', 'MYBPC1', 'HS3ST4', 'DSTN',\n", " 'SPINT1', 'AIM1', 'HES1', 'CPEB4', 'ACTB', 'RBPJ', 'SORBS2',\n", " 'RASGEF1B'], dtype=object)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deg_list" ] }, { "cell_type": "markdown", "id": "a9ed9bbc-1265-4b28-b88f-51862912d2ca", "metadata": {}, "source": [ "## Earth Mover's Distance metric on 20 DEGs and all genes" ] }, { "cell_type": "code", "execution_count": 13, "id": "b2e6a74a-d9a6-4272-a664-e1126edf9654", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CellDISECTControl
200.5062720.636810
all0.1083330.088362
\n", "
" ], "text/plain": [ " CellDISECT Control\n", "20 0.506272 0.636810\n", "all 0.108333 0.088362" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "emd_results = {}\n", "for n_top_deg in [20, None]:\n", " if n_top_deg is not None:\n", " degs = np.where(np.isin(adata.var_names, deg_list[:n_top_deg]))[0]\n", " else:\n", " degs = np.arange(adata.n_vars)\n", " n_top_deg = 'all'\n", "\n", " x_true_deg = x_true[:, degs]\n", " x_pred_deg = x_pred[:, degs]\n", " x_ctrl_deg = x_ctrl[:, degs]\n", " \n", " emd_results[str(n_top_deg)] = {}\n", " for method_name, method in zip(['CellDISECT', 'Control'], [x_pred_deg, x_ctrl_deg]):\n", " wd = []\n", " for i in range(x_true_deg.shape[1]):\n", " wd.append(\n", " wasserstein_distance(torch.tensor(x_true_deg[:, i]), torch.tensor(method[:, i]))\n", " )\n", " emd_results[str(n_top_deg)][method_name] = np.mean(wd)\n", "\n", "emd_results = pd.DataFrame.from_dict(emd_results).T\n", "emd_results" ] }, { "cell_type": "markdown", "id": "22735db5-d6eb-4bcb-b54c-f51f5556f629", "metadata": {}, "source": [ "## Pearson Correlation metric on 20 DEGs and all genes" ] }, { "cell_type": "code", "execution_count": 15, "id": "b7981e30-75a6-4a23-b98a-ac5caffe2d08", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CellDISECTControlCellDISECT_varControl_var
200.889936-0.3239580.780835-0.311901
all0.4906950.2821200.5688460.292532
\n", "
" ], "text/plain": [ " CellDISECT Control CellDISECT_var Control_var\n", "20 0.889936 -0.323958 0.780835 -0.311901\n", "all 0.490695 0.282120 0.568846 0.292532" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2_results = {}\n", "for n_top_deg in [20, None]:\n", " if n_top_deg is not None:\n", " degs = np.where(np.isin(adata.var_names, deg_list[:n_top_deg]))[0]\n", " else:\n", " degs = np.arange(adata.n_vars)\n", " n_top_deg = 'all'\n", "\n", " x_true_deg = x_true[:, degs]\n", " x_pred_deg = x_pred[:, degs]\n", " x_ctrl_deg = x_ctrl[:, degs]\n", " \n", "\n", " r2_mean_deg = pearsonr(x_true_deg.mean(0), x_pred_deg.mean(0))\n", " r2_mean_base_deg = pearsonr(x_true_deg.mean(0), x_ctrl_deg.mean(0))\n", " \n", " r2_var_deg = pearsonr(x_true_deg.var(0), x_pred_deg.var(0))\n", " r2_var_base_deg = pearsonr(x_true_deg.var(0), x_ctrl_deg.var(0))\n", " \n", " r2_results[str(n_top_deg)] = {}\n", " r2_results[str(n_top_deg)]['CellDISECT'] = r2_mean_deg[0]\n", " r2_results[str(n_top_deg)]['Control'] = r2_mean_base_deg[0]\n", "\n", " r2_results[str(n_top_deg)]['CellDISECT_var'] = r2_var_deg[0]\n", " r2_results[str(n_top_deg)]['Control_var'] = r2_var_base_deg[0]\n", " \n", "r2_results = pd.DataFrame.from_dict(r2_results).T\n", "r2_results" ] }, { "cell_type": "code", "execution_count": 23, "id": "82d729d8-a7c1-4918-8ad4-6fe464ffe97d", "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "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A7Vv3z7Vrl1b//rXvyqiRgAAAOCKXXLwve666/T9999r6dKl+t///qczZ85o5MiRGjRokMPNbgAAAMDV5JKDryRVq1ZNgwcPLu9aAAAAgApzycH3gw8+uOD+oUOHXnYxAAAAQEW55OA7btw4h8+FhYXKy8uTu7u7PD09Cb4AAAC4Kl3yUx1+//13h+3MmTNKTU1Vp06duLkNAAAAV61LDr4ladq0qV599dVis8EAAADA1aJcgq/05w1vx44dK6/DAQAAAOXqktf4rl692uGzYRg6fvy43n77bUVGRpZbYQAAAEB5uuTg26dPH4fPFotFAQEBuv322/XGG2+UV10AAABAubrk4Guz2SqiDgAAAKBCXdYLLAAAAMri8MutnV0CKlH9iT84u4QLKlPwjY2NLfMBZ86cednFAAAAABWlTMH322+/LdPBLBbLFRUDAAAAVJQyBd9NmzZVdB0AAABAhSq35/gCAAAAV7PLurlt586d+ve//63Dhw+roKDAYd+qVavKpTAAAACgPF3yjO/SpUvVsWNHpaSk6OOPP1ZhYaH27NmjjRs3ys/PryJqBAAAAK7YJQffadOmadasWfrss8/k7u6uN998U3v37tX999+v+vXrV0SNAAAAwBW75OB74MAB9erVS5Lk7u6u3NxcWSwWjR8/XvPmzSv3AgEAAIDycMnBt0aNGsrJyZEk1atXTz/++KMkKTMzU3l5eeVbHQAAAFBOyhx8zwfcLl26aP369ZKkfv36ady4cRo1apQGDBigbt26VUyVAAAAwBUq81MdbrjhBt18883q06eP+vXrJ0l6/vnn5ebmpq+//lp9+/bVCy+8UGGFAgAAAFeizMF38+bNWrhwoeLi4jR16lT17dtXDz30kJ599tmKrA8AAAAoF2Ve6tC5c2ctWLBAx48f11tvvaW0tDR17dpVzZo102uvvab09PSKrBMAAAC4Ipd8c5uXl5dGjBihzZs36+eff1a/fv0UHx+v+vXr6+67766IGgEAAIArdkWvLG7SpImee+45vfDCC/Lx8dHatWvLqy4AAACgXF3WK4sl6csvv9SCBQu0cuVKubi46P7779fIkSPLszYAAACg3FxS8D127JgWLVqkRYsWaf/+/erYsaPmzJmj+++/X15eXhVVIwAAAHDFyhx877jjDm3YsEG1a9fW0KFD9eCDD+r666+vyNoA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4FIYAACn+O233wyLxWJMmzbtgv1mzZplbNy40Th48KCRlJRkXH/99cajjz5qGIZh5OfnG7NnzzZ8fX2N48ePG8ePHzdycnIMwzCMhx56yOjYsaPx5ZdfGvv37zemT59uWK1W4+effzYMwzC++uorw8XFxZg+fbqRmppqxMfHGzVr1jT8/Pzs5161apXh5uZmxMfHG6mpqcYbb7xhuLq6Ghs3brT3kWQEBgYaCxYsMA4cOGAcOnTImDp1qhEWFuZwHY899pjRpUuX8vjqAOCyEHwBwEm2b99uSDJWrVp1SeOWL19u1KpVy/554cKFDmHVMAzj0KFDhqurq3H06FGH9m7duhkTJkwwDMMw+vfvb/Tq1cth/6BBgxyO1bFjR2PUqFEOffr162fceeed9s+SjMcff9yhz9GjRw1XV1dj+/bthmEYRkFBgVG7dm1j0aJFl3StAFCeWOoAAE5iGEaZ+m3YsEHdunVTvXr15OPjoyFDhui3335TXl5eqWN++OEHFRUVqVmzZvL29rZvmzdv1oEDByRJqampat++vcO4v39OSUlRZGSkQ1tkZKRSUlIc2tq1a+fwuW7duurVq5cWLFggSfrss8+Un5+vfv36lemaAaAicHMbADhJ06ZNZbFYLngDW1pamu666y49+uijmjp1qmrWrKmvvvpKI0eOVEFBgTw9PUscd+bMGbm6umrXrl1ydXV12Oft7V2u1yFJXl5exdoeeughDRkyRLNmzdLChQvVv3//UusFgMrAjC8AOEnNmjUVHR2t+Ph45ebmFtufmZmpXbt2yWaz6Y033tAtt9yiZs2a6dixYw793N3dVVRU5NB24403qqioSCdOnFCTJk0ctuDgYEnS9ddfr2+++cZh3N8/t2jRQlu2bHFo27Jli8LCwi56fXfeeae8vLyUkJCgxMREPfjggxcdAwAVieALAE4UHx+voqIitW/fXitXrtS+ffuUkpKiOXPmKCIiQk2aNFFhYaHeeust/fLLL/rwww81d+5ch2OEhobqzJkzSkpK0qlTp5SXl6dmzZpp0KBBGjp0qFatWqWDBw9qx44diouL09q1ayVJY8eO1bp16zRz5kzt27dP7777rj7//HNZLBb7sZ966iktWrRICQkJ2rdvn2bOnKlVq1bpySefvOi1ubq6avjw4ZowYYKaNm2qiIiI8v3yAOBSOXuRMQCY3bFjx4yYmBijQYMGhru7u1GvXj3j7rvvNjZt2mQYhmHMnDnTqFOnjlG9enUjOjra+OCDDwxJxu+//24/xiOPPGLUqlXLkGRMmjTJMIw/byibOHGiERoaari5uRl16tQx7r33XuN///uffdy8efOMevXqGdWrVzf69OljTJkyxQgODnao75133jEaNWpkuLm5Gc2aNTM++OADh/2SjI8//rjEaztw4IAhyXj99dev+HsCgCtlMYwy3l0BALjmjRo1Snv37tV///vfcjnef//7X3Xr1k1HjhxRUFBQuRwTAC4XN7cBgInNmDFD3bt3l5eXlz7//HMtXrxY77zzzhUfNz8/XydPntTkyZPVr18/Qi+AqwJrfAHAxHbs2KHu3burdevWmjt3rubMmaOHHnroio/7r3/9Sw0aNFBmZqZef/31cqgUAK4cSx0AAABgCsz4AgAAwBQIvgAAADAFgi8AAABMgeALAAAAUyD4AgAAwBQIvgAAADAFgi8AAABMgeALAAAAU/j/yF7h2B5RR0sAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAIjCAYAAADlfxjoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABI+klEQVR4nO3deVRV1f//8dcFmREQEVBCccAZ9ROmIaWWmOZcpmbklNo309JM+2jlkKVUjlmkZY59My2H7KOmKaaVWRZmmaI5gJgKzqCYQHB+f/Tzfj83QEGBK57nY62zVnefvc95nwvLXm73OcdiGIYhAAAA4DbnYO8CAAAAgNJA8AUAAIApEHwBAABgCgRfAAAAmALBFwAAAKZA8AUAAIApEHwBAABgCgRfAAAAmALBFwAAAKZA8AUAlHn9+/dXSEhIsR5z0aJFslgsSkpKKtbjArAfgi+AUtWlSxe5u7vr4sWLBfaJjo6Ws7Ozzp49W2J1WCwW6+bg4KAqVarogQce0NatW0vsnGXN1q1b9fDDDyswMFDOzs7y9/dX586dtWrVKnuXVqymTJmizz77zN5lACgFBF8ApSo6Olp//vmnVq9ene/+y5cva82aNWrfvr0qVqxYorW0bdtWH374oRYvXqynnnpKv/76q+6//3598cUXJXresmDChAm677779Ntvv+l//ud/NHfuXI0ePVqXLl1S9+7dtXTpUnuXWGwKCr59+vTRn3/+qWrVqpV+UQBKRDl7FwDAXLp06aLy5ctr6dKl6tu3b579a9asUUZGhqKjo2/qPFeuXJGzs7McHAr++33t2rX1+OOPWz8/9NBDatSokWbNmqUHH3zwps5fWIWps7StWLFCkyZN0iOPPKKlS5fKycnJum/06NHauHGjsrOzb/o8f/31l3Jzc+Xs7JxnX0ZGhjw8PG76HDfD0dFRjo6Odq0BQPG6df6kBWAKbm5uevjhhxUXF6dTp07l2b906VKVL19eXbp00blz5zRq1CiFhYXJ09NTXl5eevDBB/XLL7/YjNm6dassFouWLVuml19+WUFBQXJ3d1d6enqRagsLC5Ofn58SExOtbfv379cjjzwiX19fubq6qmnTpvr8889txhVHndnZ2XrllVcUGhoqV1dXVaxYUffcc482bdpkc4wtW7bo3nvvlYeHh3x8fNS1a1clJCTY9Jk4caIsFosOHTqk/v37y8fHR97e3howYIAuX7583e9h3Lhx8vX11YIFC2xC71Xt2rVTp06drJ9PnTqlgQMHKiAgQK6urmrcuLEWL15sMyYpKUkWi0XTpk3TrFmzVLNmTbm4uGjfvn3Wevft26fHHntMFSpU0D333GMd+7//+78KDw+Xm5ubfH199eijj+rYsWPXvY5p06apRYsWqlixotzc3BQeHq4VK1bY9LFYLMrIyNDixYutS1/69+8vqeA1vu+++64aNGggFxcXValSRUOHDtWFCxds+rRu3VoNGzbUvn37dN9998nd3V1BQUF68803r1s3gJLDjC+AUhcdHa3Fixfrk08+0bBhw6zt586d08aNG9W7d2+5ublp7969+uyzz9SjRw9Vr15dqampeu+999SqVSvt27dPVapUsTnuq6++KmdnZ40aNUqZmZn5ziRey/nz53X+/HnVqlVLkrR3715FRkYqKChIY8aMkYeHhz755BN169ZNK1eu1EMPPSRJOnLkyE3XOXHiRMXExGjQoEFq1qyZ0tPT9dNPP2nXrl1q27atJGnz5s168MEHVaNGDU2cOFF//vmn3n77bUVGRmrXrl15bu7q2bOnqlevrpiYGO3atUsffPCB/P399cYbbxT4HRw8eFD79+/XE088ofLly1/3O/vzzz/VunVrHTp0SMOGDVP16tX16aefqn///rpw4YKGDx9u03/hwoW6cuWKnnzySbm4uMjX19e6r0ePHgoNDdWUKVNkGIYkafLkyRo3bpx69uypQYMG6fTp03r77bfVsmVL/fzzz/Lx8SmwtrfeektdunRRdHS0srKytGzZMvXo0UNr165Vx44dJUkffvih9Tt/8sknJUk1a9Ys8JgTJ07UK6+8oqioKA0ZMkQHDhzQnDlz9OOPP2r79u02f1E4f/682rdvr4cfflg9e/bUihUr9O9//1thYWGl9i8KAP7BAIBS9tdffxmVK1c2IiIibNrnzp1rSDI2btxoGIZhXLlyxcjJybHpk5iYaLi4uBiTJk2ytn311VeGJKNGjRrG5cuXC1WDJGPgwIHG6dOnjVOnThk//PCD0aZNG0OSMX36dMMwDKNNmzZGWFiYceXKFeu43Nxco0WLFkZoaKi1rTjqbNy4sdGxY8dr1tykSRPD39/fOHv2rLXtl19+MRwcHIy+ffta2yZMmGBIMp544gmb8Q89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fLOyshQfH6+oqChrm4ODg6KiorRjx458x7Ro0ULx8fHWoHvkyBGtX79eHTp0KPA8mZmZSk9Pt9kAAABQ9pWZ4HvmzBnl5OQoICDApj0gIEApKSn5jnnsscc0adIk3XPPPXJyclLNmjXVunXray51iImJkbe3t3ULDg4u1usAAABo3bq1RowYUezHnThxopo0aVLsx71dlJngeyO2bt2qKVOm6N1339WuXbu0atUqrVu3Tq+++mqBY8aOHau0tDTrduzYsVKsGAAA2Fv//v1lsVj01FNP5dk3dOhQWSwW9e/fv1DH2rp1qywWiy5cuFC8ReKGlJmnOvj5+cnR0VGpqak27ampqQoMDMx3zLhx49SnTx8NGjRIkhQWFqaMjAw9+eSTeumll/JdJO3i4iIXF5fivwAAAFBmBAcHa9myZZo5c6b1iRVXrlzR0qVLVbVqVTtXhxtVZmZ8nZ2dFR4erri4OGtbbm6u4uLiFBERke+Yy5cv5wm3jo6OksSDtgEAQIHuvPNOBQcHa9WqVda2VatWqWrVqvrXv/5lbcvNzVVMTIyqV68uNzc3NW7cWCtWrJAkJSUl6b777pMkVahQIc9McW5url544QX5+voqMDBQEydOtKkhOTlZXbt2laenp7y8vNSzZ888E4Cvv/66AgICVL58eQ0cOFBXrlwp5m/i9lJmgq8kjRw5UvPmzdPixYuVkJCgIUOGKCMjQwMGDJAk9e3bV2PHjrX279y5s+bMmaNly5YpMTFRmzZt0rhx49S5c2drAAYAAMjPE088oYULF1o/L1iwwJo5roqJidGSJUs0d+5c7d27V88995wef/xxbdu2TcHBwVq5cqUk6cCBAzp58qTeeust69jFixfLw8NDP/zwg958801NmjRJmzZtkvR3KO7atavOnTunbdu2adOmTTpy5Ih69eplHf/JJ59o4sSJmjJlin766SdVrlxZ7777bkl+JWVemVnqIEm9evXS6dOnNX78eKWkpKhJkybasGGD9Ya35ORkmxnel19+WRaLRS+//LKOHz+uSpUqqXPnzpo8ebK9LgEAAJQRjz/+uMaOHaujR49KkrZv365ly5Zp69atkv5+EtSUKVO0efNm678+16hRQ99++63ee+89tWrVSr6+vpIkf39/+fj42By/UaNGmjBhgiQpNDRU77zzjuLi4tS2bVvFxcVpz549SkxMtN5ov2TJEjVo0EA//vij7rrrLs2aNUsDBw7UwIEDJUmvvfaaNm/ezKzvNZSp4CtJw4YN07Bhw/Ldd/UX8apy5cppwoQJ1l8qAACAwqpUqZI6duyoRYsWyTAMdezYUX5+ftb9hw4d0uXLl9W2bVubcVlZWTbLIQrSqFEjm8+VK1e2vpQrISFBwcHBNk+Xql+/vnx8fJSQkKC77rpLCQkJeW7Ai4iI0FdffVXkazWLMhd8AQAASssTTzxhnXCLjY212Xfp0iVJ0rp16xQUFGSzrzA3yjs5Odl8tlgsys3NvZlycR0E31tc+Ogl9i4BpSh+al97lwAA+C/t27dXVlaWLBaL2rVrZ7Ovfv36cnFxUXJyslq1apXveGdnZ0lSTk5Okc5br149HTt2TMeOHbPO+u7bt08XLlxQ/fr1rX1++OEH9e37f//v+P7774t0HrMh+AIAABTA0dFRCQkJ1v/+b+XLl9eoUaP03HPPKTc3V/fcc4/S0tK0fft2eXl5qV+/fqpWrZosFovWrl2rDh06yM3NTZ6entc9b1RUlMLCwhQdHa1Zs2bpr7/+0tNPP61WrVqpadOmkqThw4erf//+atq0qSIjI/XRRx9p7969qlGjRvF/EbeJMvVUBwAAgNLm5eUlLy+vfPe9+uqrGjdunGJiYlSvXj21b99e69atU/Xq1SVJQUFBeuWVVzRmzBgFBAQUeJ/SP1ksFq1Zs0YVKlRQy5YtFRUVpRo1amj58uXWPr169dK4ceP0wgsvKDw8XEePHtWQIUNu/oJvYxaDB9peU3p6ury9vZWWllbgL31JYqmDubDUAUBZcuXKFSUmJqp69epydXW1dzm4zV3r962weY0ZXwAAAJgCwRcAAACmQPAFAACAKRB8AQAAYAoEXwAAAJgCwRcAAACmQPAFAACAKRB8AQAAYAoEXwAAAJhCOXsXAAAAbi+l/dZRe731cuLEifrss8+0e/duSVL//v114cIFffbZZ3apB9fHjC8AADCllJQUPfPMM6pRo4ZcXFwUHByszp07Ky4urliO379/f1ksFlksFjk5OSkgIEBt27bVggULlJuba9M3JCREs2bNsn7+5Zdf1KVLF/n7+8vV1VUhISHq1auXTp06JUlKSkqyHvuf2/fff289TlZWlt588001btxY7u7u8vPzU2RkpBYuXKjs7OwCj3F1mzhxYrF8F7cKZnwBAIDpJCUlKTIyUj4+Ppo6darCwsKUnZ2tjRs3aujQodq/f3+xnKd9+/ZauHChcnJylJqaqg0bNmj48OFasWKFPv/8c5UrlzeKnT59Wm3atFGnTp20ceNG+fj4KCkpSZ9//rkyMjJs+m7evFkNGjSwaatYsaKkv0Nvu3bt9Msvv+jVV19VZGSkvLy89P3332vatGn617/+pZMnT1rHLV++XOPHj9eBAwesbZ6ensXyPRRFTk6OLBaLHByKf36W4AsAAEzn6aeflsVi0c6dO+Xh4WFtb9CggZ544glJ0oULFzRq1CitWbNGmZmZatq0qWbOnKnGjRsX+jwuLi4KDAyUJAUFBenOO+/U3XffrTZt2mjRokUaNGhQnjHbt29XWlqaPvjgA2swrl69uu677748fStWrGg9/j/NmjVLX3/9tX766Sf961//srbXqFFDPXr0UFZWls21e3t7y2KxFHi8f8rNzVXVqlX10ksvaciQIdb2n3/+WeHh4UpMTFS1atU0Y8YMLVy4UEeOHJGvr686d+6sN9980xqqFy1apBEjRmjJkiUaM2aMfv/9dx06dEghISGFqqMoWOoAAABM5dy5c9qwYYOGDh1qE/yu8vHxkST16NFDp06d0hdffKH4+HjdeeedatOmjc6dO3dT57///vvVuHFjrVq1Kt/9gYGB+uuvv7R69WoZhnHD5/noo48UFRVlE3qvcnJyyvfai8LBwUG9e/fW0qVL85w3MjJS1apVs/abPXu29u7dq8WLF2vLli164YUXbMZcvnxZb7zxhj744APt3btX/v7+N1VbgTWXyFEBAABuUYcOHZJhGKpbt26Bfb799lvt3LlTn376qZo2barQ0FBNmzZNPj4+WrFixU3XULduXSUlJeW77+6779aLL76oxx57TH5+fnrwwQc1depUpaam5unbokULeXp62mxXHTx48JrXWByio6O1fft2JScnS/p7FnjZsmWKjo629hkxYoTuu+8+hYSE6P7779drr72mTz75xOY42dnZevfdd9WiRQvVqVNH7u7uJVIvwRcAAJhKYWZRf/nlF126dEkVK1a0CZWJiYk6fPhwsdRgsVgK3D958mSlpKRo7ty5atCggebOnau6detqz549Nv2WL1+u3bt322z/fY6S1qRJE9WrV88667tt2zadOnVKPXr0sPbZvHmz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NFQWi+WaN7AlJSWpU6dOGjJkiCZPnixfX199++23GjhwoLKysuTu7p7vuEuXLsnR0VHx8fFydHS02efp6Vms1yFJHh4eedoGDRqkPn36aObMmVq4cKF69epVYL0AUBqY8QUAO/H19VW7du0UGxurjIyMPPsvXLig+Ph45ebmavr06br77rtVu3ZtnThxwqafs7OzcnJybNr+9a9/KScnR6dOnVKtWrVstsDAQElSnTp19OOPP9qM++fnevXqafv27TZt27dvV/369a97fR06dJCHh4fmzJmjDRs26IknnrjuGAAoSQRfALCj2NhY5eTkqFmzZlq5cqUOHjyohIQEzZ49WxEREapVq5ays7P19ttv68iRI/rwww81d+5cm2OEhITo0qVLiouL05kzZ3T58mXVrl1b0dHR6tu3r1atWqXExETt3LlTMTExWrdunSTpmWee0fr16zVjxgwdPHhQ7733nr744gtZLBbrsUePHq1FixZpzpw5OnjwoGbMmKFVq1Zp1KhR1702R0dH9e/fX2PHjlVoaKgiIiKK98sDgKKy9yJjADC7EydOGEOHDjWqVatmODs7G0FBQUaXLl2Mr776yjAMw5gxY4ZRuXJlw83NzWjXrp2xZMkSQ5Jx/vx56zGeeuopo2LFioYkY8KECYZh/H1D2fjx442QkBDDycnJqFy5svHQQw8Zv/76q3Xc+++/bwQFBRlubm5Gt27djNdee80IDAy0qe/dd981atSoYTg5ORm1a9c2lixZYrNfkrF69ep8r+3w4cOGJOPNN9+86e8JAG6WxTAKeXcFAOC2N3jwYO3fv1/ffPNNsRzvm2++UZs2bXTs2DEFBAQUyzEB4EZxcxsAmNi0adPUtm1beXh46IsvvtDixYv17rvv3vRxMzMzdfr0aU2cOFE9evQg9AK4JbDGFwBMbOfOnWrbtq3CwsI0d+5czZ49W4MGDbrp43788ceqVq2aLly4oDfffLMYKgWAm8dSBwAAAJgCM74AAAAwBYIvAAAATIHgCwAAAFMg+AIAAMAUCL4AAAAwBYIvAAAATIHgCwAAAFMg+AIAAMAU/h/mfwsqQ8KZVwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_long = r2_results[['CellDISECT', 'Control']].reset_index().melt(id_vars='index', \n", " var_name='Method', \n", " value_name='Value')\n", "df_long.rename(columns={'index': 'Category'}, inplace=True)\n", "\n", "# Create the grouped barplot\n", "plt.figure(figsize=(8, 6))\n", "sns.barplot(data=df_long, x='Category', y='Value', hue='Method')\n", "\n", "# Customize the plot\n", "plt.title(\"Mean Pearson Correlation\")\n", "plt.ylabel('Value')\n", "\n", "# Show the plot\n", "plt.show()\n", "\n", "df_long = r2_results[['CellDISECT_var', 'Control_var']].reset_index().melt(id_vars='index', \n", " var_name='Method', \n", " value_name='Value')\n", "df_long.rename(columns={'index': 'Category'}, inplace=True)\n", "\n", "# Create the grouped barplot\n", "plt.figure(figsize=(8, 6))\n", "sns.barplot(data=df_long, x='Category', y='Value', hue='Method')\n", "\n", "# Customize the plot\n", "plt.title(\"Var Pearson Correlation\")\n", "plt.ylabel('Value')\n", "\n", "# Show the plot\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "fe21f196-625c-4f77-a1ad-67c1d6da1aea", "metadata": {}, "source": [ "## Delta Pearson Correlation metric on 20 DEGs and all genes" ] }, { "cell_type": "code", "execution_count": 16, "id": "47b3a3a1-363b-451b-9d78-f1f813185e2e", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CellDISECTCellDISECT_var
200.7297440.641065
all0.4005090.151026
\n", "
" ], "text/plain": [ " CellDISECT CellDISECT_var\n", "20 0.729744 0.641065\n", "all 0.400509 0.151026" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r2_results_subtract = {}\n", "for n_top_deg in [20, None]:\n", " if n_top_deg is not None:\n", " degs = np.where(np.isin(adata.var_names, deg_list[:n_top_deg]))[0]\n", " else:\n", " degs = np.arange(adata.n_vars)\n", " n_top_deg = 'all'\n", "\n", " x_true_deg = x_true[:, degs]\n", " x_pred_deg = x_pred[:, degs]\n", " x_ctrl_deg = x_ctrl[:, degs]\n", " \n", "\n", " r2_mean_deg = pearsonr(x_true_deg.mean(0) - x_ctrl_deg.mean(0), x_pred_deg.mean(0) - x_ctrl_deg.mean(0))\n", " \n", " r2_var_deg = pearsonr(x_true_deg.var(0) - x_ctrl_deg.var(0), x_pred_deg.var(0) - x_ctrl_deg.var(0))\n", " \n", " r2_results_subtract[str(n_top_deg)] = {}\n", " r2_results_subtract[str(n_top_deg)]['CellDISECT'] = r2_mean_deg[0]\n", "\n", " r2_results_subtract[str(n_top_deg)]['CellDISECT_var'] = r2_var_deg[0]\n", " \n", "r2_results_subtract = pd.DataFrame.from_dict(r2_results_subtract).T\n", "r2_results_subtract" ] } ], "metadata": { "kernelspec": { "display_name": "disect", "language": "python", "name": "disect" }, "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.19" } }, "nbformat": 4, "nbformat_minor": 5 }