Skip to contents

SHAP helpers

shap_conc_decomp

shap <- data.frame(
  education = c(1, 0, -1),
  water = c(0, 1, 1)
)
rank <- c(1, 2, 3)

res <- shap_conc_decomp(
  shap = shap,
  rank = rank,
  baseline = 2
)
res$diagnostics
#>        n weight_sum   type mean_prediction concentration_index
#>    <int>      <num> <char>           <num>               <num>
#> 1:     3          3     CI        2.666667          0.08333333
#>    signed_concentration_index score_direction   shap_sum additivity_gap
#>                         <num>           <num>      <num>          <num>
#> 1:                -0.08333333              -1 0.08333333   1.387779e-17
#>    centered_rank_sum        prediction_source
#>                <num>                   <char>
#> 1:      4.626155e-17 baseline + rowSums(shap)
res$contributions
#>      feature    D_k_SHAP pct_contribution abs_contribution
#>       <char>       <num>            <num>            <num>
#> 1: education  0.16666667              200       0.16666667
#> 2:     water -0.08333333             -100       0.08333333

dalex_like <- data.frame(
  "_id_" = rep(1:3, each = 3),
  "_vname_" = rep(c("_baseline_", "education", "water"), times = 3),
  "_attribution_" = c(2, 1, 0, 2, 0, 1, 2, -1, 1),
  check.names = FALSE
)

shap_conc_decomp(
  shap = dalex_like,
  rank = rank,
  baseline = 2,
  from_dalex = TRUE
)$contributions
#>      feature    D_k_SHAP pct_contribution abs_contribution
#>       <char>       <num>            <num>            <num>
#> 1: education  0.16666667              200       0.16666667
#> 2:     water -0.08333333             -100       0.08333333

fractional_rank

fractional_rank(c(10, 20, 20, 40))
#> [1] 0.125 0.500 0.500 0.875
fractional_rank(c(1, NA, 3), na_rm = TRUE)
#> [1] 0.25 0.75