The Operational Value of Spatial Dependence in Renewable Forecast Scenarios for Single-Period Economic Dispatch: A Controlled Ablation Study
Organizations: Electric Power Research Institute (EPRI), Charlotte, NC, USA
Abstract
Renewable forecasts are evaluated by statistical skill (e.g., CRPS), but grid operators pay for realized dispatch cost. We diagnose what drives dispatch value in a single-period newsvendor-style economic dispatch using real public data from two European transmission systems (CWE, DE-4TSO). Spatial coherence across forecast sites falls below the pre-specified 1% practical-significance threshold: a controlled ablation holding per-zone marginal forecasts bit-identical and varying only cross-zone dependence (10 configurations, 3 seeds, paired-bootstrap confidence intervals) shows a coherence gain of at most 0.64% of dispatch cost, indistinguishable from zero in 3 of 10 configurations, reached only under an unrealistic 8-fold forecast-error stress test. Decision-focused training, an established paradigm in this venue, delivers a robust 2.82-5.19% gain. A parametric Gaussian-copula approximation matches the empirical copula at realistic error magnitudes but performs worse than no dependence under extreme stress. A single-seed sweep shows that a 12% energy-score gain changes cost by less than 0.1%. Results characterize this single-period dispatch class; a lightweight four-period extension supports the same conclusion. For this dispatch class, spatially-correlated scenario generation provides limited operational value on its own; grid operators and forecast vendors should instead evaluate dependence models by downstream decision value and prioritize decision-focused training.
Figures & tables
| Dimension | This work (C1 + Experiment B) | Zhou et al. (2026) |
|---|---|---|
| Grid | CWE 9-zone (real European TSO zones, real OPSD data) / DE-4TSO 4-zone | IEEE 14-bus (11 load buses), real Southern-China load data, proportionally rescaled for feasibility |
| Dispatch formulation | Single-period newsvendor-style QP: schedule chosen once, then curtailment/shortage penalties only. No commitment, no reserves, no ramp limits, no DC power flow | Two-stage day-ahead (DA) schedule + reserve capacities, then real-time (RT) recourse redispatch using procured reserves, ramp-limited, DC power flow with line limits |
| Forecast horizon | (single hour-ahead, persistence-based marginal forecast) | Day-ahead (multi-hour, h) with hourly RT recourse |
| Risk framework | Stochastic average cost over an empirical-residual scenario ensemble | Distributionally robust optimization (DRO) over an ambiguity set around the generated scenario distribution |
| Price/penalty structure | Newsvendor critical ratios: shortage price (80 default, tested to 160), curtailment cost 200, value of lost load 3000 | Reserve deployment costs ( ) plus load-shed/curtailment penalties ( ); no single VOLL-style ratio reported |
| Correlation manipulation | Experiment B: per-zone marginals held bit-identical by construction (within-column permutation of empirical residuals); only the dependence structure (copula) varies between the two arms | “Separate” vs. “Joint” forecasting: a different generative model architecture is trained in each setting; per-zone marginal accuracy is not held identical between the two arms |
Appendix figures & tables1 asset
Supplementary material from the paper’s appendix.
Appendix
| Claim | Loc. | Source file(s) |
|---|---|---|
| 10-config coherence-gain forest plot, pooled + per-seed | R-coh | expB_corr_only_s{0,1,2}_*.json and matching *_percost.npy |
| Curtailment identical to pp across copula arms | R-coh | expB_corr_only_s{0,1,2}_*.json ( curt_real_pct , curt_indep_pct ; worst case s1_pen3.0_rs2.0_noclip.json) |
| C2 skill-value gap: energy score 4.41 3.87, cost 792.6-793.3 across | R-skill | cost_s0_lam{0.0,0.05,0.1,0.3,1.0}_k1.0.json |
| C1 penetration scaling: 3.31% (1.0 ), 4.93% (1.5 ), 5.19% (2.0 ) | R-c1 | {crps,cost}_s{0,1,2}_lam0.1_k1.0_cwe.json/.npy (1.0 ); .._cwe_pen15_uncap.json/.npy (1.5 ); .._cwe_pen20_uncap.json/.npy (2.0 ) |
| Price asymmetry: 3.31% 2.76% at 80 160 | R-c1 | {crps,cost}_s{0,1,2}_lam0.1_k1.0_cwe_asym.json/.npy |
| Joint S2 S3 robustness: 4 corners, baseline/pen-only/price-only/JOINT | R-c1 | {crps,cost}_s{0,1,2}lam0.1_k1.0{cwe,cwe_pen20_uncap,cwe_asym,cwe_joint}.json/.npy |