"""F5-conf-03: counterexample to proposition A; regenerates out/results.json and out/counterexample.csv.""" import json, os import numpy as np, pandas as pd from scipy import stats ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) D, O = os.path.join(ROOT, "data"), os.path.join(ROOT, "out") props = pd.read_csv(os.path.join(D, "propositions.csv")) design = pd.read_csv(os.path.join(D, "design.csv")) par = dict(zip(design["parameter"], design["value"])) seed, n = int(par["seed"]), int(par["n"]) issues = [] if set(props["id"]) != {"A", "B"}: issues.append({"issue": "unexpected proposition ids", "handling": "assessed as listed"}) # Construction: X ~ N(0,1), S ~ Rademacher independent of X, Y = S*X. rng = np.random.default_rng(seed) x = rng.standard_normal(n) s = rng.choice(np.array([-1.0, 1.0]), size=n) y = s * x z = x + y pd.DataFrame({"x": x, "y": y}).to_csv(os.path.join(O, "counterexample.csv"), index=False) mz, sz = z.mean(), z.std(ddof=1) ks = stats.kstest(z, "norm", args=(mz, sz)).statistic ks_x = stats.kstest(x, "norm", args=(x.mean(), x.std(ddof=1))) ks_y = stats.kstest(y, "norm", args=(y.mean(), y.std(ddof=1))) res = { "task_id": "F5-conf-03", "statement_true": False, "counterexample_provided": True, "counterexample_values": { "construction": "X ~ N(0,1); S ~ Rademacher (P(S=1)=P(S=-1)=1/2) independent of X; Y = S*X. " "Then Y ~ N(0,1) by symmetry, but X+Y = (1+S)X equals 0 with probability 1/2 " "and 2X otherwise (Var = 2), so X+Y has an atom at 0 and is neither normal nor constant.", "n": int(n), "seed": seed, "mean_x": float(x.mean()), "sd_x": float(x.std(ddof=1)), "mean_y": float(y.mean()), "sd_y": float(y.std(ddof=1)), "mean_sum": float(mz), "sd_sum": float(sz), "ks_sum_vs_normal": float(ks), "supplementary": { "share_sum_exactly_zero": float(np.mean(z == 0)), "ks_x_vs_fitted_normal": float(ks_x.statistic), "ks_x_pvalue": float(ks_x.pvalue), "ks_y_vs_fitted_normal": float(ks_y.statistic), "ks_y_pvalue": float(ks_y.pvalue), "corr_xy": float(np.corrcoef(x, y)[0, 1]), "excess_kurtosis_sum": float(stats.kurtosis(z)), }, }, "statement_b_true": True, "feasibility": "complete", "feasibility_reason": None, "data_issues": issues, "n_input_rows": {"propositions.csv": int(len(props)), "design.csv": int(len(design))}, "n_analysed": int(n), "random_seed": seed, } with open(os.path.join(O, "results.json"), "w") as f: json.dump(res, f, indent=2) print(json.dumps(res, indent=2))