The algorithm used to check climatological consistency of a forecast is based on conditional probability estimates. The best way to illustrate the idea is to look at Venn's diagrams.

Venn diagram
An event is a subset of an outcome space, that is a set of all possible outcomes of an experiment. An event determined by random variable x is of the form A = {x ∈ A}. When the random variable is observed, that determines whether or not A occurs: if the value of x happens to be in A, A occurs, if not, A does not occur. Probability of an event (i.e. set) is its area, normalized such that the area of the outcome space X is one. Given two events A and B, the conditional probability of A, given B is defined by the formula
P(A | B) = P(A ∩ B) / P(B)
Events A and B are said to be independent if
P(A ∩ B) = P(A) * P(B) ⇔ P(A | B) = P(A)
Disjoint events, such as A and D on the above diagram, are not independent, they are exclusive: if D has happened, than A could not have happened. In this case
P(A ∩ D) = 0 ⇒ P(A | D) = 0.
The other extreme case, where one set contains the other, illustrates dependent events: if B has happened, so must have C.
P(C ∩ B) = P(B) ⇒ P(C | B) = 1.
These relations form the basis of our algorithm: we will claim that the combination of events is unlikely if
P(A ∩ B) < α0 * P(A) * P(B)
or equvalently,
(*) P(A | B) < α0 * P(A)
where α0 is a fixed arbitary value such that 0 < α0 < 1.
The algorithm considers seven weather elements: ceiling, visibility, wind direction and speed, obstruction to vision, precipitation type and intensity. Obstruction to vision can be one of HZ, FG/BR, BLSN/BLSA or None. Precipitation type is one of SN, DZ, RA. Mixed precipitation is coerced to one of these types. Precipitation intensity is None, light, moderate or severe. Continuous elements are categorized: given a sequence of thresholds 0 < τ1 < . . . < τn, the category k is a set
Ak = {v: τk <= v < τk+1}, k = 0, ..., n+1,
with τ0 = 0 and τn+1 = ∞. Wind categories are a special case: instead of adding 0 and ∞ wind direction categories have to be "wrapped" modulo 360 degrees. An additional category is added for calm or light (that is, category 0) winds.
These categories form our outcome space, that is any weather instance can be qualified by a combination of the categories (i.e. events). Denote
| {FFk}k=0,...n1 - set of all wind speed events |
| {DDk}k=0,...n2 - set of all wind direction events |
| {VSBYk}k=0,...n3 - set of all visibility events |
| {CIGk}k=0,...n4 - set of all ceiling events |
| {OBVk}k=0,...n5 - set of all obstruction to vision events |
| {PTYPk}k=0,...n6 - set of all precipitation type events |
| {PINTk}k=0,...n7 - set of all precipitation intensity events |
Let Ai be one of the events on the above list. Define Bi = Ak1 ∩ ... ∩ Ak6, where kj != i. Then Ai ∩ Bi = A1 ∩ ... ∩ A7 By substituting these formulas into (*) we come up with 7 conditional probabilities.
(**) P(Ai | Bi) < α0 * P(Ai), i = 1, ..., 7.
If the above inequality does not hold for some i we flag the corresponding weather element as suspicious.
The algorithm works as follows:
Categorize weather in a TAF period.
Evaluate minimal value αmin such that (**) is true for all i.
If αmin ≥ α0, the forecast is plausible, otherwise continue.
If αmin = 0, none of the historical data matches forecasted weather. The software highlights the forecast in orange. If 0 < αmin < α0, the combination of weather elements is not likely and the forecast highlighted in green.
An attempt is made to suggest more plausible weather: For each of the following elements: wind speed, direction, ceiling, visibility and precipitation intensity, a neighboring category is considered. The probabilities are calculated as above and a corresponding αmin value is calculated. If it is greater or equal to α0, the weather combination is saved on a list.
The list is sorted with respect to α and made available to the forecaster in the TAF Editor window.
The category thresholds and the value of α0 are configurable, see System Administration, the section called “Climate QC Definition File”.
Here is an example of a detailed output:

Detailed Output