# Patient vs control iPSC lines with no true difference: differentiations as n, clones as n, and donors as n.
# Python 3.13, NumPy, pandas, SciPy.
import numpy as np, pandas as pd
from scipy import stats

d = pd.read_csv("ipsc.csv")                          # one row per differentiation: status, donor, clone, differentiation, log_neurite
def compare(x, unit):
    p = x.status == "patient"; t = stats.ttest_ind(x.log_neurite[p], x.log_neurite[~p], equal_var=False); ci = t.confidence_interval()
    diff = x.log_neurite[p].mean() - x.log_neurite[~p].mean()
    print(f"{unit} ({p.sum()} vs {(~p).sum()}): patient / control {np.exp(diff):.2f} (95% CI {np.exp(ci.low):.2f} to {np.exp(ci.high):.2f}), p = {t.pvalue:.2g}")
compare(d, "Differentiations as n")
compare(d.groupby(["status", "donor", "clone"]).log_neurite.mean().reset_index(), "Clones as n")
compare(d.groupby(["status", "donor"]).log_neurite.mean().reset_index(), "Donors as n")
