Communitygithub.com

relsa-severity-assessment

Évaluation multivariée de la sévérité et prédiction des points limites humains pour les études animales de laboratoire, basée sur le score RELSA et le modèle ARIMA de prévision foRcast.

Qu'est-ce que relsa-severity-assessment ?

Cette compétence implémente deux procédures publiées pour une évaluation intégrée de la sévérité dans la recherche animale : RELSA (Talbot et al., 2022) combine plusieurs paramètres (poids corporel, température, scores cliniques, biomarqueurs, etc.) en un seul score par animal et par point temporel, exprimé par rapport à un ensemble de référence à charge connue. foRcast (Lutscher et al., 2026) utilise un modèle ARIMA sur la trajectoire RELSA individuelle pour prédire le score futur avec un intervalle de confiance à 95 %, permettant d'identifier les animaux à risque avant qu'ils n'atteignent un point limite. L'estimation par noyau de densité (KDE) sur l'échelle RELSA fournit des zones d'attention et de danger candidates. La compétence s'utilise avec des fichiers CSV et nécessite numpy, pandas, scipy, statsmodels et matplotlib. Elle aide à la décision pour le raffinement (3Rs, directive 2010/63/UE) mais ne remplace pas le jugement clinique.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/K-Dense-AI/scientific-agent-skills/tree/main/skills/relsa-severity-assessment

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Évaluation de la sévérité par RELSA et prévision du point limite humain

Vue d'ensemble

L'évaluation de la sévérité dans la recherche animale est légalement obligatoire et scientifiquement fondamentale : elle guide les décisions sur les points limites humains, et une mauvaise surveillance du bien-être dégrade la reproductibilité. La pratique habituelle évalue chaque paramètre isolément – perte de poids ici, score clinique là – ce qui rend difficile de dire à quel point un animal individuel est réellement affecté.

Cette compétence implémente deux procédures publiées qui répondent à ce problème :

  • RELSA (Talbot et al., 2022) combine plusieurs mesures en un seul score par animal et par point temporel, exprimé par rapport à un ensemble de référence de charge connue. RELSA = 0 correspond à la ligne de base ; RELSA = 1 signifie que l'animal a atteint la déviation maximale de l'ensemble de référence.
  • foRcast (Lutscher et al., 2026) ajuste un modèle ARIMA à la trajectoire RELSA individuelle d'un animal et prédit le score suivant avec un intervalle de prédiction à 95 %, de sorte que les animaux se dirigeant vers un point limite humain puissent être identifiés avant qu'ils ne l'atteignent. L'estimation par noyau de densité (KDE) sur l'échelle RELSA fournit des zones candidates d'attention et de danger pour l'interprétation.

L'objectif est le raffinement : accorder une attention plus précoce aux animaux à risque et éviter d'euthanasier des animaux qui auraient pu se rétablir. Les deux procédures sont des aides à l'évaluation de la sévérité, et non des règles de décision – voir Limites.

Quand utiliser cette compétence

  • Combiner la perte de poids, la température, les scores cliniques, les biomarqueurs ou la télémétrie en un seul score de sévérité par animal
  • Demander quels animaux d'une cohorte sont à risque d'atteindre un point limite humain, ou prédire le score de sévérité à un point temporel à venir
  • Comparer la sévérité entre groupes de traitement, interventions ou modèles animaux sur une échelle relative commune
  • Définir des seuils ou des zones sur une échelle de sévérité à partir des données
  • Rédiger la section d'évaluation de la sévérité d'un rapport de bien-être animal, d'une analyse de raffinement (3Rs) ou d'une demande selon la directive 2010/63/UE

Pour la prévision générale d'une série temporelle qui n'est pas un score de sévérité, utilisez timesfm-forecasting ou statsmodels. Pour la conception d'études et la taille d'échantillon, utilisez experimental-design et statistical-power.

Installation

uv pip install "numpy>=1.26" "pandas>=2.0" "scipy>=1.11" "statsmodels>=0.14" matplotlib

relsa_score.py et kde_thresholds.py nécessitent uniquement numpy/pandas/scipy ; statsmodels est requis pour la prévision et matplotlib uniquement pour les graphiques.

Format des données

Une ligne par animal et par point temporel, dans un fichier CSV :

