knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  dev = "png",
  dev.args = list(type = "cairo-png"),
  fig.path = "man/figures/README-",
  out.width = "100%"
)

INLAspacetime

CRAN Status check no-suggestions check pkgdown

This is a R package to implement certain spatial and spatio-temporal models, including some of the spatio-temporal models proposed here. It uses the cgeneric interface in the INLA package, to implement models by writing C code to build the precision matrix compiling it so that INLA can use it internally.

We have implemented

  1. some of the models presented in A diffusion-based spatio-temporal extension of Gaussian Matérn fields (2024). Finn Lindgren, Haakon Bakka, David Bolin, Elias Krainski and Håvard Rue. SORT 48 (1) January-June 2024, 3-66. (https://www.idescat.cat/sort/sort481/48.1.1.Lindgren-etal.pdf)

  2. the barrier (and transparent barriers) model proposed in https://doi.org/10.1016/j.spasta.2019.01.002

Vignettes

Please check here

Installation

The 'INLA' package is a suggested one, but you will need it for actually fitting a model. You can install it with

install.packages("INLA",repos=c(getOption("repos"),INLA="https://inla.r-inla-download.org/R/testing"), dep=TRUE) 

You can install the current CRAN version of INLAspacetime:

install.packages("INLAspacetime")

You can install the latest version of INLAspacetime from GitHub with

## install.packages("remotes")
remotes::install_github("eliaskrainski/INLAspacetime",  build_vignettes=TRUE)

A spacetime example

Simulate some fake data.

set.seed(1)
n <- 5
dataf <- data.frame(
    s1   = runif(n, -1, 1),
    s2   = runif(n, -1, 1),
    time = runif(n, 1, 4),
    y    = rnorm(n, 0, 1))
str(dataf)

Loading packages:

library(fmesher)
library(INLA)
library(INLAspacetime)

Define spatial and temporal discretization meshes

smesh <- fm_mesh_2d(
  loc = cbind(0,0), 
  max.edge = 5, 
  offset = 2)
tmesh <- fm_mesh_1d(
  loc = 0:5)

Define the spacetime model object to be used

stmodel <- stModel.define(
    smesh = smesh, ## spatial mesh
    tmesh = tmesh, ## temporal mesh
    model = '121', ## model, see the paper
    control.priors = list(
        prs = c(1, 0.1), ## P(spatial range < 1) = 0.1
        prt = c(5, 0), ## temporal range fixed to 5
        psigma = c(1, 0.1) ## P(sigma > 1) = 0.1
        )
    )
stmodel <- stModel.define(
    smesh = smesh, ## spatial mesh
    tmesh = tmesh, ## temporal mesh
    model = '121', ## model, see the paper
    control.priors = list(
        prs = c(1, 0.1), ## P(spatial range < 1) = 0.1
        prt = c(5, 0), ## temporal range fixed to 5
        psigma = c(1, 0.1) ## P(sigma > 1) = 0.1
        ),
    useINLAprecomp = FALSE
    )

Fit the model

Define a projector matrix from the spatial and temporal meshes to the data

Aproj <- inla.spde.make.A(
    mesh = smesh,
    loc = cbind(dataf$s1, dataf$s2),
    group = dataf$time,
    group.mesh = tmesh
)

Create a 'fake' column to be used as index. in the f() term

dataf$st <- NA

Setting the likelihood precision (as fixed)

ctrl.lik <- list(
  hyper = list(
    prec = list(
      initial = 10, 
      fixed = TRUE)    
  )
)

Combine a 'fake' index column with A.local

fmodel <- y ~ f(st, model = stmodel, A.local = Aproj)

Call the main INLA function:

fit <- inla(
    formula = fmodel,
    data = dataf,
    control.family = ctrl.lik)

Posterior marginal summaries for fixed effect and the model parameters that were not fixed.

fit$summary.fixed
fit$summary.hyperpar

Using the inlabru

library(inlabru)

Setting the observation (likelihood) model object

data_model <- bru_obs(
  formula = y ~ ., 
  family = "gaussian",
  control.family = ctrl.lik, 
  data = dataf)

Define the data model: the linear predictor terms

linpred <- ~ 1 +
    field(list(space = cbind(s1, s2), 
               time = time),
          model = stmodel)

Fitting

result <- bru(
  components = linpred,
  data_model)

Summary of the model parameters

result$summary.fixed
result$summary.hyperpar


eliaskrainski/INLAspacetime documentation built on March 29, 2025, 3:13 p.m.