Categories Uncategorized

Nouveau package R {bdlnm} publié sur CRAN : modèles non linéaires bayésiens à décalage distribué dans R via INLA

[This article was first published on R-posts.com, and kindly contributed to R-bloggers]. (Vous pouvez signaler un problème concernant le contenu de cette page ici)


Vous souhaitez partager votre contenu sur R-bloggers ? cliquez ici si vous avez un blog, ou ici si vous n’en avez pas.

CRAN, GitHub

TL;DR: {bdlnm} apporte les modèles bayésiens non linéaires à décalage distribué (B-DLNM) à R à l’aide d’INLA, permettant de modéliser des DLNM complexes, de quantifier l’incertitude et de produire des visualisations riches.

Arrière-plan

Le changement climatique accroît l’exposition à des conditions environnementales extrêmes telles que les vagues de chaleur et la pollution atmosphérique. Cependant, ces expositions ont rarement des effets immédiats. Par exemple:

    • Une vague de chaleur aujourd’hui pourrait augmenter la mortalité quelques jours plus tard
    • La pollution atmosphérique peut avoir des impacts cumulatifs et différés

Les modèles non linéaires à décalage distribué (DLNM) constituent le cadre standard pour étudier ces effets. Ils modélisent simultanément :

    • Comment le risque change avec le niveau d’exposition (exposition-réponse)
    • Comment le risque évolue dans le temps (lag-response)

Habituellement, en présence d’effets non linéaires, des splines sont utilisées pour définir ces deux relations. Ces deux bases sont ensuite combinées via une fonction de base croisée.

À mesure que les ensembles de données deviennent plus volumineux et plus complexes (par exemple, des études portant sur différentes régions et sur des périodes plus longues), les approches classiques montrent leurs limites. Les DLNM bayésiens étendent ce cadre en :

    • Prise en charge de structures de modèles plus flexibles
    • Fournir des distributions postérieures complètes
    • Permettre une quantification plus riche de l’incertitude

Le nouveau package {bdlnm} étend le cadre du package {dlnm} à un paramètre bayésien, en utilisant Integrated Nested L’approximation de Laplace (INLA), une alternative rapide au MCMC pour l’inférence bayésienne.

Installation et chargement du package

Depuis mars 2026, le package est disponible sur CRAN :

install.packages("bdlnm")
library(bdlnm)

Au moins la version stable d’INLA 23.4.24 (ou la plus récente) doit être installée au préalable. Vous pouvez installer la dernière version stable d’INLA en :

install.packages(
  "INLA",
  repos = c(
    getOption("repos"),
    INLA = "
  ),
  dep = TRUE
)

Maintenant, chargeons toutes les bibliothèques dont nous aurons besoin pour ce court tutoriel :

Charger les bibliothèques requises
# DLNMs and splines
library(dlnm)
library(splines)

# Data manipulation
library(dplyr)
library(reshape2)
library(stringr)
library(lubridate)

# Visualization
library(ggplot2)
library(gganimate)
library(ggnewscale)
library(patchwork)
library(scales)
library(plotly)

# Tables
library(gt)

# Execution time
library(tictoc)

Exemple pratique

Nous utilisons l’ensemble de données intégré de Londres avec la température et la mortalité quotidiennes (75 ans et plus) de 2000 à 2012.

Avant d’ajuster un modèle, il est utile d’explorer les données brutes. Ce graphique montre la température moyenne quotidienne et la mortalité pour la tranche d’âge de 75 ans et plus à Londres de 2000 à 2012, offrant un premier aperçu de la série chronologique que nous essayons de modéliser :

col_mort <- "#2f2f2f"
col_temp <- "#8e44ad"

# Scaling parameters
a <- (max(london$mort_75plus) - min(london$mort_75plus)) /
  (max(london$tmean) - min(london$tmean))
b <- min(london$mort_75plus) - min(london$tmean) * a

