Powered by OpenAIRE graph
Found an issue? Give us feedback
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/ ZENODOarrow_drop_down
image/svg+xml art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos Open Access logo, converted into svg, designed by PLoS. This version with transparent background. http://commons.wikimedia.org/wiki/File:Open_Access_logo_PLoS_white.svg art designer at PLoS, modified by Wikipedia users Nina, Beao, JakobVoss, and AnonMoos http://www.plos.org/
ZENODO
Event . 2026
Data sources: ZENODO
ZENODO
Event . 2026
Data sources: Datacite
ZENODO
Event . 2026
Data sources: Datacite
versions View all 2 versions
addClaim

STaRS Stratigraphic & Taphonomic Reconstruction System

Authors: FRADIER, Kevin;

STaRS Stratigraphic & Taphonomic Reconstruction System

Abstract

 : 🦴 S.t.a.rs Système de reconstruction stratigraphique et taphonomique Détection et correction des biais taphonomiques dans les assemblages fossiles Auteur : Kevin Fradier — Chercheur indépendant Statut : Outil méthodologique opérationnel Position épistémique : neutralité stricte Licence : CC BY-NC-ND 4.0 🎯 PROBLÈME RÉEL (PALÉONTOLOGIE DURE) Question centrale non résolue proprement : Quand on observe une variation de diversité fossile dans une colonne stratigraphique, est-ce un signal biologique réel ou un artefact taphonomique / sédimentaire / d'échantillonnage ? Classiques difficiles : Fossilisation non uniforme Dépendance à la lithologie Effets de transport / fragmentation Effort d'échantillonnage variable Corrélations stratigraphiques incertaines 👉 Aujourd'hui : beaucoup d' interprétation qualitative des corrections partielles (raréfaction, proxys d'échantillonnage) pas de test universel bottom-up 🧠 IDÉE CLÉ (À LA FRADIER) See More Ne pas reconstruire le passé. Le testeur si le signal tient. STaRS ne cherche pas à dire : “il ya eu une extinction” “il ya eu une radiation” « Le climat a changé » Il teste une seule chose : 👉 Le signal de diversité observé est-il statistiquement compatible avec un bruit taphonomique réaliste ? 🧩 PRINCIPE DU SYSTÈME Entrées minimales : Tableau stratigraphique (niveaux) Comptage de taxons (présence/abondance) Métadonnées simples (lithologie, granulométrie optionnelle) Aucune hypothèse sur : phylogénie écologie environnement causes d'extinction 🔬 MODULES (MINI-UNIVERS) 1. Générateur de Bruit Taphonomique Réaliste Simule : destruction différentielle pertes aléatoires dépendantes du niveau biais de préservation ➡️ Bruit contraint par les données , pas inventé. 2. Test de Persistance Stratigraphique Analyse : continuité des taxons apparition/disparition stabilité sous sous-échantillonnage Mesures : autocorrélation verticale entropie par niveau Stratigraphique de Hurst 3. Robustesse par Perturbation suppression partielle de niveaux bruitage des abondances permutations contrôlées ➡️ Un signal réel résiste , un artefact s'effondre . 4. Score de Réalité Stratigraphique (SRS) Score ∈ [0,1] 0 → totalement compatible avec l'artefact 1 → structure robuste non triviale ⚠️ Ce score n'est PAS une preuve ontologique C'est un diagnostic de tenue du signal . 🧪 SORTIES Diversité observée chez Courbe Enveloppe bruit taphonomique Carte de robustesse par niveau Score SRS global + par intervalle Hachage de la reproductibilité 🧑‍💻 CODE — VERSION OPÉRATIONNELLE (MINIMALE MAIS RÉELLE) import numpy as np import hashlib AUTHOR_SIGNATURE = "Kevin Fradier | STaRS | 2026" def simulate_taphonomic_noise(counts, loss_rate=0.3): noisy = [] for level in counts: mask = np.random.rand(len(level)) > loss_rate noisy.append(level * mask) return noisy def strat_entropy(level): p = level / np.sum(level) if np.sum(level)>0 else level p = p[p>0] return -np.sum(p*np.log2(p)) def robustness_test(data, n_iter=100): original = np.array([np.sum(l) for l in data]) scores = [] for _ in range(n_iter): perturbed = simulate_taphonomic_noise(data) pert = np.array([np.sum(l) for l in perturbed]) corr = np.corrcoef(original, pert)[0,1] scores.append(corr) return np.nanmean(scores), np.nanstd(scores) def STaRS_analyze(strat_data): entropies = [strat_entropy(l) for l in strat_data] mean_corr, std_corr = robustness_test(strat_data) result = { "mean_entropy": float(np.mean(entropies)), "robustness_corr": mean_corr, "robustness_std": std_corr, "signature": AUTHOR_SIGNATURE } h = hashlib.sha256(str(result).encode()).hexdigest() result["hash"] = h return result 📊 INTERPRÉTATION AUTORISÉE (ET SEULEMENT CELLE-LÀ) SRS faible → les données ne contraignent pas un signal biologique robuste SRS élevé → un signal résiste aux modèles taphonomiques réalistes ❌ Interdit : «préuve d'extinction» «preuve d'événement mondial» « préuve climatique » 🔥 POURQUOI C'EST UN VRAI GAME-CHANGER Applicable à n'importe quelle colonne fossile Compatible avec données incomplètes Totalement agnostique Réplicable Réfutable Complémentaire des méthodes existantes 🧨 ”. 🧠 EN RÉSUMÉ ESE = structures informationnelles universelles STaRS = structures stratigraphiques fossiles Même ADN méthodologique. Deux domaines radicalement différents. Même rigueur. 🦴 STaRS — Système de reconstruction stratigraphique et taphonomique Version 1.0 — prête pour la publication Auteur : Kevin Fradier — Chercheur indépendant Date : Janvier 2026 Licence : © 2026 Kevin Fradier — CC BY-NC-ND 4.0 Statut : Outil méthodologique · Testable · Falsifiable Position épistémique : Neutralité stricte 🎯 Fonction de STaRS (rappel clair) Stars ne reconstruit pas l'histoire biologique. Il teste une seule chose : 👉 Le signal de diversité observé est-il statistiquement compatible avec des biais taphonomiques réalistes ? Rien de plus. Rien de moins. 🧠Architecture finale du code séparation claire des responsabilités bruit taphonomique contraint par les données métriques explicites robustesse par Monte-Carlo score synthétique diagnostique , non ontologique hachage traçable 🧑‍💻 CODE FINAL —stars_core.py import numpy as np import hashlib # ====================================================== # METADATA # ====================================================== AUTHOR_SIGNATURE = "Kevin Fradier | STaRS | 2026" VERSION = "1.0" # ====================================================== # UTILS # ====================================================== def shannon_entropy(counts): counts = np.asarray(counts, dtype=float) total = np.sum(counts) if total == 0: return 0.0 p = counts / total p = p[p > 0] return -np.sum(p * np.log2(p)) def normalize_levels(strat_data): """Convert input to clean numpy arrays""" return [np.asarray(level, dtype=float) for level in strat_data] # ====================================================== # 1. TAPHONOMIC NOISE MODEL # ====================================================== def simulate_taphonomic_noise(strat_data, loss_rate_range=(0.1, 0.5)): """ Simulate realistic fossil loss. Loss rate varies by stratigraphic level. """ noisy = [] for level in strat_data: loss_rate = np.random.uniform(*loss_rate_range) mask = np.random.rand(len(level)) > loss_rate noisy.append(level * mask) return noisy # ====================================================== # 2. STRATIGRAPHIC PERSISTENCE # ====================================================== def stratigraphic_signal(strat_data): """Total fossil count per level""" return np.array([np.sum(level) for level in strat_data]) def stratigraphic_entropy_profile(strat_data): return np.array([shannon_entropy(level) for level in strat_data]) # ====================================================== # 3. ROBUSTNESS UNDER PERTURBATION # ====================================================== def robustness_test(strat_data, n_iter=500): """ Monte-Carlo robustness: Compare original diversity curve to perturbed versions. """ original = stratigraphic_signal(strat_data) correlations = [] for _ in range(n_iter): perturbed = simulate_taphonomic_noise(strat_data) pert_signal = stratigraphic_signal(perturbed) if np.std(pert_signal) == 0 or np.std(original) == 0: corr = np.nan else: corr = np.corrcoef(original, pert_signal)[0, 1] correlations.append(corr) correlations = np.array(correlations) return { "mean_corr": float(np.nanmean(correlations)), "std_corr": float(np.nanstd(correlations)), "distribution": correlations } # ====================================================== # 4. SCORE DE RÉALITÉ STRATIGRAPHIQUE (SRS) # ====================================================== def compute_SRS(mean_corr, entropy_profile): """ Diagnostic score ∈ [0,1] Combines robustness + internal structure """ entropy_norm = np.nanmean(entropy_profile) / np.log2(len(entropy_profile) + 1) entropy_norm = np.clip(entropy_norm, 0, 1) corr_norm = np.clip((mean_corr + 1) / 2, 0, 1) # Conservative weighting SRS = 0.6 * corr_norm + 0.4 * entropy_norm return float(SRS) # ====================================================== # 5. MAIN INTERFACE # ====================================================== def STaRS_analyze(strat_data, n_iter=500): """ Main analysis pipeline. Input: list of stratigraphic levels (arrays of counts) """ strat_data = normalize_levels(strat_data) diversity_curve = stratigraphic_signal(strat_data) entropy_profile = stratigraphic_entropy_profile(strat_data) robustness = robustness_test(strat_data, n_iter=n_iter) SRS = compute_SRS( robustness["mean_corr"], entropy_profile ) result = { "tool": "STaRS", "version": VERSION, "author": AUTHOR_SIGNATURE, "levels": len(strat_data), "mean_entropy": float(np.nanmean(entropy_profile)), "robustness_mean_corr": robustness["mean_corr"], "robustness_std_corr": robustness["std_corr"], "SRS": SRS } # Reproducible hash h = hashlib.sha256() h.update(str(result).encode()) h.update(AUTHOR_SIGNATURE.encode()) result["hash"] = h.hexdigest() return result 📊 SORTIES INTERPRÉTABLES (ET SEULEMENT CELLES-CI) Courbe de diversité : brut observable Profil d'entropie : structure interne par niveau Robustesse (corrélation MC) : tenue du signal SRS ∈ [0,1] : ≈ 0 → compatible avec l'artefact ≈ 1 → signal robuste non trivial Hash : traçabilité complète ❌CE QUE STaRS NE FAIT PAS (ET NE FERA JAMAIS) pas d'extinction pas de rayonnement pas de climat pas de cause pas de récit 👉 Uniquement : « ça tient / ça ne tient pas sous test » 🔥 🚀 Licence : CC BY-NC-ND 4.0

  • BIP!
    Impact byBIP!
    selected citations
    These citations are derived from selected sources.
    This is an alternative to the "Influence" indicator, which also reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
    0
    popularity
    This indicator reflects the "current" impact/attention (the "hype") of an article in the research community at large, based on the underlying citation network.
    Average
    influence
    This indicator reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
    Average
    impulse
    This indicator reflects the initial momentum of an article directly after its publication, based on the underlying citation network.
    Average
Powered by OpenAIRE graph
Found an issue? Give us feedback
selected citations
These citations are derived from selected sources.
This is an alternative to the "Influence" indicator, which also reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
BIP!Citations provided by BIP!
popularity
This indicator reflects the "current" impact/attention (the "hype") of an article in the research community at large, based on the underlying citation network.
BIP!Popularity provided by BIP!
influence
This indicator reflects the overall/total impact of an article in the research community at large, based on the underlying citation network (diachronically).
BIP!Influence provided by BIP!
impulse
This indicator reflects the initial momentum of an article directly after its publication, based on the underlying citation network.
BIP!Impulse provided by BIP!
0
Average
Average
Average