methylation: combine_neg option; oracle compares both background variants and logs sesame's negative controls
This commit is contained in:
1 parent
3a816a1c44
commit
6aebb31991
3 files changed
+32
-22
No files matched your search
@@ -38,9 +38,6 @@ def main() -> int:
|
||||
for prefix in a.prefixes:
|
||||
# min_beads=0: the oracle runs without bead-count masking (see sesame_oracle.R)
|
||||
s = sig.assemble(read_idat(prefix + "_Grn.idat"), read_idat(prefix + "_Red.idat"), man, min_beads=0)
|
||||
p = sig.detection_p(s)
|
||||
n, fg, fr = sig.noob(s)
|
||||
b = sig.beta_values(n)
|
||||
rows = list(csv.DictReader((a.sesame / (Path(prefix).name + ".tsv")).open(), delimiter="\t"))
|
||||
idx = np.array([pos[r["probe_id"]] for r in rows])
|
||||
|
||||
@@ -48,25 +45,33 @@ def main() -> int:
|
||||
return np.array([float(r[name]) if r[name] not in ("NA", "") else np.nan for r in rows])
|
||||
|
||||
mask_s = np.array([r["mask"] == "TRUE" for r in rows])
|
||||
variants = {}
|
||||
for neg in (True, False):
|
||||
p = sig.detection_p(s, combine_neg=neg)
|
||||
n, fg, fr = sig.noob(s, combine_neg=neg)
|
||||
variants[neg] = (p, n, fg, fr, sig.beta_values(n))
|
||||
keep = ~mask_s & ~s.masked[idx]
|
||||
sp, sm, su, sb = col("pval"), col("m_noob"), col("u_noob"), col("beta_noob")
|
||||
op, om, ou, ob = p[idx], n.m[idx], n.u[idx], b[idx]
|
||||
ana = man.analytical()[idx] & keep
|
||||
res[Path(prefix).name] = {
|
||||
out: dict[str, object] = {
|
||||
"probes": len(rows),
|
||||
"masked_sesame": int(mask_s.sum()),
|
||||
"masked_simurg": int(s.masked.sum()),
|
||||
"mask_agreement": float((mask_s == s.masked[idx]).mean()),
|
||||
"noob_fit": {"green": vars(fg), "red": vars(fr)},
|
||||
"pval_abs_diff": _q(np.abs(op - sp)[keep]),
|
||||
"pval_identical_fraction": float((op[keep] == sp[keep]).mean()),
|
||||
"detection_call_agreement_0.05": float(((op < 0.05) == (sp < 0.05))[keep].mean()),
|
||||
"prop_passing": {"simurg": float((op[ana] < 0.05).mean()), "sesame": float((sp[ana] < 0.05).mean())},
|
||||
"noob_m_rel_diff": _q(np.abs(om - sm)[keep] / np.maximum(np.abs(sm[keep]), 1)),
|
||||
"noob_u_rel_diff": _q(np.abs(ou - su)[keep] / np.maximum(np.abs(su[keep]), 1)),
|
||||
"beta_abs_diff": _q(np.abs(ob - sb)[keep]),
|
||||
"beta_corr": float(np.corrcoef(ob[keep & np.isfinite(sb)], sb[keep & np.isfinite(sb)])[0, 1]),
|
||||
}
|
||||
for neg, (p, n, fg, fr, b) in variants.items():
|
||||
op, om, ou, ob = p[idx], n.m[idx], n.u[idx], b[idx]
|
||||
out[f"combine_neg={neg}"] = {
|
||||
"noob_fit": {"green": vars(fg), "red": vars(fr)},
|
||||
"pval_abs_diff": _q(np.abs(op - sp)[keep]),
|
||||
"pval_identical_fraction": float((op[keep] == sp[keep]).mean()),
|
||||
"detection_call_agreement_0.05": float(((op < 0.05) == (sp < 0.05))[keep].mean()),
|
||||
"prop_passing": {"simurg": float((op[ana] < 0.05).mean()), "sesame": float((sp[ana] < 0.05).mean())},
|
||||
"noob_m_rel_diff": _q(np.abs(om - sm)[keep] / np.maximum(np.abs(sm[keep]), 1)),
|
||||
"noob_u_rel_diff": _q(np.abs(ou - su)[keep] / np.maximum(np.abs(su[keep]), 1)),
|
||||
"beta_abs_diff": _q(np.abs(ob - sb)[keep]),
|
||||
"beta_corr": float(np.corrcoef(ob[keep & np.isfinite(sb)], sb[keep & np.isfinite(sb)])[0, 1]),
|
||||
}
|
||||
res[Path(prefix).name] = out
|
||||
a.out.write_text(json.dumps(res, indent=1))
|
||||
print(json.dumps(res, indent=1))
|
||||
return 0
|
||||
|
||||
Reference in new issue
Block a user