p <- ggplot(london, aes(x = yday(date))) +
  geom_line(
    aes(y = a * tmean + b, color = "Mean Temperature"),
    linewidth = 0.4
  ) +
  geom_line(
    aes(y = mort_75plus, color = "Daily Mortality (+75 years)"),
    linewidth = 0.4
  ) +
  facet_wrap(~year, ncol = 3) +
  scale_y_continuous(
    name = "Daily Mortality (+75 years)",
    breaks = seq(0, 225, by = 50),
    sec.axis = sec_axis(
      name = "Mean Temperature (°C)",
      transform = ~ (. - b) / a,
      breaks = seq(-10, 30, by = 10)
    )
  ) +
  scale_x_continuous(
    breaks = yday(as.Date(paste0(
      "2000-",
      c("01", "03", "05", "07", "09", "11"),
      "-01"
    ))),
    labels = c("Jan", "Mar", "May", "Jul", "Sep", "Nov"),
    expand = c(0.01, 0)
  ) +
  scale_color_manual(
    values = c(
      "Daily Mortality (+75 years)" = col_mort,
      "Mean Temperature" = col_temp
    )
  ) +
  labs(x = NULL, color = NULL) +
  guides(color = "none") +
  theme_minimal() +
  theme(
    axis.title.y.left = element_text(
      color = col_mort,
      face = "bold",
      margin = margin(r = 8)
    ),
    axis.title.y.right = element_text(
      color = col_temp,
      face = "bold",
      margin = margin(l = 8)
    ),
    axis.text.y.left = element_text(color = col_mort),
    axis.text.y.right = element_text(color = col_temp)
  ) +
  transition_reveal(as.numeric(date))

animate(p, nframes = 300, fps = 10, end_pause = 100)

Aperçu du modèle

Conceptuellement, le modèle DLNM :

    • Exposition-réponse : comment le risque évolue en fonction du niveau d’exposition

    • Réponse décalée : comment le risque évolue-t-il au fil du temps

Un modèle typique est :

Ouit Poisson ( mt )
enregistrer ( mt ) = un + CB ( xt , , x tL ) · b + k ck toi kt

où:

    • un est l’interception
    • CB(·) est la fonction de base croisée, définissant à la fois les relations exposition-réponse et retard-réponse
    • b sont les coefficients associés aux termes de base croisée
    • toikt sont des covariables variables dans le temps avec des coefficients correspondants ck

Spécification et configuration du modèle

Avant d’ajuster le modèle, nous devons définir les fonctions exposition-réponse et décalage-réponse basées sur les splines à l’aide du package {dlnm}.

Pour notre exemple, nous utiliserons des spécifications courantes dans la littérature dans les études température-mortalité :

    • Exposition-réponse : spline naturelle à trois nœuds placée aux 10e, 75e et 90e centiles de la température moyenne quotidienne

    • Réponse au décalage : spline naturelle avec trois nœuds équidistants sur l’échelle logarithmique jusqu’à un décalage maximum de 21 jours

# Exposure-response and lag-response spline parameters
dlnm_var <- list(
  var_prc = c(10, 75, 90),
  var_fun = "ns",
  lag_fun = "ns",
  max_lag = 21,
  lagnk = 3
)

# Cross-basis parameters
argvar <- list(
  fun = dlnm_var$var_fun,
  knots = quantile(london$tmean, dlnm_var$var_prc / 100, na.rm = TRUE),
  Bound = range(london$tmean, na.rm = TRUE)
)

arglag <- list(
  fun = dlnm_var$lag_fun,
  knots = logknots(dlnm_var$max_lag, nk = dlnm_var$lagnk)
)

# Create crossbasis
cb <- crossbasis(london$tmean, lag = dlnm_var$max_lag, argvar, arglag)

Comme c’est généralement le cas dans ces scénarios, nous contrôlerons également le caractère saisonnier de la série chronologique de mortalité à l’aide d’une spline naturelle avec 8 degrés de liberté par an, qui contrôle de manière flexible les tendances à long terme et saisonnières de la mortalité :

seas <- ns(london$date, df = round(8 * length(london$date) / 365.25))

Enfin, il faut également définir les valeurs de température pour lesquelles des prédictions seront générées :

temp <- round(seq(min(london$tmean), max(london$tmean), by = 0.1), 1)

Ajuster le modèle

Ajuster le DLNM bayésien précédemment défini à l’aide de la fonction bdlnm(). Nous prélevons 1 000 échantillons de la distribution postérieure et définissons une graine pour la reproductibilité :

tictoc::tic()
mod <- bdlnm(
  mort_75plus ~ cb + factor(dow) + seas,
  data = london,
  family = "poisson",
  sample.arg = list(n = 1000, seed = 5243)
)
tictoc::toc()
8.33 sec elapsed

