The r4subscore
package computes the Submission Confidence Index (SCI),
a composite 0-100 score summarising submission readiness across four
pillars: quality, trace, risk, and usability.
sci_config_default() returns the pillar weights and
decision-band thresholds:
cfg <- sci_config_default()
cfg$pillar_weights
#> quality trace risk usability
#> 0.35 0.25 0.25 0.15
cfg$bands
#> $ready
#> [1] 85 100
#>
#> $minor_gaps
#> [1] 70 84
#>
#> $conditional
#> [1] 50 69
#>
#> $high_risk
#> [1] 0 49The default weights are: quality 35%, trace 25%, risk 25%, usability 15%.
| Band | SCI range | Meaning |
|---|---|---|
ready |
85-100 | Submission ready |
minor_gaps |
70-84 | Minor gaps to address |
conditional |
50-69 | Conditional — significant work needed |
high_risk |
0-49 | High risk — submission not advised |
ev <- data.frame(
run_id = "run-001",
study_id = "STUDY01",
asset_type = "dataset",
asset_id = rep(c("ADSL", "ADAE"), each = 6),
source_name = "r4subcore",
source_version = "0.1.2",
indicator_id = paste0("X-00", 1:12),
indicator_name = paste0("Indicator ", 1:12),
indicator_domain = rep(c("quality", "trace", "risk", "usability",
"quality", "trace"), 2),
severity = "info",
result = c("pass", "pass", "pass", "pass", "pass", "pass",
"warn", "pass", "fail", "pass", "pass", "warn"),
metric_value = c(1, 1, 1, 1, 1, 1, 0.8, 1, 0, 1, 1, 0.9),
metric_unit = "score",
message = paste0("Indicator ", 1:12, " result"),
location = rep(c("ADSL", "ADAE"), each = 6),
evidence_payload = "{}",
created_at = Sys.time(),
stringsAsFactors = FALSE
)compute_pillar_scores() aggregates the mean metric value
per domain:
sci_explain() returns a breakdown showing each pillar’s
contribution to the final SCI and any score loss:
sci_sensitivity_analysis() evaluates the SCI across a
grid of alternative pillar weights, useful for understanding how robust
the score is to weighting choices:
grid <- data.frame(
quality = c(0.35, 0.50, 0.25),
trace = c(0.25, 0.20, 0.30),
risk = c(0.25, 0.20, 0.25),
usability = c(0.15, 0.10, 0.20)
)
sa <- sci_sensitivity_analysis(ev, weight_grid = grid)
sa
#> # A tibble: 3 × 7
#> scenario quality trace risk usability SCI band
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 1 0.35 0.25 0.25 0.15 80 minor_gaps
#> 2 2 0.5 0.2 0.2 0.1 81.2 minor_gaps
#> 3 3 0.25 0.3 0.25 0.2 80.6 minor_gapsPass a custom config to favour particular pillars: