Skip to content

Point-Stat

Point-Stat is the MET tool you reach for when your “truth” is not a grid but a scattered set of measurements — surface stations, rawinsondes (weather balloons), aircraft, ships, buoys. It interpolates the gridded forecast down to each observation point, forms matched pairs, and then rolls those pairs up into a wide menu of verification statistics across the masking regions, thresholds, and observation types you choose.

Forecast models produce values on a regular grid. Many of the best observations, however, live at irregular points on the map. Point-Stat bridges that mismatch: it “matches gridded forecasts to point observation locations and supports several different interpolation options,” then computes continuous, categorical, and probabilistic statistics from the resulting pairs.

The everyday users are forecast verifiers and model developers who want to know, for example, “How good was my 2 m temperature forecast at the surface stations across the domain?” or “How well did predicted upper-air winds match the rawinsonde network?” Point-Stat answers those questions one observation type at a time, over the regions and thresholds you define.

A handful of terms recur throughout this page:

Gridded forecast — A model field laid out on a regular lattice of grid points — temperature, wind, precipitation, and so on.

Point observation — A measurement taken at a single location (a station, balloon, ship, or aircraft report), not on a grid.

Matched pair — One observed value paired with the forecast value interpolated to that same location and time. Matched pairs are the atoms from which every statistic is built.

Message type — A categorical label (inherited from PrepBUFR) that groups observations by platform — e.g. ADPSFC for surface synoptic, ADPUPA for upper-air.

Point-Stat takes two data inputs plus a configuration file.

Gridded forecast

A GRIB or NetCDF file containing the model field(s) you want to verify. The fcst dictionary in the config selects which fields and levels to read.

Point observations

A MET NetCDF point-observation file. You do not feed raw observations directly — they are first reformatted by PB2NC (PrepBUFR) or ASCII2NC (text). Python embedding for point obs is also supported.

Everything Point-Stat reports flows from a single operation: build matched pairs. For each qualifying observation, the tool interpolates the forecast field to that observation’s location (and, where needed, its vertical level), then stores the pair (forecast value, observed value) together with the station ID, coordinates, level, and the interpolation method used.

Vertical matching is handled before horizontal interpolation. When forecast and observation levels coincide, they pair directly; when they differ, pressure-level forecasts interpolate in the natural log of pressure, and height-above-ground forecasts interpolate linearly in height. Surface forecasts are matched to the observation message types that the configuration maps to the SURFACE group.

Once a population of matched pairs exists for a given field, region, threshold set, and message type, the statistics are simply summaries of that population — means and errors for continuous fields, contingency-table counts for yes/no events, reliability and Brier scores for probabilities, and so on.

How you bring the grid to the point is a real modeling choice. Each method works inside an interpolation width W and a shape (SQUARE or CIRCLE) that together define the neighborhood of grid points around each observation. A width of 1 means “just the nearest grid point”; a width of 2 uses the 2×2 set of points enclosing the observation; a width of 3 uses the 3×3 square of nine points centered on the nearest grid point.

MethodWhat it does
Nearest NeighborAssigns the value of the single closest grid point. No interpolation (W = 1).
BilinearLinear interpolation using the four closest grid squares — i.e. the four grid points surrounding the observation — applied in each of the two dimensions in turn.
Unweighted MeanSimple average of all grid points in the neighborhood; distance is ignored.
Distance-weighted mean (DW_MEAN)Weights are the reciprocal of squared distance in grid coordinates, so closer points count more.
GaussianWeighted sum following a Gaussian distribution; nearby points contribute more weight.
MedianThe median value within the interpolation neighborhood.
Min / MaxThe minimum or the maximum value within the neighborhood.
Least-squares fit (LS_FIT)Fits a plane z = α·x + β·y + γ over the W×W subgrid by least squares, then evaluates it at the observation point.
Corner PointUses the four closest grid squares, interpolating to a chosen corner (upper/lower, left/right).
Geography MatchNearest grid point that also satisfies land/sea-mask and topography criteria.
BestSelects, from the neighborhood, the grid value that most closely matches the observation.
Point-Stat matching and output flow A forecast grid lattice with scattered observation points overlaid; the grid value is interpolated to each point to form matched pairs, which feed into a stack of output line types grouped by family. The families are: raw pairs (MPR, the individual forecast/observation values); continuous error scores (CNT and the SL1L2/VL1L2 partial sums); categorical yes/no event counts and statistics (FHO, CTC, CTS); multi-category counts and statistics for more than two categories (MCTC, MCTS); and probabilistic scores for probability forecasts (PCT, PSTD, PJC, PRC). All are written to the .stat file. FORECAST GRID INTERPOLATE → PAIRS LINE TYPES grid nodes · obs points Interpolate W×W nearest · bilinear · DW_MEAN … grid value → obs location Matched pairs (fcst, obs) per point raw pairs MPR continuous CNT · SL1L2 · VL1L2 categorical FHO · CTC · CTS multi-category MCTC · MCTS probabilistic PCT · PSTD · PJC · PRC → .stat file aggregated per mask · message type · threshold · interpolation
Figure 1. The forecast grid is interpolated to each scattered observation point to form matched pairs; those pairs, grouped by masking region, message type, and threshold, are summarized into the family of ASCII output line types written to the .stat file.

