Skip to content

Repository files navigation

Spaceflight as an accelerated model of terrestrial disease

Integrated analysis of open human spaceflight blood transcriptomics, reframed as a natural accelerated model of terrestrial immune aging. Built for the Built with Claude: Life Sciences hackathon (Anthropic × Gladstone).

One-line finding. The conserved human spaceflight blood signature — reproduced across two independent missions and validated out-of-sample in a mission the SOMA atlas never used — most closely resembles terrestrial immune aging / inflammaging, and a dual-evidence countermeasure screen (transcriptional reversal × independent lifespan-extension) nominates oral, human-safe geroprotectors that oppose it.

What is new here

SOMA (Overbey et al., Nature 2024) characterized the conserved spaceflight signature but did not disease-map it or test it in independent commercial missions. Building on that:

  1. Disease-signature mapping (rank-based GSEA; two confound nulls) → immune-aging resemblance.
  2. Out-of-sample replication in Axiom Ax-1 (OSD-903), a mission SOMA did not include.
  3. Dual-evidence countermeasures → compounds that (a) transcriptionally REVERSE the signature (XSum connectivity over LINCS L1000) AND (b) independently extend lifespan (HAGR DrugAge), ranked by mission-pharmacy feasibility. Top actionable hits: taxifolin, ursolic acid, curcumin, everolimus. Hypothesis-generating only — see docs/countermeasure_report.md.

See docs/RELATED_WORK.md for honest positioning against 2025–2026 near-neighbor papers.

Reproduce every figure

Pointing an AI agent at this repo? See AGENTS.md for the full runbook.

pip install -r requirements.txt      # or: conda env from environment.yml
FIG_16X9=1 python src/make_space_figures.py    # regenerates the committed figures/ (all six, 16:9)

make_space_figures.py reads only data/processed/ and data/gene_sets/ — no network, no controlled data. fig1–3 and fig6 use the live pipeline; fig4 runs GSEA prerank + a 5× scrambled-signature null live over data/gene_sets/reference_signatures.json (needs gseapy, already in requirements.txt) and fig5 rebuilds from the committed dual-evidence table. Every figure is deterministic (fixed seeds), so the committed figures/ regenerate byte-for-byte on the same platform (they were rendered on macOS with Helvetica Neue; other machines fall back to DejaVu Sans — visually equivalent, numbers unchanged). The shared deep-space theme is in src/spacetheme.py; drop FIG_16X9 for the default aspect. src/make_figures.py + src/figstyle.py are the original plain-style generators (fig1–4; fig4 there is a simpler rank plot without the scrambled-null control); they write to a separate figures_plain/ so they never overwrite the committed demo set in figures/.

The supplementary + schematic figures regenerate the same way, all space-themed 16:9:

python src/make_supp_singlecell.py   # single-cell OXPHOS-compartment supp (from docs/singlecell_celltype_anchors.csv)
python src/make_supp_frailty.py      # frailty-panel corroboration supp (from docs/frailty_convergence.csv)
python src/make_workflow.py          # end-to-end analysis-workflow schematic (incl. the closed loop)

fig5 (countermeasures) has two external inputs not committed here (large / separately licensed): the Enrichr LINCS L1000 Chem-Pert GMTs and HAGR DrugAge. Fetch them once with:

bash data/gene_sets/fetch_lincs_drugage.sh    # → lincs_chempert_{up,down}.gmt + drugage.csv

The derived result tables fig5 plots are already committed in docs/ (ranked_reversers.csv, dual_evidence_candidates.csv), so the figure itself is reproducible without the download — the fetch is only needed to rerun the reversal step from scratch.

The method is the product — src/pipeline.py (living-atlas engine)

The disease-mapping method generalizes beyond spaceflight to any directional signature. pipeline.py turns it into a reusable engine — point it at a folder of signature CSVs (symbol,score) and it maps each against the 131-set versioned reference library:

python src/pipeline.py map --signatures ./signatures --out ./atlas_out    # runs today, no API key

