An in silico protocol for predicting genetic biomarkers in rare diseases: a case study in sporadic amyotrophic lateral sclerosis.
The 13 matches
- [1] § Methods › Data collection ↔ Project-script.py, lines 20–53 · score 0.84 · STRONGEST SNP RISK, CHR_ID, CHR_POS, MAPPED_GENE, ALLELE, TRAIT
- [2] § Methods › Data collection ↔ 1.py, lines 22–43 · score 0.84 · STRONGEST SNP RISK, CHR_ID, CHR_POS, MAPPED_GENE, ALLELE, TRAIT
- [3] § Methods › Data preprocessing ↔ Project-script.py, lines 226–303 · score 0.75 · positive negative SNP, dissimilar pairs, model training, intergenic, preprocessing, positional
- [4] § Methods › Machine learning model building ↔ 2.py, lines 18–161 · score 0.74 · max_depth, n_estimators, class weight, ROC AUC, Random Forest, split
- [5] § Materials and equipment › Visualization and results interpretation ↔ Project-script.py, lines 102–158 · score 0.70 · Precision Recall curve, confusion matrix, ROC curve, metrics, classifier, predictions
- [6] § Methods › Machine learning model building ↔ Project-script.py, lines 85–99 · score 0.67 · max_depth, n_estimators, class weight, Random Forest, classification, training
- [7] § Methods › Data collection ↔ Project-script.py, lines 20–53 · score 0.62 · riskAllele, mappedGenes, pValue, locations, TSV, chromosome
- [8] § Methods › Data collection ↔ 2.py, lines 164–224 · score 0.62 · riskAllele, mappedGenes, pValue, locations, TSV, chromosome
- [9] § Methods › Model validation ↔ 1.py, lines 228–294 · score 0.55 · Logistic Regression, Ridge Regression, Random Forest, metrics, model
- [10] § Methods › Data preprocessing ↔ Project-script.py, lines 56–82 · score 0.53 · gene related features, mapped genes, intergenic, numeric, Chromosomes, positions
- [11] § Methods › Data preprocessing ↔ Project-script.py, lines 226–303 · score 0.53 · chr_diff, pos_diff, dissimilarity, preprocessing, positional, SNPs
- [12] § Methods › Data preprocessing ↔ 2.py, lines 18–161 · score 0.52 · chr_diff, pos_diff, dissimilarity, chromosome, positional, SNPs
- [13] § Results › Performance of the prediction model ↔ Project-script.py, lines 102–158 · score 0.51 · Precision Recall curve, ROC curve, class, AUC, model, prediction
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 · 307 lines · 12 KB · CC-BY-4.0 · 8 matches
- import pandas as pd
- import numpy as np
- from sklearn.ensemble import RandomForestClassifier
- from sklearn.preprocessing import StandardScaler
- from sklearn.pipeline import Pipeline
- from sklearn.model_selection import train_test_split
- from sklearn.metrics import (classification_report, roc_auc_score,
- average_precision_score, confusion_matrix,
- precision_recall_curve, roc_curve)
- from sklearn.impute import SimpleImputer
- import matplotlib.pyplot as plt
- import joblib
- import warnings
- import seaborn as sns
- from tqdm import tqdm
- warnings.filterwarnings('ignore')
- def load_data():
- """Load and prepare positive (sALS) and negative (GWAS) SNPs"""
- # Load known sALS SNPs
- sals_df = pd.read_csv("EFO_0001357_associations_export.tsv", sep='\t')
- sals_df['target'] = 1
- # Load GWAS data for negative examples
- gwas_df = pd.read_csv("GWAS_cache.tsv", sep='\t', low_memory=False)
- # Process sALS SNPs
- sals_df['rsID'] = sals_df['riskAllele'].str.split('-').str[0]
- sals_df[['chromosome', 'position']] = sals_df['locations'].str.extract(r'([XYMT\d]+):(\d+)')
- sals_df['position'] = pd.to_numeric(sals_df['position'], errors='coerce')
- # Process GWAS SNPs
- if 'SNPS' in gwas_df.columns:
- gwas_df['rsID'] = gwas_df['SNPS'].str.split('-').str[0]
- else:
- gwas_df['rsID'] = gwas_df['STRONGEST SNP-RISK ALLELE'].str.split('-').str[0]
- gwas_df['chromosome'] = gwas_df['CHR_ID']
- gwas_df['position'] = gwas_df['CHR_POS'].astype(str).str.split(' x').str[0].str.split(';').str[0]
- gwas_df['position'] = pd.to_numeric(gwas_df['position'], errors='coerce')
- gwas_df['mappedGenes'] = gwas_df['MAPPED_GENE']
- gwas_df['pValue'] = gwas_df['P-VALUE']
- # Filter non-ALS SNPs
- als_keywords = ["amyotrophic lateral sclerosis", "ALS", "motor neuron disease"]
- gwas_df['is_als'] = gwas_df['DISEASE/TRAIT'].str.contains('|'.join(als_keywords), case=False, na=False)
- neg_df = gwas_df[~gwas_df['is_als']].copy()
- neg_df = neg_df[~neg_df['rsID'].isin(sals_df['rsID'])]
- neg_df['target'] = 0
- return sals_df, neg_df
- def prepare_features(df):
- """Prepare features for similarity analysis"""
- # Gene-related features
- df['gene_count'] = df['mappedGenes'].apply(lambda x: len(str(x).split(','))) if 'mappedGenes' in df.columns else 0
- df['is_intergenic'] = df['mappedGenes'].isna().astype(int) if 'mappedGenes' in df.columns else 1
- # p-value transformation
- if 'pValue' in df.columns:
- df['pValue'] = df['pValue'].replace('NR', np.nan)
- df['pValue'] = pd.to_numeric(df['pValue'], errors='coerce')
- df['log_pvalue'] = -np.log10(df['pValue'].replace(0, 1e-300))
- df['log_pvalue'] = df['log_pvalue'].fillna(df['log_pvalue'].median())
- else:
- df['log_pvalue'] = 0
- # Chromosome encoding
- chr_map = {str(i): i for i in range(1, 23)}
- chr_map.update({'X': 23, 'Y': 24, 'MT': 25})
- df['chr_encoded'] = df['chromosome'].map(chr_map).fillna(26)
- # Position handling
- if 'position' in df.columns:
- df['position'] = df['position'].fillna(df['position'].median())
- else:
- df['position'] = 0
- return df
- def train_model(X_train, y_train):
- """Train the similarity prediction model"""
- model = Pipeline([
- ('imputer', SimpleImputer(strategy='median')),
- ('scaler', StandardScaler()),
- ('clf', RandomForestClassifier(
- n_estimators=100,
- max_depth=5,
- class_weight='balanced',
- random_state=42,
- n_jobs=-1
- ))
- ])
- model.fit(X_train, y_train)
- return model
- def evaluate_model(model, X_test, y_test):
- """Evaluate model performance with comprehensive metrics"""
- print("\n=== Model Performance Evaluation ===")
- # Predictions
- y_pred = model.predict(X_test)
- y_proba = model.predict_proba(X_test)
- # Handle single class case
- if y_proba.shape[1] == 1:
- y_proba = np.column_stack([y_proba, 1 - y_proba])
- # Classification metrics
- print("\nDetailed Classification Report:")
- print(classification_report(y_test, y_pred))
- # Confusion matrix
- cm = confusion_matrix(y_test, y_pred)
- plt.figure(figsize=(6, 6))
- sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
- xticklabels=['Negative', 'Positive'],
- yticklabels=['Negative', 'Positive'])
- plt.title('Confusion Matrix')
- plt.xlabel('Predicted')
- plt.ylabel('Actual')
- plt.show()
- # ROC Curve
- fpr, tpr, _ = roc_curve(y_test, y_proba[:, 1])
- roc_auc = roc_auc_score(y_test, y_proba[:, 1])
- plt.figure(figsize=(6, 6))
- plt.plot(fpr, tpr, color='darkorange', lw=2,
- label=f'ROC curve (AUC = {roc_auc:.2f})')
- plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
- plt.xlabel('False Positive Rate')
- plt.ylabel('True Positive Rate')
- plt.title('Receiver Operating Characteristic')
- plt.legend(loc="lower right")
- plt.show()
- # Precision-Recall Curve
- precision, recall, _ = precision_recall_curve(y_test, y_proba[:, 1])
- avg_precision = average_precision_score(y_test, y_proba[:, 1])
- plt.figure(figsize=(6, 6))
- plt.plot(recall, precision, color='blue', lw=2,
- label=f'Precision-Recall (AP = {avg_precision:.2f})')
- plt.xlabel('Recall')
- plt.ylabel('Precision')
- plt.title('Precision-Recall Curve')
- plt.legend(loc="lower left")
- plt.show()
- # Key metrics
- print("\nKey Performance Metrics:")
- print(f"- ROC-AUC Score: {roc_auc:.3f}")
- print(f"- Average Precision: {avg_precision:.3f}")
- print(f"- Accuracy: {np.mean(y_pred == y_test):.3f}")
- def predict_similar_snps(model, reference_snps, candidate_snps, top_n=10):
- """Predict similar SNPs using the trained model with progress tracking"""
- results = []
- feature_names = ['chr_diff', 'pos_diff', 'pval_diff', 'gene_diff', 'intergenic_diff']
- total_snps = len(reference_snps)
- print(f"\nStarting prediction for {total_snps} reference SNPs...")
- print(f"Comparing against {len(candidate_snps)} candidate SNPs")
- print(f"Finding top {top_n} similar SNPs for each reference SNP\n")
- # Initialize progress bar
- pbar = tqdm(reference_snps.iterrows(), total=total_snps, desc="Processing SNPs")
- for idx, (_, ref_snp) in enumerate(pbar, 1):
- # Update progress bar description
- pbar.set_description(f"Processing {ref_snp['rsID']}")
- # Calculate similarity features
- features = []
- for _, cand_snp in candidate_snps.iterrows():
- features.append([
- abs(ref_snp['chr_encoded'] - cand_snp['chr_encoded']),
- abs(ref_snp['position'] - cand_snp['position']),
- abs(ref_snp['log_pvalue'] - cand_snp['log_pvalue']),
- abs(ref_snp['gene_count'] - cand_snp['gene_count']),
- abs(ref_snp['is_intergenic'] - cand_snp['is_intergenic'])
- ])
- features_df = pd.DataFrame(features, columns=feature_names)
- # Predict similarity scores
- proba = model.predict_proba(features_df)
- similarity_scores = proba[:, 1] if proba.shape[1] > 1 else np.zeros(len(features_df))
- # Get top matches
- top_matches = candidate_snps.copy()
- top_matches['similarity_score'] = similarity_scores
- top_matches = top_matches.nlargest(top_n, 'similarity_score')
- for _, match in top_matches.iterrows():
- results.append({
- 'reference_rsID': ref_snp['rsID'],
- 'reference_chr': ref_snp['chromosome'],
- 'reference_pos': ref_snp['position'],
- 'reference_genes': ref_snp['mappedGenes'],
- 'reference_pval': ref_snp['pValue'],
- 'predicted_rsID': match['rsID'],
- 'predicted_chr': match['chromosome'],
- 'predicted_pos': match['position'],
- 'predicted_genes': match['mappedGenes'],
- 'predicted_pval': match['pValue'],
- 'similarity_score': match['similarity_score']
- })
- # Update progress bar postfix with current SNP info
- pbar.set_postfix({
- 'Current SNP': ref_snp['rsID'],
- 'Top Match': top_matches.iloc[0]['rsID'],
- 'Top Score': f"{top_matches.iloc[0]['similarity_score']:.3f}"
- })
- print(f"\nPrediction completed for all {total_snps} reference SNPs!")
- return pd.DataFrame(results)
- def main():
- print("sALS SNP Similarity Prediction Pipeline")
- print("=" * 50)
- try:
- # 1. Data loading and preparation
- print("\n[1/4] Loading and preprocessing data...")
- pos_df, neg_df = load_data()
- pos_df = prepare_features(pos_df)
- neg_df = prepare_features(neg_df)
- print(f"- Positive SNPs: {len(pos_df)}")
- print(f"- Negative SNPs: {len(neg_df)}")
- # 2. Training data preparation
- print("\n[2/4] Preparing training data...")
- # Create similar pairs (positive-positive)
- similar_pairs = []
- for i in range(min(500, len(pos_df))): # Limit to 500 positive SNPs for efficiency
- for j in range(i + 1, min(i + 5, len(pos_df))): # Compare with next 5 SNPs
- similar_pairs.append([
- abs(pos_df.iloc[i]['chr_encoded'] - pos_df.iloc[j]['chr_encoded']),
- abs(pos_df.iloc[i]['position'] - pos_df.iloc[j]['position']),
- abs(pos_df.iloc[i]['log_pvalue'] - pos_df.iloc[j]['log_pvalue']),
- abs(pos_df.iloc[i]['gene_count'] - pos_df.iloc[j]['gene_count']),
- abs(pos_df.iloc[i]['is_intergenic'] - pos_df.iloc[j]['is_intergenic'])
- ])
- # Create dissimilar pairs (positive-negative)
- dissimilar_pairs = []
- for i in range(min(500, len(pos_df))): # Same 500 positive SNPs
- for j in range(min(5, len(neg_df))): # Compare with 5 negative SNPs
- dissimilar_pairs.append([
- abs(pos_df.iloc[i]['chr_encoded'] - neg_df.iloc[j]['chr_encoded']),
- abs(pos_df.iloc[i]['position'] - neg_df.iloc[j]['position']),
- abs(pos_df.iloc[i]['log_pvalue'] - neg_df.iloc[j]['log_pvalue']),
- abs(pos_df.iloc[i]['gene_count'] - neg_df.iloc[j]['gene_count']),
- abs(pos_df.iloc[i]['is_intergenic'] - neg_df.iloc[j]['is_intergenic'])
- ])
- # Combine and split data
- X = pd.DataFrame(
- similar_pairs + dissimilar_pairs,
- columns=['chr_diff', 'pos_diff', 'pval_diff', 'gene_diff', 'intergenic_diff']
- )
- y = np.array([1] * len(similar_pairs) + [0] * len(dissimilar_pairs))
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- print(f"\nTraining data summary:")
- print(f"- Total samples: {len(X)}")
- print(f"- Training samples: {len(X_train)}")
- print(f"- Test samples: {len(X_test)}")
- print(f"- Positive/Negative ratio: {np.mean(y):.2f}")
- # 3. Model training and evaluation
- print("\n[3/4] Training and evaluating model...")
- model = train_model(X_train, y_train)
- evaluate_model(model, X_test, y_test)
- # 4. Similar SNP prediction
- print("\n[4/4] Predicting similar SNPs...")
- print(f"Reference SNPs to process: {len(pos_df)}")
- print(f"Candidate SNPs to compare against: {len(neg_df)}")
- print(f"Top 10 similar SNPs will be identified for each reference SNP")
- predictions = predict_similar_snps(model, pos_df, neg_df, top_n=10)
- # Save results
- output_file = "sals_similar_snps_predictions.tsv"
- predictions.to_csv(output_file, sep='\t', index=False)
- print(f"\nSaved {len(predictions)} predictions to {output_file}")
- joblib.dump(model, 'sals_similarity_model.pkl')
- print("Model saved to 'sals_similarity_model.pkl'")
- except Exception as e:
- print(f"\nError occurred: {str(e)}")
- raise
- if __name__ == "__main__":
- main()
Project-script.py, under CC-BY-4.0 · at the source
Overview
- Laboratory of Integrative Biology, Faculty of Science Ain Chock, University Hassan II, Casablanca, Morocco
Abstract
Studying the genetics of rare diseases is challenging because small sample sizes limit the statistical power of standard methods like Genome-wide association studies (GWAS). We created a new machine-learning approach to find candidate Single Nucleotide Polymorphisms (SNPs) when data is scarce. Our method trains a Random Forest model to spot similarities between SNPs. We used 189 known Sporadic Amyotrophic Lateral Sclerosis (sALS)-linked SNPs as positive examples and 938,544 unrelated SNPs as negatives. The model learns from genomic location, significance levels, nearby genes, and other features. When we tested it on sALS, it performed exceptionally well, with 93.8% accuracy and near-perfect AUC scores. The method uncovered 1,890 new SNP candidates for sALS. Among these, 209 reached genome-wide significance, and 50 appeared repeatedly in our analyses, making them strong candidates. Key genes like SARM1, OPHN1, and BPTF emerged from the results, all connected to neural health and survival pathways. Our examination revealed a notable excess of SNPs on chromosome 18 compared to expectations. This non-random distribution underscores the region’s particular interest. Here, our approach demonstrates its ability to extract meaningful signals from a restricted sample. The results generated by this approach enable early diagnosis of the disease under study, explanation of its mechanism, and identification of therapeutic targets.
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 13 matches between paragraphs and lines of code.
Zenodo 18789012
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
3 files
- 1.py, Python, 297 lines, 2 matches
- 2.py, Python, 415 lines, 3 matches
- Project-script.py, Python, 307 lines, 8 matches
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;
- 3 scripts, each with its path and the digest of its content;
- 13 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 availability statement
The original contributions presented in the study are publicly available. The SNP dataset and associated Python scripts have been deposited in Zenodo at: https://
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, 30 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 6 authors, 7 keywords, 43 references.
Cite
This paper
Aguerd, A., Nouadi, B., Ezaouine, A., Fenjar, I., Bennis, F., & Chegdani, F. (2026). An in silico protocol for predicting genetic biomarkers in rare diseases: a case study in sporadic amyotrophic lateral sclerosis. Frontiers in genetics, 17, 1742595. https://
BibTeX
@article{aguerd2026silic
author = {Aguerd, Ali and Nouadi, Badreddine and Ezaouine, Abdelkarim and Fenjar, Imad and Bennis, Faiza and Chegdani, Fatima},
title = {{An in silico protocol for predicting genetic biomarkers in rare diseases: a case study in sporadic amyotrophic lateral sclerosis}},
journal = {Frontiers in genetics},
year = {2026},
month = mar,
volume = {17},
pages = {1742595},
publisher = {Frontiers Media SA},
issn = {1664-8021},
doi = {10.3389/
url = {https://
pmid = {41890230},
pmcid = {PMC13016588}
}
RIS
TY - JOUR
AU - Aguerd, Ali
AU - Nouadi, Badreddine
AU - Ezaouine, Abdelkarim
AU - Fenjar, Imad
AU - Bennis, Faiza
AU - Chegdani, Fatima
TI - An in silico protocol for predicting genetic biomarkers in rare diseases: a case study in sporadic amyotrophic lateral sclerosis
T2 - Frontiers in genetics
J2 - Front Genet
PY - 2026
DA - 2026/
VL - 17
SP - 1742595
SN - 1664-8021
PB - Frontiers Media SA
DO - 10.3389/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.3389/
"type": "article-journal",
"title": "An in silico protocol for predicting genetic biomarkers in rare diseases: a case study in sporadic amyotrophic lateral sclerosis",
"container-title": "Frontiers in genetics",
"author": [
{
"family": "Aguerd",
"given": "Ali"
},
{
"family": "Nouadi",
"given": "Badreddine"
},
{
"family": "Ezaouine",
"given": "Abdelkarim"
},
{
"family": "Fenjar",
"given": "Imad"
},
{
"family": "Bennis",
"given": "Faiza"
},
{
"family": "Chegdani",
"given": "Fatima"
}
],
"container-title-short":
"volume": "17",
"page": "1742595",
"DOI": "10.3389/
"PMID": "41890230",
"PMCID": "PMC13016588",
"ISSN": "1664-8021",
"publisher": "Frontiers Media SA",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
12
]
]
}
}
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.1371/journal.pbio.3003856 [code]
- Aging and metabolism contribute separately to brain-body health.Journal: PLoS biologyIn common: seaborn, scikit-learn, pandas, 2 other tools, clinical / translational, 3 references
- [2] doi:10.1038/s41597-026-07077-7 [code]
- Everyday Activity Science and Engineering Table Setting Dataset.Journal: Scientific dataIn common: seaborn, scikit-learn, pandas, 2 other tools, 3 references
- [3] doi:10.1016/j.crmeth.2026.101421 [code]
- EthoPy provides an accessible platform for reproducible behavioral neuroscience.Journal: Cell reports methodsIn common: seaborn, scikit-learn, pandas, 2 other tools, 3 references
- [4] doi:10.1016/j.isci.2026.115766 [code]
- RNA-binding protein family diversification correlates with neural complexity across metazoan evolution.Journal: iScienceIn common: scikit-learn, pandas, NumPy, 4 references
- [5] doi:10.1002/advs.202521254 [code]
- Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and "Shadow" Proteins.Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)In common: seaborn, scikit-learn, pandas, 2 other tools, genetics / omics, 2 references
- [6] doi:10.7554/elife.93664 [code]
- Drug-induced changes in connectivity to midbrain dopamine cells revealed by rabies monosynaptic tracing.Journal: eLifeIn common: seaborn, scikit-learn, pandas, 2 other tools, other condition, 2 references
- [7] doi:10.7554/elife.110074 [code]
- Disentangling cephalopod chromatophores motor units with computer vision.Journal: eLifeIn common: scikit-learn, pandas, Matplotlib, 1 other tool, 3 references
- [8] doi:10.1371/journal.pgen.1012242 [code]
- Wiz regulates clustered protocadherin genes by restricting CTCF/
cohesin loop extrusion in a genomic-distance biased manner. Journal: PLoS geneticsIn common: seaborn, scikit-learn, pandas, 2 other tools, 2 references - [9] doi:10.1093/bioinformatics/btag592 [code]
- Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.Journal: Bioinformatics (Oxford, England)In common: seaborn, scikit-learn, pandas, 2 other tools, genetics / omics, other condition, 1 reference
- [10] doi:10.1016/j.isci.2026.116439 [code]
- Decoding the role of transcriptomic clocks in the human prefrontal cortex.Journal: iScienceIn common: seaborn, scikit-learn, pandas, 2 other tools, genetics / omics, 1 reference
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, 3 scripts, and 13 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:34c916a56febde23…
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
[.
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.
