É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 :
| id | treatment | condition | day | temp | weight | score | il6 |
|---|---|---|---|---|---|---|---|
| M01 | treated | endpoint | -1 | 37.15 | 25.17 | 0 | 35.1 |
| M01 | treated | endpoint | 0 | 37.26 | 25.25 | 0 | 39.5 |
| M01 | treated | endpoint | 1 | 35.83 | 23.12 | 4 | 162.0 |
idet une colonne temporelle (day,time,hour, ...) sont requis ;treatmentetconditionsont 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 0lorsque 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é :
- Les mesures de résultats, leurs unités et leur directionnalité (lesquelles ont été retournées (turned), et pourquoi).
- Le point temporel ou la fenêtre de ligne de base, et quelles variables ont été normalisées.
- Tout mappage de score appliqué aux variables ordinales, avec son échelle.
- L'ensemble de référence : quels animaux, quel groupe, combien et pourquoi ils sont supposés porter la plus grande charge.
- Les critères de point limite humain réellement appliqués dans l'étude, séparément du score RELSA.
- Pour les prévisions : pas d'interpolation, ordre ARIMA sélectionné par animal, et RMSE, PICP et MPIW.
- Pour les seuils : la largeur de bande, le nombre de scores et un balayage de sensibilité de la largeur de bande.
- 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
- Mauvaise directionnalité – une variable croissante non listée dans
--turnedcontribue 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 reacheddoit être inférieur à 100 pour une variable décroissante et supérieur à 100 pour une variable augmentée (turned), etmax deltadoit être d'une taille plausible pour cette mesure. - Normaliser un pourcentage deux fois –
bwc [%]et les scores mappés sont déjà sur l'échelle de pourcentage ; les passer à--normalizeles normalise une seconde fois, ce qui change la métrique. Ne normalisez que les mesures de niveau (température, poids, IL-6). - 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.
- 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.
- 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).