Reunião PPAG

1 Bugs

set.seed(09042019)

x = rnorm(100,3,sqrt(4))
y = ifelse(x<0,-5,x)

sink("mod1.txt")        
cat("
    MODEL LR1 {
    #Verossimilhança 

    for(i in 1:N) {
    y[i] ~ dnorm(mu,tau)I(0,)
    }

    #Proris
     
    mu ~ dnorm(0,0.1)
    tau ~ dgamma(1,0.1)

    } ", fill = TRUE)
## 
##     MODEL LR1 {
##     #Verossimilhança 
## 
##     for(i in 1:N) {
##     y[i] ~ dnorm(mu,tau)I(0,)
##     }
## 
##     #Proris
##      
##     mu ~ dnorm(0,0.1)
##     tau ~ dgamma(1,0.1)
## 
##     }
sink()
#Obeservação: A dist normal no bugs está definido para a precisão. 
#Tamanho amostral
N = length(y)
#Conjunto de dados observados
data = list("N","y")
#Parâmetros estudados
params = c("mu", "tau")  
#Valores iniciais
inits <- function () {list(mu = 0,
                           tau = 1)}

#result <- bugs(data = data, inits = inits, parameters.to.save = params,
#              model.file = "mod1.txt", n.chains = 3, n.iter = 10000,
#              n.burnin = 1000, n.thin=9, bugs.directory = "C:\\WinBUGS14",
#              debug = TRUE, save.history = TRUE, DIC = FALSE)
#result$summary
Parâmetros Real Média a Posteriori 2.5% 97.5%
mu 3 2,81 2,36 3,28
tau 0,25 0,18 0,13 0,23

2 Jags

model_code = 
'model{
for(i in 1:N){
x[i] ~ dinterval(y[i],0)
y[i] ~ dnorm(mu,tau)}
mu ~ dnorm(0,0.1)
tau ~ dgamma(1,0.1)}'
  
N = length(y)

model_data = list( y = y , N = N)

model_parameters =  c("mu", "tau")

model_run = jags(data = model_data,
                 parameters.to.save = model_parameters,
                 model.file=textConnection(model_code),
                 n.chains=3, # Number of different starting positions
                 n.iter=10000, # Number of iterations
                 n.burnin=1000, # Number of iterations to remove at start
                 n.thin=9,# Amount of thinning
                 DIC=FALSE) 
## module glm loaded
## module dic loaded
## Compiling model graph
##    Resolving undeclared variables
##    Allocating nodes
## Graph information:
##    Observed stochastic nodes: 100
##    Unobserved stochastic nodes: 2
##    Total graph size: 206
## 
## Initializing model
model_run$BUGSoutput
## Inference for Bugs model at "5", fit using jags,
##  3 chains, each with 10000 iterations (first 1000 discarded), n.thin = 9
##  n.sims = 3000 iterations saved
##     mean  sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
## mu   2.8 0.2  2.4 2.7 2.8 3.0   3.3    1  2600
## tau  0.2 0.0  0.1 0.2 0.2 0.2   0.2    1  3000
## 
## 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).
hdi(model_run$BUGSoutput$sims.matrix[,2])
##     lower     upper 
## 0.1388523 0.2405011 
## attr(,"credMass")
## [1] 0.95

3 Stan

model = "data {
  int<lower=0> N_obs;
  int<lower=0> N_cens;
  real y_obs[N_obs];
  real<lower=max(y_obs)> U;
}
parameters {
  real<lower=U> y_cens[N_cens];
  real mu;
  real<lower=0> sigma;
}
model {
  y_obs ~ normal(mu, sigma);
  y_cens ~ normal(mu, sigma);
  mu ~ normal(0,10)
  sigma ~ gamma(0,0.1)
}"


data <- list(y = y, x = x, N = N)
fit <- stan(model_code = model,
            data = data, iter = 1000, warmup = 100, chains = 2)

4 Nimble

simpleCode1 <- nimbleCode({
for(i in 1:N){
x[i] ~ dinterval(y[i],0)
y[i] ~ dnorm(mu,tau)}
  
mu ~ dnorm(0,10)
tau ~ dgamma(1,0.1)})

simpleModel1 <- nimbleModel(simpleCode1,
                            data = list(y = y, x = x),
                            constants = list(N = N),
                            inits = list(mu = 0, tau = 1))

mcmc.out <- nimbleMCMC(code = simpleModel1, 
                       data = list(y = y, x = x), 
                       inits = list(mu = 0, tau = 1),
                       monitors=c("mu","tau"),
                       nchains = 2, 
                       niter = 1000,
                       summary = TRUE, 
                       progressBar = TRUE)

5 INLA