Three ready-to-run example signatures ship in signatures/ (see signatures/README.md) — the combined conserved signature and each mission alone; both single-mission inputs independently land on human immune-aging sets. This step is live and reproduces the fig4 result on our own signature. A second, scaffolded step (run --annotate) uses the Anthropic Batches API to interpret every top hit at scale and is built to ingest each new OSDR/disease dataset as it publishes — the living atlas. That step needs an ANTHROPIC_API_KEY; without one, pipeline.py assembles and writes the batch requests but does not submit them. No API credits were consumed in this hackathon build — the analysis ran interactively on the Claude Max plan; the annotation half is the concrete "what we'd build with API access" component.

Closing the loop — src/atlas_loop.py

atlas_loop.py makes the atlas self-updating. It watches the three external sources the project depends on and re-runs only the affected stage when one changes:

python src/atlas_loop.py check       # detect changes, write atlas_change_report.json, no re-run
python src/atlas_loop.py refresh     # detect + re-run affected stage + DIFF vs committed output
  • ① OSDR hook — polls osdr.nasa.gov for new human transcriptomic studies (filtered on organism + assay + material); a new mission is flagged for harmonization, then map+screen re-run.
  • ② DrugAge hook / ③ LINCS hook — fingerprint the geroprotector table and the L1000 library; on change, re-run the XSum × DrugAge dual-evidence filter (connectivity.py — the same logic behind fig5) and diff the candidate list, so you see exactly which drugs were promoted or dropped.

Runs today, no key: the hooks, the countermeasure re-screen, and the diff/report. Scaffold (honestly labelled): scheduling (--watch is a demo poll loop, not a real scheduler — wire to cron or a GitHub Action) and the optional LLM change-annotation (--annotate, needs ANTHROPIC_API_KEY). Re-deriving the signature from a new mission still needs that mission's counts harmonized first; the hook flags the mission, a human wires the counts, and the rest is automatic. This is the closed loop drawn in figures/project_workflow.png (teal right rail).

Figures

File What it shows
figures/fig1_pca.png Cross-mission PCA before/after ComBat — platform ≡ mission perfect confound
figures/fig2_reproducibility.png Signal is conserved at the pathway level, not gene level
figures/fig3_ax1_replication.png Held-out Ax-1 replication: inflammatory + OXPHOS replicate; telomere n.s.
figures/fig4_disease_map.png Ranked disease-similarity map vs a scrambled-signature null floor (immune aging on top)
figures/fig5_countermeasures.png Money shot — dual-evidence countermeasure map (reversal × geroprotector × feasibility)
figures/fig6_three_mission.png Immune-aging anchors replicate across three missions (I4 · Ax-1 · JAXA cfRNA)
figures/supp_frailty_convergence.png Supp — our signature vs the Camera et al. 2024 frailty panel (immune subset 7/7 up; src/make_supp_frailty.py; see docs/independent_corroboration.md)
figures/supp_singlecell_compartment.png Supp — OXPHOS compartment paradox: up in bulk whole-blood/cfRNA but suppressed in every PBMC immune cell type (src/make_supp_singlecell.py; see docs/singlecell_supplementary.md)
figures/project_workflow.png End-to-end analysis workflow, orbit → medicine cabinet, incl. the self-updating closed loop (hand-laid schematic; src/make_workflow.py)

Data access — open vs controlled (hard constraint)

NASA OSDR human data is two-tier: processed/derived matrices are OPEN; raw individual-level sequence is CONTROLLED (dbGaP-style IRB). This project uses OPEN/processed data only. Exactly what was used:

Mission OSDR / GLDS Modality Compartment n subj Access Used here
Inspiration4 OSD-569 / GLDS-561 nanopore direct-RNA-seq (featureCounts) whole blood 4 OPEN processed ✅ gene×sample counts
Axiom Ax-1 OSD-903 / GLDS-732 Illumina bulk RNA-seq (STAR) whole blood 2 OPEN (raw+processed) ✅ processed STAR counts
JAXA CFE OSD-530 / GLDS-530 cfRNA plasma cell-free 6 OPEN processed (group-level) ➖ separate cfRNA layer
Inspiration4 PBMC OSD-570 / GLDS-562 snRNA-seq PBMC 4 OPEN (DE tables only) ➖ DE reference (no counts)
NASA Twins Garrett-Bakelman 2019 multi-omics blood 2 published summary tables ➖ reference layer

