knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
(Vignette under construction!)
DiagrammeR::mermaid(' flowchart TD subgraph "main, group, replicate" input([input]) mapper([mapper]) end weights(["weights"]) input_comb(["combined inputs: list(mapper = list(main, group, replicate), scale = weights)"]) multi_mapper(["mapper_multi<br/>list(main, group, replicate)"]) scale_mapper([mapper_scale]) pipe_mapper([mapper_pipe]) state([state]) lin(["mapper_linearised<br/>(offset, jacobian, state0)"]) effect([effect]) ibm_do_lin{linearise} ibm_lin[ibm_linear] ibm_eval[ibm_eval] ibm_eval_lin[ibm_eval] %% edge definitions with the node IDs input --> input_comb weights --> input_comb input_comb --> ibm_eval input_comb --> ibm_lin pipe_mapper --> ibm_do_lin ibm_do_lin -->|Yes| ibm_lin ibm_do_lin -->|No| ibm_eval state0([state0]) --> ibm_lin ibm_lin --> lin state --> ibm_eval_lin lin --> ibm_eval_lin state --> ibm_eval mapper --> multi_mapper --> pipe_mapper scale_mapper --> pipe_mapper ibm_eval --> effect ibm_eval_lin --> effect ', width = 600, height = 800 )
DiagrammeR::mermaid(' flowchart TD mapper([mapper]) input([input]) state0([state0]) off(["offset"]) jac(["jacobian"]) lin(["mapper_linearised<br/>(offset, jacobian, state0)"]) ibm_A[ibm_amatrix] style ibm_A color:#f00 ibm_lin[ibm_linear] ibm_jac[ibm_jacobian] %% edge definitions with the node IDs mapper-->ibm_lin input-->ibm_lin state0-->ibm_lin ibm_lin --> ibm_eval ibm_eval --- ibm_jac ibm_lin --> ibm_jac ibm_eval --> off ibm_jac --> jac ibm_jac --- ibm_A ibm_lin --> lin %%off-->lin %%jac-->lin %%state-->lin ', width = 600, height = 400 )
For each <label>
of main
, group
, replicate
, and weights
, the given expression expr
is evaluated in the data context, producing the input
to the component mapper
.
For spatial covariate inputs, the corresponding <label>_layer
expression is also evaluated.
Red nodes indicate deprecated behaviour retained for backwards compatibility.
DiagrammeR::mermaid(' flowchart TD expr([`label`_expr]) data([data]) _envir([.envir]) input(["`label`_input"]) input0([input = NULL]) input1([input = 1]) style input1 color:#f00 eval[eval] eval_function["value=fun(.data.)"] eval_formula["model.Matrix"] eval_spatial["eval_spatial"] eval_coordinates["SpatialPoints(value, crs)"] style eval_coordinates color:#f00 eval_crs["crs=fm_CRS(.data.)"] res{"Type of<br/>result"} null_on_fail{"null_on_fail?"} is_coordinates_fun{"Is expr =<br/>coordinates?"} expr --> eval eval --> res res -->|error| null_on_fail data --> eval _envir --> eval null_on_fail -->|TRUE| input0 null_on_fail -->|FALSE| input1 input0 --> input input1 --> input res -->|function| eval_function eval_function --> is_coordinates_fun is_coordinates_fun -->|Yes| eval_coordinates is_coordinates_fun -->|No| input eval_coordinates --> input eval_crs --> eval_coordinates res -->|"vector,<br/>matrix,<br/>data.frame<br/>list"| input res -->|formula| eval_formula eval_formula --> input res -->|"spatial<br/>covariate"| eval_spatial eval_spatial --> input %% spatial covariate layer input layer_expr(["`label`_layer_expr"]) layer(["`label`_layer"]) layer_eval["eval"] data --> layer_eval _envir --> layer_eval layer_expr --> layer_eval --> layer --> eval_spatial ', width = 900, height = 700 )
Classic integration structure
DiagrammeR::mermaid(' %%{init: {"securityLevel": "loose", "theme":"base"}}%% classDiagram ipmaker --|> ipoints : Call ipmaker --> samp_dim ipmaker --> nosamp_dim samp_dim --> ips : if_spatial = TRUE samp_dim --> cprod : if_spatial = FALSE, <br> ips = NULL nosamp_dim --> lips ips --> cprod lips --> cprod cprod --|> ips2 ipoints --> is_2D is_2D --> nsub2 : is_2D = TRUE && is.numeric(domain) = TRUE is_2D --> inla_mesh_segment: is_2D = TRUE && samplers || domain =/= NULL inla_mesh_segment --> inla_mesh_2d inla_mesh_2d --> bru_int_polygon bru_int_polygon --> ips2 ipoints .. ips ipoints .. lips ipoints --> domain : domain = NULL is_2D--|> is_1D : is_2D = FALSE is_1D --> nsub1 : is_1D = TRUE nsub1 --> inla_mesh_1d inla_mesh_1d --> ips2 class ipoints{ Generate integration points ipoints(samplers, domain, name, group, int.args, project) } class ipmaker{ Integration points for log Gaussian Cox process models ipmaker(samplers, domain, dnames, int.args = list(method = "stable", nsub = NULL)) } class cprod{ Cross product of integration points with weights and Spatial arguments fm_cprod(...) with weight = weight.x * weight.y and sp::merge } class ips{ integration points via samplers except "coordinates" ipoints(samplers, domain$coordinates, group = samp.dim, int.args = int.args } class lips{ integration points provided via domain but not via samplers lapply(nosamp.dim, function(nm) ipoints(NULL, domain[[nm]], name = nm, int.args = int.args)) } class ips2{ ipoints output do.call(cprod, c(list(ips), lips)) } class is_2D{ 2D Check (!is.null(samplers) && inherits(samplers, sp ojbect)) || inherits(domain, "inla.mesh") } class is_1D{ 1D Check ((!is.null(samplers) && is.numeric(samplers)) || (!is.null(domain) && (is.numeric(domain) || inherits(domain, "fm_mesh_1d")))) } class nsub1{ Number of integration points along a triangle edge for 1D (int.args[["nsub1"]] <- domain; domain <- NULL; int.args[["method"]] <- "direct") } class nsub2{ Number of integration points along a triangle edge for 2D (int.args[["nsub2"]] <- domain; domain <- NULL; int.args[["method"]] <- "direct") } class samp_dim{ Dimensions provided via samplers (except "coordinates") intersect(names(samplers), dnames) } class nosamp_dim{ Dimensions provided via domain but not via samplers setdiff(names(domain), c(samp.dim, "coordinates")) } class domain{ domain check (domain <- samplers; samplers <- NULL) } class inla_mesh_1d{ impute domain with fm_mesh_1d (domain <- fm_mesh_1d(sort(unique(as.vector(samplers))))) } class inla_mesh_segment{ Convert sp curve objects to inla.mesh.segment objects (INLA::inla.sp2segment(samplers, join = FALSE)) } class inla_mesh_2d{ Create a triangle mesh based on initial point locations, specified or automatic boundaries, and mesh quality parameters. (domain <- fm_mesh_2d_inla(boundary = samplers, max.edge = max.edge)) } class bru_int_polygon{ Integration points for polygons inside an inla.mesh bru_int_polygon(domain, polylist = poly_segm, method = int.args$method, nsub = int.args$nsub2, samplers = samplers) } ', width = 2000, height = 1200 )
Flow diagram for new integration scheme construction, implemented as fm_int(domain, samplers)
methods.
DiagrammeR::mermaid(' flowchart TD samplers[(samplers)] domains[(domains)] samplers --> multi_samplers[("multi domain samplers")] samplers --> single_samplers[("single domain samplers")] samplers --> calc_full_samplers["remove sampler domains"] domains --> calc_full_samplers --> full_samplers[("full domain samplers")] domains --> multi_samplers domains --> single_samplers domains --> full_samplers subgraph "single sampler" ipoints_single_rowwise["compute ips for each row"] --> single_sampler_ips([ips]) end subgraph "multi sampler" ipoints_domainwise["compute ips for each domain"] --> ipoints_single_rowwise ips_domain_list[("ips for each domain")] --> cprod_row["cprod within each sampler row"] --> multi_sampler_ips([ips]) end multi_samplers -->|for each| ipoints_domainwise single_samplers -->|for each| ipoints_single_rowwise full_samplers -->|for each| ipoints_single_rowwise multi_sampler_ips --> ips_list[(ips list)] single_sampler_ips --> ips_list single_sampler_ips --> ips_domain_list ips_list --> cprod_joint[cprod] --> joint_ips([joint ips]) ', width = 900, height = 1200 )
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.