Pewsey 2021 - Circular Distributions and Constructions
Summary
A circular pdf is non-negative, 2π-periodic and integrates to 1 over any length-2π interval. Models arise by wrapping, projection or perturbation (plus conditioning, diffusion, maximum entropy). The von Mises, wrapped normal/Cauchy and projected normal are the workhorses; flexible families add skewness, peakedness and multimodality.
Overview
Directions on S1 are angles θ∈[0,2π) or unit vectors x=(cosθ,sinθ)⊤ or complex z=eiθ. Axial data identify θ and θ+π. Times on the 24-hour clock can be analysed as circular after mapping to the circle (Gill and Hangartner 2010). Exploratory tools (Sec. 2): moving rose diagram, wrap-around time series plot, circular data image, area-proportional rose diagrams, circular boxplots (Abuzaid et al. 2012, centred on the circular median using dc(ϕ,θ)=π−∣π−∣θ−ϕ∣∣, Eq. 1), CircSiZer, WiZer (the wrapped normal is the only kernel guaranteeing circular causality; Huckemann et al. 2016) and SphereSiZer.
Main Content
Von Mises (Eq. 2)
fΘ(θ;μ,κ)=2πI0(κ)1exp{κcos(θ−μ)},
μ∈[0,2π) mean direction, κ>0 concentration, Iν modified Bessel function of the first kind. Derivable using five constructions (Mardia and Jupp 1999, Sec. 3.5.4). Trigonometric moments φk=EeikΘ=Ak(κ)eikμ with A1(κ)=I1(κ)/I0(κ) (standard result) the mean resultant length ρ.
Wrapping
If X is linear, Θ=Xmod2π (=Arg{eiX}). The cf of Θ is {φk=φX(k)} and fΘ(θ)=∑k∈ZfX(θ+2πk). Wrapped Cauchy: f(θ;μ,ρ)=2π11+ρ2−2ρcos(θ−μ)1−ρ2 with φk=(ρeiμ)k (Eq. 3) — the rare closed form. Wrapped normal (X∼N(μ,σ2)) closely approximates the vM and vice versa (Pewsey and Jones 2005). Other wrapped families: skew-normal, exponential, Laplace, t, stable, generalized normal-Laplace.
Projection
Stereographic: Θ=2tan−1X. Radial projection of X=(X1,X2): Θ=Arg(X1+iX2), i.e. X/∥X∥∈S1. The projected normal (offset normal / angular Gaussian) can be symmetric or asymmetric, unimodal or bimodal; natural for measurements relative to an observer.
Perturbation: cardioid and sine-skewed
Cardioid: f=2π1{1+2ρcos(θ−μ)}, ∣ρ∣<21. Sine-skewed (Abe and Pewsey 2011): f(θ;μ,λ)=g(θ−μ){1+λsin(θ−μ)} with symmetric unimodal base g and λ∈[−1,1]; same normalising constant as g; λ>0 skews anticlockwise; only moderate asymmetry and may not be unimodal.
Overarching and highly flexible unimodal families
Jones-Pewsey (2005): f∝{1+tanh(κψ)cos(θ−μ)}1/ψ, κ≥0, shape ψ∈R; contains uniform, cardioid, vM and WC. Kato-Jones (2015, Eq. 4): f(θ)=2π1{1+2γ1+ρ2−2ρcos(θ−μ−λ)cos(θ−μ)−ρcosλ} with μ∈[0,2π), ρ∈[0,1), γ∈[0,(1+ρ)/2], λ∈[−π,π) subject to ργcosλ≥(ρ2+2γ−1)/2; closed-form cdf; generalises the WC by extending trigonometric moments. Möbius transformation (Eq. 5): Θ∗=ϕ+ω+2tan−1[wrtan{(Θ−ω)/2}], wr=(1−r)/(1+r); applied to circular uniform gives WC (McCullagh 1996). Inverse Batschelet (Jones and Pewsey 2012): transformation of argument, four parameters, Laplace-like shapes. Most flexible unimodal: Jones-Pewsey 2012 and Kato-Jones 2015.
Multimodality: mixtures and generalized vM
Mixture (Eq. 6): f(θ;p,μ,κ)=∑j=1mpjf(θ;μj,κj), ∑pj=1. Identifiability of location-scale wrapped mixtures: Holzmann et al. (2004). Generalized vM of order m (Eq. 7): f∝exp{κ0+∑j=1mκjcos(j(θ−μj))} (Gatto 2008), normalising constant numerical; Fernández-Durán’s non-negative trigonometric sums need no constants but are over-parameterised; Taniguchi et al. (2020) normalise spectra via residue theorem.
Examples
Choosing a model for hourly wind direction
Wind direction at an airport can be bimodal (on-shore / off-shore). A single vM cannot represent both; a two-component vM mixture (Eq. 6) or a projected normal (which can be bimodal) can. Using the wrapped normal vs vM matters little for unimodal data (Pewsey and Jones 2005), but heavy-tailed/peaked data favours WC or Jones-Pewsey.
Python: von Mises mean resultant length and MLE
import numpy as npfrom scipy import stats, special, optimizetheta = stats.vonmises.rvs(kappa=3.0, loc=1.0, size=2000, random_state=1)C, S = np.cos(theta).mean(), np.sin(theta).mean()mu_hat, rho = np.arctan2(S, C), np.hypot(C, S) # mean direction, resultant lengthkappa_hat = optimize.brentq(lambda k: special.i1(k)/special.i0(k) - rho, 1e-6, 100)print(mu_hat, rho, kappa_hat) # ML for vM = moment estimator