1  Modelo Poisson Condicional

A seguir, vamos discutir a implementação do modelo Poisson Condicional retirado do artigo Barrera-Gómez et al. (2023).

1.1 Problema

Entender o impacto da temperatura (controlando por outros confundidores) no número de acidentes de veículos (dados sintéticos similares aos dos autores usado no artigo).

Período: 15/05/2005 a 15/10/2011.

Base de dados:

  • Número de acidentes de veículos automotores em uma data específica.

  • Data.

  • Zona climática.

  • Temperatura máxima do dia em graus Celsius (exposição).

  • Indicador de feriados (0=não; 1=sim).

  • Indicador de o dia estar no início ou no fim de um período de feriado (0=não; 1=sim).

  • Indicador de precipitação nesse dia (0=não; 1=sim).

1.2 Estrutura dos Dados

Os dados estão aninhados em 3 níveis:

  • Nível 1: existem \(I=14\) regiões geográficas.

  • Nível 2: Para cada zona \(i\) existem \(J_i\) estratos temporais (combinação de ano, mês e dia da semana).

  • Nível 3: Para cada estrato de tempo \(j\) na zona \(i\) existem \(K_{ij}\) observações (dias).

Notação das variáveis

  • \(Y_{ijk}\) é o número de casos de casos de acidentes de veículos automotores, observado no dia \(k\), no estrato de tempo \(j\), na zona \(i\).

  • \(X_{lijk}\) é a \(l-\)ésima variável explicativa associada a \(Y_{.ijk}\).

1.3 Modelo Poisson Misto

O artigo de Barrera-Gómez et al. (2023) propõe um modelo de regressão de Poisson condicional com um coeficiente angular aleatório.

\[\begin{align} Y_{ijk} & \sim Poisson(\lambda_{ijk})\\ log(\lambda_{ijk}) & = \kappa_{ij} + \beta_{1i} X_{1ijk} + \beta_2 X_{2ijk} + \ldots + \beta_p X_{pijk}\\ \beta_{1i} & = \beta_1 + u_{1i}\\ u_{1i} & \sim N(0,\sigma_1^2). \end{align}\]

1.4 Modelo Poisson Condicional Misto

Os autores propuseram um modelo com uma abordagem em um único estágio para modelar os dados de todas as zonas simultaneamente.

\[\begin{align} \mathbf{Y}_{ij}|S_{ij},X & \sim Multinomial(S_{ij},\pi_{ij1},\ldots, \pi_{ijK_{ij}})\\ S_{ij} & = \sum_{k=1}^{K_{ij}} Y_{ijk}\\ \pi_{ijk} & = g_{ijk}/g_{ij}\\ g_{ijk} & = exp(u_{1i}X_{1ijk} + \beta_1 X_{1ijk} + \ldots + \beta_p X_{pijk})\\ g_{ij} & = \sum_{k=1}^{K_{ij}} g_{ijk}\\ u_{1i} & \sim N(0,\sigma_1^2). \end{align} \]

Para ajustar o modelo acima sob a abordagem Bayesiana, precisamos completar a especificação do modelo por meio das distribuições a priori para os parâmetros.

\[\begin{align} \beta_l & \sim N(\mu = 0, \sigma^2 = 0.000001), l=1,\ldots,p\\ \sigma_1^2 & = 1/\tau_1\\ \tau_1 & \sim Gama(\alpha = 0.001, r = 0.001) \end{align}\]
#Ativando pacotes
library(readxl)
library(lubridate)
library(stringr)
library(bayesplot)
library(ggplot2)
library(R2jags)

# -------------------------- #
# Importando a base de dados #
# -------------------------- #

#Carregando os dados:
load("crash.RData")

# Visualizando os dados
head(crash)
  zone       date n_accidents_human temp_max holi event prec01
