{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Comparing correction methods\n", "\n", "Run every MaldiBatchKit corrector on the same dataset and compare them on three batch-mixing metrics (silhouette, kBET acceptance, LISI) plus per-batch peak-position drift.\n", "\n", "Uses the **MALDI-Kleb-AI** dataset (Rocchi *et al.*, 2026; [Zenodo DOI 10.5281/zenodo.17405072](https://zenodo.org/records/17405072)); see notebook 01 for caching details.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Load the dataset\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:25:33.274575Z", "iopub.status.busy": "2026-04-23T12:25:33.274402Z", "iopub.status.idle": "2026-04-23T12:25:53.670756Z", "shell.execute_reply": "2026-04-23T12:25:53.670314Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X: (741, 6000) | batches: {'Rome': 470, 'Milan': 184, 'Catania': 87}\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", "
AmikacinMeropenemSpeciesBatchSNR
1-8317003599SSKlebsiella pneumoniaeMilan128.163340
10-8320002130SSKlebsiella pneumoniaeMilan128.492364
100-8660007296SSKlebsiella pneumoniaeMilan149.638040
1004RRKlebsiella pneumoniaeRome70.134876
101-8140000209SSKlebsiella pneumoniaeMilan84.646561
\n", "
" ], "text/plain": [ " Amikacin Meropenem Species Batch SNR\n", "1-8317003599 S S Klebsiella pneumoniae Milan 128.163340\n", "10-8320002130 S S Klebsiella pneumoniae Milan 128.492364\n", "100-8660007296 S S Klebsiella pneumoniae Milan 149.638040\n", "1004 R R Klebsiella pneumoniae Rome 70.134876\n", "101-8140000209 S S Klebsiella pneumoniae Milan 84.646561" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sys, pathlib\n", "sys.path.insert(0, str(pathlib.Path.cwd().parent))\n", "from notebooks._demo import load_maldi_kleb_ai\n", "\n", "ds = load_maldi_kleb_ai(antibiotic='Amikacin')\n", "print('X:', ds.X.shape, '| batches:', ds.batch.value_counts().to_dict())\n", "ds.meta.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Baseline metrics (no correction)\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:25:53.690499Z", "iopub.status.busy": "2026-04-23T12:25:53.690394Z", "iopub.status.idle": "2026-04-23T12:25:54.749554Z", "shell.execute_reply": "2026-04-23T12:25:54.749044Z" } }, "outputs": [ { "data": { "text/plain": [ "{'silhouette': 0.1474570958800467,\n", " 'kbet_acc': 0.020242914979757085,\n", " 'lisi': 1.0145424511187204}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np, pandas as pd\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "from maldibatchkit.diagnostics import silhouette_batch, kbet, lisi\n", "\n", "def summarise(X):\n", " return {\n", " 'silhouette': silhouette_batch(X, ds.batch),\n", " 'kbet_acc': kbet(X, ds.batch)['acceptance_rate'],\n", " 'lisi': lisi(X, ds.batch, perplexity=30.0),\n", " }\n", "\n", "baseline = summarise(ds.X)\n", "baseline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Run every corrector\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:25:54.751423Z", "iopub.status.busy": "2026-04-23T12:25:54.751221Z", "iopub.status.idle": "2026-04-23T12:25:54.754521Z", "shell.execute_reply": "2026-04-23T12:25:54.754106Z" } }, "outputs": [], "source": [ "from maldibatchkit import (\n", " ComBat, Limma, Harmony,\n", " MedianCentering, ZScorePerBatch, ReferenceScaling,\n", " QualityWeightedComBat, SpeciesAwareComBat,\n", ")\n", "\n", "pipelines = {\n", " 'ComBat (Johnson)': lambda: ComBat(batch=ds.batch, method='johnson'),\n", " 'ComBat (Fortin + species)': lambda: SpeciesAwareComBat(batch=ds.batch, species=ds.species),\n", " 'ComBat (Chen / CovBat)': lambda: ComBat(\n", " batch=ds.batch, method='chen',\n", " discrete_covariates=ds.species, covbat_cov_thresh=0.9,\n", " ),\n", " 'Quality-weighted ComBat': lambda: QualityWeightedComBat(batch=ds.batch, quality=ds.quality),\n", " 'Limma': lambda: Limma(batch=ds.batch),\n", " 'Harmony': lambda: Harmony(batch=ds.batch, random_state=0, max_iter=10, nclust=5, theta=4.0),\n", " 'Median-centering': lambda: MedianCentering(batch=ds.batch),\n", " 'Z-score per batch': lambda: ZScorePerBatch(batch=ds.batch),\n", " 'Reference scaling': lambda: ReferenceScaling(batch=ds.batch),\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:25:54.755736Z", "iopub.status.busy": "2026-04-23T12:25:54.755633Z", "iopub.status.idle": "2026-04-23T12:26:07.644152Z", "shell.execute_reply": "2026-04-23T12:26:07.643524Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,416 - harmonypy - INFO - Running Harmony (PyTorch on cuda)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,417 - harmonypy - INFO - Parameters:\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,417 - harmonypy - INFO - max_iter_harmony: 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,418 - harmonypy - INFO - max_iter_kmeans: 20\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,418 - harmonypy - INFO - epsilon_cluster: 1e-05\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,418 - harmonypy - INFO - epsilon_harmony: 0.0001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,419 - harmonypy - INFO - nclust: 5\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,419 - harmonypy - INFO - block_size: 0.05\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,419 - harmonypy - INFO - lamb: [1. 1. 1.]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,420 - harmonypy - INFO - theta: [4. 4. 4.]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,420 - harmonypy - INFO - sigma: [0.1 0.1 0.1 0.1 0.1]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,421 - harmonypy - INFO - verbose: True\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,422 - harmonypy - INFO - random_state: 0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,422 - harmonypy - INFO - Data: 50 PCs × 741 cells\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,422 - harmonypy - INFO - Batch variables: ['batch']\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,602 - harmonypy - INFO - Computing initial centroids with sklearn.KMeans...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,610 - harmonypy - INFO - KMeans initialization complete.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:03,780 - harmonypy - INFO - Iteration 1 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,006 - harmonypy - INFO - Iteration 2 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,070 - harmonypy - INFO - Iteration 3 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,108 - harmonypy - INFO - Iteration 4 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,146 - harmonypy - INFO - Iteration 5 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,181 - harmonypy - INFO - Iteration 6 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,209 - harmonypy - INFO - Iteration 7 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,242 - harmonypy - INFO - Iteration 8 of 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2026-04-23 14:26:04,270 - harmonypy - INFO - Converged after 8 iterations\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", " \n", " \n", " \n", " \n", " \n", "
 silhouettekbet_acclisi
(before)0.1470.0201.015
ComBat (Johnson)-0.0110.2601.266
ComBat (Fortin + species)-0.0150.2671.238
ComBat (Chen / CovBat)-0.0030.9621.930
Quality-weighted ComBat0.0090.2191.200
Limma0.0230.0821.040
Harmony0.0010.4221.384
Median-centering0.0420.1261.044
Z-score per batch-0.0050.3331.820
Reference scaling0.0000.2281.146
\n" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows = []\n", "for name, build in pipelines.items():\n", " X_c = build().fit_transform(ds.X)\n", " rows.append({'method': name, **summarise(X_c)})\n", "summary = pd.concat([\n", " pd.DataFrame([baseline], index=['(before)']),\n", " pd.DataFrame(rows).set_index('method'),\n", "])\n", "summary.style.format('{:.3f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Visual comparison\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:26:07.645876Z", "iopub.status.busy": "2026-04-23T12:26:07.645549Z", "iopub.status.idle": "2026-04-23T12:26:07.847497Z", "shell.execute_reply": "2026-04-23T12:26:07.846876Z" } }, "outputs": [ { "data": { "image/png": "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jh3T4sWL9f7776tUqVKSZO5YTJgwQaNGjVLXrl310ksv6cKFC/rggw/UokUL/fbbb1YHjS5evKh27drpmWee0fPPP291O4T69etLSrm3X926de/6cwPw7xUVFaWHH35YJUqU0IYNG8zvpVSpA89JSUn6/fffNXz4cJUsWTLdB1Bdu3Yt3YeYlixZMkfObN29e7e2b9+uZ555Rg888ICio6M1d+5ctWrVSocPH5aLi4uklNvGNG/eXJGRkerVq5fq1aunv//+W6tWrdIff/yhUqVKKSkpSY8//rg2bdqkZ555Rq+++qquXbumDRs26ODBg6pcubKkrOXO8ePH1a1bN7388svq2bOn5s2bpy5dumjt2rVq06aNzRyXUgba3dzc9Prrr8vNzU0//vij3n77bV29elVTpkyx2haZ2V/JjT7eafv27bJYLBlmzX//+1/Z2dkpLCxMsbGxmjx5srp3766dO3dm2GZycrI6dOigXbt26ZVXXlG1atW0cuVK9ezZM93lk5KSFBISosaNG+u9997Txo0bNXXqVFWuXFmvvPKKuRz7EJ5mvexDACgsKlasqI0bN+rHH3/Uww8/nCNtbt++XSVLlkx3cF6SBg0apOLFi2v06NGKjo7W9OnTNXDgQC1dujTDNv/55x89/PDDiomJ0auvviovLy99+eWX2rx5c7rLZybnM5srqX788UctW7ZMAwcOVKlSpe56i7m77ddImRtrKF26tObOnZvmln61atXSP//8oz///FMbNmzQF198kaaGnMru+vXryzAMbd++vVA8RDXPGAAKtPXr1xv29vaGvb290aRJE+ONN94w1q1bZyQmJqZZtmLFikbPnj3N95s3bzYkGZs3bzantWzZ0pBkLFy40JyWkJBgeHl5GZ07dzanTZ8+3ZBk/O9//zOnJSYmGk2aNDHc3NyMq1evZrgOwzCMkydPGpKMefPmmdMeeeQRIygoyLhx44Y5LTk52WjatKnh7+9vTvvqq6/SbdMwDKNGjRpGy5Yt00wfP3684erqahw7dsxq+ptvvmnY29sbp0+fTvOZ2z3wwANW/U81b948Q5Jx8uRJwzAM4/z584aDg4Px6KOPGklJSeZys2bNMiQZn3/+uWEYhpGUlGQUK1bMeOONN8x+lixZ0ujSpYthb29vXLt2zTAMw5g2bZphZ2dnXL582TAMwwgPDzck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XercubMCAgJUo0YNvf766/r555/N5U6fPq2OHTvKzc1NxYoVU9euXfXXX3+Z81OPbn7++eeqUKGC3Nzc1L9/fyUlJWny5Mny8vJSmTJlNGHChDQ1uLu7y8vLS97e3goODlbPnj21Z88ec/7Fixf17LPPytvbWy4uLgoKCtLixYvN+aGhodq6datmzJhhHqWNjo5Ot7/Lli1T7dq15e3tbTVt0aJFWrx4sf7zn/+oYcOG8vX1VceOHfXjjz8qONj6KbPvvfeeypUrp5IlS2rAgAG6efOmOS8hIUFhYWHy9vaWq6urGjdurC1btpjz58+fL09PT61bt07Vq1eXm5ubGYp3s3LlSj3xxBPpztu1a5feffddTZ06VVOmTFHTpk3l6+urNm3aaPny5erZs6e57Ny5c1W5cmU5ODioatWqViH/3HPPqVu3blZt37x5U6VKldLChQvNaY6OjvLy8pKXl5fq1KmjN998U2fOnNGFCxfMZYYPH66AgAC5uLjIz89Po0aNMrfV/PnzNXbsWO3bt8/8mc2fP1+SVLx4cTVr1kxLliy56zYBgH8r8pv8Jr8BoOAhv8lv8hsAcleR3Gr40qVLWrt2rSZMmCBXV9c08z09PSVJycnJZohv3bpVt27d0oABA9StWzerkIqKitIPP/ygtWvXKioqSk8//bR+//13BQQEaOvWrdq+fbt69eql1q1bq3HjxunWdPbsWX333XdW82/cuKH69etr+PDhKlasmFavXq0XXnhBlStXVqNGjTRjxgwdO3ZMNWvW1Lhx4yRJpUuXTrf98PBwNWjQwGraokWLVLVqVXXs2DHN8haLRR4eHub7zZs3q1y5ctq8ebNOnDihbt26qU6dOurTp48kaeDAgTp8+LCWLFmi8uXL65tvvlHbtm114MAB+fv7S5Li4+P13nvv6YsvvpCdnZ2ef/55hYWFadGiRenWLElXrlzRtm3bMjyyvWjRInPnKT2pP8tvvvlGr776qqZPn67WrVvr+++/14svvqgHHnhAwcHB6t69u7p06aK4uDjzyPu6desUHx+vJ598Mt224+Li9L///U9VqlRRyZIlzenu7u6aP3++ypcvrwMHDqhPnz5yd3fXG2+8oW7duungwYNau3atNm7cKElW27lRo0YKDw/PcHskJCQoISHBfH/16tUMlwWAwob8TkF+k98AUJCQ3ynI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2bXXXmv//1VXXeXyfVxq4sSJKi8v1x/+8Ad17NhR4eHhSktLc3gbW10a09PQ0FCH6xaLRTabrc51p0+frqlTp9qvXzwjDgDwH+Q3+U1+A4D/Ib/Jb/IbgC/jL9KdKCws1KRJkzR37lylp6fXWh4SEqIuXbrYLxeDXJL69Omj6dOna8uWLUpJSdFbb70l6cczsxs2bKjz/pKTk3XhwgVt27bNflt5ebmKiorUvXv3euvs06ePampqdPz4cYd6unTpUudbti71+eef17qenJwsSerbt6+Ki4sVGxtba7/R0dFO91uXsrIy/e///q/DfQUFBdm/IKWgoEDZ2dm69dZb1aNHD4WHh+vEiRMO+wgNDVVNTY3Dbc566orw8HBFRUU5XAAA/oP8Jr/JbwDwP+Q3+U1+A/B1TKTX48SJE8rIyNCQIUN0zz336OjRow6X//u//6tzu9LSUk2fPl1bt27V4cOHtXbtWhUXF9vDMScnRytWrFBOTo7279+vvXv3at68eZKkrl27avTo0XrggQe0efNm7dmzR/fcc4/atWun0aNH11trUlKSxo8fr3vvvVf/8z//o9LSUm3fvl25ublavXq103G+8847eu2113TgwAHl5ORo+/btysrKkiSNHz9ebdq00ejRo/XZZ5+ptLRU+fn5ys7O1rffftvknkZERGjixInas2ePPvvsM2VnZ2vs2LH2Jxtdu3bV8uXLtX//fm3btk3jx4+vdbb7uuuu04YNG3T06FGdPHmywZ4CAK4s5Df5DQDwP+Q3+Q0A/oCJ9HqsXr1ahw8f1po1axQfH1/rcsMNN9S5XcuWLfW3v/1NY8aMUVJSkh588EFlZmbqoYcekiQNGTJE77zzjj788EP17t1bN910k7Zv327ffsmSJerXr59uv/12paWlyRijNWvW1Hpr1E8tWbJE9957rx599FF169ZNGRkZ2rFjhzp06OB0u6efflorV65UamqqXn/9da1YscJ+9r1ly5b69NNP1aFDB/3qV79ScnKyJk2apDNnzrh0lrhLly761a9+pVtvvVXDhw9XamqqXnnlFfvyV199VSdPnlTfvn01YcIEZWdnKzY21mEfzz//vNatWyer1ao+ffpIarinAIArB/lNfgMA/A/5TX4DgD+wGGOMt4uAd9T1DdyoraKiwi3f7NsUKc9vrHdZkIzWju+u2NhYBQVxLqyxLv22ZvrWNPTONY3pmzeOL/B/5HfjXPz96j77Q1kiXP/MWl8VJKOklhd0oDpENlka3qAZ7Ht0qFv2E8i5w9j816Xjq6qqIr/RZOR34wR6frvCFzPf2+hJbf7YE3c9d6yPJ7I78J7hAAAAAAAAAADgRkykAwAAAAAAAADgRIi3C4D38Kk+vsvZ21suvjUFAHBlIr+bpiBzkGJiYrxdhtsF+sdoAECgIb+bJlDz2xVkfm30pDZ60jzoLAAAAAAAAAAATjCRDgAAAAAAAACAE0ykAwAAAAAAAADgBBPpAAAAAAAAAAA4wUQ6AAAAAAAAAABOMJEOAAAAAAAAAIATTKQDAAAAAAAAAOAEE+kAAAAAAAAAADjBRDoAAAAAAAAAAE4wkQ4AAAAAAAAAgBNMpAMAAAAAAAAA4AQT6QAAAAAAAAAAOMFEOgAAAAAAAAAATjCRDgAAAAAAAACAE0ykAwAAAAAAAADgRIi3CwAAAAA85cYFn8kS0crbZbhdkIySWl7QgeoQ2WSptXzfo0O9UBUAAO4RqPntioYy/0rkiZ7w3AmNwV+kAwAAAAAAAADgBBPpAAAAAAAAAAA4wUR6MygoKFDPnj0VGhqqjIwMb5fjVw4dOiSLxaLCwkJJUn5+viwWi06dOuXVugAAgY3sdh3ZDQDwFvLbdeQ3ADSMiXQn7rvvPlksFlksFoWGhqpTp0567LHHdObMmSbtZ+rUqerdu7dKS0u1dOlSzxR7hRg4cKCOHDmi6Ohob5cCAPBBZLfvIbsBAA0hv30P+Q0AtfFlow0YMWKElixZovPnz2vnzp2aOHGiLBaL5s2b1+h9lJSU6OGHH1b79u1druPcuXMKCwtzeftAERYWpri4OG+XAQDwYWS3byG7AQCNQX77FvIbAGrjL9IbEB4erri4OFmtVmVkZGjYsGFat26dfbnNZlNubq46deqkFi1aqFevXnr33Xcl/fOtUeXl5frXf/1XWSwW+1nxffv2aeTIkWrVqpXatm2rCRMm6MSJE/b9DhkyRFlZWZo8ebLatGmj9PT0Rm+XnZ2txx57TK1bt1ZcXJxmzpzpMKZTp07poYceUtu2bRUREaGUlBR99NFH9uWbN2/WoEGD1KJFC1mtVmVnZ+v06dP19mjPnj0aOnSoIiMjFRUVpX79+umLL76wLy8oKNCQIUPUsmVLXX311UpPT9fJkyclSXl5efrFL36hmJgYXXPNNbr99ttVUlJS73399O1lS5cuVUxMjD7++GMlJyerVatWGjFihI4cOWLf5sKFC8rOzrbfx+OPP66JEyfyVj8ACFBkN9kNAPA/5Df5DQC+jon0Jti3b5+2bNnicHY6NzdXr7/+uhYtWqSvvvpKU6ZM0T333KNNmzbJarXqyJEjioqK0osvvqgjR47orrvu0qlTp3TTTTepT58++uKLL5SXl6djx45p7NixDve3bNkyhYWFqaCgQIsWLWrSdldddZW2bdum+fPn65lnnrE/AbHZbBo5cqQKCgr0xhtv6Ouvv9bcuXMVHBws6ccz+CNGjNCYMWP05Zdf6u2339bmzZuVlZVVb1/Gjx+v9u3ba8eOHdq5c6eeeOIJhYaGSpIKCwt18803q3v37tq6das2b96sUaNGqaamRpJ0+vRpTZ06VV988YU2bNigoKAg3XHHHbLZbI3+uVRXV+u5557T8uXL9emnn6qsrEzTpk2zL583b57efPNNLVmyRAUFBaqoqNAHH3xQ7/7Onj2riooKhwsAwD+R3XULtOyWyG8ACCTkd93IbwDwLj7apQEfffSRWrVqpQsXLujs2bMKCgrSyy+/LOnHA/6cOXO0fv16paWlSZISExO1efNm/elPf9LgwYMVFxcni8Wi6Oho+9uinn/+efXp00dz5syx389rr70mq9WqAwcOKCkpSZLUtWtXzZ8/377O7NmzG7VdamqqcnJy7Pt4+eWXtWHDBt1yyy1av369tm/frv3799vXT0xMtO8vNzdX48eP1+TJk+3b//GPf9TgwYO1cOFCRURE1OpRWVmZfv/73+v666+3b3PR/Pnz9bOf/UyvvPKK/bYePXrY/z9mzBiHfb322mu69tpr9fXXXyslJcXJT+afzp8/r0WLFqlz586SpKysLD3zzDP25S+99JKmT5+uO+64Q5L08ssva82aNfXuLzc3V08//XSj7hsA4HvI7isvuyXyGwD8HflNfgOAr2MivQFDhw7VwoULdfr0ab3wwgsKCQmxB9DBgwdVXV2tW265xWGbc+fOqU+fPvXuc8+ePdq4caNatWpVa1lJSYk9ZPv16+fSdqmpqQ7L4uPjdfz4cUk/nqVu3769fd26avvyyy/15ptv2m8zxshms6m0tFTJycm1tpk6daruv/9+LV++XMOGDdOdd95p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AAAAAE4wkQ4AAAAAAAAAgBNMpAMAAAAAAAAA4AQT6YCXLViwQNddd50iIiI0YMAAbd++3en677zzjq6//npFRESoZ8+eWrNmjcNyY4yeeuopxcfHq0WLFho2bJiKi4s9OQSvcXfv7rvvPlksFofLiBEjPDkEr2hK37766iuNGTNG1113nSwWi1588cXL3qc/c3fvZs6cWesxd/3113twBEBgcXcO+JKmjG3x4sUaNGiQrr76al199dUaNmyYzx+HXc2NlStXymKxKCMjw7MFXoamju3UqVPKzMxUfHy8wsPDlZSU5LOPzaaO7cUXX1S3bt3UokULWa1WTZkyRWfOnGmmahvv008/1ahRo5SQkCCLxaIPPvigwW3y8/PVt29fhYeHq0uXLlq6dKnH6wQCRSDnt6ua0pOlS5fWeg0RERHRjNV6HsdlR03tR35+fq3HiMVi0dGjR5un4GaQm5urG264QZGRkYqNjVVGRoaKiooa3O5yjydMpANe9Pbbb2vq1KnKycnRrl271KtXL6Wnp+v48eN1rr9lyxaNGzdOkyZN0u7du5WRkaGMjAzt27fPvs78+fP1xz/+UYsWLdK2bdt01VVXKT093SdftFwOT/ROkkaMGKEjR47YLytWrGiO4TSbpvaturpaiYmJmjt3ruLi4tyyT3/lid5JUo8ePRwec5s3b/bUEICA4qkc8AVNHVt+fr7GjRunjRs3auvWrbJarRo+fLi+++67Zq68cVzNjUOHDmnatGkaNGhQM1XadE0d27lz53TLLbfo0KFDevfdd1VUVKTFixerXbt2zVx5w5o6trfeektPPPGEcnJytH//fr366qt6++239eSTTzZz5Q07ffq0evXqpQULFjRq/dLSUt12220aOnSoCgsLNXnyZN1///36+OOPPVwp4P8COb9d5UouRkVFObyGOHz4cDNW7Hkclx01tR8XFRUVOTxOYmNjPVRh89u0aZMyMzP1+eefa926dTp//ryGDx+u06dP17uNW44nBoDX9O/f32RmZtqv19TUmISEBJObm1vn+mPHjjW33Xabw20DBgwwDz30kDHGGJvNZuLi4syzzz5rX37q1CkTHh5uVqxY4YEReI+7e2eMMRMnTjSjR4/2SL2+oql9u1THjh3NCy+84NZ9+hNP9C4nJ8f06tXLjVUCVw5P5ICvuNzj6oULF0xkZKRZtmyZp0q8LK6M78KFC2bgwIHmv//7v306r5s6toULF5rExERz7ty55irRZU0dW2Zmprnpppscbps6daq58cYbPVrn5ZJk3n//fafrPPbYY6ZHjx4Ot911110mPT3dg5UBgSGQ89tVTe3JkiVLTHR0dDNV530clx01ph8bN240kszJkyebpSZfcPz4cSPJbNq0qd513HE84S/SAS85d+6cdu7cqWHDhtlvCwoK0rBhw7R169Y6t9m6davD+pKUnp5uX7+0tFRHjx51WCc6OloDBgyod5/+yBO9uyg/P1+xsbHq1q2bfvvb36q8vNz9A/ASV/rmjX36Ik+Os7i4WAkJCUpMTNT48eNVVlZ2ueUCAc+TOeBt7jjeVFdX6/z582rdurWnynSZq+N75plnFBsbq0mTJjVHmS5xZWwffvih0tLSlJmZqbZt2yolJUVz5sxRTU1Nc5XdKK6MbeDAgdq5c6f94wm++eYbrVmzRrfeemuz1OxJ/nI8AXxNIOe3q1zNxaqqKnXs2FFWq1WjR4/WV1991Rzl+qxAf5y4qnfv3oqPj9ctt9yigoICb5fjUd9//70kOX3+647HCRPpgJecOHFCNTU1atu2rcPtbdu2rfdzq44ePep0/Yv/NmWf/sgTvZN+/FiX119/XRs2bNC8efO0adMmjRw50udezLrKlb55Y5++yFPjHDBggJYuXaq8vDwtXLhQpaWlGjRokCorKy+3ZCCgeSoHfIE7jjePP/64EhISar1Q8AWujG/z5s169dVXtXjx4uYo0WWujO2bb77Ru+++q5qaGq1Zs0YzZszQ888/r9mzZzdHyY3mytjuvvtuPfPMM/rFL36h0NBQde7cWUOGDPHJj3ZpqvqOJxUVFfrhhx+8VBXg+wI5v13lSk+6deum1157TatWrdIbb7whm82mgQMH6ttvv22Okn0Sx2VH8fHxWrRokd577z299957slqtGjJkiHbt2uXt0jzCZrNp8uTJuvHGG5WSklLveu44noS4XCUABJhf//rX9v/37NlTqamp6ty5s/Lz83XzzTd7sTIEqpEjR9r/n5qaqgEDBqhjx476y1/+4tN/dQnAd82dO1crV65Ufn5+QHzxWGVlpSZMmKDFixerTZs23i7H7Ww2m2JjY/XnP/9ZwcHB6tevn7777js9++yzysnJ8XZ5lyU/P19z5szRK6+8ogED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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 3, figsize=(15, 4))\n", "for ax, col, title in zip(\n", " axes,\n", " ['silhouette', 'kbet_acc', 'lisi'],\n", " ['Silhouette (lower better)', 'kBET acceptance (higher better)', 'LISI (higher better)'],\n", " strict=True,\n", "):\n", " colours = ['#999999'] + ['#2b8cbe'] * (len(summary) - 1)\n", " summary[col].plot.barh(ax=ax, color=colours)\n", " ax.set_title(title)\n", " ax.invert_yaxis()\n", " ax.grid(axis='x', alpha=0.3)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Per-batch peak-position drift, before vs after\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2026-04-23T12:26:07.849264Z", "iopub.status.busy": "2026-04-23T12:26:07.849071Z", "iopub.status.idle": "2026-04-23T12:26:10.034052Z", "shell.execute_reply": "2026-04-23T12:26:10.033274Z" } }, "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", "
beforeComBat (Johnson)Species-aware ComBat
mean_delta_mzmedian_delta_mzmax_abs_delta_mzmean_delta_mzmedian_delta_mzmax_abs_delta_mzmean_delta_mzmedian_delta_mzmax_abs_delta_mz
batch
Catania-1.2-3.06.00.00.06.0-0.20.03.0
Milan-1.6-3.012.00.40.06.00.60.06.0
Rome-1.20.030.00.20.03.0-0.60.06.0
\n", "
" ], "text/plain": [ " before ComBat (Johnson) \\\n", " mean_delta_mz median_delta_mz max_abs_delta_mz mean_delta_mz \n", "batch \n", "Catania -1.2 -3.0 6.0 0.0 \n", "Milan -1.6 -3.0 12.0 0.4 \n", "Rome -1.2 0.0 30.0 0.2 \n", "\n", " Species-aware ComBat \\\n", " median_delta_mz max_abs_delta_mz mean_delta_mz median_delta_mz \n", "batch \n", "Catania 0.0 6.0 -0.2 0.0 \n", "Milan 0.0 6.0 0.6 0.0 \n", "Rome 0.0 3.0 -0.6 0.0 \n", "\n", " \n", " max_abs_delta_mz \n", "batch \n", "Catania 3.0 \n", "Milan 6.0 \n", "Rome 6.0 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from maldibatchkit.diagnostics import peak_position_drift\n", "\n", "before = peak_position_drift(ds.X, ds.batch, mz_values=ds.mz, top_k=15)\n", "combat_johnson = peak_position_drift(\n", " ComBat(batch=ds.batch).fit_transform(ds.X),\n", " ds.batch, mz_values=ds.mz, top_k=15,\n", ")\n", "species_combat = peak_position_drift(\n", " SpeciesAwareComBat(batch=ds.batch, species=ds.species).fit_transform(ds.X),\n", " ds.batch, mz_values=ds.mz, top_k=15,\n", ")\n", "pd.concat(\n", " {'before': before, 'ComBat (Johnson)': combat_johnson, 'Species-aware ComBat': species_combat},\n", " axis=1,\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "maldibatchkit", "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.10.17" } }, "nbformat": 4, "nbformat_minor": 4 }