knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

(Vignette under construction!)

Mapping from component inputs and latent states to component effects

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
)

Linearising a mapping

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
)

Component input evaluation

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
)

Intergration point construction

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
)


inlabru-org/inlabru documentation built on May 5, 2024, 4:31 p.m.