1    1 2000-05-15                 0    26.78    0     0      0
2    1 2000-05-16                 0    26.87    0     0      0
3    1 2000-05-17                 0    23.95    0     0      1
4    1 2000-05-18                 0    24.63    0     0      0
5    1 2000-05-19                 1    22.55    0     0      0
6    1 2000-05-20                 1    21.30    0     0      1
# Resumindo os dados 
summary(object = crash)
      zone           date            n_accidents_human    temp_max    
 Min.   : 1.0   Min.   :2000-05-15   Min.   : 0.000    Min.   : 5.50  
 1st Qu.: 4.0   1st Qu.:2003-03-23   1st Qu.: 0.000    1st Qu.:22.50  
 Median : 7.5   Median :2006-01-29   Median : 0.000    Median :26.00  
 Mean   : 7.5   Mean   :2006-01-29   Mean   : 1.512    Mean   :25.59  
 3rd Qu.:11.0   3rd Qu.:2008-12-07   3rd Qu.: 2.000    3rd Qu.:29.18  
 Max.   :14.0   Max.   :2011-10-15   Max.   :31.000    Max.   :39.88  
                                     NA's   :770       NA's   :770    
      holi             event             prec01      
 Min.   :0.00000   Min.   :0.00000   Min.   :0.0000  
 1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.0000  
 Median :0.00000   Median :0.00000   Median :0.0000  
 Mean   :0.03842   Mean   :0.05682   Mean   :0.4242  
 3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:1.0000  
 Max.   :1.00000   Max.   :1.00000   Max.   :1.0000  
                                     NA's   :81      

Agora vamos incluir na base de dados a variável de estrato, que será denominada zone_ymd.

# ---------------- #
# Criando estratos
# ---------------- #

# Criando a variavel ano a partir da data
year <- year(crash$date)

# Criando a variavel mês a partir da data com dois digitos
month <- str_pad(month(crash$date), 2, pad = "0")

# Criando a variavel dia da semana a partir da data
dow <- wday(crash$date, week_start = 1)

#Concatenando ano, mes e dia da semana
ymd <- paste(year, month, dow, sep = "_")

# Concatenando a zona em ymd (estrato)
crash$zone_ymd <- as.factor(paste(str_pad(crash$zone, 2, pad = "0"), as.factor(ymd), sep = "_")) 

# Removendo os objetos que não serão utilizados
rm(year, month, dow, ymd)

# Resumindo os dados 
summary(crash)
      zone           date            n_accidents_human    temp_max    
 Min.   : 1.0   Min.   :2000-05-15   Min.   : 0.000    Min.   : 5.50  
 1st Qu.: 4.0   1st Qu.:2003-03-23   1st Qu.: 0.000    1st Qu.:22.50  
 Median : 7.5   Median :2006-01-29   Median : 0.000    Median :26.00  
 Mean   : 7.5   Mean   :2006-01-29   Mean   : 1.512    Mean   :25.59  
 3rd Qu.:11.0   3rd Qu.:2008-12-07   3rd Qu.: 2.000    3rd Qu.:29.18  
 Max.   :14.0   Max.   :2011-10-15   Max.   :31.000    Max.   :39.88  
                                     NA's   :770       NA's   :770    
      holi             event             prec01               zone_ymd    
 Min.   :0.00000   Min.   :0.00000   Min.   :0.0000   01_2000_06_4:    5  
 1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.0000   01_2000_06_5:    5  
 Median :0.00000   Median :0.00000   Median :0.0000   01_2000_07_1:    5  
 Mean   :0.03842   Mean   :0.05682   Mean   :0.4242   01_2000_07_6:    5  
 3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:1.0000   01_2000_07_7:    5  
 Max.   :1.00000   Max.   :1.00000   Max.   :1.0000   01_2000_08_2:    5  
                                     NA's   :81       (Other)     :25842  

Próximo passo? É preciso organizar os dados em um formato específico para a realização do ajuste do modelo.

Os autores forneceram uma função chamada multinomdata que faz essa organização dos dados automaticamente. Para que a mesma funcione, é preciso deixar seus dados no mesmo formato dos autores: nível 1 é o espaço geográfico, o nível 2 é o tempo e o nível 3 é o dia dentro de cada estrato temporal em cada zona.

Os argumentos da função são:

  • data - o data.frame com os dados.

  • X - Vetor de caracteres com os nomes das variáveis explicativas. Assume-se que a primeira corresponde à exposição de interesse. Todas as variáveis devem ser numéricas.

  • Y - nome da variável desfecho entre aspas (como encontra-se em data).

  • i - variável que indica o nível 1 dos dados (neste caso a variável espacial - deve ser numérica).

  • ij - variável que indica o nível 2 dos dados (neste caso a variável deve ser um fator).