idtreatmentconditiondaytempweightscoreil6
M01treatedendpoint-137.1525.17035.1
M01treatedendpoint037.2625.25039.5
M01treatedendpoint135.8323.124162.0
  • id et une colonne temporelle (day, time, hour, ...) sont requis ; treatment et condition sont des étiquettes optionnelles utilisées pour le regroupement et la sélection de l'ensemble de référence.
  • Le temps peut être en jours, heures ou minutes – gardez-le simplement monotone par animal. La convention RELSA code le point temporel de base comme -1.
  • Une ligne par animal et par point temporel. Faites la moyenne de la télémétrie horaire à une valeur par intervalle d'abord (les modèles publiés font la moyenne de la fréquence cardiaque, de la VFC et de la température, et additionnent l'activité).
  • Laissez les mesures manquantes vides. Elles sont supprimées du score, jamais imputées – une valeur manquante traitée comme « aucune déviation » biaise la sévérité à la baisse.

assets/example_cohort.csv est une petite cohorte synthétique (6 souris, 9 jours, température, poids corporel, score clinique de 0 à 8 et un biomarqueur de type IL-6) utilisée par chaque commande ci-dessous, de sorte que chacune est exécutable telle quelle.

Les quatre décisions qui déterminent le résultat

Prenez-les explicitement et consignez-les dans les méthodes. Rien d'autre dans la procédure n'a autant d'importance.

1. Directionnalité – quelles variables augmentent lors de l'aggravation ? La baisse est la valeur par défaut (poids corporel, activité, consommation alimentaire, creusage, course en roue). Les variables qui augmentent doivent être déclarées avec --turned : scores cliniques, biomarqueurs inflammatoires, fièvre, tachycardie. Si vous vous trompez, la variable ne contribue rien du tout, silencieusement, car les déviations dans la « mauvaise » direction sont plafonnées à zéro. La température corporelle dépend du modèle – elle baisse dans le sepsis et l'endotoxémie, augmente dans les modèles de fièvre. Rien dans les données ne peut trancher pour vous : dans le modèle de sepsis publié, l'activité dépasse légitimement plus la base vers le haut que vers le bas, donc seule une variable qui ne bouge jamais une fois dans la direction déclarée est détectable, et build_reference() émet un avertissement précisément pour ce cas.

2. L'ensemble de référence – par rapport à quoi ? Les scores RELSA ne signifient rien sans lui. Utilisez le groupe censé porter la plus grande charge dans votre modèle (les études publiées utilisent la dose la plus élevée ou le groupe de traitement atteignant le point limite). Un ensemble de référence trop léger pousse chaque score au-dessus de 1 ; trop sévère comprime tout vers 0. Sauvegardez-le avec --save-reference et réutilisez-le avec --load-reference pour que les cohortes ultérieures restent sur la même échelle.

3. Scores avec une ligne de base nulle. Un score clinique de 0 chez un animal sain ne peut pas être normalisé par rapport – 0/0 est indéfini. Utilisez --score-scale score=8 pour mapper l'échelle du score à la place (sain → 100 %, pire possible → 200 %), ce qui le marque également comme augmenté (turned). Ce mappage est un choix de modélisation sur la valeur d'un point de score par rapport à un pour cent du poids corporel ; déclarez-le. L'alternative est de garder le score hors du RELSA et de l'utiliser comme un critère de point limite indépendant.

4. Quelles variables sont mesurées tout au long. Parce que le score fait la moyenne des variables disponibles, une variable qui apparaît ou disparaît en cours de trajectoire déplace le score par elle-même. Dans les données de sepsis publiées, l'ajout du poids corporel – enregistré uniquement le jour de l'euthanasie – fait passer le score de point limite de l'animal de 0,93 à 0,83 sans raison biologique. relsa_scores() émet un avertissement lorsque la composition change ; notez les variables présentes tout au long.

Flux de travail

Étape 1 – calculer les scores RELSA

python scripts/relsa_score.py assets/example_cohort.csv \
    --variables weight,temp,score,il6 \
    --normalize weight,temp,il6 \
    --turned il6 \
    --score-scale score=8 \
    --baseline-time -1 \
    --reference-group condition=endpoint \
    --save-reference reference.json \
    --out relsa_scores.csv

Le modèle de référence est affiché pour que l'échelle soit vérifiable :

reference model: assets/example_cohort.csv [condition=endpoint]
  animals=2  rows=18  baseline_time=-1.0
  variable      turned   max reached   max delta
  weight            no         82.40       17.60
  temp              no         92.79        7.21
  score            yes        187.50       87.50
  il6              yes        797.72      697.72

relsa_scores.csv contient le poids de chaque variable à côté du score, ce qui rend le score explicable – ici M01 se détériorant jusqu'à son point limite, M03 culminant au jour 3 et se rétablissant :

 id  time  weight  temp  score  il6  n_vars  relsa
