File size: 2,215 Bytes
925ee3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env python
"""Bootstrap confidence intervals on all key metrics."""
from _common import *

OUT = output_dir("02_bootstrap_ci")


def bootstrap_halflife(adata, hl_df, n_boot=1000, seed=42):
    g, h, _ = match_halflife(adata, hl_df)
    if len(g) < 10:
        return {"r": np.nan, "ci_lo": np.nan, "ci_hi": np.nan, "se": np.nan, "n": len(g)}

    r_point, _ = stats.spearmanr(g, h)
    rng = np.random.RandomState(seed)
    rs = np.zeros(n_boot)
    for i in range(n_boot):
        idx = rng.choice(len(g), size=len(g), replace=True)
        rs[i], _ = stats.spearmanr(g[idx], h[idx])

    return {
        "r": float(r_point),
        "ci_lo": float(np.percentile(rs, 2.5)),
        "ci_hi": float(np.percentile(rs, 97.5)),
        "se": float(np.std(rs)),
        "n": len(g),
    }


def main():
    set_figure_style()
    hl_mouse, hl_human = load_halflife_refs()
    all_results = {}

    for name, loader, _ in DATASETS:
        print(f"\n{'=' * 60}\n{name.upper()}\n{'=' * 60}")
        adata_an = run_analytical(loader)
        results = {}
        for ref_name, hl_df in [("mouse", hl_mouse), ("human", hl_human)]:
            r = bootstrap_halflife(adata_an, hl_df)
            results[ref_name] = r
            print(f"  {ref_name}: r={r['r']:.4f} [{r['ci_lo']:.4f}, {r['ci_hi']:.4f}] (n={r['n']})")
        all_results[name] = results

    save_json(all_results, "bootstrap_ci", OUT)

    # Figure
    fig, ax = plt.subplots(figsize=(8, 5))
    labels, rs, los, his = [], [], [], []
    for name in all_results:
        for ref in ("mouse", "human"):
            d = all_results[name][ref]
            labels.append(f"{name}\n{ref}")
            rs.append(d["r"])
            los.append(d["r"] - d["ci_lo"])
            his.append(d["ci_hi"] - d["r"])
    ax.barh(range(len(labels)), [-r for r in rs], xerr=[[lo for lo in los], [hi for hi in his]],
            color="steelblue", alpha=0.7, capsize=4)
    ax.set_yticks(range(len(labels)))
    ax.set_yticklabels(labels)
    ax.set_xlabel("|Spearman r| with half-life (95% CI)")
    ax.set_title("Half-life correlation with bootstrap CIs")
    fig.tight_layout()
    save_fig(fig, "bootstrap_ci", OUT)


if __name__ == "__main__":
    main()