Perturbation Grids for FDA Selection

fit_perturbation_grid() estimates the two-parameter selection surface indexed by a subject subsampling rate q and a SelectBoost perturbation strength c0.

library(SelectBoost.FDA)

sim <- simulate_fda_scenario(
  n = 18,
  grid_length = 10,
  include_scalar = FALSE,
  seed = 1
)

grid_fit <- fit_perturbation_grid(
  sim$design,
  q_grid = c(0.6, 0.8),
  c0_grid = c(0.7, 0.4),
  B = 1,
  selectboost_B = 1,
  selector = "msgps",
  association_method = "hybrid",
  bandwidth = 3,
  levels = c("feature", "group"),
  seed = 2
)

grid_fit
#> FDA perturbation grid
#>   q values: 2 
#>   c0 values: 2 
#>   row replicates: 1 
#>   surface rows: 88 
#>   warnings: 0
head(selection_surface(grid_fit))
#>                                           feature predictor    group   level
#> nuisance.group.0.6.0.4.selectboost       nuisance  nuisance nuisance   group
#> nuisance.group.0.6.0.7.selectboost       nuisance  nuisance nuisance   group
#> nuisance.group.0.8.0.4.selectboost       nuisance  nuisance nuisance   group
#> nuisance.group.0.8.0.7.selectboost       nuisance  nuisance nuisance   group
#> nuisance_1.feature.0.6.0.4.selectboost nuisance_1  nuisance nuisance feature
#> nuisance_1.feature.0.6.0.7.selectboost nuisance_1  nuisance nuisance feature
#>                                          q  c0 selection mean_selection
#> nuisance.group.0.6.0.4.selectboost     0.6 0.4       0.4            0.4
#> nuisance.group.0.6.0.7.selectboost     0.6 0.7       0.3            0.3
#> nuisance.group.0.8.0.4.selectboost     0.8 0.4       0.5            0.5
#> nuisance.group.0.8.0.7.selectboost     0.8 0.7       0.2            0.2
#> nuisance_1.feature.0.6.0.4.selectboost 0.6 0.4       0.0            0.0
#> nuisance_1.feature.0.6.0.7.selectboost 0.6 0.7       0.0            0.0
#>                                        max_selection selected representation
#> nuisance.group.0.6.0.4.selectboost                 1     TRUE           grid
#> nuisance.group.0.6.0.7.selectboost                 1     TRUE           grid
#> nuisance.group.0.8.0.4.selectboost                 1     TRUE           grid
#> nuisance.group.0.8.0.7.selectboost                 1     TRUE           grid
#> nuisance_1.feature.0.6.0.4.selectboost             0    FALSE           grid
#> nuisance_1.feature.0.6.0.7.selectboost             0    FALSE           grid
#>                                        basis_type source_representation
#> nuisance.group.0.6.0.4.selectboost                                 grid
#> nuisance.group.0.6.0.7.selectboost                                 grid
#> nuisance.group.0.8.0.4.selectboost                                 grid
#> nuisance.group.0.8.0.7.selectboost                                 grid
#> nuisance_1.feature.0.6.0.4.selectboost       <NA>                  grid
#> nuisance_1.feature.0.6.0.7.selectboost       <NA>                  grid
#>                                        start_position end_position start_argval
#> nuisance.group.0.6.0.4.selectboost                  1           10            0
#> nuisance.group.0.6.0.7.selectboost                  1           10            0
#> nuisance.group.0.8.0.4.selectboost                  1           10            0
#> nuisance.group.0.8.0.7.selectboost                  1           10            0
#> nuisance_1.feature.0.6.0.4.selectboost              1            1            0
#> nuisance_1.feature.0.6.0.7.selectboost              1            1            0
#>                                        end_argval domain_start domain_end
#> nuisance.group.0.6.0.4.selectboost              1            0          1
#> nuisance.group.0.6.0.7.selectboost              1            0          1
#> nuisance.group.0.8.0.4.selectboost              1            0          1
#> nuisance.group.0.8.0.7.selectboost              1            0          1
#> nuisance_1.feature.0.6.0.4.selectboost          0            0          0
#> nuisance_1.feature.0.6.0.7.selectboost          0            0          0
#>                                             method    block position argval
#> nuisance.group.0.6.0.4.selectboost     selectboost     <NA>       NA   <NA>
#> nuisance.group.0.6.0.7.selectboost     selectboost     <NA>       NA   <NA>
#> nuisance.group.0.8.0.4.selectboost     selectboost     <NA>       NA   <NA>
#> nuisance.group.0.8.0.7.selectboost     selectboost     <NA>       NA   <NA>
#> nuisance_1.feature.0.6.0.4.selectboost selectboost nuisance        1      0
#> nuisance_1.feature.0.6.0.7.selectboost selectboost nuisance        1      0
#>                                        transform source_predictor
#> nuisance.group.0.6.0.4.selectboost          <NA>             <NA>
#> nuisance.group.0.6.0.7.selectboost          <NA>             <NA>
#> nuisance.group.0.8.0.4.selectboost          <NA>             <NA>
#> nuisance.group.0.8.0.7.selectboost          <NA>             <NA>
#> nuisance_1.feature.0.6.0.4.selectboost  identity         nuisance
#> nuisance_1.feature.0.6.0.7.selectboost  identity         nuisance
#>                                        source_position_start
#> nuisance.group.0.6.0.4.selectboost                        NA
#> nuisance.group.0.6.0.7.selectboost                        NA
#> nuisance.group.0.8.0.4.selectboost                        NA
#> nuisance.group.0.8.0.7.selectboost                        NA
#> nuisance_1.feature.0.6.0.4.selectboost                     1
#> nuisance_1.feature.0.6.0.7.selectboost                     1
#>                                        source_position_end source_argval_start
#> nuisance.group.0.6.0.4.selectboost                      NA                <NA>
#> nuisance.group.0.6.0.7.selectboost                      NA                <NA>
#> nuisance.group.0.8.0.4.selectboost                      NA                <NA>
#> nuisance.group.0.8.0.7.selectboost                      NA                <NA>
#> nuisance_1.feature.0.6.0.4.selectboost                   1                   0
#> nuisance_1.feature.0.6.0.7.selectboost                   1                   0
#>                                        source_argval_end component unit
#> nuisance.group.0.6.0.4.selectboost                  <NA>      <NA> <NA>
#> nuisance.group.0.6.0.7.selectboost                  <NA>      <NA> <NA>
#> nuisance.group.0.8.0.4.selectboost                  <NA>      <NA> <NA>
#> nuisance.group.0.8.0.7.selectboost                  <NA>      <NA> <NA>
#> nuisance_1.feature.0.6.0.4.selectboost                 0      <NA> <NA>
#> nuisance_1.feature.0.6.0.7.selectboost                 0      <NA> <NA>
#>                                        feature_index basis_component
#> nuisance.group.0.6.0.4.selectboost                NA            <NA>
#> nuisance.group.0.6.0.7.selectboost                NA            <NA>
#> nuisance.group.0.8.0.4.selectboost                NA            <NA>
#> nuisance.group.0.8.0.7.selectboost                NA            <NA>
#> nuisance_1.feature.0.6.0.4.selectboost            11            <NA>
#> nuisance_1.feature.0.6.0.7.selectboost            11            <NA>
#>                                        domain_label group_id n_features
#> nuisance.group.0.6.0.4.selectboost             <NA>        2         10
#> nuisance.group.0.6.0.7.selectboost             <NA>        2         10
#> nuisance.group.0.8.0.4.selectboost             <NA>        2         10
#> nuisance.group.0.8.0.7.selectboost             <NA>        2         10
#> nuisance_1.feature.0.6.0.4.selectboost            0        2         NA
#> nuisance_1.feature.0.6.0.7.selectboost            0        2         NA
#>                                        selected_features replicate
#> nuisance.group.0.6.0.4.selectboost                     4        NA
#> nuisance.group.0.6.0.7.selectboost                     3        NA
#> nuisance.group.0.8.0.4.selectboost                     5        NA
#> nuisance.group.0.8.0.7.selectboost                     2        NA
#> nuisance_1.feature.0.6.0.4.selectboost                NA        NA
#> nuisance_1.feature.0.6.0.7.selectboost                NA        NA
#>                                        association_method group_method
#> nuisance.group.0.6.0.4.selectboost                 hybrid    threshold
#> nuisance.group.0.6.0.7.selectboost                 hybrid    threshold
#> nuisance.group.0.8.0.4.selectboost                 hybrid    threshold
#> nuisance.group.0.8.0.7.selectboost                 hybrid    threshold
#> nuisance_1.feature.0.6.0.4.selectboost             hybrid    threshold
#> nuisance_1.feature.0.6.0.7.selectboost             hybrid    threshold
#>                                        within_blocks bandwidth width
#> nuisance.group.0.6.0.4.selectboost              TRUE         3    NA
#> nuisance.group.0.6.0.7.selectboost              TRUE         3    NA
#> nuisance.group.0.8.0.4.selectboost              TRUE         3    NA
#> nuisance.group.0.8.0.7.selectboost              TRUE         3    NA
#> nuisance_1.feature.0.6.0.4.selectboost          TRUE         3    NA
#> nuisance_1.feature.0.6.0.7.selectboost          TRUE         3    NA
#>                                        n_replicates
#> nuisance.group.0.6.0.4.selectboost                1
#> nuisance.group.0.6.0.7.selectboost                1
#> nuisance.group.0.8.0.4.selectboost                1
#> nuisance.group.0.8.0.7.selectboost                1
#> nuisance_1.feature.0.6.0.4.selectboost            1
#> nuisance_1.feature.0.6.0.7.selectboost            1
summarise_perturbation_grid(grid_fit)
#>                   level   q  c0 n_items n_selected mean_selection max_selection
#> feature.0.6.0.4 feature 0.6 0.4      20         10           0.50             1
#> feature.0.6.0.7 feature 0.6 0.7      20         10           0.50             1
#> feature.0.8.0.4 feature 0.8 0.4      20          9           0.45             1
#> feature.0.8.0.7 feature 0.8 0.7      20          6           0.30             1
#> group.0.6.0.4     group 0.6 0.4       2          2           0.50             1
#> group.0.6.0.7     group 0.6 0.7       2          2           0.50             1
#> group.0.8.0.4     group 0.8 0.4       2          2           0.45             1
#> group.0.8.0.7     group 0.8 0.7       2          2           0.30             1