# -------------------------- #
# Modelo Poisson Condicional
# -------------------------- #

# definindo as variáveis explicativas (a primeira é a exposição de interesse): 
Xnames <- c("temp_max", "holi", "event", "prec01")

# Organizando os dados no formato apropriado para o modelo definido no BUGS:
source("Multinomdata.R")
ddmultinom <- multinomdata(data = crash, #a base de dados
                           X = Xnames,
                           Y = "n_accidents_human",
                           i = "zone",
                           ij = "zone_ymd")

A saída da função multinomdata é uma lista contendo vários elementos.

#Nomes dos componentes no objeto
names(ddmultinom)
 [1] "Ymat"    "Svector" "X1mat"   "X2mat"   "X3mat"   "X4mat"   "ivector"
 [8] "Kvector" "N"       "I"      

A seguir vamos entender cada um dos componentes do objeto ddmultinom.

Ymat é uma matriz com tantas linhas quantas forem as distribuições multinomiais (ou seja, estratos de zona-tempo) e tantas colunas quanto o tamanho máximo das distribuições multinomiais.

Os números representam contagens de desfechos observados em cada categoria (ou seja, estrato de zona-tempo) da distribuição.

dim(ddmultinom$Ymat)
[1] 4671    5
head(ddmultinom$Ymat)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    2   NA   NA
[2,]    0    0    1   NA   NA
[3,]    0    2    1   NA   NA
[4,]    0    2   NA   NA   NA
[5,]    1    1   NA   NA   NA
[6,]    1    0   NA   NA   NA

Svector é um vetor numérico que inclui o tamanho de cada distribuição multinomial (ou seja, a soma das contagens de desfechos dentro de cada estrato):

length(ddmultinom$Svector)
[1] 4671
table(ddmultinom$Svector)

   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16 
1078  679  510  377  330  246  181  132  124   89   74   75   66   47   36   43 
  17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 
  37   28   24   35   17   19   16   25   20   16   15   12   10   12   13   10 
  33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48 
  11   18    8   10   15   12    8   12   11    7    8    3   13    7    6    8 
  49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64 
   7    5    6    6    8    6    4    5    8    2    5    2    6    6    1    7 
  65   66   67   68   70   71   72   77   79   82   83   86   88   91   93  105 
   3    6    3    2    2    1    2    2    3    2    1    1    2    1    1    1 
 111 
   1 

X1mat, X2mat, ... : tantas matrizes quanto o número de variáveis passadas em X, respectivamente. Mesma dimensão e padrão de ausência estrutural que o de Ymat.

Os números em cada matriz representam os valores observados da variável correspondente em cada categoria da distribuição multinomial.

Inclui NA estrutural em coerência com Ymat:

dim(ddmultinom$X1mat)
[1] 4671    5
head(ddmultinom$X1mat)
      [,1]  [,2]  [,3] [,4] [,5]
[1,] 26.78 22.59 27.47   NA   NA
[2,] 26.87 25.81 29.97   NA   NA
[3,] 23.95 27.35 31.24   NA   NA
[4,] 24.63 26.96    NA   NA   NA
[5,] 22.55 27.56    NA   NA   NA
[6,] 21.30 22.39    NA   NA   NA

ivector é um vetor numérico indicando a zona a que cada distribuição multinomial pertence.

length(ddmultinom$ivector)
[1] 4671
table(ddmultinom$ivector)

  1   2   3   4   5   6   7   8   9  10  11  12  13  14 
495 448 282 470 439 504 496 500 289 331  66 240  79  32 

Kvector é um vetor numérico indicando o número de categorias em cada distribuição multinomial (ou seja, o número de observações dentro de cada estrato de zona-tempo).

Os valores são coerentes com o número de NA em cada linha de Ymat.

length(ddmultinom$Kvector)
[1] 4671
head(ddmultinom$Kvector)
[1] 3 3 3 2 2 2
table(ddmultinom$Kvector)

   2    3    4    5 
 945  421 2100 1205 

