Yamartino method

The Yamartino method is an algorithm for calculating an approximation of the circular variance of wind direction during a single pass through the incoming data.

Background
The simple method for calculating circular variance requires two passes through the list of values. The first pass determines the circular mean of those values, while the second pass determines the variance. This double-pass method requires access to all values.

There is also a single-pass method for calculating the standard deviation, but this method is unsuitable for angular data such as wind direction. Trying to calculate angular moments by naively applying the standard formulas to angular expressions yields absurd results. For example, a dataset that measures wind speeds of 1° and 359° would average to 180°, but expressing the same data as 1° and -1° (equal to 359°) would give an average of 0°. Thus, we define circular moments by placing all measured angles on a unit circle, then calculating the moments of these points.

The Yamartino method, introduced by Robert J. Yamartino in 1984, solves both problems A further discussion of the Yamartino method, along with other methods of estimating the standard deviation of wind direction can be found in Farrugia & Micallef.

It is possible to calculate the exact standard deviation in one pass. However, that method needs slightly more calculation effort.

Algorithm
Over the time interval to be averaged across, n measurements of wind direction (θ) will be made and two totals are accumulated without storage of the n individual values. At the end of the interval the calculations are as follows: with the average values of sin θ and cos θ defined as


 * $$s_a = \frac 1 n \sum_{i=1}^n \sin \theta_i,$$


 * $$c_a = \frac 1 n \sum_{i=1}^n \cos \theta_i.$$

Then the average wind direction is given via the four-quadrant arctan(x,y) function as


 * $$\theta_a=\arctan(c_a,s_a).$$

From twenty different functions for σθ using variables obtained in a single-pass of the wind direction data, Yamartino found the best function to be


 * $$\sigma_\theta = \arcsin (\varepsilon) \left[1+\left(\tfrac 2 {\sqrt 3} -1\right) \varepsilon^3\right], $$

where


 * $$\varepsilon=\sqrt{1-(s^2_a+c^2_a)}.$$

The key here is to remember that sin2θ + cos2θ = 1 so that for example, with a constant wind direction at any value of θ, the value of $$\varepsilon$$ will be zero, leading to a zero value for the standard deviation. The use of $$\varepsilon$$ alone produces a result close to that produced with a double-pass when the dispersion of angles is small (not crossing the discontinuity), but by construction it is always between 0 and 1. Taking the arcsine then produces the double-pass answer when there are just two equally common angles: in the extreme case of an oscillating wind blowing backwards and forwards, it produces a result of $$\tfrac{\pi}{2}$$ radians, i.e. a right angle. The final factor adjusts this figure upwards so that it produces the double-pass result of $$\tfrac{\pi}{\sqrt{3}}$$ radians for an almost uniform distribution of angles across all directions, while making minimal change to results for small dispersions.

The theoretical maximum error against the correct double-pass σθ is therefore about 15% with an oscillating wind. Comparisons against Monte Carlo generated cases indicate that Yamartino's algorithm is within 2% for more realistic distributions.

A variant might be to weight each wind direction observation by the wind speed at that time.