dsh-probstat
Deterministic probability & statistical-inference math for DeepSeek Harness (dsh). Nine zero-runtime-dependency tools that replace the math agents get wrong most often: hallucinated z-table values, distribution cdf/quantile errors, wrong critical values, sloppy compound-event identities, mis-recalled test decisions, guessed study sizes, hand-waved A/B comparisons, "the variances look close enough" and "the effect is big" said without a number.
中文简介:DeepSeek Harness 概率与统计推断数学工具箱——分布计算(正态/二项/泊松/指数/均匀/几何的 pdf/cdf/生存函数/分位数/统计量)、标准正态 z 表换算、置信区间(均值 z/t + 比例 Wilson)、事件概率恒等式(并/交/条件/贝叶斯)、单样本假设检验(均值 z/t + 比例)、目标误差所需样本量(Wald / Wilson)、双样本检验(均值 z/Welch/合并方差 + 双比例)、方差比 F 检验(该走 Welch 还是合并方差)、效应量(Cohen's d + 区间 + CLES + TOST 等效性检验)。零运行时依赖,纯确定性计算。
Install
dsh plugin --profile web add github:TYEclipse/dsh-probstat
Tools
| Tool | What it does |
|---|---|
dist_calc |
pdf / cdf / survival / quantile / stats for 6 distributions |
z_score |
standard-normal table math (z ↔ probability) |
confidence_interval |
mean intervals (z or t) and Wilson proportion intervals |
event_probability |
union / intersection / conditional / Bayes / complement / at-least-one |
hypothesis_test |
one-sample z / t / proportion tests with p-values and the decision |
sample_size |
sample size for a target margin of error (mean, proportion) |
two_sample_test |
two-group comparisons: difference of means (z / Welch / pooled) and of proportions |
variance_ratio |
F test on two sample variances — pooled or Welch for the t test? |
effect_size |
Cohen's d, its interval, CLES and a TOST equivalence test |
dist_calc
Distributions: normal (mean, sd — default standard normal), binomial (n, p), poisson (lambda), exponential (rate lambda), uniform (a, b), geometric (p). Operations: pdf, cdf (P(X ≤ x)), survival (P(X > x)), quantile (inverse cdf at probability q), stats (mean / variance / sd).
Examples:
distribution: "normal", x: 1.96→ cdf0.9750022(P(Z ≤ 1.96))distribution: "binomial", operation: "quantile", n: 10, p: 0.5, q: 0.95→8distribution: "poisson", operation: "survival", lambda: 3, x: 5→0.08391794distribution: "geometric", operation: "stats", p: 0.5→ mean1, variance2
Conventions: the geometric distribution counts failures before the first success (support k ≥ 0, P(X = k) = p·(1−p)^k). Quantiles of discrete distributions return the smallest k with P(X ≤ k) ≥ q.
z_score
Modes: to_prob (z → probability + percentile), from_prob (probability → z), two_sided (z → two-tailed p-value), between (z1, z2 → probability between; order is sorted internally).
mode: "between", z1: -1.96, z2: 1.96→0.9500043mode: "two_sided", z: 2.5→ p-value0.01241936
confidence_interval
Kinds: mean_z (population mean, known sigma), mean_t (population mean, unknown sigma; Student-t with df = n − 1), proportion (Wilson score interval — stays valid for small samples and extreme proportions, unlike the naive Wald interval). Default confidence level 0.95.
kind: "mean_t", mean: 72.5, sd: 8.2, n: 25→[69.115, 75.885](t* = 2.0639, df = 24)kind: "proportion", successes: 40, n: 100→[0.30940, 0.49800]kind: "proportion", successes: 0, n: 50→[0, 0.07135]
event_probability
Operations: union (P(A or B); independent default true, false treats events as mutually exclusive), intersection (independent events), conditional (P(A|B) = P(A and B)/P(B)), bayes (posterior from prior, true-positive and false-positive rates), complement, at_least_one (1 − (1−p)^n).
operation: "bayes", prior: 0.001, truePositive: 0.99, falsePositive: 0.01→0.09016operation: "at_least_one", p: 0.05, n: 20→0.64151
hypothesis_test
Kinds: mean_z (known sigma), mean_t (unknown sigma; Student-t with df = n − 1), proportion (against p0, normal approximation). Optional tail (two-sided default, left, right) and alpha (default 0.05). Every run reports the statistic, the standard error, all three p-values, the tail-specific critical value and the decision.
kind: "mean_z", sampleMean: 102, mu0: 100, sigma: 15, n: 36→ z0.8, two-sided p0.4237108, critical1.959964→ do not rejectkind: "mean_t", sampleMean: 5.2, mu0: 5, sd: 1.5, n: 12, tail: "right"→ t0.4618802, df11, p0.3265839kind: "proportion", successes: 40, n: 100, p0: 0.5→ z-2, two-sided p0.0455003→ reject at 0.05
The proportion kind warns (in note) when the normal approximation is shaky (n·p0 < 5) rather than quietly returning a p-value.
sample_size
Kinds: mean_z (n = (z·σ/E)²) and proportion (method: "wald" default: n = z²p(1−p)/E²; method: "wilson": the smallest n whose Wilson half-width meets E). p defaults to 0.5, the conservative worst case.
kind: "mean_z", sigma: 15, marginOfError: 5→ n35(exact 34.573129)kind: "proportion", p: 0.5, marginOfError: 0.03→ n1068(Wald)kind: "proportion", p: 0.5, marginOfError: 0.03, method: "wilson"→ n1064(smallest n whose Wilson interval is that narrow)
two_sample_test
Two independent groups. Kinds: mean_z (difference of means, known population sigmas), mean_welch (unknown sigmas, unequal variances — Welch t with the fractional Welch–Satterthwaite df), mean_pooled (unknown sigmas, equal-variance pooled t with df = n₁ + n₂ − 2) and proportion (difference of two proportions, pooled normal approximation). Optional delta0 (the null-hypothesis difference, default 0), tail and alpha. Every run reports both estimates, the difference, the standard error, the statistic, the df, all three p-values, the tail-specific critical value and the decision.
kind: "mean_z", mean1: 102, mean2: 98, sigma1: 10, sigma2: 12, n1: 40, n2: 50→ z1.7245225, two-sided p0.0846135→ do not reject at 0.05kind: "mean_welch", mean1: 5.2, mean2: 4.6, sd1: 1.1, sd2: 0.9, n1: 12, n2: 15→ t1.5248215, df21.166825(fractional by construction), two-sided p0.1421069kind: "mean_pooled"on the same data → pooled variance0.986, df25, t1.5601529kind: "proportion", successes1: 45, n1: 100, successes2: 32, n2: 90→ pooled p0.40526316, z1.3240058, one-sided p0.0927506
Welch is the right default when the variances were not designed to be equal; pick mean_pooled only when equal variances are a stated assumption. The Welch df is reported unrounded — rounding it to an integer silently changes the p-value. The proportion kind flags a shaky approximation (smallest expected cell < 5) instead of hiding it.
variance_ratio
The F test on sd1² / sd2² — the check behind the sentence "the variances were about the same, so I used the pooled t test". Give both spreads and both sample sizes (each n >= 2); optional alpha (default 0.05) and tail (two-sided default, left, right). One-sided calls put the whole alpha in one tail, so the critical bound differs from the two-sided one — both are reported.
sd1: 1.1, sd2: 0.9, n1: 12, n2: 15→ F(11, 14)1.4938272, two-sided p0.47360638, bounds[0.29772447, 3.0945898]→ do not reject equal variancessd1: 2, sd2: 1, n1: 20, n2: 20→ F(19, 19)4, two-sided p0.0040359154→ reject; guidancemean_welch
guidance names the two-sample t route the data argue for, and it deliberately does not call a non-significant F test proof of equal variances: the F test assumes both samples are normal and has little power at small n, so the note says so and still recommends Welch as the safe default. Use the verdict as "the pooled route is defensible", never as "the variances are equal".
effect_size
Cohen's d for two independent groups with the interval that says how precise it is — the number a p-value cannot give you. Give mean1, mean2, sd1, sd2, n1, n2 (each n >= 2); optional conf (default 0.95), and equivalenceMargin (positive, in the units of the means) plus alpha (default 0.05) to run an equivalence test. Returns the raw difference, the pooled sd, d, Hedges g (small-sample correction), the d interval, the common-language effect size (probability that a random draw from group 1 exceeds one from group 2) and Cohen's conventional magnitude label.
mean1: 5.2, mean2: 4.6, sd1: 1.1, sd2: 0.9, n1: 12, n2: 15→ d0.60424462, Hedges g0.58593418, 95% interval[-0.1717658, 1.380255], CLES0.66540697, magnitudemedium— note that the interval still spans 0, i.e. "medium-sized but imprecise", not "significant"mean1: 0.05, mean2: 0, sd1: 1, sd2: 1, n1: 50, n2: 50, equivalenceMargin: 0.5→ TOST p0.013342614(lower0.003548887, upper0.013342614) → equivalent at 0.05mean1: 0.6, mean2: 0, sd1: 1, sd2: 1, n1: 12, n2: 15, equivalenceMargin: 0.5→ the same margin is not established (p0.60081641)
Two boundaries worth knowing: a small p-value answers "is there an effect", while d answers "how big", and neither answers "is it big enough to ignore" — that is the equivalence test's job, and it needs a margin you choose. The interval around d is the large-sample normal approximation, so it is optimistic at small n; the TOST is run on the raw mean difference, so equivalenceMargin is in the units of the means, not in d.
Numerics & precision
- Normal cdf: Abramowitz & Stegun 7.1.26 erf fit, absolute error ≤ 1.5e-7 (far beyond published 4-decimal z-tables).
- Normal quantile: Acklam inverse normal, relative error < 1.15e-9.
- Binomial / Poisson: exact pmf via recurrence and cdf by summation (no combinatorics overflow); quantiles by monotone search.
- Student-t: regularized incomplete beta (Lentz continued fraction) + Lanczos log-gamma; cross-checked against published t-table values (2.2281, 2.0452, 1.8125, 1.984).
- Exponential / uniform / geometric: closed forms.
- Hypothesis tests: p-values from the same cdf primitives; critical values via the quantile functions. Wilson sample size: binary search on a half-width that is strictly decreasing in n.
- Two-sample tests: the Welch–Satterthwaite df is used as-is (fractional), never rounded; the pooled kind reports its pooled variance so the assumption is checkable.
- F distribution:
P(F ≤ x) = I_y(df1/2, df2/2)withy = df1·x/(df1·x + df2), i.e. the same regularized incomplete beta the t distribution uses; critical values by bisection. Cross-checked against published F-table values (F(0.95; 2, 10) = 4.102821, F(0.95; 5, 20) = 2.710890, F(0.95; 1, 1) = 161.4476). - Effect size: d is the difference over the pooled sd; the interval is the large-sample normal approximation (
SE(d) = √((n1+n2)/(n1·n2) + d²/(2(n1+n2)))), Hedges g applies the1 − 3/(4·df − 1)correction, and the equivalence test is a TOST on the raw difference with two one-sided t-tests at the pooled df. - All validation errors return
valid: falsewith an explanatoryerrorstring; no tool ever throws on bad numeric input.
Development
pnpm install
pnpm build
pnpm test # 70 tests; anchors from test/oracle/anchors.py (independent Python oracle)
pnpm lint
License
MIT
No comments yet. Be the first to write one.