Obtains optimal stacking weights given leave-one-out predictive densities for each candidate model.
Arguments
- log_loopd
an \(n \times M\) matrix with \(i\)-th row containing the leave-one-out predictive densities for the \(i\)-th data point for the \(M\) candidate models.
- solver
specifies the solver to use for obtaining optimal weights. Default is
"ECOS"
. Internally callsCVXR::psolve()
.
Value
A list of length 2.
weights
optimal stacking weights as a numeric vector of length \(M\)
status
solver status, returns
"optimal"
if solver succeeded.
References
Yao Y, Vehtari A, Simpson D, Gelman A (2018). "Using Stacking to Average Bayesian Predictive Distributions (with Discussion)." Bayesian Analysis, 13(3), 917-1007. doi:10.1214/17-BA1091 .
Author
Soumyakanti Pan span18@ucla.edu,
Sudipto Banerjee sudipto@ucla.edu
Examples
data(simGaussian)
dat <- simGaussian[1:100, ]
mod1 <- spLMstack(y ~ x1, data = dat,
coords = as.matrix(dat[, c("s1", "s2")]),
cor.fn = "matern",
params.list = list(phi = c(1.5, 3),
nu = c(0.5, 1),
noise_sp_ratio = c(1)),
n.samples = 1000, loopd.method = "exact",
parallel = FALSE, solver = "ECOS", verbose = TRUE)
#>
#> STACKING WEIGHTS:
#>
#> | phi | nu | noise_sp_ratio | weight |
#> +---------+-----+-----+----------------+--------+
#> | Model 1 | 1.5| 0.5| 1| 0.000 |
#> | Model 2 | 3.0| 0.5| 1| 0.285 |
#> | Model 3 | 1.5| 1.0| 1| 0.000 |
#> | Model 4 | 3.0| 1.0| 1| 0.715 |
#> +---------+-----+-----+----------------+--------+
#>
loopd_mat <- do.call('cbind', mod1$loopd)
w_hat <- get_stacking_weights(loopd_mat)
print(round(w_hat$weights, 4))
#> [1] 0.0000 0.2845 0.0000 0.7155
print(w_hat$status)
#> [1] "optimal"