Intérieurement, bdlnm():

    • s’adapte au modèle en utilisant INLA

    • renvoie des échantillons postérieurs pour tous les paramètres

Température minimale de mortalité

Nous estimons la température minimale de mortalité (MMT), définie comme la température à laquelle le risque global de mortalité est minimisé. Cette valeur optimale sera ensuite utilisée pour centrer les risques relatifs estimés.

tictoc::tic()
mmt <- optimal_exposure(mod, exp_at = temp)
tictoc::toc()
7.3 sec elapsed

Le cadre bayésien, comparé à la perspective fréquentiste, fournit directement la distribution postérieure complète du MMT. Il est utile d’inspecter cette distribution pour évaluer s’il existe plusieurs valeurs d’exposition optimales candidates et pour vérifier que la médiane fournit une valeur de centrage raisonnable :

ggplot(as.data.frame(mmt$est), aes(x = mmt$est)) +
  geom_histogram(
    fill = "#A8C5DA",
    bins = length(unique(mmt$est)),
    alpha = 0.6,
    color = "white"
  ) +
  geom_density(
    aes(y = after_stat(density) * length(mmt$est) / length(unique(mmt$est))),
    color = "#2E5E7E",
    linewidth = 1.2,
    adjust = 2 # <-- key change: higher = smoother
  ) +
  geom_vline(
    xintercept = mmt$summary["0.5quant"],
    color = "#2E5E7E",
    linewidth = 1.1,
    linetype = "dashed"
  ) +
  scale_x_continuous(breaks = seq(min(mmt$est), max(mmt$est), by = 0.1)) +
  labs(x = "Temperature (°C)", y = "Frequency") +
  theme_minimal()

La distribution postérieure du MMT est concentrée autour de 18,9 ºC et est unimodale, de sorte que la médiane constitue une valeur de centrage stable pour les estimations du risque relatif.

La distribution postérieure du MMT peut également être visualisée directement à l’aide du package plot() méthode: plot(mmt).

Prédire les effets de l’exposition, du décalage et de la réponse

Nous prédisons l’association exposition-retard-réponse entre la température et la mortalité à partir du modèle ajusté à la grille de température fournie :

cen <- mmt$summary[["0.5quant"]]
tictoc::tic()
cpred <- bcrosspred(mod, exp_at = temp, cen = cen)
tictoc::toc()
6.83 sec elapsed

Le centrage au MMT signifie que les risques relatifs (RR) sont interprétés par rapport à cette température optimale avec une mortalité minimale.

Plusieurs visualisations peuvent être produites à partir de ces prédictions. Bien que des visualisations plus simples puissent être créées à l’aide du package plot() méthode, nous utiliserons ici une méthode plus sophistiquée ggplot2 visualisations :

Surface d’exposition-retard-réponse 3D

Nous pouvons tracer l’association exposition-retard-réponse complète en utilisant une surface 3D :

matRRfit_median <- cpred$matRRfit.summary[,, "0.5quant"]
x <- rownames(matRRfit_median)
y <- colnames(matRRfit_median)
z <- t(matRRfit_median)

zmin <- min(z, na.rm = TRUE)
zmax <- max(z, na.rm = TRUE)
mid <- (1 - zmin) / (zmax - zmin)

plot_ly() |>
  add_surface(
    x = x,
    y = y,
    z = z,
    surfacecolor = z,
    cmin = zmin,
    cmax = zmax,
    colorscale = list(
      c(0, "#00696e"),
      c(mid * 0.5, "#80c8c8"),
      c(mid, "#f5f0e8"),
      c(mid + (1 - mid) * 0.5, "#c2714f"),
      c(1, "#6b1c1c")
    ),
    colorbar = list(title = "RR")
  ) |>
  add_surface(
    x = x,
    y = y,
    z = matrix(1, nrow = length(y), ncol = length(x)),
    colorscale = list(c(0, "black"), c(1, "black")),
    opacity = 0.4,
    showscale = FALSE
  ) |>
  layout(
    title = "Exposure-Lag-Response Surface",
    scene = list(
      xaxis = list(title = "Temperature (°C)"),
      yaxis = list(title = "Lag", tickvals = y, ticktext = gsub("lag", "", y)),
      zaxis = list(title = "RR"),
      camera = list(eye = list(x = 1.5, y = -1.8, z = 0.8))
    )
  )
