External validation and transportability reporting

Development workflow

development <- simulate_gazepoint_governed_data(18L, 6L, 1L, seed = 2901L)
predictors <- c("tracking_ratio", "blink_rate", "gaze_dispersion")
task <- create_gazepoint_synthetic_task(development, "recording_quality", "new_participants")
manifest <- create_gazepoint_synthetic_manifest(task$outcome, predictors)
folds <- create_gazepoint_group_folds(
  development, task$outcome, predictors, manifest,
  task$generalization_target,
  "participant_id", "trial_id", "stimulus_id",
  v = 3L, repeats = 1L, seed = 2901L
)
development_evaluation <- evaluate_gazepoint_group_folds(
  folds, task, predictors, "glm", seed = 2901L,
  assess_calibration = TRUE, calibration_bootstrap = 0L
)
model <- fit_gazepoint_model(
  development, task, predictors, "glm", seed = 2901L
)

Explicit independent external dataset

external <- simulate_gazepoint_governed_data(10L, 6L, 1L, seed = 2902L)
external$participant_id <- paste0("E", external$participant_id)
external$trial_id <- paste0("E", external$trial_id)
external$stimulus_id <- paste0("E", external$stimulus_id)
declaration <- declare_gazepoint_external_dataset(
  external,
  label = "synthetic_external_site",
  independent = TRUE,
  origin = "Independent deterministic synthetic generation"
)
report <- evaluate_gazepoint_external_transportability(
  model,
  development_data = development,
  external_data = external,
  declaration = declaration,
  development_evaluation = development_evaluation,
  bootstrap = 0L,
  seed = 2902L
)
report
#> <gp3ml_transportability_report>
#>   Status: externally_validated
#>   Reason: The explicitly independent dataset passed schema and identifier-overlap gates.
#>                       metric development_estimate external_estimate
#>                     accuracy           0.87037037         0.8833333
#>            balanced_accuracy           0.49425287         0.5000000
#>                  sensitivity           0.00000000         0.0000000
#>                  specificity           0.98850575         1.0000000
#>                    precision           0.00000000                NA
#>                       recall           0.00000000         0.0000000
#>                           f1                  NaN                NA
#>                          mcc          -0.08304548                NA
#>                      roc_auc           0.57340641         0.7277628
#>                       pr_auc           0.30964591         0.3291055
#>                        brier           0.11055175         0.0956074
#>                     log_loss           0.39533485         0.3260348
#>                          ece           0.11646202                NA
#>    calibration_intercept_abs           3.23095109                NA
#>  calibration_slope_abs_error           1.47811645                NA
#>    difference
#>   0.012962963
#>   0.005747126
#>   0.000000000
#>   0.011494253
#>            NA
#>   0.000000000
#>            NA
#>            NA
#>   0.154356393
#>   0.019459639
#>  -0.014944353
#>  -0.069300020
#>            NA
#>            NA
#>            NA
report$performance_comparison
#>                         metric development_estimate external_estimate
#> 1                     accuracy           0.87037037         0.8833333
#> 2            balanced_accuracy           0.49425287         0.5000000
#> 3                  sensitivity           0.00000000         0.0000000
#> 4                  specificity           0.98850575         1.0000000
#> 5                    precision           0.00000000                NA
#> 6                       recall           0.00000000         0.0000000
#> 7                           f1                  NaN                NA
#> 8                          mcc          -0.08304548                NA
#> 9                      roc_auc           0.57340641         0.7277628
#> 10                      pr_auc           0.30964591         0.3291055
#> 11                       brier           0.11055175         0.0956074
#> 12                    log_loss           0.39533485         0.3260348
#> 13                         ece           0.11646202                NA
#> 14   calibration_intercept_abs           3.23095109                NA
#> 15 calibration_slope_abs_error           1.47811645                NA
#>      difference
#> 1   0.012962963
#> 2   0.005747126
#> 3   0.000000000
#> 4   0.011494253
#> 5            NA
#> 6   0.000000000
#> 7            NA
#> 8            NA
#> 9   0.154356393
#> 10  0.019459639
#> 11 -0.014944353
#> 12 -0.069300020
#> 13           NA
#> 14           NA
#> 15           NA
report$group_coverage
#>          unit     identifier development_groups external_groups
#> 1 participant participant_id                 18              10
#> 2    stimulus    stimulus_id                  6               6
#>   overlapping_groups external_novel_groups external_coverage_prop status
#> 1                  0                    10                      1   pass
#> 2                  0                     6                      1   pass

Explicit absence of external validation

not_validated <- evaluate_gazepoint_external_transportability(
  model,
  development_data = development,
  external_data = NULL
)
not_validated
#> <gp3ml_transportability_report>
#>   Status: not_externally_validated
#>   Reason: No independent external dataset was supplied.

An internal holdout is never renamed external validation. The external result is specific to the declared dataset and context.

mirror server hosted at Truenetwork, Russian Federation.