M01     1    0.46  0.49   0.57 0.52       4   0.51
M01     3    0.84  0.76   1.00 0.89       4   0.88
M01     5    1.00  1.00   1.00 1.00       4   1.00
M03     3    0.56  0.44   0.57 0.54       4   0.53
M03     5    0.35  0.26   0.43 0.32       4   0.35
M03     7    0.12  0.06   0.14 0.11       4   0.11

Un poids de 1,00 signifie que cette variable a atteint le maximum de référence ; n_vars est le nombre de variables entrant dans le score à ce point temporel.

Même chose depuis Python, lorsque vous avez besoin des objets :

import sys; sys.path.insert(0, "scripts")
from _common import read_relsa_table, score_to_percent
from relsa_score import prepare, build_reference, relsa_scores

frame = read_relsa_table("assets/example_cohort.csv")
frame["score"] = score_to_percent(frame["score"], max_score=8)   # score clinique 0-8
VARS, TURNED = ["weight", "temp", "score", "il6"], ["score", "il6"]

prepared  = prepare(frame, normalize=["weight", "temp", "il6"], baseline_time=-1)
reference = build_reference(prepared[prepared.condition == "endpoint"],
                           variables=VARS, turned=TURNED, baseline_time=-1,
                           label="animaux atteignant le point limite")
scores    = relsa_scores(prepared, reference)

Étape 2 – prévoir le point limite

Entraînez-vous sur tout ce qui précède le point temporel avant le point limite, prédisez le score au point limite et évaluez la prédiction :

python scripts/forecast_relsa.py relsa_scores.csv \
    --animals M01,M02 --endpoints M01=5 --endpoints M02=6 \
    --group-col condition --plot-dir figs --endpoint-line 1.0
 id  time  predicted    lower    upper        model  actual
M01   5.0   0.932585 0.670443 1.194728 ARIMA(1,1,0)    1.00
M02   6.0   0.955696 0.748309 1.163084 ARIMA(1,1,0)    0.94

   group             id        model  n   rmse  picp  mpiw
endpoint            M01 ARIMA(1,1,0)  1 0.0674 100.0 0.524
endpoint            M02 ARIMA(1,1,0)  1 0.0157 100.0 0.415
endpoint -- endpoint --               2 0.0489 100.0 0.470
                OVERALL               2 0.0489 100.0 0.470

Rapportez les trois métriques ensemble. RMSE est la précision ponctuelle, PICP le pourcentage de valeurs réelles dans l'intervalle et MPIW la largeur moyenne de l'intervalle en unités RELSA – un modèle peut atteindre PICP = 100 % en rendant l'intervalle si large qu'il ne dit rien, ce qu'exactement la ligne du cancer du pancréas de l'article (PICP 100 %, MPIW 7,35, soit 735 % de la plage RELSA) montre.

Pour la surveillance en direct, prévoyez une étape à chaque point temporel à la place :

python scripts/forecast_relsa.py relsa_scores.csv --mode rolling --animals M03

Deux choses à savoir avant de se fier à une prévision :

  • L'interpolation est activée par défaut (--interpolate-step 0.1), car une mesure par jour est beaucoup trop clairsemée pour ARIMA. Elle permet une sélection de modèle utilisable et des intervalles plus étroits au prix d'une incertitude honnête. Définissez --interpolate-step 0 lorsque la fréquence de mesure le permet.
  • ARIMA ne peut pas prédire une falaise. Il suppose la stationnarité et la linéarité, donc un effondrement brutal dans les dernières heures avant un point limite ne sera pas prévu à partir d'une trajectoire antérieure lisse – le propre cas d'échec de l'article. Agissez sur la limite supérieure de l'intervalle, et ne laissez jamais une prévision faible remplacer un animal qui semble malade.

Étape 3 – contextualiser le score avec des zones de sévérité

python scripts/kde_thresholds.py relsa_scores.csv \
    --group treatment=treated --n-thresholds 2 --plot zones.png --json zones.json
KDE on 33 RELSA scores  (bandwidth = 0.1502)
  candidate thresholds (density minima): 0.703
  density modes: 0.264, 0.866
  normal    [0.000, 0.703)  n=25 (75.8%)
  danger    >= 0.703  n=8 (24.2%)

Les seuils sont les minima de la densité des scores – les vallées clairsemées entre les clusters de scores. Incluez les animaux au point limite, les survivants et les témoins : les zones sont destinées à séparer ces états, donc tous doivent être représentés.

Vérifiez la largeur de bande avant de croire un seuil. Sur les données de sepsis publiées, cette implémentation trouve des minima à 0,355 et 0,655 (publié : 0,337 et 0,643) – mais une largeur de bande 10 % plus grande supprime complètement les deux minima. Exécutez le balayage dans references/thresholds-and-zones.md et rapportez le balayage, pas une paire de nombres nus. Une liste de seuils vide est une réponse légitime : les scores forment un seul cluster et il n'y a pas d'endroit basé sur les données pour couper.