Cliquez sur l’image pour explorer la version interactive de Plotly

La surface révèle deux régions à risque distinctes. Les températures chaudes produisent un risque aigu et aigu, concentré dans les premiers décalages, culminant au décalage 0 et se dissipant rapidement après les premiers décalages. Les températures froides produisent une augmentation plus modeste et progressive des premiers décalages qui ne disparaît pas complètement avec des décalages plus longs. Les températures intermédiaires proches du MMT se situent à proximité du plan de référence RR = 1 sur tous les décalages.

La structure différentielle de décalage observée pour la mortalité liée à la chaleur et au froid est cohérente avec les mécanismes physiologiques connus. La mortalité liée à la chaleur a tendance à survenir rapidement après une exposition due à un stress physiologique aigu, tandis que la mortalité liée au froid se développe plus progressivement en raison d’effets cardiovasculaires et respiratoires retardés, entraînant un risque croissant sur des périodes de décalage plus longues.

Courbes de réponse en retard

On peut également visualiser des tranches de la surface précédente. Par exemple, la relation de retard de réponse pour différentes valeurs de température :

matRRfit <- cbind(
  melt(cpred$matRRfit.summary[,, "0.5quant"], value.name = "RR"),
  RR_lci = melt(
    cpred$matRRfit.summary[,, "0.025quant"],
    value.name = "RR_lci"
  )$RR_lci,
  RR_uci = melt(
    cpred$matRRfit.summary[,, "0.975quant"],
    value.name = "RR_uci"
  )$RR_uci
) |>
  rename(temperature = Var1, lag = Var2) |>
  mutate(
    lag = as.numeric(gsub("lag", "", lag))
  )

temps <- cpred$exp_at

p <- ggplot() +
  # Lag-responses curves colored by temperature
  geom_line(
    data = matRRfit,
    aes(x = lag, y = RR, group = temperature, color = temperature),
    alpha = 0.35,
    linewidth = 0.35
  ) +
  scale_color_gradientn(
    colours = c(
      "#2166ac",
      "#4393c3",
      "#92c5de",
      "#d1e5f0",
      "#f7f7f7",
      "#fddbc7",
      "#f4a582",
      "#d6604d",
      "#b2182b"
    ),
    name = "Temperature"
  ) +
  # Start a new color scale for highlighted curves
  ggnewscale::new_scale_color() +
  # RR = 1 reference
  geom_hline(
    yintercept = 1,
    linetype = "dashed",
    color = "grey30",
    linewidth = 0.5
  ) +
  scale_x_continuous(breaks = cpred$lag_at) +
  scale_y_continuous(trans = "log10", breaks = pretty_breaks(6)) +
  labs(
    title = "Lag-response curves by temperature",
    x = "Lag (days)",
    y = "Relative Risk (RR)"
  ) +
  theme_minimal() +
  theme(legend.position = "top", panel.grid.minor.x = element_blank()) +
  transition_states(
    temperature,
    transition_length = 1,
    state_length = 0
  ) +
  shadow_mark(past = TRUE, future = FALSE, alpha = 0.6)

animate(p, nframes = 300, fps = 15, end_pause = 100)

Les températures froides (en bleu) augmentent progressivement dans les délais initiaux, puis diminuent progressivement sans disparaître complètement dans les délais plus longs. Les températures chaudes (rouges) présentent un schéma différent : un risque plus élevé immédiatement après le décalage 0, qui diminue rapidement et se dissipe en grande partie après les premiers décalages :

Courbes exposition-réponses

Nous pouvons également tracer les courbes exposition-réponses par décalage et la courbe cumulée globale sur toute la période de décalage :

allRRfit <- data.frame(
  temperature = as.numeric(rownames(cpred$allRRfit.summary)),
  lag = "overall",
  RR = cpred$allRRfit.summary[, "0.5quant"],
  RR_lci = cpred$allRRfit.summary[, "0.025quant"],
  RR_uci = cpred$allRRfit.summary[, "0.975quant"]
)

RRfit <- rbind(matRRfit, allRRfit)

# Split data
RRfit_lags <- RRfit |>
  filter(!lag %in% c("overall")) |>
  mutate(lag = as.numeric(lag))