Point-Stat does not compute one number for the whole domain and stop. It slices the matched pairs along three axes, producing a separate set of statistics for each combination.

The mask dictionary restricts which observations contribute to a given region:

  • grid — named grids (e.g. "FULL" for the entire domain).
  • poly — polyline regions defined by lat/lon vertices.
  • sid — explicit lists of station IDs.

Finer station control comes from sid_inc / sid_exc (include or exclude specific stations) and from obs_quality_inc / obs_quality_exc (filter on observation quality flags).

Observations carry a message type, and Point-Stat “performs verification using observations for one message type at a time.” The message_type entry in the obs dictionary lists which to use; message_type_group_map bundles related types into logical groups (by default the surface types map to SURFACE). Common types include ADPSFC (surface synoptic), ADPUPA (upper-air), SFCSHP (ship reports), and MSONET (mesonet).

Categorical verification needs an event definition. cat_thresh applies a threshold (for example, “precipitation ≥ 1 mm”) to both the forecast and the observation, turning each pair into a yes/no outcome that feeds the contingency-table line types. cnt_thresh conditions the continuous statistics on a value range.

Point-Stat writes a single STAT file (point_stat_*…*.stat) holding every requested line type, and — when you ask for it — optional per-type ASCII files (*_TYPE.txt). Each line type is toggled in the output_flag dictionary to NONE, STAT, or BOTH. The table groups the line types by the kind of verification they support.

Line typeWhat it contains
MPRMatched-pair data — the raw (forecast, observation) values per point, with station ID, location, level, the interpolation method/points, applied thresholds, and any climatology values.
FHOForecast, Hit, and Observation rates for a dichotomous (yes/no) event.
CTCContingency Table Counts — the 2×2 cells: hits, false alarms, misses, correct negatives.
CTSContingency Table Statistics derived from the 2×2 table — accuracy, bias, POD (probability of detection), FAR (false alarm ratio), CSI (critical success index), HSS (Heidke skill score), and more — with confidence intervals.
MCTCMulti-category Contingency Table Counts for variables with more than two categories.
MCTSMulti-category Contingency Table Statistics — accuracy, the Hanssen-Kuipers discriminant (true-skill statistic), HSS, and the Gerrity score (which gives more credit for correctly forecasting the rarer categories).
CNTContinuous Statistics — means, standard deviations, correlation, error metrics, and percentiles, with confidence intervals.
SL1L2Scalar L1L2 partial sums — running totals (sums of the forecasts, observations, their products and squares, plus the count) rather than finished scores. L1L2 denotes the first- and second-moment sums. These component sums are what scalar continuous statistics are computed from, and they recombine exactly across runs (see the callout below).
SAL1L2Scalar Anomaly L1L2 partial sums — like SL1L2 but built on anomalies (departures from a climatological baseline). Available only when a climatology is supplied; see climo_mean below.
VL1L2Vector L1L2 partial sums — component sums for vector (wind) continuous statistics.
VAL1L2Vector Anomaly L1L2 partial sums — vector anomaly partial sums against climatology.
VCNTVector Continuous Statistics for wind — speed, direction, and vector-difference metrics.
PCTProbability Contingency Table Counts across probability bins, for probabilistic forecasts.
PSTDProbabilistic Statistics for dichotomous outcomes — reliability, resolution, the Brier score (mean squared error of the probability forecasts), and ROC area (how well the probabilities discriminate events from non-events).
PJCProbabilistic Joint/Conditional factorization — calibration, refinement, and likelihood by probability bin.
PRCProbabilistic ROC points — detection vs. false-detection rates across thresholds.
ECLVEconomic Cost/Loss relative Value across cost/loss ratios.
ECNTEnsemble Continuous Statistics — HiRA only (High Resolution Assessment: the grid points in the neighborhood around an observation are treated as a small ensemble). The neighborhood values are scored as that ensemble.
ORANKEnsemble matched-pair / observation-rank information — HiRA only.
RPSRanked Probability Score — HiRA only.
SEEPSStable Equitable Error in Probability Space — a precipitation score that grades forecasts across dry / light / heavy categories and weights climatologically rarer events more heavily.
SEEPS_MPRSEEPS scores for individual matched pairs.