Limites : à déclarer lors du rapport

  • RELSA est une aide à l'évaluation de la sévérité, pas un paramètre décisif. Un animal avec un faible score RELSA mais montrant d'autres signes de détresse doit toujours être traité en conséquence. Aucune des deux procédures n'est un prédicteur validé de la mort.
  • Les zones KDE ne sont pas des classifications réglementaires de sévérité. Les catégories de la directive 2010/63/UE (non-récupération, légère, modérée, sévère) sont attribuées prospectivement par un processus différent. L'article est explicite : ses seuils « ne doivent pas être confondus avec les classifications réglementaires de sévérité » et ne leur sont pas directement traduisibles.
  • Les scores ne sont pas comparables entre ensembles de référence ou modèles. RELSA est relatif par construction, et la notation clinique n'est pas harmonisée entre les laboratoires. Rapportez toujours l'ensemble de référence avec le score.
  • Les preuves publiées sont une preuve de concept : 13 animaux sur sept modèles, dont cinq lignes reposant sur un ou deux animaux. Le RMSE global de 0,069 et le PICP de 96 % proviennent de 13 prédictions de points limites.
  • Un score sous-estimé est l'erreur dangereuse, car il décourage l'attention et peut retarder une décision d'euthanasie, tandis qu'une surestimation incite simplement à des soins supplémentaires.

Liste de vérification pour le rapport

Une analyse de sévérité n'est reproductible que si tout ceci est déclaré :

  1. Les mesures de résultats, leurs unités et leur directionnalité (lesquelles ont été retournées (turned), et pourquoi).
  2. Le point temporel ou la fenêtre de ligne de base, et quelles variables ont été normalisées.
  3. Tout mappage de score appliqué aux variables ordinales, avec son échelle.
  4. L'ensemble de référence : quels animaux, quel groupe, combien et pourquoi ils sont supposés porter la plus grande charge.
  5. Les critères de point limite humain réellement appliqués dans l'étude, séparément du score RELSA.
  6. Pour les prévisions : pas d'interpolation, ordre ARIMA sélectionné par animal, et RMSE, PICP et MPIW.
  7. Pour les seuils : la largeur de bande, le nombre de scores et un balayage de sensibilité de la largeur de bande.
  8. Les versions des logiciels et la déclaration selon laquelle les seuils sont spécifiques au modèle et ne sont pas des classifications réglementaires.

Pièges courants

  1. Mauvaise directionnalité – une variable croissante non listée dans --turned contribue exactement zéro, silencieusement, et aucun avertissement n'est possible à moins qu'elle ne tombe jamais. Vérifiez vous-même le tableau du modèle de référence : max reached doit être inférieur à 100 pour une variable décroissante et supérieur à 100 pour une variable augmentée (turned), et max delta doit être d'une taille plausible pour cette mesure.
  2. Normaliser un pourcentage deux fois – bwc [%] et les scores mappés sont déjà sur l'échelle de pourcentage ; les passer à --normalize les normalise une seconde fois, ce qui change la métrique. Ne normalisez que les mesures de niveau (température, poids, IL-6).
  3. Mélanger les échelles temporelles – si votre base est en heures et que vous ajoutez des points temporels quotidiens, ARIMA les traite comme équidistants. Gardez une seule échelle.
  4. Imputer les valeurs manquantes à 0 ou à la moyenne – comme ci-dessus, cela biaise le score à la baisse. Laissez-les vides. Si un paramètre n'est jamais mesuré, excluez-le de l'analyse plutôt que de le définir comme manquant.
  5. Sur-interpréter un balayage de seuil unique – exécutez le balayage de sensibilité de la largeur de bande et rapportez la plage dans laquelle les seuils restent stables.

Références

Talbot SR, Biernot S, Bleich A, van Dijk RM, Ernst L, Häger C, Helgers SOA, Koopmans B, Koska I, Kuhla A, Miljanovic N, Müller-Graff FT, Schwabe K, Tolba R, Vollmar B, Weegh N, Wölk T, Wolf F, Palme R, Zechner D. Définition d'un score corporel du bien-être animal (RELSA) pour l'évaluation des charges dans les modèles de rongeurs. Lab Anim. 2022 Aug 11:23677222110606. doi: 10.1177/00236772221110606. Epub avant impression. PMID: 35950228.