N é um número inteiro indicando o número de distribuições multinomiais (ou seja, o número de estratos de zona-tempo) utilizados para ajustar o modelo:

ddmultinom$N
[1] 4671

I é um número inteiro indicando o número de zonas:

ddmultinom$I
[1] 14

Em seguida, temos o código que especifica o modelo definido acima e que usará os componentes criados pela função multinomdata.

### Modelo no BUGS:
  bugmultinom <- function() { 
     for (r in 1:N) {
     Ymat[r, 1:Kvector[r]] ~ dmulti(prob[r, 1:Kvector[r]], Svector[r])
     for (s in 1:Kvector[r]) {
       prob[r, s] <- g[r, s] / sum(g[r, 1:Kvector[r]]) 
       log(g[r, s]) <- beta1 * X1mat[r, s] +
         u1[ivector[r]] * X1mat[r, s] +
                  beta2 * X2mat[r, s] +
                  beta3 * X3mat[r, s] +
                  beta4 * X4mat[r, s]
      }
   }
     
     for (i in 1:I) {
     u1[i] ~ dnorm(0, tau1)
     }
     
     beta1 ~ dnorm(0, 0.000001)
     beta2 ~ dnorm(0, 0.000001)
     beta3 ~ dnorm(0, 0.000001)
     beta4 ~ dnorm(0, 0.000001)
     tau1 ~ dgamma(0.001, 0.001)
     sigma1 <- sqrt(1 / tau1) 
   }

Em seguida, precisamos definir as configurações do ajuste, isto é, número de cadeias, interações, período de aquecimento e espaçamento para o MCMC.

Chain <- 2
Iter <- 2000
Burn <- 1000
Thin <- 4

Também podemos especificar quais são os parâmetros que serão monitorados. Neste caso monitoraremos todos os parâmetros.

nX <- length(Xnames)
parslabels <- c(paste0("beta", 1:nX), "sigma1")
parameters <- c(parslabels, "u1")

Especificando os valores iniciais das duas cadeias.

### valores iniciias MCMC:
parsini <- list(c(beta = 0.1, tau1 = 100), # cadeia 1
                c(beta = -0.1, tau1 = 10)) # cadeia 2
                        
initials <- lapply(parsini,
                   FUN = function(cha) {
                     res <- as.list(c(rep(cha[1], nX), cha[2]))
                     names(res) <- c(paste0("beta", 1:nX), "tau1")
                     return(res)
                     } 
                   )

Chamando o JAGS para ajustar o MCMC especificado nos códigos acima.

### Chamando o JAGS:

modmultinomial <- R2jags::jags(data = ddmultinom,
                               inits = initials,
                               parameters.to.save = parameters,
                               model.file = bugmultinom,
                               n.iter = (Iter * Thin + Burn),
                               n.burnin = Burn,
                               n.thin = Thin,
                               n.chains = Chain,
                               DIC = TRUE)

Após o ajuste do modelo, é preciso verificar se houve convergência das cadeias. Inicialmente iremos fazer uma inspeção visual das duas cadeias geradas.

# Extraindo as cadeias dos parâmetros
samples <- as.mcmc(modmultinomial)

#Plotando as cadeias dos betas e sigma1
trace_plot_beta <- mcmc_trace(x = samples,
                              pars = c("beta1","beta2","beta3","beta4","sigma1"),
                              facet_args = list(ncol = 2))

trace_plot_beta

#Plotando as cadeias de alguns u1
trace_plot_u <- mcmc_trace(x = samples,
                           pars = c("u1[1]","u1[5]","u1[9]","u1[12]"),
                           facet_args = list(ncol = 2))

trace_plot_u

Outra característica importante é avaliar o comportamento das autocorrelações em uma cadeia. A seguir, criamos os gráficos usando somente a cadeia 1.

#Plotando o gráfico de autocorrelação dos betas e sigma1 
acf_plot_beta <- mcmc_acf(x = samples[[1]],
                          pars = c("beta1","beta2","beta3","beta4","sigma1"),
                          facet_args = list(ncol = 2))

acf_plot_beta

#Plotando o gráfico de autocorrelação de alguns u1
acf_plot_u <- mcmc_acf(x = samples[[1]],
                       pars = c("u1[1]","u1[5]","u1[9]","u1[12]"),
                       facet_args = list(ncol = 2))