The returned object keeps the statistical result as ordinary data frames:

feature_surface <- selection_map(grid_fit, level = "feature")
group_surface <- selection_map(grid_fit, level = "group")

head(feature_surface[, c("feature", "q", "c0", "selection", "selected")])
#>                                             feature   q  c0 selection selected
#> nuisance_1.feature.0.6.0.4.selectboost   nuisance_1 0.6 0.4         0    FALSE
#> nuisance_1.feature.0.6.0.7.selectboost   nuisance_1 0.6 0.7         0    FALSE
#> nuisance_1.feature.0.8.0.4.selectboost   nuisance_1 0.8 0.4         0    FALSE
#> nuisance_1.feature.0.8.0.7.selectboost   nuisance_1 0.8 0.7         0    FALSE
#> nuisance_10.feature.0.6.0.4.selectboost nuisance_10 0.6 0.4         0    FALSE
#> nuisance_10.feature.0.6.0.7.selectboost nuisance_10 0.6 0.7         0    FALSE
head(group_surface[, c("group", "q", "c0", "mean_selection", "max_selection")])
#>                                       group   q  c0 mean_selection
#> nuisance.group.0.6.0.4.selectboost nuisance 0.6 0.4            0.4
#> nuisance.group.0.6.0.7.selectboost nuisance 0.6 0.7            0.3
#> nuisance.group.0.8.0.4.selectboost nuisance 0.8 0.4            0.5
#> nuisance.group.0.8.0.7.selectboost nuisance 0.8 0.7            0.2
#> signal.group.0.6.0.4.selectboost     signal 0.6 0.4            0.6
#> signal.group.0.6.0.7.selectboost     signal 0.6 0.7            0.7
#>                                    max_selection
#> nuisance.group.0.6.0.4.selectboost             1
#> nuisance.group.0.6.0.7.selectboost             1
#> nuisance.group.0.8.0.4.selectboost             1
#> nuisance.group.0.8.0.7.selectboost             1
#> signal.group.0.6.0.4.selectboost               1
#> signal.group.0.6.0.7.selectboost               1

