# How precise is a kappa from a typical agreement study? 10,000 simulated studies per size, using the grade model of
# make_data.py (true grade 0-4, rounding noise SD 0.45, rater B half a grade higher). Python 3.13, NumPy.
import numpy as np
rng = np.random.default_rng(20261111); R = 10_000; K = 5
i, j = np.indices((K, K)); wq = 1 - (i - j) ** 2 / (K - 1) ** 2
def kappas(a, b):
    P = np.zeros((K, K)); np.add.at(P, (a, b), 1); P /= len(a); E = np.outer(P.sum(1), P.sum(0))
    k = lambda w: ((w * P).sum() - (w * E).sum()) / (1 - (w * E).sum())
    return k((i == j).astype(float)), k(wq)
for n in (20, 40, 80):
    ks = np.array([kappas(*[np.clip(np.round(t + s + rng.normal(0, 0.45, n)), 0, 4).astype(int) for s in (0, 0.5)])
                   for t in [rng.integers(0, 5, n) for _ in range(R)]])
    lo, hi = np.percentile(ks, [2.5, 97.5], axis=0)
    print(f"{n} slides: Cohen's kappa middle 95% of studies {lo[0]:.2f} to {hi[0]:.2f}; quadratic-weighted kappa {lo[1]:.2f} to {hi[1]:.2f}")
