Resample draws
objects according to provided weights, for example weights
obtained through importance sampling.
resample_draws(x, ...)
# S3 method for draws
resample_draws(x, weights = NULL, method = "stratified", ndraws = NULL, ...)
# S3 method for rvar
resample_draws(x, ...)
(draws) A draws
object or another R object for which the method
is defined.
Arguments passed to individual methods (if applicable).
(numeric vector) A vector of positive weights of length
ndraws(x)
. The weights will be internally normalized. If weights
is not
specified, an attempt will be made to extract any weights already stored in
the draws object (via weight_draws()
). If no weights are stored in the
draws object, equal weight is supplied to each draw. How exactly the
weights influence the resampling depends on the method
argument.
(string) The resampling method to use:
"simple"
: simple random resampling with replacement
"simple_no_replace"
: simple random resampling without replacement
"stratified"
: stratified resampling with replacement
"deterministic"
: deterministic resampling with replacement
Currently, "stratified"
is the default as it has comparably low variance
and bias with respect to ideal resampling. The latter would sample perfectly
proportional to the weights, but this is not possible in practice due to the
finite number of draws available. For more details about resampling methods,
see Kitagawa (1996).
(positive integer) The number of draws to be returned. By
default ndraws
is set internally to the total number of draws in x
if
sensible.
A draws
object of the same class as x
.
Upon usage of resample_draws()
, chains will automatically be merged
due to subsetting of individual draws (see subset_draws
for details).
Also, weights stored in the draws
object will be removed in the process,
as resampling invalidates existing weights.
Kitagawa, G., Monte Carlo Filter and Smoother for Non-Gaussian Nonlinear ' State Space Models, Journal of Computational and Graphical Statistics, 5(1):1-25, 1996.
resample_draws()
x <- as_draws_df(example_draws())
# random weights for justr for demonstration
w <- runif(ndraws(x), 0, 10)
# use default stratified sampling
x_rs <- resample_draws(x, weights = w)
#> Merging chains in order to subset via 'draw'.
summarise_draws(x_rs, default_summary_measures())
#> # A tibble: 10 × 7
#> variable mean median sd mad q5 q95
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 mu 4.24 4.59 3.45 3.25 -1.17 9.48
#> 2 tau 4.54 3.49 3.81 3.29 0.307 11.7
#> 3 theta[1] 7.08 6.23 6.51 5.22 -1.16 19.3
#> 4 theta[2] 5.37 5.13 4.94 4.03 -2.32 14.2
#> 5 theta[3] 2.96 4.13 7.31 5.22 -11.1 12.0
#> 6 theta[4] 5.10 5.24 5.01 4.32 -3.63 12.3
#> 7 theta[5] 2.89 3.57 5.35 4.54 -7.60 10.8
#> 8 theta[6] 3.88 4.34 5.34 5.00 -6.04 11.1
#> 9 theta[7] 6.88 6.73 5.29 4.60 -1.15 15.4
#> 10 theta[8] 4.60 4.73 5.71 5.23 -5.31 14.5
# use simple random sampling
x_rs <- resample_draws(x, weights = w, method = "simple")
#> Merging chains in order to subset via 'draw'.
summarise_draws(x_rs, default_summary_measures())
#> # A tibble: 10 × 7
#> variable mean median sd mad q5 q95
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 mu 3.95 4.08 3.51 4.00 -1.16 8.74
#> 2 tau 4.25 3.18 3.66 2.66 0.332 11.4
#> 3 theta[1] 7.04 6.06 6.71 5.72 -1.19 20.1
#> 4 theta[2] 4.66 4.73 4.68 4.51 -2.60 12.4
#> 5 theta[3] 2.77 4.16 7.50 5.46 -11.1 11.6
#> 6 theta[4] 4.99 5.50 4.89 4.49 -2.65 12.2
#> 7 theta[5] 2.66 3.49 5.34 4.86 -6.86 10.6
#> 8 theta[6] 3.71 4.07 5.14 4.92 -4.98 10.8
#> 9 theta[7] 6.45 5.92 5.34 4.60 -1.43 14.8
#> 10 theta[8] 4.34 4.76 5.56 5.22 -5.29 13.2