O MCMC é a metodologia mais usual na modelagem Bayesiana. Auferidas as condições necessárias, ganha-se propriedades de otimalidade que nenhum outro método, nesta seara, consegue oferecer. No entanto, tais propriedades carregam consigo um custo computacional que, em situações de ordem prática, são inalcançáveis. Com o surgimento de modelos estruturalmente mais complexos e com a incorporação de bases mais robustas, tem-se a necessidade de avaliar metodologias computacionalmente menos custosas.

Uma das propostas metodológicas é o Integrated Nested Laplace Approximation, doravante INLA. Parte-se de alguns pressupostos

  1. A classe de modelos estudada tem estrutura aditiva, isto é:

\(\eta_i = \alpha + \sum_{j=1}^{n_f}f^{(j)}(u_{ij}) + \sum_{k=1}^{n_\beta}\beta_kZ_{ki} + \epsilon_i\)

Em particular, quando atribui-se priori aos parâmetros acima, tem-se a classe de modelos chamada Gaussiano Latente.

Para os casos particulares da Estrutura Aditiva, os modelos mais bem aplicáveis são: Regressão Linear, Modelos Dinâmicos, Modelos Espaciais, Modelos Espaço-Temporais.

Embora exista a limitação de modelos, isto é, o MCMC por exemplo é mais genérico, a classe supracitada é a mais amplamente utilizada em modelagem, de uma forma geral.

  1. Gaussian Markov random field (GMRF)

O caso particular do Campo Latente Gaussiano que admite propriedade de independência condicional e possui uma matriz de precisão esparsa. É necessário assumir estas condições para a boa aproximação e menos custo computacional.

5.1 Aproximação analítica

A chave para esta metolodogia esta nas segunintes expressões

  1. \(\widetilde{\pi}(x_i|\mathbf{y}) = \int \widetilde{\pi}(x_i|\mathbf{\theta},\mathbf{y})\widetilde{\pi}(\mathbf{\theta}|\mathbf{y})d\theta\)

  2. \(\widetilde{\pi}(\theta_j|\mathbf{y}) = \int\widetilde{\pi}(\theta|\mathbf{y})d\theta_{-j}\)

Onde \(x\) é o Campo Gaussiano e \(\theta\) é o vetor hiperparamétrico, em geral contendo variâncias, precisões, correlações, etc.

O Campo Gaussiano é tão somente o preditor linear como ele é definido, por exemplo:

Seja \(\eta_i = \beta_0 + \beta_ic_t + u_t + v_t\)

Onde \(\beta_i\) para qualquer i é uma componente fixa, \(c_t\) é uma variável que varia no tempo, \(u_t\) é um processo autoregressivo(1) (\(u_t = \phi u_{t-1}+e_t\)) e \(v_t\) é um termo não estruturado, um ruído. \(u_t\) e \(v_t\) são chamados de componentes aleatórias.

Logo,

\(\mathbf{x} = (\beta_0,\beta_i,\mathbf{u},\mathbf{v},\mathbf{\eta})\)

e

\(\mathbf{\theta} = (\phi,\sigma^2,\sigma_{v}^{2})\)

Observe que em geral a dimensão do Campo Gaussiano é grande, e em contrapartida, a dimensão do vetor hiperparamétrico costuma ser pequena.

O algoritmo INLA funciona basicamnete atribuindo distribuições as conjuntas maiores e avaliando as marginais por meio de integração numérica.

A primeira epata é calcular as marginais hiperparamétricas, mas para tal, precisa-se definir uma distribuição para \(\mathbf{\theta|y}\), para que depois seja possível integral cada marginal separadamente.

A abordagem mais simples é assumir uma aproximação de Laplace, embora esta distribuição tende a divergir da gaussianidade, sendo assim não suficientemente acurado. A abordagem mais correta, embora computacionalmente mais custosa, baseia-se na seguinte aproximação.

\(\widetilde{\pi}(\theta|\mathbf{y}) \propto \cfrac{\pi(x,\theta,y)}{\widetilde{\pi_g}(x|\theta,y)}\)

Sendo o denominador apresentado uma aproximação gaussiana, auferida pela aproximação de Laplace, avaliado na moda dos conhecidos.

A próxima etapa é calcular as marginais para os elementos do Campo Gaussiano.

Tem-se que

\(\widetilde{\pi}(x_i|\mathbf{y},\theta) = N(\mu_i(\theta),\sigma^2_i(\theta))\)

Obtidas através de uma distribuição Normal Multivariada com média sendo as modas de cada parâmetro e a matriz de variância e covariância obtida através da Matriz Hessiana.

Por fim, obtem-se:

\(\widetilde{\pi}(x_i|\mathbf{y}) = \sum_k \widetilde{\pi}(x_i|\mathbf{y},\theta_k)\widetilde{\pi}(\theta_k|\mathbf{y})\Delta_k\)

A ideia do INLA é, como foi descrito anterior, aproximando distribuições maiores por Laplace, e ruduzindo as marginais através de integração numérica.

Rafael Cabral Fernandez

2019-04-15