acf_plot_u

Percebemos um problema de convergência, especialmente com o parâmetro \(\beta_1\). Vamos modificar as configuraçòes do ajuste do MCMC.

### Definições do ajuste (número de cadeias, interações, período de aquecimento e espaçamentopara o MCMC):  
Chain <- 2
Iter <- 2000
Burn <- 1000
Thin <- 4

Ajustando novamente o MCMC com a nova configuração. Cuidado! Maior custo computacional.

### Chamando o JAGS:

modmultinomial <- R2jags::jags(data = ddmultinom,
                               inits = initials,
                               parameters.to.save = parameters,
                               model.file = bugmultinom,
                               n.iter = (Iter * Thin + Burn),
                               n.burnin = Burn,
                               n.thin = Thin,
                               n.chains = Chain,
                               DIC = TRUE)
# Extraindo as cadeias dos parâmetros
samples <- as.mcmc(modmultinomial)

#Plotando as cadeias dos betas e sigma1
trace_plot_beta <- mcmc_trace(x = samples,
                              pars = c("beta1","beta2","beta3","beta4","sigma1"),
                              facet_args = list(ncol = 2))

trace_plot_beta

#Plotando as cadeias de alguns u1
trace_plot_u <- mcmc_trace(x = samples,
                           pars = c("u1[1]","u1[5]","u1[9]","u1[12]"),
                           facet_args = list(ncol = 2))

trace_plot_u

Outra forma de verificar convergência das cadeiais é usando a estatística Rhat.

### Todos os parâmteros possuem Rhat < 1.05?
all(modmultinomial$BUGSoutput$summary[, "Rhat"] < 1.05)
[1] TRUE

Vamos avaliar as autocorrelações com essa nova configuração do MCMC.

#Plotando o gráfico de autocorrelação dos betas e sigma1 
acf_plot_beta <- mcmc_acf(x = samples[[1]],
                          pars = c("beta1","beta2","beta3","beta4","sigma1"),
                          facet_args = list(ncol = 2))

acf_plot_beta

#Plotando o gráfico de autocorrelação de alguns u1
acf_plot_u <- mcmc_acf(x = samples[[1]],
                       pars = c("u1[1]","u1[5]","u1[9]","u1[12]"),
                       facet_args = list(ncol = 2))

acf_plot_u

Como as cadeias mostram convergência, podemos agora fazer inferência sobre os parâmetros. Como?

# Gráfico de histogramas das amostras dos betas e sigma1
hist_plot_beta <- mcmc_hist(x = samples,
                            pars = c("beta1","beta2","beta3","beta4","sigma1"),
                            facet_args = list(ncol = 2))


hist_plot_beta

# Gráfico de histogramas de alguns u1
hist_plot_u <- mcmc_hist(x = samples,
                         pars = c("u1[1]","u1[5]","u1[9]","u1[12]"),
                         facet_args = list(ncol = 2))

hist_plot_u

A seguir apresentamos estimativas pontual e intervalar para todos os parâmetros do modelo.

#Um resumo simples das distribuições a posteriori 
print(modmultinomial, digits = 3)
Inference for Bugs model at "/var/folders/nv/pcz0dtyn2p38kqsvxq7782c00000gn/T//RtmpqZPVj6/model17b4600f45a5.txt", fit using jags,
 2 chains, each with 9000 iterations (first 1000 discarded), n.thin = 4
 n.sims = 4000 iterations saved
           mu.vect sd.vect      2.5%       25%       50%       75%     97.5%