RRfit_overall <- RRfit |>
  filter(lag %in% c("overall"))

temps <- cpred$exp_at
t_cold <- temps[which.min(abs(temps - quantile(temps, 0.01)))]
t_hot <- temps[which.min(abs(temps - quantile(temps, 0.99)))]

# Top plot: exposure-response curves for each lag and overall
p_main <- ggplot() +
  # Background: all lags, fading from vivid (small) to pale (large)
  geom_line(
    data = RRfit_lags,
    aes(x = temperature, y = RR, group = lag, color = lag),
    linewidth = 0.8
  ) +
  scale_color_gradientn(
    colours = c(
      "black",
      "#2b1d2f",
      "#4a2f5e",
      "#6a4c93",
      "#8b6bb8",
      "#b39cdb",
      "#d8c9f1",
      "#f3eef5"
    ),
    values = scales::rescale(c(0, 0.5, 1, 2, 3, 4, 5, 10, 20))
  ) +
  new_scale_color() +
  new_scale_fill() +
  # Credible intervals
  geom_ribbon(
    data = RRfit_overall,
    aes(
      x = temperature,
      ymin = RR_lci,
      ymax = RR_uci,
      fill = "1"
    ),
    alpha = 0.2
  ) +
  # Highlighted curves
  geom_line(
    data = RRfit_overall,
    aes(x = temperature, y = RR, color = "1"),
    linewidth = 1.2
  ) +
  geom_hline(
    yintercept = 1,
    linetype = "dashed"
  ) +
  scale_color_manual(values = "#a6761d", labels = "Overall (CrI95%)") +
  scale_fill_manual(values = "#a6761d", labels = "Overall (CrI95%)") +
  scale_y_continuous(
    transform = "log10",
    breaks = sort(c(0.8, pretty_breaks(5)(c(0.8, 4))))
  ) +
  labs(
    x = NULL,
    y = "Relative Risk (RR)",
    color = NULL,
    fill = NULL
  ) +
  theme_minimal() +
  theme(
    legend.position = "top",
    axis.text.x = element_blank(),
    plot.margin = margin(8, 8, 0, 8)
  )

# Bottom plot: histogram with percentile lines
p_hist <- ggplot(london, aes(x = tmean)) +
  geom_histogram(
    aes(y = after_stat(density), fill = after_stat(x)),
    binwidth = 0.5,
    color = "black",
    linewidth = 0.2
  ) +
  geom_vline(
    xintercept = t_cold,
    linetype = "dashed",
    color = "#053061",
    linewidth = 0.6
  ) +
  geom_vline(
    xintercept = t_hot,
    linetype = "dashed",
    color = "#67001f",
    linewidth = 0.6
  ) +
  geom_vline(
    xintercept = cen,
    linetype = "dashed",
    color = "grey20",
    linewidth = 0.6
  ) +
  annotate(
    "text",
    x = t_cold,
    y = Inf,
    label = "1st pct",
    vjust = 1.4,
    hjust = 1.1,
    size = 3.2,
    color = "#053061"
  ) +
  annotate(
    "text",
    x = t_hot,
    y = Inf,
    label = "99th pct",
    vjust = 1.4,
    hjust = -0.1,
    size = 3.2,
    color = "#67001f"
  ) +
  annotate(
    "text",
    x = cen,
    y = Inf,
    label = "MMT",
    vjust = 1.4,
    hjust = -0.1,
    size = 3.2,
    color = "grey20"
  ) +
  scale_x_continuous(limits = range(cpred$exp_at)) +
  scale_fill_gradientn(
    colours = c(
      "#053061",
      "#2166ac",
      "#4393c3",
      "#92c5de",
      "#d1e5f0",
      "#f7f7f7",
      "#fddbc7",
      "#f4a582",
      "#d6604d",
      "#b2182b",
      "#67001f"
    ),
    name = "Temperature"
  ) +
  labs(x = "Temperature (°C)", y = "Density") +
  theme_minimal() +
  theme(
    plot.margin = margin(20, 8, 8, 8),
    legend.position = "bottom"
  )

# Combine them:
p_main / p_hist + plot_layout(heights = c(3, 1))