Lutscher L, Bleich A, Zechner D, Talbot SR. Utilisation de la prévision de séries temporelles pour l'évaluation de la sévérité dans les modèles de maladies de rongeurs. BMC Lab Animal Research. 2026. (Manuscrit en préparation).

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

adaptyv

How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.

aeon

This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.

alphagenome

Look up precomputed AlphaGenome Atlas effects for any GRCh38 single-nucleotide variant (AVI score with Phred and 18 SHAP feature attributions, plus raw and quantile scores for RNA-seq, DNase, ATAC, ChIP-TF, ChIP-histone, CAGE, PRO-cap, splicing, polyadenylation and contact-map tracks), score variants or scan windows on demand with the AlphaGenome model for human and mouse (variant scoring, in silico mutagenesis, REF-versus-ALT track prediction), and build Atlas website deep links. Use when the user mentions AlphaGenome, AlphaGenome Atlas, AVI or AlphaGenome Variant Impact, DeepMind variant effect prediction, or wants to prioritise or mechanistically interpret non-coding, regulatory, splicing, enhancer, promoter, or chromatin-accessibility effects of SNVs from a VCF, credible set, or region. Research use only; not a clinical tool.

analytical-method-validation

Plan, execute, and document validation, verification, and transfer of analytical procedures under the governing framework - ICH Q2(R2) and Q14, USP <1220>/<1225>/<1226>, ICH M10 bioanalytical, CLSI EP, or ISO/IEC 17025. Use for HPLC, LC-MS/MS, GC, CE, ICP-MS, dissolution, qNMR, qPCR, NIR, and ligand binding or cell-based assays whenever the question is whether a procedure is fit for its intended purpose. Triggers include

anndata

Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.

arbor

Autonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g.

arboreto

Infer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk RNA-seq, single-cell RNA-seq) to identify transcription factor-target gene relationships and regulatory interactions. Supports distributed computation for large-scale datasets.

astropy

Core Python library for astronomy and astrophysics workflows that need Astropy APIs, including units/quantities, coordinates, FITS I/O, tables, time systems, WCS, and cosmology. Use when implementing or debugging astronomical data analysis code with Astropy.

autoskill

Observe the user

benchling-integration

Benchling Python SDK and REST API integration for registry entities, inventory, ELN entries, workflows, Benchling Apps, and Data Warehouse queries. Use when automating lab data with benchling-sdk or the v2 API.

bgpt-paper-search

Search scientific papers and retrieve structured experimental data extracted from full-text studies via the BGPT MCP server. Returns 25+ fields per paper including methods, results, sample sizes, quality scores, and conclusions. Use for literature reviews, evidence synthesis, and finding experimental details not available in abstracts alone.

bids

>

biopython

Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.

bioservices

Unified Python interface to 40+ bioinformatics services. Use when querying multiple databases (UniProt, KEGG, ChEMBL, Reactome) in a single workflow with consistent API. Best for cross-database analysis, ID mapping across services. For quick single-database lookups use gget; for sequence/file manipulation use biopython.

bulk-rnaseq

End-to-end bulk RNA-seq orchestrator — takes raw FASTQ reads through QC and trimming (FastQC, fastp/Trim Galore), alignment and quantification (STAR, Salmon, featureCounts), assembles a gene-level counts matrix, then hands off to differential expression (pydeseq2), pathway/GSEA enrichment (pathway-enrichment), and publication figures (scientific-visualization). Use whenever the user has bulk RNA-seq reads or quant output and wants a complete, reproducible differential-expression workflow — e.g.

cellxgene-census

Query the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs/downloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.

cirq

Google quantum computing framework. Use when targeting Google Quantum AI hardware, designing noise-aware circuits, or running quantum characterization experiments. Best for Google hardware, noise modeling, and low-level circuit design. For IBM hardware use qiskit; for quantum ML with autodiff use pennylane; for physics simulations use qutip.

citation-management

Comprehensive citation management for academic research. Search OpenAlex, PubMed, and Google Scholar for papers, extract accurate metadata, validate citations, and generate properly formatted BibTeX entries. This skill should be used when you need to find papers, verify citation information, convert DOIs to BibTeX, or ensure reference accuracy in scientific writing.

clinical-decision-support

Prepare and validate research-only clinical decision-support evaluation, evidence-profile, cohort, survival, biomarker/model, privacy, and governance artifacts. Use for aggregate or synthetic research documentation and traceability—not patient care or live clinical operation.

clinical-reports

Create safety-bounded draft structures and run local deterministic checks for clinical case, diagnostic, trial, safety, and aggregate research reports. Use only with synthetic, de-identified, or aggregate inputs and verified source-fact manifests; every output requires qualified review.

Skills associés