Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

03c — Step 3: robustness checks (Colombia)

LifeWatch ERIC

Every variant reuses the step-2 samples (same training draw, same validation set, same prediction grid) and the step-2 random-forest settings. Each is compared with the step-2 baseline.

  • (a) Land cover before the outcome period. Train with ESA CCI 1992 or 1999 instead of 2000 (Evaluator 1: use predictors observed before 2000). Prediction still uses 2015 land cover, as in the paper.

  • (b) Spatial validation. 5-fold cross-validation on the training pool, random folds vs folds grouped by HEALPix cell (WGS84) at depths 6, 7, 8 (~110, ~55, ~27 km). Accuracy of the step-2 model on the validation set by distance to the nearest training point (0.5 km bins, as in the paper).

  • (c) Variable selection as in the paper, with and without the three predictors recorded during the outcome period (NPP 2000–2015, burned area 2001–2017, road density from GRIP4): rank by permutation mean decrease in accuracy over 10 balanced fits, then add variables one at a time.

  • (d) Gradient boosting (HistGradientBoostingClassifier, native categorical splits) on the step-2 predictors.

  • (e) Climate-source SENSITIVITY check (not a fix): bioclim PC1–PC4 from CHELSA v2.1 (1981–2010) instead of WorldClim v2.1 (1970–2000), same PCA procedure and sample points (02_data_clean). CHELSA’s period overlaps the 2000–2012 outcome period.

Areas use exact WGS84 pixel areas on the 1-in-100 grid; calibrated areas use the step-2 prior-shift correction with the same prevalence π.

variants: abc | smoke: False
151980 pool; 39522 train; 123356 validation; pi = 0.016444001176786186

Baseline (step 2) and (a) pre-2000 land cover

The baseline row is refitted in both rules so each output table is self-contained.

{'variant': 'baseline_step2', 'n_vars': 10, 'n_train': 39522, 'n_val': 123356, 'oob_accuracy': 0.8844, 'validation_accuracy': 0.8867, 'expected_uncal_mha': np.float64(3.9887), 'expected_prior_mha': np.float64(0.1883), 'gt05_uncal_mha': np.float64(2.0259), 'gt05_prior_mha': np.float64(0.0286), 'grid_coverage': 0.9951, 'pearson_vs_authors_pct': 0.6782, 'kappa_vs_authors_bin': 0.1119, 'note': 'final 10-variable model, LC 2000'}
{'variant': 'a_landcover_1992', 'n_vars': 10, 'n_train': 39522, 'n_val': 123356, 'oob_accuracy': 0.8856, 'validation_accuracy': 0.8865, 'expected_uncal_mha': np.float64(3.9852), 'expected_prior_mha': np.float64(0.1872), 'gt05_uncal_mha': np.float64(2.0192), 'gt05_prior_mha': np.float64(0.0271), 'grid_coverage': 0.9951, 'pearson_vs_authors_pct': 0.6788, 'kappa_vs_authors_bin': 0.1114, 'note': 'ESA CCI 1992 instead of 2000 for training'}
{'variant': 'a_landcover_1999', 'n_vars': 10, 'n_train': 39522, 'n_val': 123356, 'oob_accuracy': 0.8859, 'validation_accuracy': 0.8868, 'expected_uncal_mha': np.float64(3.9888), 'expected_prior_mha': np.float64(0.1875), 'gt05_uncal_mha': np.float64(2.0256), 'gt05_prior_mha': np.float64(0.0269), 'grid_coverage': 0.9951, 'pearson_vs_authors_pct': 0.6782, 'kappa_vs_authors_bin': 0.1118, 'note': 'ESA CCI 1999 instead of 2000 for training'}

(d) Gradient boosting and (e) CHELSA climate sensitivity (optional rule, VARIANTS=de)

(b) Random vs spatially blocked cross-validation (HEALPix, WGS84)

Main rule: step-2 variable set. Optional rule: CHELSA variant (e).

{'variables': 'baseline_step2', 'scheme': 'random', 'mean_accuracy': np.float64(0.8866100802737202), 'sd': np.float64(0.0012736655622142049), 'folds': '0.8885 0.8871 0.8856 0.8854 0.8864'}
{'variables': 'baseline_step2', 'scheme': 'healpix_d6', 'mean_accuracy': np.float64(0.8538238025590899), 'sd': np.float64(0.03631765639121536), 'folds': '0.8177 0.8251 0.8421 0.8980 0.8862'}
{'variables': 'baseline_step2', 'scheme': 'healpix_d7', 'mean_accuracy': np.float64(0.8640413212264771), 'sd': np.float64(0.026135875843856918), 'folds': '0.8915 0.8360 0.8672 0.8385 0.8870'}
{'variables': 'baseline_step2', 'scheme': 'healpix_d8', 'mean_accuracy': np.float64(0.8685550730359258), 'sd': np.float64(0.01699018727589654), 'folds': '0.8621 0.8765 0.8563 0.8945 0.8535'}

Accuracy of the step-2 model on the validation set by distance to the nearest training point (great-circle distance via 3-D chord on the WGS84 ellipsoid).

       bin     n  accuracy  share_regrowth
0.0-0.5 km 33233  0.893239        0.850721
0.5-1.0 km 24121  0.879027        0.530119
1.0-1.5 km 20335  0.880600        0.368330
1.5-2.0 km 15390  0.886810        0.307732
2.0-2.5 km 10479  0.894742        0.268919
2.5-3.0 km  6844  0.888515        0.262566
3.0-3.5 km  4092  0.896872        0.254643
3.5-4.0 km  2553  0.886800        0.269095
4.0-4.5 km  1611  0.891372        0.257604
4.5-5.0 km  1176  0.881803        0.312075
5.0-5.5 km   782  0.915601        0.310742
5.5-6.0 km   561  0.910873        0.295900
6.0-6.5 km   415  0.910843        0.284337
6.5-7.0 km   322  0.894410        0.285714
7.0-7.5 km   226  0.902655        0.398230
7.5-8.0 km   187  0.860963        0.508021
   >8.0 km  1029  0.790087        0.449951