beta1        0.010   0.007    -0.004     0.005     0.010     0.015     0.026
beta2       -0.228   0.034    -0.294    -0.252    -0.228    -0.204    -0.162
beta3        0.036   0.027    -0.017     0.018     0.037     0.055     0.089
beta4        0.007   0.014    -0.019    -0.002     0.007     0.016     0.034
sigma1       0.023   0.006     0.015     0.019     0.022     0.027     0.038
u1[1]        0.009   0.009    -0.010     0.003     0.009     0.015     0.027
u1[2]       -0.026   0.011    -0.047    -0.032    -0.025    -0.019    -0.005
u1[3]       -0.001   0.014    -0.028    -0.010    -0.001     0.008     0.026
u1[4]       -0.001   0.010    -0.021    -0.008    -0.001     0.005     0.018
u1[5]        0.033   0.012     0.010     0.025     0.033     0.041     0.058
u1[6]       -0.004   0.008    -0.021    -0.010    -0.004     0.001     0.011
u1[7]       -0.001   0.010    -0.022    -0.008    -0.001     0.006     0.020
u1[8]       -0.007   0.009    -0.024    -0.013    -0.007    -0.002     0.009
u1[9]        0.006   0.014    -0.023    -0.004     0.006     0.015     0.034
u1[10]      -0.003   0.013    -0.028    -0.012    -0.003     0.005     0.021
u1[11]       0.005   0.019    -0.033    -0.007     0.005     0.018     0.044
u1[12]       0.004   0.014    -0.023    -0.005     0.004     0.014     0.032
u1[13]       0.005   0.019    -0.030    -0.008     0.005     0.017     0.043
u1[14]      -0.019   0.021    -0.062    -0.033    -0.018    -0.005     0.018
deviance 30513.489   5.313 30504.775 30509.698 30512.884 30516.665 30525.580
          Rhat n.eff
beta1    1.002   990
beta2    1.001  4000
beta3    1.002  1300
beta4    1.001  4000
sigma1   1.001  4000
u1[1]    1.002  1400
u1[2]    1.001  4000
u1[3]    1.001  2400
u1[4]    1.001  3400
u1[5]    1.001  4000
u1[6]    1.003   830
u1[7]    1.001  2200
u1[8]    1.002  1100
u1[9]    1.001  4000
u1[10]   1.006   290
u1[11]   1.001  4000
u1[12]   1.001  4000
u1[13]   1.001  4000
u1[14]   1.002  3800
deviance 1.003   850

For each parameter, n.eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

DIC info (using the rule, pD = var(deviance)/2)
pD = 14.1 and DIC = 30527.6
DIC is an estimate of expected predictive error (lower deviance is better).

A seguir apresentamos como construir um gráfico com a estimativa pontual e intervalar para \(\beta_1 + u_1\).

# lista com as amostras das distribuições a posteriori 
simslist <- modmultinomial$BUGSoutput$sims.list
# amostra de beta1 
beta1sims <- simslist[["beta1"]]
# amostra de u1 
u1sims <- simslist[["u1"]]
# número de zonas
I <- dim(u1sims)[2]
# amostra de (beta1 + u1):
beta1isims <- apply(u1sims, 2, FUN = function(x) return(x + beta1sims))

# Gráfico
xlim1 <- min(apply(beta1isims, 2, FUN = function(x) quantile(x, prob = 0.005))) 
xlim2 <- max(apply(beta1isims, 2, FUN = function(x) quantile(x, prob = 0.995))) 
plot(c(xlim1, xlim2), c(0, I + 1), type = "n", bty = "n", xlab = "", ylab = "",main = expression(beta[1] + u[i1]), yaxt = "n")
abline(v = 0, lty = 3)
    
# média e intervalo de credibilidade de 95%
estbeta1i <- t(apply(beta1isims, 2,
                     FUN = function(x) c(mean(x), quantile(x, probs = c(0.025, 0.975))))) 
# plota a média:
points(estbeta1i[, 1], I - 1:I, pch = 19)
# plota o intervalo de credibilidade:
segments(estbeta1i[, 2], I - 1:I, estbeta1i[, 3], I - 1:I)
# print labels:
text(xlim1, I - 1:I, paste("Zone", 1:I), cex = 0.8)

Por fim, os autores forneceram uma função que retorna a média e o intervalo de credibilidade de 95% para \(\beta_1\) e RR geral e específico de cada zona. A funçao possui três argumentos, são eles:

  • model: o modelo ajustado com JAGS ou WinBUGS.

  • deltaE: o aumento no nível de exposição para o qual o RR deve ser calculado.

  • credible: percentual para os intervalos de credibilidade. O padrão é 95.

