{ "cells": [ { "cell_type": "markdown", "id": "d24f37f0", "metadata": {}, "source": [ "# Tutorial spatial" ] }, { "cell_type": "markdown", "id": "4f5e3027-7d68-41b2-8d53-3f42fa12848b", "metadata": {}, "source": [ "**This tutorial is for running NS-Forest for spatial transcriptomic gene panel design.**\n", "\n", "**The first step is filtering non-zero median expression of all genes represented in the AnnData object.** This is done by taking the expression values for each gene for all cells, removing the zero values, and calculating the median per gene. Median is used instead of mean because mean is sensitive to outliers and skewed with noise. We can visualize these genes' non-zero median expression in a histogram and plot the 10th and 99th percentiles. We remove genes with relatively low or high expression. High expression can effect the spatial imaging results due to \"optical crowding\", resulting from excessive fluorescent signal from high transcript dense regions (https://www.nature.com/articles/s41467-021-27798-0). \n", "\n", "**The next step is filtering by transcript length.** In spatial transcriptomics, probes are designed to target each gene; genes with more probes tend to have higher sensitivity to be detected (https://pmc.ncbi.nlm.nih.gov/articles/PMC10054990/). The minimum transcript length is to ensure high detection. The transcript lengths are from Gencode's BioMart. Due to multiple transcript lengths associated with a single gene, the longest length is choosen. The NS-Forest package contains the gencode files for human (v47) and mouse (vM36), which can be found in the `gencode_annotation` folder. The default minimum transcript length is 700. This value is adjustable depending on the organ and species. For example, when looking at a mouse brain dataset, we chose 700 to include Sst (721bp), which is a well known neuronal inhibitory marker gene.\n", "\n", "Note: adata.var.index should be unique. It is recommended that the adata.var_names be the ensembl_id, but gene_symbol should work. \n", "\n", "**After running spaceTx_genefilter, the standard NS-Forest pipeline is run, including prep_medians, prep_binary_score, and nsforesting.NSForest. This pipeline outputs a set of 1-6 markers per cell type that can be used for spatial transcriptomic gene panel.** " ] }, { "cell_type": "markdown", "id": "09e1a223", "metadata": {}, "source": [ "### Setting up environment" ] }, { "cell_type": "code", "execution_count": 1, "id": "8a91b9cd", "metadata": {}, "outputs": [], "source": [ "import sys\n", "import os\n", "code_folder = \"C:/Users/bpeng/OneDrive - J. Craig Venter Institute/Documents/Github/NSForest\"\n", "sys.path.insert(0, os.path.abspath(code_folder))\n", "import numpy as np\n", "import pandas as pd\n", "import scanpy as sc\n", "import anndata as ad\n", "import matplotlib.pyplot as plt\n", "import plotly.io as pio\n", "pio.renderers.default = \"notebook\"\n", "import nsforest as ns\n", "from nsforest import utils" ] }, { "cell_type": "code", "execution_count": 2, "id": "ade71ff3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AnnData object with n_obs × n_vars = 871 × 16497\n", " obs: 'cluster'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cluster_header = \"cluster\"\n", "output_folder = \"../outputs_layer1_spatial/\"\n", "data_folder = \"../demo_data/\"\n", "file = data_folder + \"adata_layer1.h5ad\"\n", "adata = sc.read_h5ad(file)\n", "adata" ] }, { "cell_type": "markdown", "id": "27ae1090-f530-47a5-b3db-14ea386fd8a1", "metadata": {}, "source": [ "### Filtering genes to optimize spatial gene panels. " ] }, { "cell_type": "code", "execution_count": 3, "id": "e310124b-c56a-4ed6-bae7-0f29f44a0344", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Non-zero median expression percentile limits: \n", "0.10 1.584962\n", "0.99 8.898539\n", "dtype: float64\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAGxCAYAAACTN+exAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQz0lEQVR4nO3dC5zM9f7H8Q/WriUUcgvhHJXbUamULnTcTpFTTpyiUjlSRIpETqWba6FDN/5CJF2V7ijpSEV0Iyd1QhTRyW1d1rLzf7y/08zOzK5ltLtz+b2ej8eP7/zmOzPf+c1v5/eZ77WYz+fzGQAAQIIpHusCAAAAHA2CGAAAkJAIYgAAQEIiiAEAAAmJIAYAACQkghgAAJCQCGIAAEBCIogBAAAJiSAGAAAkJIIYxNS0adOsWLFiVqpUKVu/fn2u+1u2bGmNGjWKSdlwZPQZaQtYt26d+0z12aLoXXvttVa7du2kOPR6H3o/wKEQxCAuZGZm2j//+c9YFwMFoFq1avbRRx9Z+/btOZ4xcNddd9mcOXM49vAEghjEhb/85S82a9Ys++KLL8wrDh486IK3ZJOWlmZnn322HX/88eZlWpZu7969Rf66f/jDH+y0004r8tcFYoEgBnFh0KBBVrFiRbvjjjsOm3ffvn02ZMgQq1OnjqWmptoJJ5xgffr0se3bt+eqiu7QoYO9/fbbdvrpp1t6erqdcsop9tRTTx1RmdREomaRvLbQppLNmzdbr169rEaNGq48Kte9995rBw4cyNXEMnr0aHvggQdcHl3sFy5c6O6fO3eunXPOOVa6dGkrW7astWnTxtVmHM7777/vnlcBoI6dakGOOeYYu+SSS+znn3+2Xbt22Q033GCVKlVy23XXXWcZGRm5LraPPfaYnXrqqe4YHXfccXb55Zfb999/nyufyn/iiSe65j8d07feeitXmfJqTvruu+/ca9erV8+9R31mKuNXX32V5/t59tlnbejQoVa9enUrV66ctW7d2r755psj+ty+/fZb69q1q1WuXNkd4/r169ujjz4adv7oIv/HP/7RduzYEfY5Vq1a1X3uCjBFTRk6nqtWrbJWrVpZmTJlXHB288032549e8JeV+XW/ieeeMK9pl57+vTpR1Qmyc7OdufGySef7D6HY4891v70pz/ZI488EsyzdetW93nWrFnTPY/Kcu6559qCBQvybU4q7L+ZrKws996uvvrqXPfpNfQ8t912W7AsAwYMcOdb+fLlrUKFCu7cf/XVV+1Im591juV13uj/UDou+tx0Dum807F69913D/s6SCBaxRqIlalTp2oVdd+yZct8jzzyiEu/++67wftbtGjha9iwYfB2dna2r127dr6UlBTfXXfd5Zs3b57voYce8pUpU8Z32mmn+fbt2xfMe+KJJ/pq1Kjha9Cgge/pp5/2vfPOO77OnTu711i0aNFhy7Zq1SrfRx99FLa1bt3aV6JECd+SJUtcnk2bNvlq1qzpXuvJJ5/0LViwwHf//ff70tLSfNdee23wudauXete94QTTvBdeOGFvhdffNGVXfufeeYZd1/btm19r7zyiu+5557zNW3a1Jeamur797//nW8ZFy5c6B6r19frvf32274nnnjCd8wxx7jXadOmjW/gwIHutUaNGuXK3rdv37Dn6Nmzp69kyZK+AQMGuMfPmjXLd8opp/iqVKni27x5czDfPffc416rR48evrfeess3adIk936qVq3qPqfI96rPNkDHW8+v9630nDlzfJdeeqkvPT3d95///CfX+6ldu7avW7duvjfeeMP37LPP+mrVquWrV6+e78CBA4f9zMqXL+9r3Lix+8z1vvW6xYsX9w0bNiyYb82aNb6yZcv6OnXq5G4fPHjQ9+c//9lXuXJl308//RTM1717d/c56PUffPBB93x6Hp1/HTp0CHvtwOf7pz/9yR3D9957z7dy5cojLtOIESPc56PjrL8BfRbjx48Py6Nz//jjj3fH/v3333fny9133+2bPXt2WJl1PhT138ytt97qPs8dO3aE7X/sscfc47/88kt3e/v27e5cnTFjhjtGep86R3U8pk+fHvZYlUfvJ/L7QudYqMB5o/8D9PzFihVz59nLL7/se+2119xnpmOsv1MkB4IYxE0Qk5mZ6atbt67vjDPOcF+8eQUx+sJT/tGjR4c9jy782q8v99AvwFKlSvnWr18f3Ld3715fhQoVfL169Yq6rGPGjMn1GnoeBQyhryG6SCivLmChF/Y//OEPvv379wfz6eJZvXp1d4FTOmDXrl3ugtq8efN8yxT48r7kkkvC9vfv39/t79evX9h+faHr/QcoMFO+hx9+OCzfhg0b3AVp0KBB7va2bdvcsbzsssvC8n344Yfu8YcLYiIpGNFxUGCii1/k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5VGH5WHDhrk86lzasmVLW7VqVVie2267zSpUqGC1atWy2bNnh933/PPPu9dIdi1btrT+/fuH7WvevLlt2rTJTUIXTwhi4mkByMsv92+hi0ECAN8hh7V7925r0qSJTZw48ZB5Ro8ebWPHjnV5li1bZlWrVrU2bdrYrl273P2vvfaazZo1y+bNm2ejRo2y6667zv73v/+5+1QDMXToUHtUNV0xEsvJB1NTU93xirsO374ktWPHDs3S5P4HAByZvXv3+r7++mv3f5iMjENv0eTds+fI8v4O+u6fM2dO2L7s7Gxf1apVfSNHjgzu27dvn698+fK+J554wt0eNWqU7+9//3vw/sqVK/uWLl3q0j179vSNHTv2iF7/nnvu8TVp0sQ9b40aNXzp6em+yy+/3Ldt27awfE899ZTvlFNO8aWlpflOPvlk36OPPhq8b+3ate59PPfcc74WLVq4PMovU6ZM8TVo0MCXmprq3lOfPn2Cj9u+fbsr6/HHH+8rW7as78ILL/R9/vnnucr29NNP+0488URfuXLl3HveuXOnu7979+7udUM3lWXhwoUuHXgPU6dOdccu1Ny5c32nn366K2udOnV8w4YN82VlZUV3nkV5/WZ00lGqPfiNw+ZZN7L90T49AMSXwGScebn4YrM3Qr4TK1fOmYE8UosW6mCRc7t2bbNffsmdr4BnC9bEaps3b7a2bdsG96WlpVmLFi1syZIl1qtXL1eTM2nSJNu2bZt9//33tnfvXvvjH/9oixcvthUrVtjjjz9+xK/33XffueYn1e5oLaAePXpYnz597JlnnnH3T5482e655x5XK3TaaafZZ599Zj179rQyZcpY98BiwGZ2xx132MMPP2xTp0515VUZ1OQ1cuRIu+iii9z6Qh9++OFvh8xn7du3d81hb775pmv6efLJJ61Vq1a2Zs0at1/++9//uua2119/3b3XLl26uOd78MEH7ZFHHnF5GzVqZPfdd5/LrzmD1q1bl+/7feedd+yqq66yf/3rX3b++ee717jhhhvcfXqfhYUgBgCQ9BTASJUqVcL267YmXZN27dq5C/GZZ57p+sxMnz7dBRU33XST68iqAGLChAlWqVIlF+w0bNjwkK+3b98+9/gaNWq423qcAgwFJGqWuf/++126U6dO7v46derY119/7YKO0CBGfVMCeeSBBx6wAQMG2C233BLcp/LKwoUL7auvvrItW7a4gEceeughF7C8+OKLwaAiOzvbvZ+yZcu621dffbW9++67LohR4KOmI83YrHIeKT128ODBwbLXrVvXvcdBgwYRxHhmynCWHQBwtFTzEZgn5ttv/WuwFSQth3Iokf34tmw5dN7ISc4O8wu/oEX26VDtReg+dfzVFnq7devWboZZBRAKElSDcc0119jy5csP+TrqGBwIYOScc85xwcM333zjFkDcsGGDq51R7UvAgQMHcnWcPeOMM4JpBSc//fSTq1nJy/Lly926VxUrVgzbrxol1YwE1K5dOxjAiNYw0nP/Hnpt9TNSMBO6hIWCuT179rigqDBQEwMAyUDNLz/9lJMuaNGsxVRYeX+HQK2CamR00Q7QxTuydibgP//5j2v+UVPPU089ZRdccIFrWlHzy/XXX++aicqVK3dErx8IlPS/gplAk1KzZs3C8inACaWaoIDDLQORnZ3t3puGQ0cKHQ6tgCyybIEyHS09/t577w2rNQr4PcsKHA5BDAAkA10oPvssJ40waq5RIDN//nzXB0W0bs+iRYvcSKRIqqFR84uafI455hhXqxAYHRT4P78L/w8//OBqTTScWz766CM31f5JJ53kgqYTTjjB9bvp1q3bEX9Sqj1RLYqafi688MJc959++ukuSEtJSXH5jpaak/R+o6HXVi2T+hAVJYIYAEgG+gV/6qnmVWpGUWfa0I68n3/+eXDOF9U2qH/J8OHD3crJ2pRWM0fXrl1zPZ9qSSpXrmwdO3Z0t88991zXtPTxxx/bW2+9ZQ0aNMh3sjfVPqh/iPqkqMamX79+rgYnUCOk59I+1eSog25mZqZ9+umnrqOtOu4eih534403urJddNFFbni4Ovb27dvXNXup2erSSy91gdnJJ5/sAil18tW+0Kap/CgA+uSTT1xnXgVwgQ7B+bn77rutQ4cOVrNmTevcubML2L788kvX/KZmuMJCEAMASHgKAEJrJwKBgAIJdWIVdTJV/5DevXu7YEFNOZoTJrR/iPz8888uwNGopYCzzjrLdahV51wFEOq0mx/VSKhp5eKLL7Zff/3V/f/YY48F7//HP/7hAqgxY8a4cqnZqHHjxrkmmYuk96N+JuPGjbOBAwe6TsaXa36x35qFFLBoPhs1d23dutUFTWoGO1STWV70vHodBWo6XgoID0edotVXSCOaNB+P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3ab09u3bLamHRy5a5N9YdgBAtLTUwKxZ/o1lB+ARUQcxu3fvtiZNmtjEiRNz3bdnzx5bsWKF3XXXXe7/l19+2dasWeOClFD9+/e3OXPm2OzZs23x4sWWkZFhHTp0sIMhf3hdu3a1zz//3N5++223Ka1ABgCQBy01MG6cf2PZAXhE1H1iLrroIrflRTUm8+fPD9s3YcIEO+uss+yHH36wWrVq2Y4dO2zKlCk2Y8YMa926tcszc+ZMq1mzpi1YsMDatWtnq1evdoHLxx9/bM2aNXN5Jk+ebOecc4598803dvLJJx/duwWAZF52oH//WJcCSK4+MQpa1Ox07LHHutvLly93zU5t27YN5lGzU6NGjWzJkiXu9kcffeQCokAAI2effbbbF8gTSU1UO3fuDNsAAEDyKtQgZt++fTZ48GDXNFSuXDm3b/PmzZaammrHHXdcWN4qVaq4+wJ5KleunOv5tC+QJ9KIESOC/We0qWYHADxDfenWrfNv9KuDRxRaEKPaliuuuMKys7PtscceO2x+n8/namwCQtOHyhNqyJAhrtYnsG3YsOF3vgMASCAa1Vinjn9jhCM8IqWwApguXbrY2rVr7b333gvWwkjVqlVt//79bvRRaG3Mli1brHnz5sE8P//8c67n3bp1q6uxyUtaWprbElrp0rEuAYBExncIPKZ4YQUw3377reuoW7FixbD7mzZtaiVLlgzrALxp0yZbuXJlMIhRB17VpixdujSY55NPPnH7AnmScsrw3bv9m9IAwHcIULA1MRoO/d133wVvq7ZFw58rVKjgOuhefvnlbnj166+/7oZMB/qw6H71hVF/lR49etiAAQNcgKP9AwcOdHPLBEYr1a9f3/7yl79Yz5497cknn3T7brjhBjcMm5FJAADgqIKYTz/91C688MLg7dtuu8393717dxs2bJjNnTvX3T711FPDHrdw4UJrqdloTdMYjLOUlBRXY7N3715r1aqVTZs2zUqUKBHM/8wzz1i/fv2Co5g010xec9MAAABvijqIUSCiDraHkt99AaVKlXLzx2g7FNXQaP4Yz9A04X/7mz/90ks6SLEuEYBEkplpdvPN/rR+8CV6H0HgCLAAZLzQbMVvvpmTBoBoHDhg9n//50+PH08QA08giAGAZJmx94EHctKABxDEAEAy0HpJQ4fGuhRAci07AAAAUBioiQGAZKBB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RYaamDihpQaW/6ur21h2AEDU9u41O/VU/6Y04AHUxMSRint3xroIABJVdrbZF1/kpAEPIIgBgGSgpQbmzctJAx5AEAOgwNBvJsbLDrRpE8sSAEWOPjEAACAhURMDoEhRW1OIyw68844/3a4dM/bCEwhiACBZlh3o0MGfZtkBeARBTJzQUgNfVK0XTANAVLTUwBln5KQBDyCIiaNlB/7afVysiwEgkZcdWLYs1qUAihThOgAASEgEMQAAICERxMSJUln7bPHj17tNaQCIipYaOPdc/8ayA/AI+sTEiWI+sxo7twTTABAVLTWwZElOGvCAAq+JGTFihJ155plWtmxZq1y5sl166aX2zTffhOXx+Xw2bNgwq169uqWnp1vLli1t1apVYXkyMzOtb9++VqlSJStTpox17NjRNm7cWNDFBYDkkJZmNmeOf1Ma8IACD2IWLVpkffr0sY8//tjmz59vBw4csLZt29ru3buDeUaPHm1jx461iRMn2rJly6xq1arWpk0b27VrVzBP//79bc6cOTZ79mxbvHixZWRkWIcOHezgwYMFXWQASHwpKWaXXurflAY8oMDP9Lfffjvs9tSpU12NzPLly+2CCy5wtTDjx4+3oUOHWqdOnVye6dOnW5UqVWzWrFnWq1cv27Fjh02ZMsVmzJhhrVu3dnlmzpxpNWvWtAULFlg7zUYJAAA8rdA79iogkQoVKrj/165da5s3b3a1MwFpaWnWokULW/Jbe64CnqysrLA8anpq1KhRME8kNT/t3LkzbAMAz1At9fvv+zdqrOERhRrEqNbltttus/POO88FIKIARlTzEkq3A/fp/9TUVDvuuOMOmSevvjjly5cPbqq1AQDP2LfP7MIL/ZvSgAcUasPpzTffbF9++aXr0xKpWMTU+gp4IvdFyi/PkCFDXMAUoJqYRApkfMXM1lSsFUwDXsYikUdB340NGuSkAQ8otCBGI4vmzp1rH3zwgdWoUSO4X514RTUq1apVC+7fsmVLsHZGefbv32/btm0Lq41RnubNm+f5emqS0pao9pUsZW3/8VisiwEgUZUubRYxyhNIdgXenKTaEtXAvPzyy/bee+9ZnTp1wu7XbQUpGrkUoIBFo5oCAUrTpk2tZMmSYXk2bdpkK1euPGQQAwAAvKXAa2I0vFqjjF599VU3V0ygD4v6qWhOGDUHafj08OHDrV69em5TunTp0ta1a9dg3h49etiAAQOsYsWKrlPwwIEDrXHjxsHRSgAAwNsKPIh5/PHH3f+awC5yqPW1117r0oMGDbK9e/da7969XZNRs2bNbN68eS7oCRg3bpylpKRYly5dXN5WrVrZtGnTrESJEpaMtNTA3On+Pj0du491zUsAcMS01EDHjv703Ln+Va2BJJdSGM1Jh6PaGM3Yq+1QSpUqZRMmTHCbF2ipgZP+90MwDQBR0VIDCxbkpAEPYFpHAEgGGtgwc2ZOGvAAghgASAZaaqBbt1iXAkiuGXsBAAAKAzUxAJAMtNTAihX+9OmnmyXpIAggFEEMACQDLTVw1ln+dEaGWZkysS4RUOgIYuKElhrYWK5yMA0AUdFSAyeemJMGPIAgJk5oXpjzbnoq1sUAkMjLDqxbF+tSAEWKIAZA0mIhSSC5EcQASNoABUByY4h1nEjLyrRXp9/qNqUBIOqOvZde6t+UBjyAmpg4Udznsyabvw2mASDqIdavvpqTBjyAIAYAkkFqqtmkSTlpwAMIYgAgGZQsadazZ6xLARQpghgAnlZQHYTXjWxfIM8D4MgRxABAMsjONlu92p+uX9+sOOM2kPwIYgAgGezda9aokT/NsgPwCIKYOPK/9HKxLgKARFapUqxLABQpgpg4sTe1lDXtNyvWxQCQqLTg49atsS4FUKRoNAUAAAmJIAYAACQkgpg4oaUGZs8a7DaWHQAQNS010K2bf2PZAXgEfWLihJYaOHvDymAaAKKipQZm/davLjBzL5DkCGIKEavsAigyWmpg3LicNOABBDEAkCzLDvTvH+tSAEWKIAYACgDLFwBFjyAGAJJl2YEffvCna9Vi2QF4AkFMAqBvDeAdR/L3nudik1p2oE4df5plB+ARBDFxZE/JtFgXAUAiK1061iUAihRBTBwtO9DgtpdiXQwAibzswO7dsS4FUKSY7A4AACQkamIAwCv9ZoAkQxATJ9IO7LfH5wx36Zsuu9MyU5isCsCRSz2QZffOf9yl72lzE4cOnkAQEyeKZ2fbn7//NJgGgGiUyD5oV345z6Xva3UDBw+eQBADAEngQIkSNub8q4PpgmpyoukK8YwgBgCSQFaJkvZo879H9RjmoEKii/sg5rHHHrMxY8bYpk2brGHDhjZ+/Hg7//zzY10sAMBvqK1BrMT1EOvnnnvO+vfvb0OHDrXPPvvMBS8XXXSR/RCYWhsA4OfzWYU9O9ymNOAFcV0TM3bsWOvRo4f94x//cLdVC/POO+/Y448/biNGjIh18QAgbqRnZdqKCd1cuv6tL7oJNONJUTZdFeTwcmqZ4lvcBjH79++35cuX2+DBg8P2t23b1pYsWZIrf2ZmptsCduzY4f7fuXNnoZQvO3NPgT7fwf37LFDSg5l7LNvHCCUAfIccjVq3vlCkp05hXWe8audvx9N3BDWKcRvE/PLLL3bw4EGrUqVK2H7d3rx5c678qpm59957c+2vWbOmJYrygcRj18S2IAASEt8hMTru42P0wklu165dVr588KxOrCAmoFixYmG3FZlF7pMhQ4bYbbfdFrydnZ1tv/76q1WsWDHP/MkYuSpg27Bhg5UrVy7WxYlrHCuOFecUf3+JwKvfVT6fzwUw1atXP2zeuA1iKlWqZCVKlMhV67Jly5ZctTOSlpbmtlDHHnuseY1OdC+d7L8Hx4pjxTnF318i8OJ3VfnD1MDE/eik1NRUa9q0qc2fPz9sv243b948ZuUCAADxIW5rYkTNQ1dffbWdccYZds4559ikSZPc8Oobb7wx1kUDAAAxFtdBzN///nf73//+Z/fdd5+b7K5Ro0b25ptv2oknnhjrosUdNaXdc889uZrUwLHivOLvL57wXcWxKkjFfEcyhgkAACDOxG2fGAAAgPwQxAAAgIREEAMAABISQQwAAEhIBDEAACAhEcQkOK0ZdeaZZ1rZsmWtcuXKdumll9o333wT62IlxHHTchT9+/ePdVHi0o8//mhXXXWVW7ajdOnSduqpp7oFWRHuwIED9s9//tPq1Klj6enpVrduXTclhJY98boPPvjALrnkEjd1vP7WXnnllbD7NTB22LBh7n4du5YtW9qqVavMi/I7VllZWXbHHXdY48aNrUyZMi7PNddcYz/99FNMyxwvCGIS3KJFi6xPnz728ccfu9mM9aWqlb53794d66LFrWXLlrmJE//0pz/Fuihxadu2bXbuuedayZIl7a233rKvv/7aHn74YU8u43E4o0aNsieeeMImTpxoq1evttGjR9uYMWNswoQJ5nX6DmrSpIk7NnnRsRo7dqy7X3+TVatWtTZt2rg1c7wmv2O1Z88eW7Fihd11113u/5dfftnWrFljHTt2jElZ447miUHy2LJli+b98S1atCjWRYlLu3bt8tWrV883f/58X4sWLXy33HJLrIsUd+644w7feeedF+tiJIT27dv7rr/++rB9nTp18l111VUxK1M80nfSnDlzgrezs7N9VatW9Y0cOTK4b9++fb7y5cv7nnjiCZ+XRR6rvCxdutTlW79+vc/rqIlJMjt27HD/V6hQIdZFiUuqtWrfvr21bt061kWJW3PnznVLfXTu3Nk1UZ522mk2efLkWBcrLp133nn27rvvul/G8sUXX9jixYvt4osvjnXR4tratWvd4r6qNQ6dybdFixa2ZMmSmJYtUb7n1ex0LLWj8b3sAKKjIF7rTemLVUs0INzs2bNddayqrnFo33//vT3++OPuXLrzzjtt6dKl1q9fP3eRUVs8cqivgi4op5xyipUoUcIOHjxoDz74oF155ZUcpnwogJEqVaqE7dft9evXc+zysW/fPhs8eLB17drVcytb54UgJoncfPPN9uWXX7pfggi3YcMGu+WWW2zevHlWqlQpDk8+1ClVNTHDhw93t1UTow6XCmwIYsI999xzNnPmTJs1a5Y1bNjQPv/8c9dZXJ0vu3fvznl2GKpNiPwhFrkPFtbJ94orrnB/o4899hiHhiAmefTt29c1A6iXe40aNWJdnLijkTVbtmyxpk2bBvfpV7OOlzrTZWZmul/SMKtWrZo1aNAg7FDUr1/fXnrpJQ5PhNtvv939KtaFRTSCRDUJGv1GEHNo6sQbqJHR+Ragv9HI2hnkBDBdunRxTXHvvfcetTC/oU9MgtMvF9XAqMe6TmwN9URurVq1sq+++sr9Ug5sqm3o1q2bSxPA5NDIpMhh+urzwerxlufIkeLFw79GdS4xxDp/+p5SIKMRlQH79+93oy2bN2/OV9ghAphvv/3WFixY4KY+gB/NSUnQUVVV2a+++qqbKybQ1ly+fHk39wL8dGwi+wlpzgV9GdB/KNytt97qLiRqTtIXp/rEaEi6NoTT3B7qA1OrVi3XnPTZZ5+5YcPXX3+95w9VRkaGfffdd8HjoBoE/WDQoAMdLzW76RyrV6+e25TWnETq6+E1+R0rNU1efvnlrj/f66+/7mqQA9/zFSpUsNTUVPO0WA+Pwu+jjzCvberUqRzaw2CI9aG99tprvkaNGvnS0tJ8p5xyim/SpEmcT3nYuXOnG6Zfq1YtX6lSpXx169b1DR061JeZmen547Vw4cI8v5u6d+8eHGZ9zz33uKHWOs8uuOAC31dffeXJ45bfsVq7du0hv+cXLlzo87pi+ifWgRQAAEC06BMDAAASEkEMAABISAQxAAAgIRHEAACAhEQQAwAAEhJBDAAASEgEMQAAICERxAAAgIREEAMAABISQQwAAEhIBDEAAMAS0f8DWb/HGCg/+FUAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "FILTER 1: 13944 out of 16497 total genes passed the expression filter (lower_percentile = 0.1, upper_percentile = 0.99).\n", "\n", "FILTER 2: 14278 out of 16497 total genes passed the transcript length filter (min_txLength = 700).\n", "\n", "FINAL SELECTION: 12147 out of 16497 total genes passed both filters.\n" ] }, { "data": { "text/plain": [ "AnnData object with n_obs × n_vars = 871 × 12147\n", " obs: 'cluster'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata = ns.pp.spaceTx_genefilter(adata, gencode_folder = f\"{code_folder}/gencode_annotation\")\n", "adata" ] }, { "cell_type": "markdown", "id": "fc36e8fd-d864-4ff3-84a3-357fc4e79073", "metadata": {}, "source": [ "### Calculating medians and binary scores per cluster" ] }, { "cell_type": "code", "execution_count": 4, "id": "5dffeeca", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Calculating medians per cluster: 100%|██████████| 16/16 [00:01<00:00, 10.98it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving medians as adata.varm.medians_cluster\n", "median: 0.0\n", "mean: 1.828\n", "std: 2.518\n", "Only positive genes selected. 9402 positive genes out of 12147 total genes\n", "--- 1.6438896656036377 seconds ---\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Calculating binary scores per cluster: 100%|██████████| 16/16 [01:11<00:00, 4.46s/it]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving binary scores as adata.varm.binary_scores_cluster\n", "median: 0.118\n", "mean: 0.207\n", "std: 0.251\n", "--- 71.59167551994324 seconds ---\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "adata = ns.pp.prep_medians(adata, cluster_header)\n", "adata = ns.pp.prep_binary_scores(adata, cluster_header)" ] }, { "cell_type": "markdown", "id": "40b0304c", "metadata": {}, "source": [ "### Running NS-Forest" ] }, { "cell_type": "code", "execution_count": 5, "id": "ab30c7d8", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running NS-Forest version 4.1\n", "\n", "Preparing adata...\n", "Pre-selecting genes based on binary scores...\n", "\tBinaryFirst_high Threshold (mean + 2 * std): 0.709\n", "\tAverage number of genes after gene_selection in each cluster: 577.5625\n", "Saving number of genes selected per cluster as...\n", "../outputs_layer1_spatial/cluster_gene_selection.csv\n", "--- 0.04798698425292969 seconds ---\n", "\n", "Number of clusters to evaluate: 16\n", "1 out of 16:\n", "\te1_e299_SLC17A7_L5b_Cdh13\n", "\tPre-selected 1122 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['SLC17A7', 'ANKRD33B']\n", "\tfbeta: 0.959\n", "\tprecision: 0.988\n", "\trecall: 0.856\n", "2 out of 16:\n", "\tg1_g48_GLI3_Astro_Gja1\n", "\tPre-selected 441 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['LINC00498']\n", "\tfbeta: 0.95\n", "\tprecision: 1.0\n", "\trecall: 0.792\n", "3 out of 16:\n", "\tg2_g27_APBB1IP_Micro_Ctss\n", "\tPre-selected 281 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['C1QC']\n", "\tfbeta: 0.935\n", "\tprecision: 1.0\n", "\trecall: 0.741\n", "4 out of 16:\n", "\tg3_g18_GPNMB_OPC_Pdgfra\n", "\tPre-selected 251 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['COL20A1']\n", "\tfbeta: 0.833\n", "\tprecision: 1.0\n", "\trecall: 0.5\n", "5 out of 16:\n", "\tg4_g9_MOG_Oligo_Opalin\n", "\tPre-selected 401 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['CNDP1']\n", "\tfbeta: 0.976\n", "\tprecision: 1.0\n", "\trecall: 0.889\n", "6 out of 16:\n", "\ti10_i16_TSPAN12_Vip_Mybpc1\n", "\tPre-selected 811 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['CHRNB3', 'WIF1']\n", "\tfbeta: 0.865\n", "\tprecision: 1.0\n", "\trecall: 0.562\n", "7 out of 16:\n", "\ti11_i6_EGF_Vip_Mybpc1\n", "\tPre-selected 1459 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['FZD8']\n", "\tfbeta: 0.556\n", "\tprecision: 0.667\n", "\trecall: 0.333\n", "8 out of 16:\n", "\ti1_i90_COL5A2_Ndnf_Car4\n", "\tPre-selected 191 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['COL5A2', 'TRPC3']\n", "\tfbeta: 0.845\n", "\tprecision: 1.0\n", "\trecall: 0.522\n", "9 out of 16:\n", "\ti2_i77_LHX6_Sst_Cbln4\n", "\tPre-selected 212 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['LHX6', 'GRIK3']\n", "\tfbeta: 0.857\n", "\tprecision: 1.0\n", "\trecall: 0.545\n", "10 out of 16:\n", "\ti3_i56_BAGE2_Ndnf_Cxcl14\n", "\tPre-selected 110 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['SCN5A', 'GREM2']\n", "\tfbeta: 0.642\n", "\tprecision: 0.826\n", "\trecall: 0.339\n", "11 out of 16:\n", "\ti4_i54_MC4R_Ndnf_Cxcl14\n", "\tPre-selected 163 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['ADAM33', 'NDNF', 'CD36']\n", "\tfbeta: 0.783\n", "\tprecision: 0.929\n", "\trecall: 0.481\n", "12 out of 16:\n", "\ti5_i47_TRPC3_Ndnf_Car4\n", "\tPre-selected 773 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['TRPC3', 'CA2']\n", "\tfbeta: 0.828\n", "\tprecision: 0.962\n", "\trecall: 0.532\n", "13 out of 16:\n", "\ti6_i44_GPR149_Vip_Mybpc1\n", "\tPre-selected 303 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['GPR149', 'SHISA8', 'ASIC4']\n", "\tfbeta: 0.757\n", "\tprecision: 0.852\n", "\trecall: 0.523\n", "14 out of 16:\n", "\ti7_i31_CLMP_Ndnf_Cxcl14\n", "\tPre-selected 829 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['RASSF3', 'PAX6', 'CPLX3']\n", "\tfbeta: 0.841\n", "\tprecision: 0.947\n", "\trecall: 0.581\n", "15 out of 16:\n", "\ti8_i27_SNCG_Vip_Mybpc1\n", "\tPre-selected 1082 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['SNCG', 'EDNRA']\n", "\tfbeta: 0.759\n", "\tprecision: 0.923\n", "\trecall: 0.444\n", "16 out of 16:\n", "\ti9_i22_TAC3_Vip_Mybpc1\n", "\tPre-selected 812 genes to feed into Random Forest.\n", "\tNSForest-selected markers: ['MCTP2', 'ANGPT1']\n", "\tfbeta: 0.806\n", "\tprecision: 1.0\n", "\trecall: 0.455\n", "--- 80.83747506141663 seconds ---\n", "\n", "Saving supplementary table as...\n", "../outputs_layer1_spatial/cluster_supplementary.csv\n", "Saving markers table as...\n", "../outputs_layer1_spatial/cluster_markers.csv\n", "using median\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Calculating medians per cluster: 100%|██████████| 16/16 [00:00<00:00, 379.53it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving supplementary table as...\n", "../outputs_layer1_spatial/cluster_markers_onTarget_supp.csv\n", "Saving supplementary table as...\n", "../outputs_layer1_spatial/cluster_markers_onTarget.csv\n", "\n", "Saving final results table as...\n", "../outputs_layer1_spatial/cluster_results.csv\n", "Saving final results table as...\n", "../outputs_layer1_spatial/cluster_results.pkl\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "outputfilename_prefix = cluster_header\n", "results = ns.nsforesting.NSForest(adata, cluster_header, save_supplementary = True, save = True, output_folder = output_folder, outputfilename_prefix = outputfilename_prefix)" ] }, { "cell_type": "code", "execution_count": 6, "id": "7fb3867d", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
software_versioncluster_headerclusterNameclusterSizef_scoreprecisionrecallTNFPFNTPmarker_countNSForest_markersbinary_genesonTarget
04.1clustere1_e299_SLC17A7_L5b_Cdh132990.9588010.9884170.8561875693432562[SLC17A7, ANKRD33B][SLC17A7, ANKRD33B, SFTA1P, TBR1, LINC00152, N...1.000000
14.1clusterg1_g48_GLI3_Astro_Gja1480.9500001.0000000.791667823010381[LINC00498][LINC00498, SLC25A18, FGFR3, EMX2OS, ALDH1L1, ...1.000000
24.1clusterg2_g27_APBB1IP_Micro_Ctss270.9345791.0000000.74074184407201[C1QC][CSF2RA, C1QC, SYK, P2RY13, FGD2, MS4A7, CX3CR...1.000000
34.1clusterg3_g18_GPNMB_OPC_Pdgfra180.8333331.0000000.5000008530991[COL20A1][OLIG2, STK32A, COL20A1, KLRC3, B3GNT7, CSPG4,...1.000000
44.1clusterg4_g9_MOG_Oligo_Opalin90.9756101.0000000.8888898620181[CNDP1][MOBP, CNDP1, TF, ASPA, CLMN, CD22, PPP1R14A, ...1.000000
54.1clusteri10_i16_TSPAN12_Vip_Mybpc1160.8653851.0000000.5625008550792[CHRNB3, WIF1][TSPAN12, TMC5, CHRNB3, ANGPT1, DCN, WIF1, HCR...0.494252
64.1clusteri11_i6_EGF_Vip_Mybpc160.5555560.6666670.3333338641421[FZD8][EGF, XYLT2, FZD8, ZSCAN23, NSRP1P1, RPUSD4, S...1.000000
74.1clusteri1_i90_COL5A2_Ndnf_Car4900.8453241.0000000.522222781043472[COL5A2, TRPC3][NMBR, BMP2, COL5A2, ADRA1D, TRPC3, PAPSS2, BM...0.618906
84.1clusteri2_i77_LHX6_Sst_Cbln4770.8571431.0000000.545455794035422[LHX6, GRIK3][LHX6, RSPO3, CALB1, TAC1, TRBC2, GRIK3, MAFB,...0.942058
94.1clusteri3_i56_BAGE2_Ndnf_Cxcl14560.6418920.8260870.339286811437192[SCN5A, GREM2][SCN5A, GREM2, SYT10, ARHGAP18, ZNF423, GRB14,...0.531211
104.1clusteri4_i54_MC4R_Ndnf_Cxcl14540.7831330.9285710.481481815228263[ADAM33, NDNF, CD36][EGFL6, ADAM33, PGAM1P5, CHRNB3, NDNF, CD36, A...0.351766
114.1clusteri5_i47_TRPC3_Ndnf_Car4470.8278150.9615380.531915823122252[TRPC3, CA2][SOX13, PRSS12, SSTR2, TRPC3, PAPSS2, CA2, HAP...0.448483
124.1clusteri6_i44_GPR149_Vip_Mybpc1440.7565790.8518520.522727823421233[GPR149, SHISA8, ASIC4][CXCL12, GPR149, SHISA8, IGFBP5, PXDN, ASIC4, ...0.546603
134.1clusteri7_i31_CLMP_Ndnf_Cxcl14310.8411210.9473680.580645839113183[RASSF3, PAX6, CPLX3][FGF10, RASSF3, CLMP, PAX6, SP8, CPLX3, TGFBR2...0.629389
144.1clusteri8_i27_SNCG_Vip_Mybpc1270.7594940.9230770.444444843115122[SNCG, EDNRA][SNCG, EDNRA, MMRN2, FBN3, RGS2, SCML4, NRP2, ...1.000000
154.1clusteri9_i22_TAC3_Vip_Mybpc1220.8064521.0000000.454545849012102[MCTP2, ANGPT1][BSPRY, OFD1P10Y, MCTP2, ARHGAP29, FHDC1, ANGP...0.752842
\n", "
" ], "text/plain": [ " software_version cluster_header clusterName clusterSize \\\n", "0 4.1 cluster e1_e299_SLC17A7_L5b_Cdh13 299 \n", "1 4.1 cluster g1_g48_GLI3_Astro_Gja1 48 \n", "2 4.1 cluster g2_g27_APBB1IP_Micro_Ctss 27 \n", "3 4.1 cluster g3_g18_GPNMB_OPC_Pdgfra 18 \n", "4 4.1 cluster g4_g9_MOG_Oligo_Opalin 9 \n", "5 4.1 cluster i10_i16_TSPAN12_Vip_Mybpc1 16 \n", "6 4.1 cluster i11_i6_EGF_Vip_Mybpc1 6 \n", "7 4.1 cluster i1_i90_COL5A2_Ndnf_Car4 90 \n", "8 4.1 cluster i2_i77_LHX6_Sst_Cbln4 77 \n", "9 4.1 cluster i3_i56_BAGE2_Ndnf_Cxcl14 56 \n", "10 4.1 cluster i4_i54_MC4R_Ndnf_Cxcl14 54 \n", "11 4.1 cluster i5_i47_TRPC3_Ndnf_Car4 47 \n", "12 4.1 cluster i6_i44_GPR149_Vip_Mybpc1 44 \n", "13 4.1 cluster i7_i31_CLMP_Ndnf_Cxcl14 31 \n", "14 4.1 cluster i8_i27_SNCG_Vip_Mybpc1 27 \n", "15 4.1 cluster i9_i22_TAC3_Vip_Mybpc1 22 \n", "\n", " f_score precision recall TN FP FN TP marker_count \\\n", "0 0.958801 0.988417 0.856187 569 3 43 256 2 \n", "1 0.950000 1.000000 0.791667 823 0 10 38 1 \n", "2 0.934579 1.000000 0.740741 844 0 7 20 1 \n", "3 0.833333 1.000000 0.500000 853 0 9 9 1 \n", "4 0.975610 1.000000 0.888889 862 0 1 8 1 \n", "5 0.865385 1.000000 0.562500 855 0 7 9 2 \n", "6 0.555556 0.666667 0.333333 864 1 4 2 1 \n", "7 0.845324 1.000000 0.522222 781 0 43 47 2 \n", "8 0.857143 1.000000 0.545455 794 0 35 42 2 \n", "9 0.641892 0.826087 0.339286 811 4 37 19 2 \n", "10 0.783133 0.928571 0.481481 815 2 28 26 3 \n", "11 0.827815 0.961538 0.531915 823 1 22 25 2 \n", "12 0.756579 0.851852 0.522727 823 4 21 23 3 \n", "13 0.841121 0.947368 0.580645 839 1 13 18 3 \n", "14 0.759494 0.923077 0.444444 843 1 15 12 2 \n", "15 0.806452 1.000000 0.454545 849 0 12 10 2 \n", "\n", " NSForest_markers \\\n", "0 [SLC17A7, ANKRD33B] \n", "1 [LINC00498] \n", "2 [C1QC] \n", "3 [COL20A1] \n", "4 [CNDP1] \n", "5 [CHRNB3, WIF1] \n", "6 [FZD8] \n", "7 [COL5A2, TRPC3] \n", "8 [LHX6, GRIK3] \n", "9 [SCN5A, GREM2] \n", "10 [ADAM33, NDNF, CD36] \n", "11 [TRPC3, CA2] \n", "12 [GPR149, SHISA8, ASIC4] \n", "13 [RASSF3, PAX6, CPLX3] \n", "14 [SNCG, EDNRA] \n", "15 [MCTP2, ANGPT1] \n", "\n", " binary_genes onTarget \n", "0 [SLC17A7, ANKRD33B, SFTA1P, TBR1, LINC00152, N... 1.000000 \n", "1 [LINC00498, SLC25A18, FGFR3, EMX2OS, ALDH1L1, ... 1.000000 \n", "2 [CSF2RA, C1QC, SYK, P2RY13, FGD2, MS4A7, CX3CR... 1.000000 \n", "3 [OLIG2, STK32A, COL20A1, KLRC3, B3GNT7, CSPG4,... 1.000000 \n", "4 [MOBP, CNDP1, TF, ASPA, CLMN, CD22, PPP1R14A, ... 1.000000 \n", "5 [TSPAN12, TMC5, CHRNB3, ANGPT1, DCN, WIF1, HCR... 0.494252 \n", "6 [EGF, XYLT2, FZD8, ZSCAN23, NSRP1P1, RPUSD4, S... 1.000000 \n", "7 [NMBR, BMP2, COL5A2, ADRA1D, TRPC3, PAPSS2, BM... 0.618906 \n", "8 [LHX6, RSPO3, CALB1, TAC1, TRBC2, GRIK3, MAFB,... 0.942058 \n", "9 [SCN5A, GREM2, SYT10, ARHGAP18, ZNF423, GRB14,... 0.531211 \n", "10 [EGFL6, ADAM33, PGAM1P5, CHRNB3, NDNF, CD36, A... 0.351766 \n", "11 [SOX13, PRSS12, SSTR2, TRPC3, PAPSS2, CA2, HAP... 0.448483 \n", "12 [CXCL12, GPR149, SHISA8, IGFBP5, PXDN, ASIC4, ... 0.546603 \n", "13 [FGF10, RASSF3, CLMP, PAX6, SP8, CPLX3, TGFBR2... 0.629389 \n", "14 [SNCG, EDNRA, MMRN2, FBN3, RGS2, SCML4, NRP2, ... 1.000000 \n", "15 [BSPRY, OFD1P10Y, MCTP2, ARHGAP29, FHDC1, ANGP... 0.752842 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.7" } }, "nbformat": 4, "nbformat_minor": 5 }