La courbe cumulée globale (moutarde) est clairement asymétrique : le risque augmente des deux côtés du MMT, mais la hausse est beaucoup plus forte pour les températures chaudes que pour les températures froides. La courbe de décalage 0 (noire), qui reflète l’effet immédiat, se comporte différemment pour le froid que pour la chaleur : elle est inférieure à 1 aux températures froides (reflétant la nature différée des effets du froid) et augmente de manière approximativement linéaire pour la chaleur. L’histogramme confirme que la plupart des journées à Londres se situent entre 5°C et 20°C, de sorte que les températures extrêmes, malgré leurs risques individuels élevés, sont des événements relativement rares.

Risque attribuable

Nous pouvons également calculer les nombres et fractions attribuables à partir d’un B-DLNM, ce qui permet de quantifier l’impact de toutes les expositions observées sur la mortalité des plus de 75 ans. Nous calculons le nombre d’événements de mortalité attribuables aux expositions à la température (nombre attribuable) et la fraction de tous les événements de mortalité qu’il constitue (fraction attribuable).

Deux perspectives différentes peuvent être utilisées :

    • En arrière (dir = "back") : quelles sont les causes des décès d’aujourd’hui qui s’expliquent par les expositions thermiques passées ?

    • Avant (dir = "forw") : quels décès futurs l’exposition à la température actuelle entraînera-t-elle ?

Utilisons la perspective prospective, plus couramment utilisée :

tictoc::tic()
attr_forw <- attributable(
  mod,
  london,
  name_date = "date",
  name_exposure = "tmean",
  name_cases = "mort_75plus",
  cen = cen,
  dir = "forw"
)
tictoc::toc()
110.12 sec elapsed

Evolution de la fraction attribuable

Nous pouvons tracer la série chronologique des fractions quotidiennes attribuables (AF) :

col_af <- "black"

temp_colours <- c(
  "#053061",
  "#2166ac",
  "#4393c3",
  "#92c5de",
  "#d1e5f0",
  "#f7f7f7",
  "#fddbc7",
  "#f4a582",
  "#d6604d",
  "#b2182b",
  "#67001f"
)

af_med <- attr_forw$af.summary[, "0.5quant"]

# Pre-compute range once
af_min <- min(af_med, na.rm = TRUE) - 0.01
af_max <- max(af_med, na.rm = TRUE) + 0.01

df <- data.frame(
  date = london$date,
  x = yday(london$date),
  year = year(london$date),
  tmean = london$tmean,
  af = af_med
)

ggplot(df, aes(x = x)) +
  # Full-height temperature background per day
  geom_rect(
    aes(
      xmin = x - 0.5,
      xmax = x + 0.5,
      ymin = af_min,
      ymax = af_max,
      fill = tmean
    )
  ) +
  scale_fill_gradientn(
    colours = temp_colours,
    name = "Temperature (°C)"
  ) +
  # AF line on top
  geom_line(
    aes(y = af),
    color = col_af,
    linewidth = 0.7
  ) +
  scale_y_continuous(
    name = "Attributable Fraction (AF)",
    breaks = seq(0, 1, by = 0.1),
    limits = c(af_min, af_max),
    expand = c(0, 0)
  ) +
  scale_x_continuous(
    breaks = yday(as.Date(paste0(
      "2000-",
      c("01", "03", "05", "07", "09", "11"),
      "-01"
    ))),
    labels = c("Jan", "Mar", "May", "Jul", "Sep", "Nov"),
    expand = c(0, 0)
  ) +
  facet_wrap(~year, ncol = 3, axes = "all_x") +
  labs(x = NULL) +
  theme_minimal(base_size = 11) +
  theme(
    panel.spacing.x = unit(0, "pt"),
    strip.text = element_text(face = "bold", size = 10),
    legend.position = "top",
    legend.key.width = unit(2.5, "cm")
  )

De brusques pics de FA dépassant 60 % sont visibles au cours des étés 2003 et 2006, coïncidant avec les principales vagues de chaleur européennes. En général, les épisodes d’été produisent des pics de FA plus élevés et plus abrupts, tandis que les journées froides d’hiver sont associées à des élévations plus soutenues dans le temps, bien que d’ampleur moins prononcée.

Charge totale imputable

En additionnant l’ensemble de la période d’étude, le tableau quantifie le fardeau total de la mortalité attribuable aux expositions à des températures non optimales dans la population de 75 ans et plus :