# RR associated to a "deltatemp" degrees increase in temperature:
# increase in temperature to compute RR:
deltatemp <- 5
source("getassoc.R")
rr1stageind <- getassoc(model = modmultinomial,
                        deltaE = deltatemp,
                        credible = 95)
rr1stageind    
      zone     betamean    betacrilo   betacriup        RR      RRlo     RRup
1        1  0.018936091  0.006539315 0.031206573 1.0993075 1.0332370 1.168865
2        2 -0.015509696 -0.032994144 0.001588698 0.9253822 0.8479185 1.007975
3        3  0.009258462 -0.015163923 0.034090954 1.0473805 0.9269834 1.185844
4        4  0.008878925 -0.004676227 0.022374441 1.0453948 0.9768901 1.118370
5        5  0.043087064  0.021825919 0.064507843 1.2404017 1.1153069 1.380629
6        6  0.005596419 -0.001999068 0.013285870 1.0283773 0.9900544 1.068685
7        7  0.009263811 -0.006560137 0.025451199 1.0474085 0.9677314 1.135708
8        8  0.002533237 -0.006972172 0.012167779 1.0127467 0.9657398 1.062728
9        9  0.015524421 -0.011682086 0.041591853 1.0807142 0.9432627 1.231163
10      10  0.006828474 -0.015835066 0.029001805 1.0347319 0.9238779 1.156050
11      11  0.015103381 -0.023374876 0.055299925 1.0784415 0.8896970 1.318506
12      12  0.014310563 -0.012610154 0.040317163 1.0741749 0.9388958 1.223341
13      13  0.015029595 -0.021573416 0.055518436 1.0780437 0.8977469 1.319948
14      14 -0.009138684 -0.052849462 0.030322377 0.9553348 0.7677836 1.163708
15 overall  0.010021564 -0.004356378 0.025551992 1.0521033 0.9784536 1.136280

1.5 Outras possibilidades

1.5.1 Modelo com efeito espacial

\[\begin{align} \mathbf{Y}_{ij}|S_{ij},X & \sim Multinomial(S_{ij},\pi_{ij1},\ldots, \pi_{ijK_{ij}})\\ S_{ij} & = \sum_{k=1}^{K_{ij}} Y_{ijk}\\ \pi_{ijk} & = g_{ijk}/g_{ij}\\ g_{ijk} & = exp(u_{1i}X_{1ijk} + \beta_1 X_{1ijk} + \ldots + \beta_p X_{pijk})\\ g_{ij} & = \sum_{k=1}^{K_{ij}} g_{ijk}\\ u_{1i}|\mathbf{u}_{1(-i)} & \sim N \left(\frac{\sum w_{ij}u_{1j}}{w_{i+}},\frac{\sigma_s^2}{w_{i+}}\right)\\ \beta_l & \sim N(\mu = 0, \sigma^2 = 0.000001), l=1,\ldots,p\\ \sigma_s^2 & = 1/ \tau_s\\ \tau_s & \sim Gama(\alpha = 0.01, r = 0.01) \end{align}\]

1.5.2 Modelo com superdispersão

\[\begin{align} \mathbf{Y}_{ij}|S_{ij},X & \sim Multinomial(S_{ij},\pi_{ij1},\ldots, \pi_{ijK_{ij}})\\ S_{ij} & = \sum_{k=1}^{K_{ij}} Y_{ijk}\\ \pi_{ijk} & = g_{ijk}/g_{ij}\\ g_{ijk} & = exp(u_{1i}X_{1ijk} + \beta_1 X_{1ijk} + \ldots + \beta_p X_{pijk} + \epsilon_{ijk})\\ g_{ij} & = \sum_{k=1}^{K_{ij}} g_{ijk}\\ u_{1i} & \sim N(0,\sigma_1^2)\\ \epsilon_{ijk} & \sim N(0, \sigma^2_{e_i})\\ \beta_l & \sim N(\mu = 0, \sigma^2 = 0.000001), l=1,\ldots,p\\ \sigma_1^2 & = 1/ \tau_1\\ \tau_1 & \sim Gama(\alpha = 0.001, r = 0.001)\\ \sigma_{e_i}^2 & = 1/ \tau_{e_i}\\ \tau_{e_i} & \sim Gama(\alpha = 0.001, r = 0.001) \end{align}\]