The same data can be filtered before plotting or reporting:

head(selected_surface(grid_fit, threshold = 0.5, level = "feature"))
#>                                             feature predictor    group   level
#> nuisance_10.feature.0.8.0.7.selectboost nuisance_10  nuisance nuisance feature
#> nuisance_2.feature.0.6.0.4.selectboost   nuisance_2  nuisance nuisance feature
#> nuisance_2.feature.0.8.0.4.selectboost   nuisance_2  nuisance nuisance feature
#> nuisance_4.feature.0.8.0.4.selectboost   nuisance_4  nuisance nuisance feature
#> nuisance_5.feature.0.6.0.4.selectboost   nuisance_5  nuisance nuisance feature
#> nuisance_5.feature.0.6.0.7.selectboost   nuisance_5  nuisance nuisance feature
#>                                           q  c0 selection mean_selection
#> nuisance_10.feature.0.8.0.7.selectboost 0.8 0.7         1              1
#> nuisance_2.feature.0.6.0.4.selectboost  0.6 0.4         1              1
#> nuisance_2.feature.0.8.0.4.selectboost  0.8 0.4         1              1
#> nuisance_4.feature.0.8.0.4.selectboost  0.8 0.4         1              1
#> nuisance_5.feature.0.6.0.4.selectboost  0.6 0.4         1              1
#> nuisance_5.feature.0.6.0.7.selectboost  0.6 0.7         1              1
#>                                         max_selection selected representation
#> nuisance_10.feature.0.8.0.7.selectboost             1     TRUE           grid
#> nuisance_2.feature.0.6.0.4.selectboost              1     TRUE           grid
#> nuisance_2.feature.0.8.0.4.selectboost              1     TRUE           grid
#> nuisance_4.feature.0.8.0.4.selectboost              1     TRUE           grid
#> nuisance_5.feature.0.6.0.4.selectboost              1     TRUE           grid
#> nuisance_5.feature.0.6.0.7.selectboost              1     TRUE           grid
#>                                         basis_type source_representation
#> nuisance_10.feature.0.8.0.7.selectboost       <NA>                  grid
#> nuisance_2.feature.0.6.0.4.selectboost        <NA>                  grid
#> nuisance_2.feature.0.8.0.4.selectboost        <NA>                  grid
#> nuisance_4.feature.0.8.0.4.selectboost        <NA>                  grid
#> nuisance_5.feature.0.6.0.4.selectboost        <NA>                  grid
#> nuisance_5.feature.0.6.0.7.selectboost        <NA>                  grid
#>                                         start_position end_position
#> nuisance_10.feature.0.8.0.7.selectboost             10           10
#> nuisance_2.feature.0.6.0.4.selectboost               2            2
#> nuisance_2.feature.0.8.0.4.selectboost               2            2
#> nuisance_4.feature.0.8.0.4.selectboost               4            4
#> nuisance_5.feature.0.6.0.4.selectboost               5            5
#> nuisance_5.feature.0.6.0.7.selectboost               5            5
#>                                              start_argval        end_argval
#> nuisance_10.feature.0.8.0.7.selectboost                 1                 1
#> nuisance_2.feature.0.6.0.4.selectboost  0.111111111111111 0.111111111111111
#> nuisance_2.feature.0.8.0.4.selectboost  0.111111111111111 0.111111111111111
#> nuisance_4.feature.0.8.0.4.selectboost  0.333333333333333 0.333333333333333
#> nuisance_5.feature.0.6.0.4.selectboost  0.444444444444444 0.444444444444444
#> nuisance_5.feature.0.6.0.7.selectboost  0.444444444444444 0.444444444444444
#>                                              domain_start        domain_end
#> nuisance_10.feature.0.8.0.7.selectboost                 1                 1
#> nuisance_2.feature.0.6.0.4.selectboost  0.111111111111111 0.111111111111111
#> nuisance_2.feature.0.8.0.4.selectboost  0.111111111111111 0.111111111111111
#> nuisance_4.feature.0.8.0.4.selectboost  0.333333333333333 0.333333333333333
#> nuisance_5.feature.0.6.0.4.selectboost  0.444444444444444 0.444444444444444
#> nuisance_5.feature.0.6.0.7.selectboost  0.444444444444444 0.444444444444444
#>                                              method    block position
#> nuisance_10.feature.0.8.0.7.selectboost selectboost nuisance       10
#> nuisance_2.feature.0.6.0.4.selectboost  selectboost nuisance        2
#> nuisance_2.feature.0.8.0.4.selectboost  selectboost nuisance        2
#> nuisance_4.feature.0.8.0.4.selectboost  selectboost nuisance        4
#> nuisance_5.feature.0.6.0.4.selectboost  selectboost nuisance        5
#> nuisance_5.feature.0.6.0.7.selectboost  selectboost nuisance        5
#>                                                    argval transform
#> nuisance_10.feature.0.8.0.7.selectboost                 1  identity
#> nuisance_2.feature.0.6.0.4.selectboost  0.111111111111111  identity
#> nuisance_2.feature.0.8.0.4.selectboost  0.111111111111111  identity
#> nuisance_4.feature.0.8.0.4.selectboost  0.333333333333333  identity
#> nuisance_5.feature.0.6.0.4.selectboost  0.444444444444444  identity
#> nuisance_5.feature.0.6.0.7.selectboost  0.444444444444444  identity
#>                                         source_predictor source_position_start
#> nuisance_10.feature.0.8.0.7.selectboost         nuisance                    10
#> nuisance_2.feature.0.6.0.4.selectboost          nuisance                     2
#> nuisance_2.feature.0.8.0.4.selectboost          nuisance                     2
#> nuisance_4.feature.0.8.0.4.selectboost          nuisance                     4
#> nuisance_5.feature.0.6.0.4.selectboost          nuisance                     5
#> nuisance_5.feature.0.6.0.7.selectboost          nuisance                     5
#>                                         source_position_end source_argval_start
#> nuisance_10.feature.0.8.0.7.selectboost                  10                   1
#> nuisance_2.feature.0.6.0.4.selectboost                    2   0.111111111111111
#> nuisance_2.feature.0.8.0.4.selectboost                    2   0.111111111111111
#> nuisance_4.feature.0.8.0.4.selectboost                    4   0.333333333333333
#> nuisance_5.feature.0.6.0.4.selectboost                    5   0.444444444444444
#> nuisance_5.feature.0.6.0.7.selectboost                    5   0.444444444444444
#>                                         source_argval_end component unit
#> nuisance_10.feature.0.8.0.7.selectboost                 1      <NA> <NA>
#> nuisance_2.feature.0.6.0.4.selectboost  0.111111111111111      <NA> <NA>
#> nuisance_2.feature.0.8.0.4.selectboost  0.111111111111111      <NA> <NA>
#> nuisance_4.feature.0.8.0.4.selectboost  0.333333333333333      <NA> <NA>
#> nuisance_5.feature.0.6.0.4.selectboost  0.444444444444444      <NA> <NA>
#> nuisance_5.feature.0.6.0.7.selectboost  0.444444444444444      <NA> <NA>
#>                                         feature_index basis_component
#> nuisance_10.feature.0.8.0.7.selectboost            20            <NA>
#> nuisance_2.feature.0.6.0.4.selectboost             12            <NA>
#> nuisance_2.feature.0.8.0.4.selectboost             12            <NA>
#> nuisance_4.feature.0.8.0.4.selectboost             14            <NA>
#> nuisance_5.feature.0.6.0.4.selectboost             15            <NA>
#> nuisance_5.feature.0.6.0.7.selectboost             15            <NA>
#>                                              domain_label group_id n_features
#> nuisance_10.feature.0.8.0.7.selectboost                 1        2         NA
#> nuisance_2.feature.0.6.0.4.selectboost  0.111111111111111        2         NA
#> nuisance_2.feature.0.8.0.4.selectboost  0.111111111111111        2         NA
#> nuisance_4.feature.0.8.0.4.selectboost  0.333333333333333        2         NA
#> nuisance_5.feature.0.6.0.4.selectboost  0.444444444444444        2         NA
#> nuisance_5.feature.0.6.0.7.selectboost  0.444444444444444        2         NA
#>                                         selected_features replicate
#> nuisance_10.feature.0.8.0.7.selectboost                NA        NA
#> nuisance_2.feature.0.6.0.4.selectboost                 NA        NA
#> nuisance_2.feature.0.8.0.4.selectboost                 NA        NA
#> nuisance_4.feature.0.8.0.4.selectboost                 NA        NA
#> nuisance_5.feature.0.6.0.4.selectboost                 NA        NA
#> nuisance_5.feature.0.6.0.7.selectboost                 NA        NA
#>                                         association_method group_method
#> nuisance_10.feature.0.8.0.7.selectboost             hybrid    threshold
#> nuisance_2.feature.0.6.0.4.selectboost              hybrid    threshold
#> nuisance_2.feature.0.8.0.4.selectboost              hybrid    threshold
#> nuisance_4.feature.0.8.0.4.selectboost              hybrid    threshold
#> nuisance_5.feature.0.6.0.4.selectboost              hybrid    threshold
#> nuisance_5.feature.0.6.0.7.selectboost              hybrid    threshold
#>                                         within_blocks bandwidth width
#> nuisance_10.feature.0.8.0.7.selectboost          TRUE         3    NA
#> nuisance_2.feature.0.6.0.4.selectboost           TRUE         3    NA
#> nuisance_2.feature.0.8.0.4.selectboost           TRUE         3    NA
#> nuisance_4.feature.0.8.0.4.selectboost           TRUE         3    NA
#> nuisance_5.feature.0.6.0.4.selectboost           TRUE         3    NA
#> nuisance_5.feature.0.6.0.7.selectboost           TRUE         3    NA
#>                                         n_replicates
#> nuisance_10.feature.0.8.0.7.selectboost            1
#> nuisance_2.feature.0.6.0.4.selectboost             1
#> nuisance_2.feature.0.8.0.4.selectboost             1
#> nuisance_4.feature.0.8.0.4.selectboost             1
#> nuisance_5.feature.0.6.0.4.selectboost             1
#> nuisance_5.feature.0.6.0.7.selectboost             1