Raw FASTQ for Ax-1 is open (ENA PRJNA1157458 / OSD-903); we used the GeneLab-processed count matrix for reproducibility. A complete from-raw path — the exact GeneLab pipeline (GL-DPPD-7101-G: Trim Galore → STAR 2.7.11b → RSEM 1.3.3, Ensembl 112/GRCh38), the 6 ENA run accessions, and a matrix-verification snippet — is documented in docs/process_ax1_from_fastq.md. To fetch any other file, see docs/orientation_report.md and the nasa-osdr-census helper.

Repo layout

data/processed/     harmonized_cellular.h5ad, count + metadata parquets, cfRNA layer, crosswalk
data/gene_sets/     131 versioned reference signatures + spaceflight query/leading-edge
src/                spaceflight_disease.py (analysis), pipeline.py (living-atlas engine),
                    connectivity.py (XSum reversal), atlas_loop.py (closed-loop new-data hooks),
                    make_space_figures.py + spacetheme.py (space-themed figures),
                    make_supp_singlecell.py, make_supp_frailty.py, make_workflow.py;
                    make_figures.py + figstyle.py (plain)
figures/            fig1..fig6 + supp_frailty + supp_singlecell + project_workflow — 16:9 deep-space set
docs/               orientation, QC, disease-mapping + corroboration reports + all scored tables

Reports (in docs/)

  • orientation_report.md — SOMA deep-read, dataset census, gap analysis, OSDR scan
  • qc_report.md — acquisition/harmonization QC + judgment-call log
  • disease_mapping_report.md — the disease-similarity result, both nulls, and honest limitations
  • process_ax1_from_fastq.md — from-raw processing path for the open Ax-1 set
  • independent_corroboration.md — honest positioning vs 2024–2026 spaceflight-as-aging papers (frailty biomarkers, Nat Aging review) + the supp_frailty_convergence figure
  • REFERENCES_SLIDE.md — condensed citation list (full detail in CITATIONS.md)

Honest limitations (read before citing)

  • Tiny n (I4 n=4, Ax-1 n=2). Validation currency is replication across missions, not within-mission p-values.
  • Platform ≡ mission perfect confound → within-mission contrasts only, never a merged batch-corrected embedding for inference.
  • Conserved signal is pathway-level, weak at the gene level (genome-wide cross-mission ρ≈−0.04).
  • Disease similarity is signature-level (rank-based), not cohort co-embedding; ~half the raw GSEA hits are attributable to gene-set size/expression base-rate (see the matched null) — the immune-aging + OXPHOS core is what survives.
  • Countermeasure candidates (LINCS) are hypothesis-generating only (cancer-cell-line data).
  • Human vs mouse kept distinct throughout; the one rodent aging set is flagged and excluded from the human claim.

Data & licensing

Code in this repository is released under the MIT License (see LICENSE).

Data. Everything included here — processed count matrices, group-level summary tables, and reference gene sets — comes entirely from open, public sources: NASA OSDR / GeneLab, published summary tables (e.g. the NASA Twins Study), MSigDB, HAGR (GenAge / CellAge), and Enrichr. No controlled-access or individual-level raw sequence data is included (see Data access above). Redistributed datasets and gene sets remain under their original licenses / terms of use; full sources and citations are in docs/CITATIONS.md. NASA GeneLab / OSDR data are used under NASA's open-data terms with attribution.

Not medical advice. This is a research / hypothesis-generating resource; the countermeasure candidates are computational prioritizations from cell-line perturbation data and are not clinical or dosing recommendations.

About

Spaceflight as an accelerated model of terrestrial disease: integrating open human spaceflight -omics and mapping the conserved immune-aging signature onto terrestrial disease + geroprotectors (reproducible pipeline, figures, scored tables). Hackathon project for Built with Claude: Life Sciences 07/13/26

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages