"""Case 011: hypothetical independent-group summaries. NumPy + SciPy.
No sampled observations; formulas assume continuous normal outcomes.
"""
import numpy as np
import scipy
from scipy.stats import t
n1,n2=20,100
mean1,mean2=53.,50.
sd1,sd2=12.,6.
difference=mean1-mean2
v1,v2=sd1**2/n1,sd2**2/n2
se_w=np.sqrt(v1+v2)
df_w=(v1+v2)**2/(v1**2/(n1-1)+v2**2/(n2-1))
pooled_variance=((n1-1)*sd1**2+(n2-1)*sd2**2)/(n1+n2-2)
se_p=np.sqrt(pooled_variance*(1/n1+1/n2))
def summarize(se,df):
    statistic=difference/se
    half_width=t.ppf(.975,df)*se
    return np.array([difference,se,df,statistic,2*t.sf(abs(statistic),df),
                     difference-half_width,difference+half_width])
welch,pooled=summarize(se_w,df_w),summarize(se_p,n1+n2-2)
print("difference SE df t p CI_low CI_high")
print("Welch:",np.round(welch,6))
print("pooled:",np.round(pooled,6))
# Separate allocation-only comparison: common population SD=10, total N=120.
se_unequal=10*np.sqrt(1/20+1/100)
se_balanced=10*np.sqrt(1/60+1/60)
print("equal_variance_SE_20_100:",round(se_unequal,6))
print("equal_variance_SE_60_60:",round(se_balanced,6))
print("allocation_SE_ratio:",round(se_unequal/se_balanced,6))
print("small_group_variance_share:",round(v1/(v1+v2),6))
assert se_w>se_p
assert np.isclose(v1/(v1+v2),20/21,atol=1e-10)
assert np.isclose(se_unequal/se_balanced,np.sqrt(1.8),atol=1e-10)
assert welch[5]<0<welch[6]
print("All assertions passed; NumPy",np.__version__,"SciPy",scipy.__version__)
