{
  "task_slug": "seahorse-ad-network-pharmacology-null-control",
  "question": "Is the AD core-target/pathway signal for seahorse (Hippocampus spp.) small-molecule constituents under a standard TCM network-pharmacology pipeline specific to seahorse, or reproduced by size- and target-degree-matched random compound sets from the same databases?",
  "falsifiable_prediction": "1000 (here: 1000 per seed x 3 seeds) size+degree-matched random compound sets: top-10 PPI-degree hub recovery of {APP,JUN,PPARG} >= 50%, seahorse emp_p_ad_overlap > 0.05 (not specific) => CONFIRMED (artifact). Hub recovery < 20% AND emp_p_ad_overlap < 0.05 AND emp_p_ad_kegg < 0.05 => REFUTED (pipeline is discriminative).",
  "prediction_outcome": "confirmed",
  "negative_result": true,
  "dataset": "CTD CTD_chem_gene_ixns.tsv.gz (report date 2026-07-30, human rows filtered to OrganismID==9606, 11095 distinct human compounds); STRING v12.0 9606.protein.links + protein.info (combined_score>=700, 16201 genes with >=1 edge kept); Enrichr KEGG_2021_Human (320 terms) and DisGeNET (9829 terms) gene set libraries; seahorse compound list = 21 CTD ChemicalName entries (20 with >=1 human CTD target, excluded: ['Proline']).",
  "env": {
    "python": "3.12.3",
    "torch": "not used in this task",
    "extra_packages": []
  },
  "seeds": [
    0,
    1,
    2
  ],
  "arms": [
    {
      "name": "baseline-standard-pipeline",
      "is_baseline": true,
      "what": "Seahorse compound list -> CTD human targets (union, deduped) -> intersect with KEGG 'Alzheimer disease' (hsa05010) gene set -> STRING (score>=700) subnetwork on the intersection -> rank by within-subnetwork degree, take top-10 hub genes -> hypergeometric test of the FULL target set against every KEGG_2021_Human term, BH-FDR corrected. Deterministic given fixed inputs; per_seed values are identical across seeds by construction (no randomness in this arm).",
      "metrics": {
        "n_targets_seahorse": {
          "per_seed": [
            1270.0,
            1270.0,
            1270.0
          ],
          "mean": 1270.0,
          "std": 0.0
        },
        "n_ad_overlap": {
          "per_seed": [
            71.0,
            71.0,
            71.0
          ],
          "mean": 71.0,
          "std": 0.0
        },
        "neglog10p_ad_kegg": {
          "per_seed": [
            6.490932952567916,
            6.490932952567916,
            6.490932952567916
          ],
          "mean": 6.490932952567916,
          "std": 0.0
        },
        "ad_kegg_fdr": {
          "per_seed": [
            1.1741791210604776e-06,
            1.1741791210604776e-06,
            1.1741791210604776e-06
          ],
          "mean": 1.1741791210604776e-06,
          "std": 0.0
        },
        "n_kegg_terms_sig_fdr05": {
          "per_seed": [
            174.0,
            174.0,
            174.0
          ],
          "mean": 174.0,
          "std": 0.0
        }
      }
    },
    {
      "name": "null-size-matched",
      "is_baseline": false,
      "what": "1000 draws per seed of 20 random CTD human compounds (uniform, excluding the seahorse list itself), same pipeline as baseline run on each draw; forms the weak null distribution (size-matched only, target degree unconstrained).",
      "metrics": {
        "emp_p_ad_overlap": {
          "per_seed": [
            0.20679320679320679,
            0.20679320679320679,
            0.21078921078921078
          ],
          "mean": 0.2081252081252081,
          "std": 0.001883734348815313
        },
        "emp_p_ad_kegg": {
          "per_seed": [
            0.3196803196803197,
            0.3006993006993007,
            0.2917082917082917
          ],
          "mean": 0.304029304029304,
          "std": 0.011659767832175557
        },
        "hub_recovery_rate": {
          "per_seed": [
            0.936,
            0.936,
            0.959
          ],
          "mean": 0.9436666666666667,
          "std": 0.010842303978193685
        },
        "hub_recovery_rate_APP": {
          "per_seed": [
            0.087,
            0.098,
            0.084
          ],
          "mean": 0.08966666666666667,
          "std": 0.006018490028422597
        },
        "hub_recovery_rate_JUN": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        },
        "hub_recovery_rate_PPARG": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        },
        "hub_recovery_rate_AKT1": {
          "per_seed": [
            0.777,
            0.785,
            0.811
          ],
          "mean": 0.791,
          "std": 0.014514360704718175
        },
        "hub_recovery_rate_TNF": {
          "per_seed": [
            0.85,
            0.844,
            0.862
          ],
          "mean": 0.852,
          "std": 0.007483314773547889
        },
        "hub_recovery_rate_IL6": {
          "per_seed": [
            0.739,
            0.748,
            0.768
          ],
          "mean": 0.7516666666666666,
          "std": 0.012119772641798572
        },
        "hub_recovery_rate_TP53": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        }
      }
    },
    {
      "name": "null-degree-matched",
      "is_baseline": false,
      "what": "1000 draws per seed; each of the 20 seahorse compounds is replaced by a random CTD human compound drawn from the same log2(#CTD targets) bin, so the random set matches both the seahorse set's size AND its per-compound target-degree distribution. Primary (strong) null model used for emp_p_ad_overlap / emp_p_ad_kegg / hub_recovery_rate.",
      "metrics": {
        "emp_p_ad_overlap": {
          "per_seed": [
            0.46153846153846156,
            0.48451548451548454,
            0.4885114885114885
          ],
          "mean": 0.4781884781884782,
          "std": 0.011885826372011146
        },
        "emp_p_ad_kegg": {
          "per_seed": [
            0.3946053946053946,
            0.3996003996003996,
            0.4155844155844156
          ],
          "mean": 0.4032634032634033,
          "std": 0.008947738156872734
        },
        "hub_recovery_rate": {
          "per_seed": [
            0.97,
            0.976,
            0.973
          ],
          "mean": 0.973,
          "std": 0.00244948974278318
        },
        "hub_recovery_rate_APP": {
          "per_seed": [
            0.032,
            0.04,
            0.021
          ],
          "mean": 0.031000000000000003,
          "std": 0.0077888809636986155
        },
        "hub_recovery_rate_JUN": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        },
        "hub_recovery_rate_PPARG": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        },
        "hub_recovery_rate_AKT1": {
          "per_seed": [
            0.961,
            0.965,
            0.964
          ],
          "mean": 0.9633333333333333,
          "std": 0.0016996731711975965
        },
        "hub_recovery_rate_TNF": {
          "per_seed": [
            0.933,
            0.943,
            0.925
          ],
          "mean": 0.9336666666666668,
          "std": 0.0073635740114581325
        },
        "hub_recovery_rate_IL6": {
          "per_seed": [
            0.838,
            0.836,
            0.837
          ],
          "mean": 0.8370000000000001,
          "std": 0.0008164965809277268
        },
        "hub_recovery_rate_TP53": {
          "per_seed": [
            0.0,
            0.0,
            0.0
          ],
          "mean": 0.0,
          "std": 0.0
        },
        "hub_jaccard_null_median": {
          "per_seed": [
            0.6666666666666666,
            0.6666666666666666,
            0.6666666666666666
          ],
          "mean": 0.6666666666666666,
          "std": 0.0
        },
        "hub_jaccard_null_q1": {
          "per_seed": [
            0.42857142857142855,
            0.42857142857142855,
            0.42857142857142855
          ],
          "mean": 0.42857142857142855,
          "std": 0.0
        },
        "hub_jaccard_null_q3": {
          "per_seed": [
            0.6666666666666666,
            0.6666666666666666,
            0.6666666666666666
          ],
          "mean": 0.6666666666666666,
          "std": 0.0
        }
      }
    },
    {
      "name": "disease-swap-control",
      "is_baseline": false,
      "what": "Seahorse target set held fixed; DisGeNET gene sets for AD + 5 unrelated diseases (Type 2 Diabetes, Hypertension, Colorectal Carcinoma, Asthma, Osteoarthritis) tested by hypergeometric enrichment against the same target set and background library, ranked by -log10(p). Deterministic given fixed inputs.",
      "metrics": {
        "disease_rank_ad": {
          "per_seed": [
            4.0,
            4.0,
            4.0
          ],
          "mean": 4.0,
          "std": 0.0
        },
        "n_diseases_tested": {
          "per_seed": [
            6.0,
            6.0,
            6.0
          ],
          "mean": 6.0,
          "std": 0.0
        },
        "ad_neglog10p": {
          "per_seed": [
            74.03568426069666,
            74.03568426069666,
            74.03568426069666
          ],
          "mean": 74.03568426069666,
          "std": 0.0
        }
      }
    }
  ],
  "headline": {
    "metric": "hub_recovery_rate",
    "baseline_mean": 0.9436666666666667,
    "proposed_mean": 0.973,
    "delta": 0.029333333333333322,
    "claim": "The random compound sets reproduce the seahorse AD-module signal at least as often as predicted (hub recovery >=50%, seahorse overlap not significant vs the degree-matched null) -- the published core-target module is consistent with a database/pipeline artifact, not seahorse-specific."
  },
  "deviations": [
    "GO_BP_2025 enrichment was dropped: none of the six pre-registered metrics require it (they only reference the KEGG hsa05010 term, hub genes, overlap counts and disease ranks); KEGG_2021_Human enrichment with BH-FDR was still run in full for the baseline arm.",
    "The (string_confidence_cutoff x ad_geneset_source) 3x3 sweep was not run at full null sample size (1000 draws x 3 seeds x 9 combinations = 27,000 draws was not attempted); a reduced single-seed sweep is reported separately by sweep.py in results_raw/sweep_results.csv (n_null and seed columns record exactly what was run), not folded into the headline results.json arms.",
    "headline.baseline_mean/proposed_mean compare null-size-matched vs null-degree-matched hub_recovery_rate (the actual falsification axis), not baseline-standard-pipeline vs a 'proposed' arm -- baseline-standard-pipeline is deterministic and has no hub_recovery_rate metric defined for it in the experiment plan.",
    "disease-swap-control used DisGeNET (dis.gmt) for all 6 disease terms (including AD) rather than mixing DisGeNET and KEGG, to keep the enrichment background gene universe identical across diseases (a mixed-library comparison would confound background size with disease identity)."
  ],
  "runtime_sec": 19.5
}