Point-Stat’s behavior lives almost entirely in its configuration file. The entries below are the ones you touch most often.

fcst / obs — Select the forecast and observation fields, levels, and (in obs) the message_type list. When the two share naming conventions you can write obs = fcst; to copy the forecast settings.

output_flag — One switch per line type — NONE skips the computation entirely, STAT writes to the unified .stat file, and BOTH also emits a separate per-type ASCII file.

interp — The interpolation method, width, shape (SQUARE/CIRCLE), and vld_thresh (the fraction of the neighborhood that must hold valid data).

mask — The verification regions — grid, poly, and sid.

cat_thresh / cnt_thresh — Thresholds that define categorical events and condition continuous statistics.

ci_alpha / boot — Confidence-interval controls. ci_alpha sets the alpha (e.g. 0.05); methods include parametric (normal approximation) and nonparametric bootstrap, which resamples matched pairs with replacement.

regrid — Optional regridding applied before matching.

duplicate_flag / obs_summary — How to handle duplicate observations and how to summarize multiple observations that fall together (NONE, MIN, MAX, MEAN, MEDIAN).

land_mask / topo_mask — Land/sea and topography constraints used by the geography-match interpolation.

climo_mean / climo_stdev / climo_cdf — An external climatology — a long-term average baseline for the field (what is “normal” for this time and place). Supplying it unlocks anomaly statistics (an anomaly is the forecast’s or observation’s departure from that baseline) and skill scores, which measure how much better the forecast does than simply predicting the climatological normal.

hira — Enables the High Resolution Assessment neighborhood method (flag, width, shape, vld_thresh, cov_thresh), producing the ECNT/ORANK/RPS line types.

seeps — Controls the SEEPS precipitation score.

On the command line, Point-Stat is invoked as point_stat fcst_file obs_file config_file plus optional flags such as -outdir, -obs_valid_beg / -obs_valid_end (override the observation time window), -point_obs (add more NetCDF obs files), -log, and -v (verbosity 0–9, default 2).

  1. Reformat the observations. Convert PrepBUFR with PB2NC or text with ASCII2NC into a MET NetCDF point-observation file.
  2. Write the configuration. Set the fcst/obs fields, message_type, mask regions, cat_thresh, interp method/width, and switch on the line types you want in output_flag.
  3. Run Point-Stat. Call point_stat with the forecast file, the NetCDF observation file, and the config, sending results to -outdir.
  4. Read the output. Open the .stat file (or the per-type .txt files). Each row carries header columns plus the statistics for its line type, region, message type, and threshold.
  5. Aggregate & visualize. Pass the .stat output to Stat-Analysis to combine across cases, and on to METviewer / METplotpy for plots.

Point-Stat is one stage in a longer verification pipeline. Its job is to turn forecasts and point observations into matched pairs and statistics; other tools take it from there.

If your “truth” is itself a grid (such as an analysis or a radar mosaic) rather than scattered points, its sibling tool Grid-Stat is the right counterpart — it applies the same statistical machinery to grid-to-grid comparisons.


A derived, human-readable re-presentation — not official documentation. Sources: MET User’s Guide — Point-Stat Tool