Modelling variability in functional brain networks using embeddings.
The 12 matches
- [1] § Methods › Datasets › Real MEG data ↔ data_preprocessing/wakeman_henson/1_preprocess.py, lines 11–44 · score 0.86 · notch filter, bad segment, Wakeman Henson, 125 Hz, ECG, EoG
- [2] § Methods › Datasets › Real MEG data ↔ data_preprocessing/notts/1_preprocess.py, lines 14–52 · score 0.85 · notch filter, bad segment, bad channel, 125 Hz, ECG, EoG
- [3] § Results › Real MEG data › Wakeman Henson: HIVE reveals similarities and differences between MEG recordings ↔ real_data/wakeman_henson/analyse_and_plot.py, lines 253–311 · score 0.78 · Calinski Harabasz score, Davies Bouldin score, Silhouette score, HMM DE, clusters, dual
- [4] § Results › Real MEG data › Wakeman Henson: HIVE reveals similarities and differences between MEG recordings ↔ real_data/multi_dataset/analyse_and_plot.py, lines 483–551 · score 0.77 · Calinski Harabasz score, Davies Bouldin score, Silhouette score, HMM DE, clusters, dual
- [5] § Results › Real MEG data › Wakeman Henson: HIVE reveals similarities and differences between MEG recordings ↔ real_data/wakeman_henson/analyse_and_plot.py, lines 253–311 · score 0.74 · Calinski Harabasz score, negative Davies Bouldin, Silhouette score, Wakeman Henson, HMM DE, Clustering
- [6] § Results › Real MEG data › Wakeman Henson: HIVE reveals similarities and differences between MEG recordings ↔ real_data/multi_dataset/analyse_and_plot.py, lines 483–551 · score 0.72 · Calinski Harabasz score, negative Davies Bouldin, Silhouette score, HMM DE, Clustering, HIVE
- [7] § Results › Real MEG data › Cam-CAN: HIVE reveals individual variability across age ↔ real_data/camcan/predict_age.py, lines 87–147 · score 0.62 · cross validation, predict age, folds, demographics, dimensions, training
- [8] § Methods › Datasets › Real MEG data ↔ data_preprocessing/notts/3_source_reconstruct.py, lines 88–129 · score 0.61 · Source reconstruction, surfaces, beamformer, nose, symmetric, Coregistration
- [9] § Methods › Datasets › Real MEG data ↔ data_preprocessing/wakeman_henson/2_source_reconstruct.py, lines 34–81 · score 0.60 · Source reconstruction, surfaces, beamformer, nose, symmetric, Coregistration
- [10] § Results › Real MEG data › Cam-CAN: HIVE reveals individual variability across age ↔ real_data/camcan/hive.py, lines 92–226 · score 0.58 · nearest neighbours, power maps, young, Centroids, PSDs, age
- [11] § Results › Real MEG data › Cam-CAN: HIVE reveals individual variability across age ↔ real_data/camcan/analyse_and_plot.py, lines 258–368 · score 0.57 · nearest neighbours, power maps, young, Centroids, PSDs, age
- [12] § Results › Real MEG data › Cam-CAN: HIVE reveals individual variability across age ↔ real_data/camcan/predict_age.py, lines 87–147 · score 0.55 · age prediction, cross validated, fold, PCA, dimensions, HMM
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 347 lines · 9.7 KB · MIT · 2 matches
- import os
- from glob import glob
- from collections import defaultdict
- import numpy as np
- import pickle
- import matplotlib.pyplot as plt
- from scipy.stats import ttest_ind
- from scipy.spatial.distance import pdist, squareform
- from sklearn.metrics import (
- davies_bouldin_score,
- silhouette_score,
- calinski_harabasz_score,
- )
- from osl_dynamics.utils import plotting, set_random_seed
- from osl_dynamics.inference import tf_ops
- from osl_dynamics.models import hive
- from osl_dynamics.data import Data
- from osl_dynamics.analysis import spectral, power, connectivity
- tf_ops.gpu_growth()
- set_random_seed(0)
- def get_best_dimension(dimensions, significance_level=0.01):
- best_dim = dimensions[0]
- fe_1 = [
- pickle.load(open(f"results/hive_{best_dim}/run{i}/model/history.pkl", "rb"))[
- "free_energy"
- ]
- for i in range(1, 11)
- ]
- for i in range(len(dimensions) - 1):
- dim = dimensions[i + 1]
- fe_2 = [
- pickle.load(open(f"results/hive_{dim}/run{i}/model/history.pkl", "rb"))[
- "free_energy"
- ]
- for i in range(1, 11)
- ]
- pvalue = ttest_ind(fe_1, fe_2, alternative="greater", permutations=5000).pvalue
- print(f"p-value for {best_dim} vs {dim}: {pvalue}")
- if pvalue < significance_level:
- best_dim = dim
- fe_1 = fe_2
- print(f"Best dimension: {best_dim}")
- return best_dim
- def get_best_hive_run(dim):
- best_fe = np.Inf
- for run in range(1, 11):
- history = pickle.load(
- open(f"results/hive_{dim}/run{run}/model/history.pkl", "rb")
- )
- if history["loss"][-1] < best_fe:
- best_fe = history["loss"][-1]
- best_run = run
- print(f"Best HIVE run: {best_run}")
- return best_run
- def get_best_hmm_run():
- best_fe = np.Inf
- for run in range(1, 11):
- history = pickle.load(open(f"results/hmm/run{run}/model/history.pkl", "rb"))
- if history["loss"][-1] < best_fe:
- best_fe = history["loss"][-1]
- best_run = run
- print(f"Best HMM run: {best_run}")
- return best_run
- def load_data(use_tfrecord=True, buffer_size=2000, n_jobs=16):
- """Load the data."""
- data_paths = sorted(
- glob(
- "/well/woolrich/projects/wakeman_henson/spring23/src/sub*_run*/sflip_parc-raw.fif"
- )
- )
- training_data = Data(
- data_paths,
- sampling_frequency=250,
- mask_file="MNI152_T1_8mm_brain.nii.gz",
- parcellation_file="fmri_d100_parcellation_with_PCC_reduced_2mm_ss5mm_ds8mm.nii.gz",
- picks="misc",
- reject_by_annotation="omit",
- use_tfrecord=use_tfrecord,
- buffer_size=buffer_size,
- n_jobs=n_jobs,
- )
- return training_data
- best_dim = get_best_dimension([3, 5, 10, 20, 30])
- best_hive_run = get_best_hive_run(best_dim)
- hive_loss = pickle.load(
- open(f"results/hive_{best_dim}/run{best_hive_run}/model/history.pkl", "rb")
- )["loss"]
- best_hmm_run = get_best_hmm_run()
- hmm_loss = pickle.load(open(f"results/hmm/run{best_hmm_run}/model/history.pkl", "rb"))[
- "loss"
- ]
- model = hive.Model.load(f"results/hive_{best_dim}/run{best_hive_run}/model")
- inf_params_dir = f"results/hive_{best_dim}/run{best_hive_run}/inf_params"
- best_run_dir = f"results/best_run"
- os.makedirs(best_run_dir, exist_ok=True)
- plot_dir = f"{best_run_dir}/plots"
- os.makedirs(plot_dir, exist_ok=True)
- plotting.plot_line(
- [range(len(hive_loss)), range(len(hmm_loss))],
- [hive_loss, hmm_loss],
- labels=["HIVE", "HMM-DE"],
- filename=f"{plot_dir}/loss.png",
- )
- alpha = pickle.load(open(f"{inf_params_dir}/alp.pkl", "rb"))
- embeddings = np.load(f"{inf_params_dir}/summed_embeddings.npy")
- plotting.plot_alpha(
- alpha[0],
- n_samples=2000,
- cmap="tab10",
- filename=f"{plot_dir}/alpha.png",
- )
- # Pairwise correlation between subject embeddings
- se_cosine = squareform(pdist(embeddings, metric="cosine"))
- fig, ax = plotting.plot_matrices(
- se_cosine,
- cmap="coolwarm",
- )
- ax[0][0].set_xticks(
- ticks=np.arange(0, 114, 6) + 3, labels=[f"{i + 1}" for i in range(19)]
- )
- ax[0][0].set_yticks(
- ticks=np.arange(0, 114, 6) + 3, labels=[f"{i + 1}" for i in range(19)]
- )
- fig.savefig(f"{plot_dir}/embeddings_cosine.png")
- training_data = load_data(n_jobs=16)
- trimmed_data = training_data.trim_time_series(
- sequence_length=200,
- n_embeddings=15,
- prepared=False,
- )
- spectra = spectral.multitaper_spectra(
- data=trimmed_data,
- alpha=alpha,
- sampling_frequency=250,
- n_jobs=16,
- )
- pickle.dump(spectra, open(f"{inf_params_dir}/spectra.pkl", "wb"))
- f, psd, coh = pickle.load(open(f"{inf_params_dir}/spectra.pkl", "rb"))
- nnmf = spectral.decompose_spectra(coh, n_components=2)
- np.save(f"{inf_params_dir}/nnmf_2.npy", nnmf)
- f, psd, coh = pickle.load(open(f"{inf_params_dir}/spectra.pkl", "rb"))
- frequency_range = [1, 45]
- n_components = nnmf.shape[0]
- plotting.plot_line(
- [f] * n_components,
- nnmf,
- labels=[f"Component {i}" for i in range(n_components)],
- x_label="Frequency (Hz)",
- y_label="Weighting",
- )
- # Calculate group average
- gpsd = np.average(psd, axis=0)
- gcoh = np.average(coh, axis=0)
- # Calculate average PSD across channels and the standard error
- p = np.mean(gpsd, axis=-2)
- e = np.std(gpsd, axis=-2) / np.sqrt(gpsd.shape[-2])
- # Plot PSDs
- n_states = gpsd.shape[0]
- fig, axes = plt.subplots(1, 6, figsize=(36, 6))
- for i in range(model.config.n_states):
- plotting.plot_line(
- [f],
- [p[i]],
- errors=[[p[i] - e[i]], [p[i] + e[i]]],
- labels=[f"State {i + 1}"],
- x_range=[f[0], f[-1]],
- y_range=[p.min() - 0.1 * p.max(), 1.2 * p.max()],
- x_label="Frequency (Hz)",
- y_label="PSD (a.u.)",
- ax=axes[i],
- )
- axes[i].axvspan(
- frequency_range[0],
- frequency_range[1],
- alpha=0.25,
- color="gray",
- )
- fig.savefig(f"{plot_dir}/spectra_psd.png")
- gp = power.variance_from_spectra(f, gpsd, nnmf)
- power.save(
- gp,
- mask_file=training_data.mask_file,
- parcellation_file=training_data.parcellation_file,
- subtract_mean=True,
- show_plots=False,
- filename=f"{plot_dir}/psd.png",
- combined=True,
- titles=[f"Mode {i+1}" for i in range(model.config.n_states)],
- plot_kwargs={"views": ["lateral"]},
- )
- gc = connectivity.mean_coherence_from_spectra(f, gcoh, nnmf)
- gc = connectivity.threshold(gc, percentile=97, subtract_mean=True)
- connectivity.save(
- gc,
- parcellation_file=training_data.parcellation_file,
- combined=True,
- titles=[f"Mode {i+1}" for i in range(model.config.n_states)],
- filename=f"{plot_dir}/coh.png",
- )
- clustering_scores = {
- "hmm": defaultdict(list),
- "hive": defaultdict(list),
- }
- subject_labels = np.repeat(np.arange(19), 6)
- for model in ["hmm", "hive"]:
- model_dir = f"results/{model}"
- for run in range(1, 11):
- if model == "hive":
- covs = np.load(
- f"{model_dir}_{best_dim}/run{run}/inf_params/session_covs.npy"
- )
- else:
- covs = np.load(f"{model_dir}/run{run}/dual_estimates/covs.npy")
- covs_flatten = np.array([cov.flatten() for cov in covs])
- clustering_scores[model]["silhouette"].append(
- silhouette_score(covs_flatten, subject_labels)
- )
- clustering_scores[model]["davies_bouldin"].append(
- davies_bouldin_score(covs_flatten, subject_labels)
- )
- clustering_scores[model]["calinski_harabasz"].append(
- calinski_harabasz_score(covs_flatten, subject_labels)
- )
- plotting.plot_violin(
- np.array(
- [
- clustering_scores["hive"]["silhouette"],
- clustering_scores["hmm"]["silhouette"],
- ]
- ),
- ["HIVE", "HMM-DE"],
- title="Silhouette score",
- y_label="Score",
- sns_kwargs={"cut": 0, "scale": "width"},
- filename=f"{plot_dir}/silhouette_scores.png",
- )
- plotting.plot_violin(
- 1
- - np.array(
- [
- clustering_scores["hive"]["davies_bouldin"],
- clustering_scores["hmm"]["davies_bouldin"],
- ]
- ),
- ["HIVE", "HMM-DE"],
- title="Negative Davies-Bouldin score",
- y_label="Score",
- sns_kwargs={"cut": 0, "scale": "width"},
- filename=f"{plot_dir}/davies_bouldin_scores.png",
- )
- plotting.plot_violin(
- np.array(
- [
- clustering_scores["hive"]["calinski_harabasz"],
- clustering_scores["hmm"]["calinski_harabasz"],
- ]
- ),
- ["HIVE", "HMM-DE"],
- title="Calinski-Harabasz score",
- y_label="Score",
- sns_kwargs={"cut": 0, "scale": "width"},
- filename=f"{plot_dir}/calinski_harabasz_scores.png",
- )
- best_hmm_covs = np.load(f"results//hmm/run{best_hmm_run}/dual_estimates/covs.npy")
- best_hive_covs = np.load(
- f"results/hive_{best_dim}/run{best_hive_run}/inf_params/session_covs.npy"
- )
- best_hmm_covs_flatten = np.array([cov.flatten() for cov in best_hmm_covs])
- best_hive_covs_flatten = np.array([cov.flatten() for cov in best_hive_covs])
- # Get the pairwise distances
- hmm_pdist = squareform(pdist(best_hmm_covs_flatten, metric="euclidean"))
- hive_pdist = squareform(pdist(best_hive_covs_flatten, metric="euclidean"))
- fig, ax = plotting.plot_matrices(
- [
- hive_pdist,
- hmm_pdist,
- ],
- titles=["HIVE", "HMM-DE"],
- cmap="coolwarm",
- )
- ax[0][0].set_xticks(
- ticks=np.arange(0, 114, 6) + 3,
- labels=[f"{i + 1}" for i in range(19)],
- fontsize=6,
- )
- ax[0][0].set_yticks(
- ticks=np.arange(0, 114, 6) + 3,
- labels=[f"{i + 1}" for i in range(19)],
- fontsize=6,
- )
- plt.setp(ax[0][0].get_xticklabels(), rotation=45)
- ax[0][1].set_xticks(
- ticks=np.arange(0, 114, 6) + 3,
- labels=[f"{i + 1}" for i in range(19)],
- fontsize=6,
- )
- ax[0][1].set_yticks(
- ticks=np.arange(0, 114, 6) + 3,
- labels=[f"{i + 1}" for i in range(19)],
- fontsize=6,
- )
- plt.setp(ax[0][1].get_xticklabels(), rotation=45)
- fig.savefig(f"{plot_dir}/covs_pairwise_distances.png")
analyse_and_plot.py at commit 7456b9a, under MIT · at the source
Overview
Abstract
Functional neuroimaging techniques allow us to estimate functional networks that underlie cognition. However, these functional networks are often estimated at the group level and do not allow for the discovery of, nor benefit from, subpopulation structure in the data, that is, the fact that some recording sessions may be more similar than others. Here, we propose the use of embedding vectors (c.f. word embedding in Natural Language Processing) to explicitly model individual sessions while inferring networks across a group. This vector is effectively a “fingerprint” for each session, which can cluster sessions with similar functional networks together in a learnt embedding space. We apply this approach to estimate dynamic functional networks using a hierarchical Hidden Markov Model (HMM). We call this approach HIVE (HMM with Integrated Variability Estimation). Using simulated data, we show that HIVE can uncover true subpopulation structure and show improved performance over existing approaches. Using real magnetoencephalography data, we show the learnt embedding vectors (session fingerprints) reflect meaningful sources of variation across a population. Overall, HIVE provides a powrful new approach for modelling individual sessions while leveraging information available across an entire group.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 12 matches between paragraphs and lines of code.
OHBA-analysis/Huang2025_ModelVariabilityWithEmbeddings
7456b9af6601e253f6728823e2c99b14e2d3e9ec, 26 February 2025Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
29 files
- data_preprocessing/
camcan/ , Python, 56 lines1_preprocess.py - data_preprocessing/
camcan/ , Python, 654 lines2_coregister.py - data_preprocessing/
camcan/ , Python, 71 lines3_source_reconstruct.py - data_preprocessing/
camcan/ , Python, 46 lines4_sign_flip.py - data_preprocessing/
notts/ , Python, 52 lines, 1 match1_preprocess.py - data_preprocessing/
notts/ , Python, 60 lines2_fix_smri_files.py - data_preprocessing/
notts/ , Python, 129 lines, 1 match3_source_reconstruct.py - data_preprocessing/
notts/ , Python, 49 lines4_sign_flip.py - data_preprocessing/
wakeman_henson/ , Python, 44 lines, 1 match1_preprocess.py - data_preprocessing/
wakeman_henson/ , Python, 81 lines, 1 match2_source_reconstruct.py - data_preprocessing/
wakeman_henson/ , Python, 48 lines3_sign_flip.py - real_data/
camcan/ , Python, 371 lines, 1 matchanalyse_and_plot.py - real_data/
camcan/ , Python, 258 lines, 1 matchhive.py - real_data/
camcan/ , Python, 61 lineshmm.py - real_data/
camcan/ , Python, 147 lines, 2 matchespredict_age.py - real_data/
camcan/ , Python, 39 linessubmit.py - real_data/
multi_dataset/ , Python, 551 lines, 2 matchesanalyse_and_plot.py - real_data/
multi_dataset/ , Python, 170 lineshive.py - real_data/
multi_dataset/ , Python, 176 lineshmm.py - real_data/
multi_dataset/ , Python, 39 linessubmit.py - real_data/
wakeman_henson/ , Python, 347 lines, 2 matchesanalyse_and_plot.py - real_data/
wakeman_henson/ , Python, 62 lineshive.py - real_data/
wakeman_henson/ , Python, 62 lineshmm.py - real_data/
wakeman_henson/ , Python, 39 linessubmit.py - simulations/
simulation_1.py , Python, 329 lines - simulations/
simulation_2.py , Python, 313 lines - simulations/
simulation_3.py , Python, 450 lines - LICENSE, License, 21 lines
- README.md, Text, 20 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 27 scripts, each with its path and the digest of its content;
- 12 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data and Code Availability
Data used are publicly available. Availability of the Nottingham dataset is at the official MEGUK site: https://
github.com/
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 29 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 3 authors, 5 keywords, 3 funders, 66 references.
Cite
This paper
Huang, R., Gohil, C., & Woolrich, M. (2026). Modelling variability in functional brain networks using embeddings. Imaging neuroscience (Cambridge, Mass.), 4, IMAG.a.1188. https://
BibTeX
@article{huang2026modell
author = {Huang, Rukuang and Gohil, Chetan and Woolrich, Mark},
title = {{Modelling variability in functional brain networks using embeddings}},
journal = {Imaging neuroscience (Cambridge, Mass.)},
year = {2026},
month = apr,
volume = {4},
pages = {IMAG.a.1188},
publisher = {MIT Press},
issn = {2837-6056},
doi = {10.1162/
url = {https://
pmid = {42016560},
pmcid = {PMC13094015}
}
RIS
TY - JOUR
AU - Huang, Rukuang
AU - Gohil, Chetan
AU - Woolrich, Mark
TI - Modelling variability in functional brain networks using embeddings
T2 - Imaging neuroscience (Cambridge, Mass.)
J2 - Imaging Neurosci (Camb)
PY - 2026
DA - 2026/
VL - 4
SP - IMAG.a.1188
SN - 2837-6056
PB - MIT Press
DO - 10.1162/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1162/
"type": "article-journal",
"title": "Modelling variability in functional brain networks using embeddings",
"container-title": "Imaging neuroscience (Cambridge, Mass.)",
"author": [
{
"family": "Huang",
"given": "Rukuang"
},
{
"family": "Gohil",
"given": "Chetan"
},
{
"family": "Woolrich",
"given": "Mark"
}
],
"container-title-short":
"volume": "4",
"page": "IMAG.a.1188",
"DOI": "10.1162/
"PMID": "42016560",
"PMCID": "PMC13094015",
"ISSN": "2837-6056",
"publisher": "MIT Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
17
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1162/imag.a.1301 [code]
- MEG-GPT: A transformer-based foundation model for magnetoencephalography data.Journal: Imaging neuroscience (Cambridge, Mass.)In common: NiBabel, seaborn, scikit-learn, 4 other tools, 15 references
- [2] doi:10.1162/imag.a.1237 [code]
- Modelling discrete states and long-term dynamics in functional brain networks.Journal: Imaging neuroscience (Cambridge, Mass.)In common: seaborn, scikit-learn, pandas, 3 other tools, systems, 12 references, author Rukuang Huang
- [3] doi:10.1162/imag.a.1190 [code]
- Canonical Hidden Markov Model Networks for studying M/
EEG. Journal: Imaging neuroscience (Cambridge, Mass.)In common: OHBA Software Library (OSL), NiBabel, scikit-learn, 4 other tools, 12 references - [4] doi:10.1002/hbm.70516 [code]
- Effects of Age on Resting-State Cortical Networks.Journal: Human brain mappingIn common: OHBA Software Library (OSL), NiBabel, scikit-learn, 4 other tools, 10 references
- [5] doi:10.1038/s41531-026-01372-1 [code]
- Varying patterns of association between cortical large-scale networks and subthalamic nucleus activity in Parkinson's disease.Journal: NPJ Parkinson's diseaseIn common: OHBA Software Library (OSL), NiBabel, seaborn, 5 other tools, systems, 6 references
- [6] doi:10.1162/imag.a.1269 [code]
- From early to contemporary normative modeling: Mapping individual differences in neurophysiological signals.Journal: Imaging neuroscience (Cambridge, Mass.)In common: NiBabel, seaborn, scikit-learn, 4 other tools, 4 references
- [7] doi:10.1038/s41467-026-75745-8 [code]
- A language network in the individualized functional connectomes of 1199 human brains doing arbitrary tasks.Journal: Nature communicationsIn common: NiBabel, seaborn, scikit-learn, 4 other tools, 4 references
- [8] doi:10.1093/braincomms/fcag236 [code]
- Dynamic, state-dependent characteristics of cognitive fluctuations in Lewy body dementia: a magnetoencephalography study.Journal: Brain communicationsIn common: OHBA Software Library (OSL), pandas, NumPy, 4 references
- [9] doi:10.1038/s41467-026-76011-7 [code]
- Human cortex organizes dynamic co-fluctuations along the sensorimotor-association
axis. Journal: Nature communicationsIn common: NiBabel, SciPy, Matplotlib, 1 other tool, systems, 4 references - [10] doi:10.7554/elife.108109 [code]
- Multimodal MRI marker of cognition explains the association between cognition and mental health in the UK Biobank.Journal: eLifeIn common: seaborn, scikit-learn, pandas, 3 other tools, 3 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 27 scripts, and 12 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:ab957e9733cb7d42…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
