Classical variance tests: formula and validation ledger#

This ledger covers pysht.variance. The implementations use normalized or log-domain arithmetic and SciPy distribution functions; output from legacy SHT is not treated as the correctness oracle.

One-sample chi-square test#

For independent normal observations and null variance \(\sigma_0^2>0\),

\[ X^2=\frac{(n-1)S^2}{\sigma_0^2}\sim\chi^2_{n-1}. \]

Lower, upper, and doubled minimum-tail p-values are supported. Confidence intervals invert the same chi-square pivot. Sample variance is computed in the log domain after scaling, avoiding direct squaring of very large observations. A constant sample is represented by the mathematically limiting statistic and interval zero; under a positive normal-theory null its two-sided p-value is zero. A permutation-invariant sample anchor is subtracted before scaling, so representable ulp-sized spreads near offsets such as \(10^{100}\) are not rounded a second time during normalization.

Validation includes a literal fixed-data formula, pivot-inversion checks for two- and one-sided intervals, joint data/null rescaling through approximately \(10^{\pm100}\), strict control validation, and htest-style rendering.

Two-sample F test#

For two independent normal samples,

\[ F=\frac{S_x^2}{S_y^2}\sim F_{n_x-1,n_y-1} \]

under equality of variances. Both sample variances must be positive. The ratio is formed by subtracting log variances, so common units cancel before exponentiation. Confidence intervals invert the F pivot.

Validation includes literal F tails and quantiles, translation and common-scale invariance, and the directional identity obtained by swapping samples:

\[ F(y,x)=1/F(x,y),\qquad p_{\text{less}}(y,x)=p_{\text{greater}}(x,y). \]

When group scales span the float64 exponent range, each positive spread keeps an independently evaluated variance log if common normalization would underflow it. Tests cover a ratio below the smallest representable positive float and its reciprocal above the largest one; the reported boundary statistics remain zero and infinity with the correct tail probability.

Bartlett test#

For \(k\) normal populations, the implementation uses the classical corrected log-variance statistic and the \(\chi^2_{k-1}\) approximation. The pooled variance is evaluated with log-sum-exp, and every group must have positive sample variance.

The fixed fixture agrees with scipy.stats.bartlett. Tests also cover group and row reordering, translation, common scaling, invalid groups, and degenerate variances.

Levene and Brown–Forsythe tests#

Both procedures apply a one-way F statistic to absolute within-group deviations. Levene centers at each sample mean; Brown–Forsythe centers at each sample median. Their reported \(F_{k-1,N-k}\) laws are finite-sample approximations and do not require the same normality assumption as Bartlett’s derivation.

The fixed fixtures agree with scipy.stats.levene(center="mean") and scipy.stats.levene(center="median"). Tests cover group and row order, translation, scales from approximately \(10^{-100}\) to \(10^{100}\), and both zero/zero and positive/zero ANOVA denominator limits. Within-group anchors are removed before a common deviation scale is chosen, preventing large group locations from contaminating the absolute deviations.

Explicit null-size gate#

The following Gaussian-null audit used three independent \(N(0,1)\) groups of 100 observations and 20,000 datasets for each seed. Every entry satisfies the project release tolerance simultaneously at nominal levels 0.01, 0.05, and 0.10. For every procedure and seed, a fresh numpy.random.default_rng(seed) generated the three groups in group order and the corresponding public function was called once per replication. Rejection meant result.pvalue < alpha.

Seed

Procedure

0.01 count/rate

0.05 count/rate

0.10 count/rate

20260823

Bartlett

196 (0.00980)

1,028 (0.05140)

2,070 (0.10350)

20260824

Bartlett

182 (0.00910)

957 (0.04785)

1,947 (0.09735)

20260823

Levene (mean)

198 (0.00990)

1,060 (0.05300)

2,068 (0.10340)

20260824

Levene (mean)

194 (0.00970)

1,019 (0.05095)

2,045 (0.10225)

20260823

Brown–Forsythe (median)

177 (0.00885)

976 (0.04880)

1,918 (0.09590)

20260824

Brown–Forsythe (median)

169 (0.00845)

938 (0.04690)

1,916 (0.09580)

This validates the displayed approximations in that advertised normal design; it is not a claim of an exact F or chi-square law for arbitrary finite samples or arbitrary nonnormal populations.

Targeted alternative-power audit#

Every public routine was also exercised on 2,000 strong normal alternatives at nominal 0.05. A fresh numpy.random.default_rng(20260829) was reset for each row, observations were generated in the displayed group order, and the public function was called once per replication.

Procedure

Alternative and design

Rejections/2,000

Rate

chisquare_1samp

\(N(0,4)\), \(n=50\), tested against variance 1

2,000

1.0000

f_2samp

\(N(0,4)\) versus \(N(0,1)\), \(n=m=50\)

1,993

0.9965

bartlett

standard deviations \((1,1.5,2)\), three groups of 100

2,000

1.0000

levene

standard deviations \((1,1.5,2)\), three groups of 100

2,000

1.0000

brown_forsythe

standard deviations \((1,1.5,2)\), three groups of 100

2,000

1.0000

These targeted results verify direction and practical sensitivity for an explicit alternative; they are not a minimum-power guarantee over all unequal variances.

Legacy mapping#

pySHT

SHT 0.1.9

chisquare_1samp

var1.chisq

f_2samp

var2.F

bartlett

vark.1937Bartlett

levene

vark.1960Levene

brown_forsythe

vark.1974BF

The Python names describe the statistical operation rather than encoding a publication year. Exact assumptions and calibration are included in every result display.