{ "cells": [ { "cell_type": "markdown", "id": "260fa1b6", "metadata": {}, "source": [ "# Multiple comparisons correction\n", "\n", "When you test colocalizations with 30 PET receptor maps, you're running 30 statistical tests at once. If you use a threshold of α=0.05, you'd expect 1–2 false positives by chance alone even if nothing is truly significant. This is the multiple comparisons problem.\n", "\n", "NiSpace provides several correction methods. This notebook explains what they do and when to use each one." ] }, { "cell_type": "code", "execution_count": 1, "id": "793abd10", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:03:52.145710Z", "iopub.status.busy": "2026-06-01T13:03:52.145589Z", "iopub.status.idle": "2026-06-01T13:03:52.468526Z", "shell.execute_reply": "2026-06-01T13:03:52.468163Z" } }, "outputs": [], "source": [ "import tqdm.notebook\n", "tqdm.notebook.tqdm = tqdm.tqdm\n", "\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "id": "ff323522", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:03:52.470302Z", "iopub.status.busy": "2026-06-01T13:03:52.470146Z", "iopub.status.idle": "2026-06-01T13:04:05.268910Z", "shell.execute_reply": "2026-06-01T13:04:05.268594Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.datasets: Loading pet maps.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.datasets: Loading integrated collection 'UniqueTracers' for dataset 'pet'.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.datasets: Filtering maps by collection.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.datasets: Loading data parcellated with 'Schaefer200Parcels7Networks'\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.api: *** NiSpace.fit() - Data extraction and preparation. ***\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.core.parcellation: Building multi-space Parcellation for 'Schaefer200Parcels7Networks' from library.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.core.parcellation: Available spaces: MNI152NLin2009cAsym, MNI152NLin6Asym, fsaverage, fsLR\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.core.parcellation: Parcellation 'Schaefer200Parcels7Networks': validation passed.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.core.parcellation: Lazy-loading parcellation image for space 'MNI152NLin2009cAsym'.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.core.parcellation: Parcellation 'Schaefer200Parcels7Networks': active space set to 'MNI152NLin2009cAsym'.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.api: Checking input data for 'x' (should be, e.g., PET data):\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.io: Input type: DataFrame, assuming parcellated data with shape (n_files/subjects/etc, n_parcels).\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWARNING | 01/06/26 15:03:54 | nispace.io: Parcellated data contains nan values!\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.api: Got 'x' data for 29 x 200 parcels.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.api: Checking input data for 'y' (should be, e.g., subject data):\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.io: Input type: list, assuming imaging data.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.io: Background (bg) handling: ignoring bg: True (bg value: ['auto', 0.0]); dropping bg parcels: False\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:54 | nispace.io: Parcellating imaging data.\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Parcellating (4 proc): 0%| | 0/1 [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Parcellating (4 proc): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 126.57it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:58 | nispace.api: Got 'y' data for 1 x 200 parcels.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:58 | nispace.api: Z-standardizing 'X' data.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:58 | nispace.api: *** NiSpace.colocalize() - Estimating X & Y colocalizations. ***\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:58 | nispace.api: Running 'spearman' colocalization.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:03:58 | nispace.api: Pre-ranking X and Y data.\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Colocalizing (spearman, 4 proc): 0%| | 0/1 [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Colocalizing (spearman, 4 proc): 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 1686.49it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.api: *** NiSpace.permute() - Estimate exact non-parametric p values. ***\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.api: Permutation of: X maps.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.api: Using default null method 'alexander_bloch' (parcellation null space: 'fsLR').\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.core.parcellation: Lazy-loading parcellation image for space 'fsLR'.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.api: Loading observed colocalizations (method = 'spearman').\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.core.permute: No null maps found.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.core.permute: Generating null maps (n = 1000, null_method = 'alexander_bloch').\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.core.parcellation: Lazy-loading parcellation image for space 'fsaverage'.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.nulls: Null map generation: Assuming n = 29 data vector(s) for n = 200 parcels.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.nulls: Using provided precomputed spin matrix.\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Spin null maps: 0%| | 0/29 [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Spin null maps: 83%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 24/29 [00:00<00:00, 234.22it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Spin null maps: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 29/29 [00:00<00:00, 233.36it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.nulls: Null data generation finished.\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:01 | nispace.core.permute: Z-standardizing null maps.\u001b[0m\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Processing null arrays (4 proc): 0%| | 0/1000 [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Processing null arrays (4 proc): 1%|▉ | 8/1000 [00:00<01:46, 9.33it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Processing null arrays (4 proc): 26%|████████████████████████████▎ | 260/1000 [00:00<00:02, 366.13it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Processing null arrays (4 proc): 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:01<00:00, 978.64it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Null colocalizations (spearman, 4 proc): 0%| | 0/1000 [00:00, ?it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Null colocalizations (spearman, 4 proc): 76%|████████████████████████████████████████████████████████████████████████████ | 760/1000 [00:00<00:00, 6950.92it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\r", "Null colocalizations (spearman, 4 proc): 100%|███████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 9067.92it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32mINFO | 01/06/26 15:04:05 | nispace.core.permute: Calculating exact p-values (tails = {'rho': 'upper'}).\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Testing 29 receptor maps simultaneously\n" ] } ], "source": [ "from nispace.datasets import fetch_reference\n", "from nispace.io import load_img\n", "from nispace.api import NiSpace\n", "\n", "# set up and run the pain analysis\n", "pet_maps = fetch_reference(\"pet\", parcellation=\"Schaefer200\",\n", " collection=\"UniqueTracers\", print_references=False)\n", "pain_map = load_img(\"neuroquery/pain.nii.gz\")\n", "\n", "nsp = NiSpace(x=pet_maps, y=pain_map, y_labels=\"Pain\",\n", " parcellation=\"Schaefer200\", seed=42, n_proc=4)\n", "nsp.fit()\n", "nsp.colocalize(\"spearman\")\n", "nsp.permute(\"maps\", n_perm=1000, p_tails=\"upper\")\n", "\n", "p_values = nsp.get_p_values()\n", "print(f\"Testing {p_values.shape[1]} receptor maps simultaneously\")" ] }, { "cell_type": "markdown", "id": "8917d2b9", "metadata": {}, "source": [ "## Methods overview\n", "\n", "NiSpace provides two categories of multiple comparison correction:\n", "\n", "- **Empirical** (use the permutation null distribution): Meff, maxT, step-maxT\n", "- **Classical** (operate on p-values directly): FDR (Benjamini-Hochberg), Bonferroni, and any statsmodels-compatible method\n", "\n", "The workflow is the same for all methods: call `correct_p()` to compute and store the corrected p-values, then retrieve them with `get_p_values()`:\n", "\n", "```python\n", "nsp.correct_p(mc_method=\"meff\") # compute and store\n", "p_corr = nsp.get_p_values(mc_method=\"meff\") # retrieve\n", "```\n", "\n", "| Method | Controls | When to use |\n", "|--------|----------|-------------|\n", "| Meff (Galwey) | FWER | **NiSpace default**; adapts to inter-map correlations |\n", "| maxT / step-maxT | FWER | When stats are comparable across maps (Spearman, Pearson, standardized beta) |\n", "| FDR-BH | FDR | When FWER control is too strict |\n", "| Bonferroni | FWER | Rarely — Meff is strictly better when tests are correlated |" ] }, { "cell_type": "markdown", "id": "680ace3c", "metadata": {}, "source": [ "## Meff — the NiSpace default\n", "\n", "The 29 PET receptor maps are not independent — serotonin receptors, dopamine transporters, and cholinergic markers all tend to co-localize. Standard Bonferroni ignores this correlation structure and therefore over-corrects.\n", "\n", "Meff estimates the *effective number of independent tests* from the eigenvalue spectrum of the inter-map correlation matrix, then applies a Sidak correction using this smaller effective number. Because it adapts to the actual correlation structure of your X maps rather than assuming independence, it is the NiSpace default.\n", "\n", "Two variants are available — `\"meff\"` resolves to the Galwey method:\n", "- `\"meff\"` / `\"meff_galwey\"` — **default**; Galwey (2009), *Genet Epidemiol*\n", "- `\"meff_li_ji\"` — Li & Ji (2005), *Ann Hum Genet*; slightly different eigenvalue weighting\n", "\n", "Calling `correct_p()` with no arguments uses Meff (Galwey)." ] }, { "cell_type": "code", "execution_count": 3, "id": "0646e1bc", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:04:05.270630Z", "iopub.status.busy": "2026-06-01T13:04:05.270515Z", "iopub.status.idle": "2026-06-01T13:04:05.276432Z", "shell.execute_reply": "2026-06-01T13:04:05.276101Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Uncorrected (p < 0.05): 2 significant\n", "Meff (p < 0.05): 0 significant\n", "\n", "Meff: 12.3 effective independent tests out of 29 total\n" ] } ], "source": [ "alpha = 0.05\n", "\n", "nsp.correct_p(mc_method=\"meff\") # default; mc_method can be omitted\n", "p_meff = nsp.get_p_values(mc_method=\"meff\")\n", "\n", "print(f\"Uncorrected (p < {alpha}): {(p_values < alpha).sum(axis=1).values[0]} significant\")\n", "print(f\"Meff (p < {alpha}): {(p_meff < alpha).sum(axis=1).values[0]} significant\")\n", "\n", "# how many effective tests did Meff find?\n", "from nispace.stats.misc import compute_meff\n", "n_tests = p_meff.shape[1]\n", "meff_value = compute_meff(np.array(nsp.get_x()))\n", "print(f\"\\nMeff: {meff_value:.1f} effective independent tests out of {n_tests} total\")" ] }, { "cell_type": "markdown", "id": "277236b3", "metadata": {}, "source": [ "## maxT and step-maxT\n", "\n", "maxT (Westfall & Young, 1993) controls FWER by using the permutation null distribution directly. Rather than looking at each test's null distribution independently, it builds a joint null distribution from the *maximum* test statistic across all reference maps in each permutation. This naturally accounts for inter-map correlations without any distributional assumptions.\n", "\n", "**Key constraint:** maxT assumes test statistics are on a *comparable scale* across X maps. This holds for:\n", "- Spearman and Pearson correlations — always in [−1, 1] ✓\n", "- Standardized regression coefficients (X was z-scored) ✓\n", "- **Not** for unstandardized regression coefficients — NiSpace emits a warning if this assumption may be violated\n", "\n", "Because `permute()` already stores the null distributions, calling `correct_p(\"maxT\")` or `correct_p(\"step_maxT\")` is computationally free. Step-maxT is a stepwise variant that tests maps in decreasing order of their observed statistic and achieves higher power than basic maxT." ] }, { "cell_type": "code", "execution_count": 4, "id": "1faab05c", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:04:05.277928Z", "iopub.status.busy": "2026-06-01T13:04:05.277814Z", "iopub.status.idle": "2026-06-01T13:04:05.282905Z", "shell.execute_reply": "2026-06-01T13:04:05.282598Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "maxT (p < 0.05): 0 significant\n", "step-maxT (p < 0.05): 0 significant\n" ] } ], "source": [ "nsp.correct_p(mc_method=\"maxT\")\n", "p_maxt = nsp.get_p_values(mc_method=\"maxT\")\n", "\n", "nsp.correct_p(mc_method=\"step_maxT\")\n", "p_step_maxt = nsp.get_p_values(mc_method=\"step_maxT\")\n", "\n", "print(f\"maxT (p < {alpha}): {(p_maxt < alpha).sum(axis=1).values[0]} significant\")\n", "print(f\"step-maxT (p < {alpha}): {(p_step_maxt < alpha).sum(axis=1).values[0]} significant\")" ] }, { "cell_type": "markdown", "id": "b0a0ba9e", "metadata": {}, "source": [ "## FDR correction (Benjamini-Hochberg)\n", "\n", "FDR correction controls the *expected proportion of false positives among rejected hypotheses* — the false discovery rate — rather than the probability of any false positive. It is less conservative than FWER methods and is widely used in neuroimaging.\n", "\n", "Note that FDR control has a different interpretation from FWER: it says \"among the significant results, I expect about X% to be false\" rather than \"I control the probability of making any error at all.\" Whether this is appropriate depends on your analysis goals." ] }, { "cell_type": "code", "execution_count": 5, "id": "11ab15bd", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:04:05.284393Z", "iopub.status.busy": "2026-06-01T13:04:05.284276Z", "iopub.status.idle": "2026-06-01T13:04:05.286887Z", "shell.execute_reply": "2026-06-01T13:04:05.286561Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "FDR-BH (p < 0.05): 0 significant\n" ] } ], "source": [ "nsp.correct_p(mc_method=\"fdr_bh\")\n", "p_fdr = nsp.get_p_values(mc_method=\"fdr_bh\")\n", "print(f\"FDR-BH (p < {alpha}): {(p_fdr < alpha).sum(axis=1).values[0]} significant\")" ] }, { "cell_type": "markdown", "id": "4023bba1", "metadata": {}, "source": [ "## Bonferroni correction\n", "\n", "Bonferroni multiplies each p-value by the total number of tests (capped at 1), assuming all tests are independent. It is the most conservative option. In practice, the reference maps in NiSpace are correlated, so Meff (which accounts for this) is almost always a better choice — it controls FWER with higher power." ] }, { "cell_type": "code", "execution_count": 6, "id": "6c7f2c93", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:04:05.288546Z", "iopub.status.busy": "2026-06-01T13:04:05.288411Z", "iopub.status.idle": "2026-06-01T13:04:05.291059Z", "shell.execute_reply": "2026-06-01T13:04:05.290772Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Bonferroni (p < 0.05): 0 significant\n" ] } ], "source": [ "nsp.correct_p(mc_method=\"bonferroni\")\n", "p_bonf = nsp.get_p_values(mc_method=\"bonferroni\")\n", "print(f\"Bonferroni (p < {alpha}): {(p_bonf < alpha).sum(axis=1).values[0]} significant\")" ] }, { "cell_type": "markdown", "id": "c294199c", "metadata": {}, "source": [ "## Full comparison\n", "\n", "Let's put all correction methods side by side:" ] }, { "cell_type": "code", "execution_count": 7, "id": "a61d1da8", "metadata": { "execution": { "iopub.execute_input": "2026-06-01T13:04:05.292662Z", "iopub.status.busy": "2026-06-01T13:04:05.292545Z", "iopub.status.idle": "2026-06-01T13:04:05.302016Z", "shell.execute_reply": "2026-06-01T13:04:05.301728Z" } }, "outputs": [ { "data": { "text/html": [ "
| \n", " | \n", " | rho | \n", "p_raw | \n", "p_meff | \n", "p_maxt | \n", "p_step_maxt | \n", "p_fdr | \n", "p_bonf | \n", "
|---|---|---|---|---|---|---|---|---|
| set | \n", "map | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| Noradrenaline/Acetylcholine | \n", "target-VAChT_tracer-feobv_n-18_dx-hc_pub-aghourian2017 | \n", "0.435971 | \n", "0.020 | \n", "0.219690 | \n", "0.163 | \n", "0.163 | \n", "0.44950 | \n", "0.580 | \n", "
| Opioids/Endocannabinoids | \n", "target-KOR_tracer-ly2795050_n-28_dx-hc_pub-vijay2018 | \n", "0.339014 | \n", "0.031 | \n", "0.320682 | \n", "0.407 | \n", "0.385 | \n", "0.44950 | \n", "0.899 | \n", "
| Noradrenaline/Acetylcholine | \n", "target-NET_tracer-mrb_n-10_dx-hc_pub-hesse2017 | \n", "0.309315 | \n", "0.068 | \n", "0.578821 | \n", "0.493 | \n", "0.464 | \n", "0.54375 | \n", "1.000 | \n", "
| Histamine | \n", "target-H3_tracer-gsk189254_n-8_dx-hc_pub-gallezot2017 | \n", "0.304823 | \n", "0.075 | \n", "0.616060 | \n", "0.508 | \n", "0.464 | \n", "0.54375 | \n", "1.000 | \n", "
| Glutamate | \n", "target-mGluR5_tracer-abp688_n-73_dx-hc_pub-smart2019 | \n", "0.219451 | \n", "0.167 | \n", "0.893923 | \n", "0.731 | \n", "0.633 | \n", "0.81200 | \n", "1.000 | \n", "
| Serotonin | \n", "target-5HTT_tracer-dasb_n-18_dx-hc_pub-savli2012 | \n", "0.176491 | \n", "0.227 | \n", "0.957637 | \n", "0.812 | \n", "0.734 | \n", "0.81200 | \n", "1.000 | \n", "
| Opioids/Endocannabinoids | \n", "target-MOR_tracer-carfentanil_n-204_dx-hc_pub-kantonen2020 | \n", "0.151909 | \n", "0.254 | \n", "0.972622 | \n", "0.853 | \n", "0.783 | \n", "0.81200 | \n", "1.000 | \n", "
| Dopamine | \n", "target-DAT_tracer-fpcit_n-174_dx-hc_pub-dukart2018 | \n", "0.129229 | \n", "0.272 | \n", "0.979716 | \n", "0.891 | \n", "0.830 | \n", "0.81200 | \n", "1.000 | \n", "
| Opioids/Endocannabinoids | \n", "target-CB1_tracer-omar_n-77_dx-hc_pub-normandin2015 | \n", "0.102278 | \n", "0.325 | \n", "0.991982 | \n", "0.924 | \n", "0.868 | \n", "0.81200 | \n", "1.000 | \n", "
| GABA | \n", "target-GABAa5_tracer-ro154513_n-10_dx-hc_pub-lukow2022 | \n", "0.111743 | \n", "0.334 | \n", "0.993200 | \n", "0.911 | \n", "0.858 | \n", "0.81200 | \n", "1.000 | \n", "