(c) Variable selection as in the paper, with and without NPP, burned area, roads

A predictor that is entirely missing (e.g. burned area if neither GlobFire nor MCD64A1 could be fetched) is dropped from the candidate list and reported.

candidates dropped for missing data: []
151642 pool records with all candidates; 123111 validation
with_npp_burned_roads ranking: ['dist_forest_2000', 'forest_density_2000', 'phihox', 'ocdens', 'pc3', 'pc4', 'cropland_density_2000', 'pc1', 'pc2', 'npp', 'road_density', 'dist_urban_2000', 'pc5', 'lc_2000', 'slope', 'biome', 'burned_frac'] | selected k = 14
without_npp_burned_roads ranking: ['dist_forest_2000', 'forest_density_2000', 'phihox', 'pc3', 'ocdens', 'pc1', 'pc4', 'pc2', 'cropland_density_2000', 'dist_urban_2000', 'pc5', 'lc_2000', 'biome', 'slope'] | selected k = 12
{'variant': 'c_selected_with_during_vars', 'n_vars': 14, 'n_train': 39435, 'n_val': 123111, 'oob_accuracy': 0.8972, 'validation_accuracy': 0.8965, 'expected_uncal_mha': np.float64(3.8888), 'expected_prior_mha': np.float64(0.1548), 'gt05_uncal_mha': np.float64(1.7591), 'gt05_prior_mha': np.float64(0.0096), 'grid_coverage': 0.9929, 'pearson_vs_authors_pct': 0.6686, 'kappa_vs_authors_bin': 0.0924, 'note': "selection incl. ['npp', 'burned_frac', 'road_density']; dropped []"}
{'variant': 'c_selected_without_during_vars', 'n_vars': 12, 'n_train': 39522, 'n_val': 123356, 'oob_accuracy': 0.8927, 'validation_accuracy': 0.8929, 'expected_uncal_mha': np.float64(3.8931), 'expected_prior_mha': np.float64(0.1539), 'gt05_uncal_mha': np.float64(1.839), 'gt05_prior_mha': np.float64(0.0085), 'grid_coverage': 0.9951, 'pearson_vs_authors_pct': 0.6708, 'kappa_vs_authors_bin': 0.0986, 'note': 'selection excl. NPP, burned area, roads'}
{'variant': 'c_all_candidates', 'n_vars': 17, 'n_train': 39435, 'n_val': 123111, 'oob_accuracy': 0.8955, 'validation_accuracy': 0.8956, 'expected_uncal_mha': np.float64(3.8848), 'expected_prior_mha': np.float64(0.1546), 'gt05_uncal_mha': np.float64(1.7606), 'gt05_prior_mha': np.float64(0.0098), 'grid_coverage': 0.9929, 'pearson_vs_authors_pct': 0.6667, 'kappa_vs_authors_bin': 0.0922, 'note': 'all 17 candidates'}
{'variant': 'c_all_candidates_without_during_vars', 'n_vars': 14, 'n_train': 39522, 'n_val': 123356, 'oob_accuracy': 0.8922, 'validation_accuracy': 0.8927, 'expected_uncal_mha': np.float64(3.9322), 'expected_prior_mha': np.float64(0.1564), 'gt05_uncal_mha': np.float64(1.852), 'gt05_prior_mha': np.float64(0.0096), 'grid_coverage': 0.9951, 'pearson_vs_authors_pct': 0.6753, 'kappa_vs_authors_bin': 0.099, 'note': '14 candidates'}
                             variant  n_vars  n_train  n_val  oob_accuracy  validation_accuracy  expected_uncal_mha  expected_prior_mha  gt05_uncal_mha  gt05_prior_mha  grid_coverage  pearson_vs_authors_pct  kappa_vs_authors_bin                                                               note
                      baseline_step2      10    39522 123356        0.8844               0.8867              3.9887              0.1883          2.0259          0.0286         0.9951                  0.6782                0.1119                                   final 10-variable model, LC 2000
                    a_landcover_1992      10    39522 123356        0.8856               0.8865              3.9852              0.1872          2.0192          0.0271         0.9951                  0.6788                0.1114                          ESA CCI 1992 instead of 2000 for training
                    a_landcover_1999      10    39522 123356        0.8859               0.8868              3.9888              0.1875          2.0256          0.0269         0.9951                  0.6782                0.1118                          ESA CCI 1999 instead of 2000 for training
         c_selected_with_during_vars      14    39435 123111        0.8972               0.8965              3.8888              0.1548          1.7591          0.0096         0.9929                  0.6686                0.0924 selection incl. ['npp', 'burned_frac', 'road_density']; dropped []
      c_selected_without_during_vars      12    39522 123356        0.8927               0.8929              3.8931              0.1539          1.8390          0.0085         0.9951                  0.6708                0.0986                            selection excl. NPP, burned area, roads
                    c_all_candidates      17    39435 123111        0.8955               0.8956              3.8848              0.1546          1.7606          0.0098         0.9929                  0.6667                0.0922                                                  all 17 candidates
c_all_candidates_without_during_vars      14    39522 123356        0.8922               0.8927              3.9322              0.1564          1.8520          0.0096         0.9951                  0.6753                0.0990                                                      14 candidates
<Figure size 1300x450 with 2 Axes>