inla.stack.RdFunctions for combining data, effects and observation matrices into
inla.stack objects, and extracting information from such objects.
inla.stack.remove.unused(stack)
inla.stack.compress(stack, remove.unused = TRUE)
inla.stack(..., compress = TRUE, remove.unused = TRUE, multi.family = FALSE)
inla.stack.sum(
data,
A,
effects,
responses = NULL,
tag = "",
compress = TRUE,
remove.unused = TRUE
)
inla.stack.join(
...,
compress = TRUE,
remove.unused = TRUE,
multi.family = FALSE
)
inla.stack.index(stack, tag)
inla.stack.LHS(stack)
inla.stack.RHS(stack)
inla.stack.data(stack, ..., .response.name = NULL)
inla.stack.A(stack)
inla.stack.response(stack, drop = TRUE)
# S3 method for class 'inla.data.stack'
print(x, ...)A inla.data.stack object, created by a call to
inla.stack, inla.stack.sum, or inla.stack.join.
If TRUE, compress the model by removing rows of
effects corresponding to all-zero columns in the A matrix (and
removing those columns).
For inla.stack.join, two or more data stacks of class
inla.data.stack, created by a call to inla.stack,
inla.stack.sum, or inla.stack.join. For
inla.stack.data, a list of variables to be joined with the data list.
If TRUE, compress the model by removing duplicated
rows of effects, replacing the corresponding A-matrix columns with a single
column containing the sum.
logical or character. For inla.data.join, if TRUE,
the response part of the stack is joined as a list. If character,
denotes the name of a data element that should be joined as a multi-column
matrix. Default is FALSE, which joins both the data and responses
elements with regular row binding with dplyr::bind_rows.
A list or codedata.frame of named data vectors. Scalars are expanded to match the number of rows in the A matrices, or any non-scalar data vectors. An error is given if the input is inconsistent.
A list of observation matrices. Scalars are expanded to diagonal matrices matching the effect vector lengths. An error is given if the input is inconsistent or ambiguous.
A collection of effects/predictors. Each list element
corresponds to an observation matrix, and must either be a single vector, a
list of vectors, or a data.frame. Single-element effect vectors are
expanded to vectors matching the number of columns in the corresponding A
matrix. An error is given if the input is inconsistent or ombiguous.
A list of response vectors, matrices, data.frame, or other special
response objects, such as inla.mdata() and inla.surv(). Each list element corresponds to
one response family. In ordinary user-side code, the list has length 1, and longer
lists are created by joining stacks with inla.stack(..., multi.family = TRUE).
A string specifying a tag for later identification.
The name to assign to the response variable when
extracting data from the stack. Default is NULL, which skips the
response object list.
logical indicating whether to return the contained object
instead of the full list, when the stack responses list has length 1.
Default is TRUE, as needed for inla() single family models.
Use drop = FALSE to extract the internal response storage, regardless of
length.
An inla.data.stack object for printing
A data stack of class inla.data.stack.
Elements:
data \(=(y^1, \ldots, y^p, \tilde{x}^1, \ldots,
\tilde{x}^{n_k})\)
A \(=\tilde{A}\)
data.names List
of data names, length \(p\)
effect.names List of effect names,
length \(n_k\)
n.data Data length, \(n_i\)
index
List indexed by tags, each element indexing into \(i=1, \ldots,
n_i\)
For models with a single effects collection, the outer list container for
A and effects may be omitted.
Component size definitions:
\(n_l\) effect blocks
\(n_k\) effects
\(n_i\) data values
\(n_{j,l}\) effect size for block \(l\)
\(n_j\) \(= \sum_{l=1}^{n_l} n_{j,l}\) total effect size
Input:
data\((y^1, \ldots, y^p)\) \(p\) vectors, each of length \(n_i\)
A\((A^1, \ldots, A^{n_l})\) matrices of size \(n_i \times n_{j,l}\)
effects\(\left((x^{1,1},\ldots,x^{n_k,1}), \ldots, (x^{1,n_l},\ldots,x^{n_k,n_l})\right)\) collections of effect vectors of length \(n_{j,l}\)
$$\mbox{predictor}(y^1, \ldots, y^p) \sim
\sum_{l=1}^{n_l} A^l \sum_{k=1}^{n_k} g(k, x^{k,l})
= \tilde{A} \sum_{k=1}^{n_k} g(k, \tilde{x}^k)
$$
where
$$\tilde{A} = \mbox{cbind}\left( A^1, \ldots, A^{n_l} \right)
$$
and
$$\tilde{x}^k = \mbox{rbind}\left( x^{k,1}, \ldots, x^{k,n_l} \right)
$$
and for each block \(l\), any missing
\(x^{k,l}\) is replaced by an NA vector.
inla.stack.remove.unused(): Remove unused entries from an existing stack
inla.stack.compress(): Compress an existing stack by removing duplicates
inla.stack.sum(): Create data stack as a sum of predictors
inla.stack.join(): Join two or more data stacks
inla.stack.index(): Extract tagged indices
inla.stack.LHS(): Extract data associated with the "left hand side" of the model
(e.g. the data itself, Ntrials, link, E)
inla.stack.RHS(): Extract data associated with the "right hand side" of the model
(all the covariates/predictors)
inla.stack.data(): Extract data for an inla call, and optionally join with other variables
inla.stack.A(): Extract the "A matrix" for control.predictor
inla.stack.response(): Extract the response variable or list of
response objects
print(inla.data.stack): Print information about an inla.data.stack
inla.stack.remove.unused: Remove
unused entries from an existing stack
inla.stack.compress: Compress an existing stack by removing
duplicates
inla.stack: Shorthand for inla.stack.join and inla.stack.sum
inla.stack.sum: Create data stack as a sum of predictors
inla.stack.join: Join two or more data stacks
inla.stack.index: Extract tagged indices
inla.stack.LHS: Extract data associated with the "left hand
side" of the model (e.g. the data itself, Ntrials, link,
E)
inla.stack.RHS: Extract data associated with the "right hand
side" of the model (all the covariates/predictors)
inla.stack.data: Extract data for an inla call, and optionally
join with other variables
inla.stack.A: Extract the "A matrix" for control.predictor
library(fmesher)
n <- 200
loc <- matrix(runif(n * 2), n, 2)
mesh <- fm_mesh_2d(
loc.domain = loc,
max.edge = c(0.05, 0.2)
)
proj.obs <- fm_evaluator(mesh, loc = loc)
proj.pred <- fm_evaluator(mesh, loc = mesh$loc)
spde <- inla.spde2.pcmatern(mesh,
prior.range = c(0.01, 0.01),
prior.sigma = c(10, 0.01)
)
covar <- rnorm(n)
field <- inla.qsample(n = 1, Q = inla.spde.precision(spde, theta = log(c(0.5, 1))))[, 1]
y <- 2 * covar + fm_evaluate(proj.obs, field)
A.obs <- inla.spde.make.A(mesh, loc = loc)
A.pred <- inla.spde.make.A(mesh, loc = proj.pred$loc)
stack.obs <-
inla.stack(
data = list(y = y),
A = list(A.obs, 1),
effects = list(c(
list(Intercept = 1),
inla.spde.make.index("spatial", spde$n.spde)
),
covar = covar
),
tag = "obs"
)
stack.pred <-
inla.stack(
data = list(y = NA),
A = list(A.pred),
effects = list(c(
list(Intercept = 1),
inla.spde.make.index("spatial", mesh$n)
)),
tag = "pred"
)
stack <- inla.stack(stack.obs, stack.pred)
formula <- y ~ -1 + Intercept + covar + f(spatial, model = spde)
result1 <- inla(formula,
data = inla.stack.data(stack.obs, spde = spde),
family = "gaussian",
control.predictor = list(
A = inla.stack.A(stack.obs),
compute = TRUE
)
)
plot(y, result1$summary.fitted.values[inla.stack.index(stack.obs, "obs")$data, "mean"],
main = "Observations vs posterior predicted values at the data locations"
)
result2 <- inla(formula,
data = inla.stack.data(stack, spde = spde),
family = "gaussian",
control.predictor = list(
A = inla.stack.A(stack),
compute = TRUE
)
)
field.pred <- fm_evaluate(
proj.pred,
result2$summary.fitted.values[inla.stack.index(stack, "pred")$data, "mean"]
)
field.pred.sd <- fm_evaluate(
proj.pred,
result2$summary.fitted.values[inla.stack.index(stack, "pred")$data, "sd"]
)
plot(field, field.pred, main = "True vs predicted field")
abline(0, 1)
image(fm_evaluate(mesh,
field = field,
dims = c(200, 200)
),
main = "True field"
)
image(fm_evaluate(mesh,
field = field.pred,
dims = c(200, 200)
),
main = "Posterior field mean"
)
image(fm_evaluate(mesh,
field = field.pred.sd,
dims = c(200, 200)
),
main = "Prediction standard deviation"
)
plot(field, (field.pred - field) / 1,
main = "True field vs standardised prediction residuals"
)