Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Dispersion Ratio Under Fat Tails

Statement

Let x1,…,xnx_1,\dots,x_n be observed data, and compare the sample standard deviation with absolute-deviation scale estimates. The repository uses normal-scaled versions

MeanAD⁡=π21n∑i=1n∣xi−xˉ∣,\operatorname{MeanAD} = \sqrt{\frac{\pi}{2}}\frac1n\sum_{i=1}^n |x_i-\bar x|,

and

MedianAD⁡=median⁡i∣xi−median⁡(x)∣Φ−1(0.75).\operatorname{MedianAD} = \frac{\operatorname{median}_i |x_i-\operatorname{median}(x)|} {\Phi^{-1}(0.75)}.

For Gaussian data, both are calibrated to estimate the same σ\sigma as the standard deviation. Under fat-tailed or contaminated data, the ratios

Std⁡MeanAD⁡,Std⁡MedianAD⁡\frac{\operatorname{Std}}{\operatorname{MeanAD}}, \qquad \frac{\operatorname{Std}}{\operatorname{MedianAD}}

can rise because sample standard deviation is more sensitive to isolated extremes. The mean absolute deviation uses all observations; the median absolute deviation depends on their central order statistics.

The sample notation X1,…,XnX_1,\dots,X_n and expectation notation follow the shared notation table. The scale symbol σ\sigma and the names MeanAD and MedianAD are local conventions for this page.

Examples

Use dispersion_ratios.

from xmath.incerto.stats import dispersion_ratios

for sample in ([2, 2, 2], [0, 0, 10], [1, 2, 3]):
    mean_ratio, median_ratio = dispersion_ratios(sample)
    print(f"{sample}: Std/MeanAD={mean_ratio:.4g}, Std/MedianAD={median_ratio:.4g}")

Output

[2, 2, 2]: Std/MeanAD=nan, Std/MedianAD=nan
[0, 0, 10]: Std/MeanAD=0.8463, Std/MedianAD=inf
[1, 2, 3]: Std/MeanAD=0.9772, Std/MedianAD=0.5507

The ratios distinguish 0/00/0 from a positive numerator over a zero denominator.

Calibration

We justify the Gaussian scale constants here; these identities do not establish a tail class. Integrating the standard normal density on the positive half-line gives E∣Z∣=2∫0∞zϕ(z) dz=2/π\mathbb E|Z|=2\int_0^\infty z\phi(z)\,dz=\sqrt{2/\pi}. The equation P(∣Z∣≤m)=2Φ(m)−1=1/2P(|Z|\le m)=2\Phi(m)-1=1/2 gives m=Φ−1(0.75)m=\Phi^{-1}(0.75). Here ZZ is standard normal and ϕ\phi is its density.

For X∼N(μ,σ2)X\sim N(\mu,\sigma^2),

E∣X−μ∣=σ2π.\mathbb E|X-\mu| = \sigma\sqrt{\frac{2}{\pi}}.

Thus multiplying the mean absolute deviation by π/2\sqrt{\pi/2} calibrates it to σ\sigma under a normal model. Also,

median⁡(∣X−μ∣)=σΦ−1(0.75),\operatorname{median}(|X-\mu|) = \sigma\Phi^{-1}(0.75),

so dividing the raw median absolute deviation by Φ−1(0.75)\Phi^{-1}(0.75) gives the same normal calibration.

These identities are normal-model calibrations, not tail theorems. If the sample has extreme observations, the standard deviation’s quadratic loss gives those observations much more weight than either absolute-deviation statistic.

Simulation

The simulation compares Gaussian, Student-t, and Pareto samples across sample sizes. It reports repeated-simulation medians of the two dispersion ratios.

Use dispersion_ratios.

import numpy as np
from xmath.incerto.stats import dispersion_ratios

rng = np.random.default_rng(20261020)
for label, sample in (("Normal", rng.normal(size=5000)),
                      ("Student 3", rng.standard_t(3, size=5000))):
    values = dispersion_ratios(sample)
    print(f"{label}: [" + ", ".join(f"{v:.3f}" for v in values) + "]")

Output

Normal: [1.003, 1.021]
Student 3: [1.175, 1.383]

These are sample diagnostics, not estimates of a tail exponent.

Figure regeneration: uv run python demos/incerto/dispersion_ratio.py.

Repeated-sample medians of Gaussian-calibrated standard-deviation to mean and median absolute-deviation ratios

The Gaussian calibration explains why the simulated Gaussian ratios are near one. The Student-t and Pareto ratios are larger because the standard deviation is more sensitive to extremes than the absolute-deviation scales. The ratio is a stress signal, not a fitted tail exponent. The moment-estimation note explains why a finite population moment can still have an estimator with infinite variance.

Caveats

References

Recorded calculation

The committed demo produced the following on 2026-10-17. These are sample calculations, with seeds and sample sizes specified in the script.

normal; n=200; median Std/MeanAD=0.999; median Std/MedianAD=1.001
normal; n=1000; median Std/MeanAD=1.000; median Std/MedianAD=1.002
normal; n=5000; median Std/MeanAD=1.000; median Std/MedianAD=0.997
normal; n=20000; median Std/MeanAD=1.000; median Std/MedianAD=0.999
student-t(3); n=200; median Std/MeanAD=1.159; median Std/MedianAD=1.421
student-t(3); n=1000; median Std/MeanAD=1.202; median Std/MedianAD=1.464
student-t(3); n=5000; median Std/MeanAD=1.226; median Std/MedianAD=1.500
student-t(3); n=20000; median Std/MeanAD=1.231; median Std/MedianAD=1.497
Pareto(1.5); n=200; median Std/MeanAD=1.819; median Std/MedianAD=6.723
Pareto(1.5); n=1000; median Std/MeanAD=2.457; median Std/MedianAD=9.386
Pareto(1.5); n=5000; median Std/MeanAD=3.086; median Std/MedianAD=12.000
Pareto(1.5); n=20000; median Std/MeanAD=3.974; median Std/MedianAD=16.015
References
  1. Taleb, N. N. (2025). Statistical Consequences of Fat Tails (3rd ed.). https://arxiv.org/abs/2001.10488v4
  2. Rousseeuw, P. J., & Croux, C. (1993). Alternatives to the Median Absolute Deviation. Journal of the American Statistical Association, 88(424), 1273–1283. 10.1080/01621459.1993.10476408