rbind(
  "Attributable fraction" = attr_forw$aftotal.summary,
  "Attributable number" = attr_forw$antotal.summary
) |>
  as.data.frame() |>
  round(3) |>
  gt(rownames_to_stub = TRUE)
signifier SD 0.025quant 0.5quant 0,975quant mode
Fraction attribuable 0,174 0,018 0,139 0,175 0,207 0,176
Numéro attribuable 68857.597 7131.526 55071.066 69178.391 81995.459 69842.155

Sur l’ensemble de la période 2000-2012, environ 17,5% (CrI à 95 % : 13,9 % à 20,7 %) de tous les décès dans la population de Londres de 75 ans et plus étaient imputables à des températures non optimales, ce qui correspond à environ 69 178 décès (CrI à 95 % : 55 071 à 81 996).

Conclusions

Le package {bdlnm} fournit une implémentation puissante et accessible des modèles non linéaires bayésiens à décalage distribué dans R. En combinant la flexibilité des DLNM avec l’inférence bayésienne complète via INLA, il permet aux chercheurs de mieux quantifier l’incertitude et d’adapter des relations complexes exposition-retard-réponse. Cela en fait un outil précieux pour étudier les impacts sur la santé du changement climatique et d’autres risques environnementaux dans des contextes de plus en plus riches en données.

Ce cadre ne se limite pas à l’épidémiologie environnementale. En fait, il peut être appliqué à tout contexte impliquant des expositions variables dans le temps et des effets différés (par exemple, des chocs de marché peuvent affecter les prix des actifs sur plusieurs jours), ce qui en fait un outil puissant et général pour l’analyse de séries chronologiques.

Le développement est en cours. Les fonctionnalités à venir incluent :

    • Analyses multi-sites: regrouper les courbes exposition-retard-réponse de différentes villes ou régions au sein d’un seul modèle
    • B-DLNM spatiaux (SB-DLNM): modéliser explicitement l’hétérogénéité spatiale dans les courbes exposition-retard-réponse de différentes régions

Le package est sur CRAN. Les rapports de bogues et les contributions sont les bienvenus via GitHub.

Références

    • Gasparrini A. (2011). Modèles linéaires et non linéaires à décalage distribué dans R : le package dlnm. Journal des logiciels statistiques43(8), 1-20. est ce que je:10.18637/jss.v043.i08.

    • Quijal-Zamorano M., Martinez-Beneito MA, Ballester J., Marí-Dell’Olmo M. (2024). Modèles non linéaires à décalage distribué spatial bayésien (SB-DLNM) pour la modélisation épidémiologique exposition-retard-réponse sur de petites zones. Journal international d’épidémiologie53(3), colorant061. est ce que je:10.1093/ije/dyae061.

    • Rue H., Martino S., Chopin N. (2009). Inférence bayésienne approximative pour les modèles gaussiens latents en utilisant des approximations de Laplace imbriquées intégrées. Journal de la Royal Statistical Society : série B71(2), 319-392. est ce que je:10.1111/j.1467-9868.2008.00700.x.

    • Gasparrini A., Leone M. (2014). Risque attribuable aux modèles de décalage distribué. Méthodologie de recherche médicale BMC14, 55. est ce que je:10.1186/1471-2288-14-55.


Nouveau package R {bdlnm} publié sur CRAN : modèles bayésiens à décalage distribué non linéaires dans R via INLA a été publié pour la première fois le 10 avril 2026 à 17h14.

À laisser un commentaire pour l’auteur, merci de suivre le lien et de commenter sur leur blog : R-posts.com.

Offres R-bloggers.com mises à jour quotidiennes par e-mail sur l’actualité de R et des tutoriels sur l’apprentissage de R et bien d’autres sujets. Cliquez ici si vous souhaitez publier ou trouver un emploi en R/data-science.


Vous souhaitez partager votre contenu sur R-bloggers ? cliquez ici si vous avez un blog, ou ici si vous n’en avez pas.

Continuer la lecture: Nouveau package R {bdlnm} publié sur CRAN : modèles non linéaires bayésiens à décalage distribué dans R via INLA

PakarPBN

A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.

In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.

The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.

Jasa Backlink

Download Anime Batch

Leave a Reply

Your email address will not be published. Required fields are marked *