[
  {
    "method_id": "observed_source",
    "output_type": "source_observation",
    "formula": "value = published source record value, after explicit admission/null rules",
    "unit": "unchanged source unit",
    "denominator": "unchanged source-defined denominator, if any",
    "aggregation": "none implicit",
    "uncertainty": "source reporting, extraction, revision, and comparability uncertainties; no synthetic probability interval",
    "limit": "Metadata/source-cell traceability is not a new audit of every original workbook/PDF"
  },
  {
    "method_id": "flat_2025_baseline",
    "output_type": "conditional_baseline",
    "formula": "y(2025+h)=y(2025), h=1,...,25",
    "unit": "same as observed series",
    "denominator": "unchanged rate scale; no future population exposure or count conversion implied",
    "aggregation": "none; rates and overlapping strata are not summed",
    "uncertainty": "no fitted probabilistic interval",
    "reference": "https://otexts.com/fpp3/toolbox.html#na%C3%AFve-method",
    "limit": "A legitimate comparison/conditional baseline, not a validated prediction through 2050"
  },
  {
    "method_id": "flat_2025_anchor",
    "output_type": "single_observation_conditional_baseline",
    "formula": "y(2025+h)=the admitted 2025 source value; all earlier history excluded from scenario view",
    "unit": "same as observed series",
    "denominator": "2025 reporting-scope assumption retained",
    "aggregation": "none",
    "uncertainty": "not estimated",
    "limit": "Does not authorize historical joins, trend fitting, or imply geographic comparability"
  },
  {
    "method_id": "fixed_damping_regional_sensitivity",
    "output_type": "parameter_sensitivity",
    "formula": "b=[ln(1+y2025)-ln(1+y2023)]/2; y(2025+h)=exp(ln(1+y2025)+b*phi*(1-phi^h)/(1-phi))-1, phi in {0.6,0.8,0.95}; constant option y2025. Negative/nonfinite or future-withheld values remain null.",
    "unit": "source unit; log1p offset of 1 is in that source scale and is not unit-invariant",
    "denominator": "rates preserved; no case-number derivation",
    "aggregation": "none",
    "uncertainty": "alternative assumptions, never confidence/probability bands",
    "limit": "Damping choices fixed, no statistical estimation or independent validation of trend"
  },
  {
    "method_id": "model_transform",
    "output_type": "model_scale",
    "formula": "z_t=ln(y_t) for strictly positive NCD, births, deaths, population; z_t=y_t for signed migration; reverse by exp(z) or identity",
    "unit": "original scale returned",
    "limit": "No pseudocount/clipping for log models. exp of transformed central path is not arithmetic expectation under log-Gaussian uncertainty"
  },
  {
    "method_id": "last_value",
    "output_type": "conditional_fitted_model_projection",
    "formula": "z_hat(T+h)=z(T); simulated z(T+h)=z(T)+sum(epsilon_j), epsilon~N(0,sigma²), sigma²=mean(diff(z)²)",
    "unit": "inverse transformed original unit",
    "parameters": "training-only innovation RMS; 2048 future paths, 512 retrospective paths; deterministic seeds",
    "reference": "https://otexts.com/fpp3/toolbox.html",
    "limit": "Point path is last value; interval requires random-walk Gaussian-innovation assumptions and omits parameter/source-regime uncertainty"
  },
  {
    "method_id": "holt_damped",
    "output_type": "conditional_fitted_model_projection",
    "formula": "prediction=l_prev+phi*b_prev; l=alpha*z+(1-alpha)*prediction; b=beta*(l-l_prev)+(1-beta)*phi*b_prev; future=l_T+b_T*sum(phi^j,j=1..h)",
    "parameters": "alpha∈{.2,.5,.8}; beta∈{.1,.3}; phi∈{.8,.95}; min training innovation MSE after first 2 values; initial l=z0, b=z1-z0",
    "simulation": "same innovations-state recurrence, fixed fitted parameters",
    "reference": "https://otexts.com/fpp3/exponential-smoothing.html",
    "limit": "Small fixed grid and initialization are implementation choices, not causal disease model"
  },
  {
    "method_id": "ar1_stationary",
    "output_type": "conditional_fitted_model_projection",
    "formula": "z_t=c+phi*z_(t-1)+epsilon_t; phi=clip(OLS lag coefficient,-.98,.98); c=mean(z1..T)-phi*mean(z0..T-1)",
    "parameters": "training OLS; residual RMS; fixed constrained phi in projection",
    "simulation": "Gaussian-innovation recursion, then inverse transform",
    "reference": "https://otexts.com/fpp3/arima.html",
    "limit": "Stationarity is imposed as conditional assumption, not empirically established structural stability through 2050"
  },
  {
    "method_id": "selected_strategy",
    "output_type": "training_only_model_selection",
    "formula": "Evaluate one-step rolling-origin MAE using prefixes of at least 6 observations. At least 4 completed inner errors required. Select lowest-MAE complex candidate only if MAE≤0.9*MAE_last; otherwise last_value.",
    "limit": "10% threshold is fixed engineering rule, not statistical significance. For NCD h5, only one outer origin exists and selector was naive there; no complex-model h5 superiority is established"
  },
  {
    "method_id": "nominal_intervals",
    "output_type": "conditional_nominal_model_interval",
    "formula": "80%=[q.10,q.90];95%=[q.025,q.975] of simulated conditional original-scale paths",
    "parameters": "2048 future /512 outer paths; model fitted once per origin",
    "limit": "Nominal probability only under fitted model assumptions. Fixed parameters, no full source-regime/policy uncertainty; not proven 2050 coverage"
  },
  {
    "method_id": "past_error_intervals",
    "output_type": "descriptive_past_error_adjusted_envelope",
    "formula": "r=max(point-lo80,hi80-point); score_i=abs(error_i)/r_i; m completed same-chain/method/horizon errors with target≤origin; k=ceil((m+1)*L); q=ordered score[k]; bounds=point±q*r. Nonnegative support intersects lower bound at 0. If k>m or scale unsupported, null.",
    "limit": "Dependent, post-hoc retrospective diagnosis; not an exchangeability or future-coverage guarantee. Available horizons 1/3/5 only"
  },
  {
    "method_id": "coherent_demography",
    "output_type": "conditional_accounting_projection",
    "formula": "For region r, P_end(r,t)=P_start(r,t)+B(r,t)-D(r,t)+E(r,t)+I*(r,t); P_start(r,t+1)=P_end(r,t); I*=I_raw-w_r*sum_r(I_raw), w_r=P_obs(r,Jan2026)/sum_r(P_obs); country=sum of 20 disjoint regions, pathwise and central.",
    "unit": "persons; births/deaths are annual flows; migration signed annual net; P stocks on Jan1",
    "denominator": "none for direct count flows; population used only as reconciliation weight",
    "initial_condition": "Observed 1 January 2026; flow 2050 ending stock is 1 January 2051",
    "statistical_adjustment_assumption": "Future unmodeled statistical adjustment term=0; historical residuals retained separately, not assigned to migration",
    "joint_uncertainty": "Training residual correlation shrunk 50% toward identity, joint Gaussian innovations; negative population paths are not discarded and affected intervals are withheld",
    "reference": "https://otexts.com/fpp3/hierarchical-forecasting.html",
    "limit": "Aggregate accounting model, not age/sex cohort-component model; sum of regional central paths is not necessarily mean/median of national predictive distribution; marginal interval limits do not add"
  },
  {
    "method_id": "oncology_denominator_diagnostic",
    "output_type": "compatibility_check_not_conversion_authority",
    "formula": "Implied exposure=100000*C/R; rounding-compatible exposure range uses R±0.5*10^(-published_decimals). Compare Pbar=(P_Jan(t)+P_Jan(t+1))/2.",
    "limit": "Arithmetic compatibility is not clinical population equivalence. Does not authorize deriving future people/cases from rates"
  },
  {
    "method_id": "mae",
    "output_type": "validation_metric",
    "formula": "mean(abs(prediction-actual)) over completed same-series/model/horizon outer folds",
    "unit": "same as source indicator",
    "aggregation": "only comparable errors; no pooled cross-unit scale"
  },
  {
    "method_id": "rmse",
    "output_type": "validation_metric",
    "formula": "sqrt(mean((prediction-actual)^2)) over completed same-series/model/horizon outer folds",
    "unit": "same as source indicator"
  },
  {
    "method_id": "mase",
    "output_type": "validation_metric",
    "formula": "mean(abs(error)/mean(abs(diff(training_values)))) across eligible outer folds, each fold uses its own training-only scale; undefined if scale=0",
    "unit": "dimensionless"
  },
  {
    "method_id": "interval_coverage",
    "output_type": "descriptive_validation_metric",
    "formula": "mean(1{lower≤actual≤upper}) over folds with available bounds; denominator must be number of eligible interval folds",
    "unit": "fraction or percent",
    "limit": "Dependent overlapping folds/strata; not an independent binomial probability guarantee"
  },
  {
    "method_id": "map_scale",
    "output_type": "visual_encoding",
    "formula": "Five relative colour bins using observed min/max among available 20-region values for the selected year and demographic slice",
    "unit": "same selected variable; not a risk index",
    "aggregation": "national values never distributed across regions",
    "limit": "Scale changes by year; raw rates and counts do not establish age-adjusted risk rankings"
  }
]