• Nenhum resultado encontrado

norma <- dmvnorm(mat.nodes,mean=z.chapeu,sigma=H,log=TRUE) integral = mean(exp(funcao(mat.nodes,...) - norma))

}

return(integral) }

4.4 Modelo Poisson com intercepto aleatório

Na seção 4.2.1 simulamos dados de um modelo Poisson com intercepto aleatório definido em 4.8. Agora vamos ver como usar os diversos métodos de integração numérica dentro do processo de estimação dos parâmetros θ = (β0,τ)deste modelo. O primeiro passo é escrever uma função com modelo completo como no código 4.66.

No código 4.67 definimos uma função genérica que capta um conjunto de dados e monta a log-verossimilhança, já integrada de acordo com uma das opções de integração apresentadas anteriormente. Essa função vai ser usada para diversos modelos com efeitos aleatórios apresentados neste texto.

A função veroM() foi definida de forma genérica. Alternativamente, pode-se definir uma função específica para cada modelo. Para o modelo Poisson com intercepto aleatório definimos o código 4.68.

Usando a função mle2() para estimar os parâmetros via o algoritmo

BFGS, e aproximação de Laplace, temos o seguinte.

system.time(P.laplace <- mle2(mod.Poisson,start=list(b0=0,tau=log(1/4)), data=list(integral="LAPLACE",otimizador = "BFGS", n.dim=1,

4.4. MODELOPOISSON COM INTERCEPTO ALEATÓRIO 153

Código 4.66: Integrando da função de verossimilhança para o modelo de regressão de Poisson com efeito aleatório de intercepto.

Poisson.Int <- function(b,beta.fixo, prec.pars, X, Z, Y,log=TRUE){

tau <- exp(prec.pars) ll = sapply(b,function(bi){

preditor <- as.matrix(X)%*%beta.fixo + as.matrix(Z)%*%bi lambda <- exp(preditor)

sum(dpois(Y,lambda=lambda,log=TRUE)) + dnorm(bi, 0, sd = 1/tau , log=TRUE) })

if(log == FALSE){ll <- exp(ll)}

return(ll)}

dados=dados, pontos=NA))) user system elapsed

2.392 0.012 2.406 summary(P.laplace)

Maximum likelihood estimation Call:

mle2(minuslogl = mod.Poisson, start = list(b0 = 0, tau = log(1/4)), data = list(integral = "LAPLACE", otimizador = "BFGS", n.dim = 1,

dados = dados, pontos = NA)) Coefficients:

Estimate Std. Error z value Pr(z) b0 2.00696 0.07272 27.5986 < 2.2e-16 tau 1.62067 0.29635 5.4687 4.534e-08 -2 log L: 491.6252

Para os demais métodos de integração obtemos os seguintes valores da log-verossimilhança:

par <- coef(P.laplace)

MET <- c("LAPLACE","GH","MC","QMH","QMS","AGH","AMC","AQMH","AQMS") sapply(MET, function(metodo){

mod.Poisson(b0=par[1],tau=par[2], integral=metodo,

pontos=21, n.dim=1,otimizador="BFGS", dados=dados)})

LAPLACE GH MC QMH QMS AGH AMC AQMH

245.8126 243.9302 248.7211 245.2455 244.9611 245.8104 245.8128 245.7723 AQMS

245.8448

Neste exemplo todos os métodos apresentaram valores muito próxi-mos do obtido pela aproximação de Laplace, mais isto não significa que todos possuem o mesmo comportamento numérico. Por exemplo, o mé-todo Monte Carlo, requer muitos pontos para convergência, o que o torna muito lento pois a cada iteração estamos re-sorteando de uma gaussiana

Código 4.67: Função de verossimilhança genérica com opções de método de integração numérica.

veroM <- function(modelo, formu.X, formu.Z, beta.fixo, prec.pars, integral, pontos, otimizador, n.dim, dados){

dados.id <- split(dados, dados$ID) ll <- c() X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=TRUE)}

if(integral == "GH"){

ll[i] <- gauss.hermite.multi(modelo, n.pontos= pontos, n.dim=n.dim, X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=FALSE)}

if(integral == "MC"){

ll[i] <- monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, tipo= "MC", X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars, log=FALSE)}

if(integral == "QMH"){

ll[i] <- monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, tipo= "Halton", X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo,

prec.pars=prec.pars,log=FALSE)}

if(integral == "QMS"){

ll[i] <- monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, tipo= "Sobol", X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=F)}

if(integral == "AGH"){

ll[i] <- adaptative.gauss.hermite(modelo,n.pontos=pontos, n.dim=n.dim, otimizador=otimizador,

X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=TRUE)}

if(integral == "AMC"){

ll[i] <- adaptative.monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, otimizador=otimizador, tipo="MC", X=X, Z=Z, Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=TRUE)}

if(integral == "AQMH"){

ll[i] <- adaptative.monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, otimizador=otimizador, tipo="Halton", X=X, Z=Z,

Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=TRUE)}

if(integral == "AQMS"){

ll[i] <- adaptative.monte.carlo(modelo,n.pontos=pontos, n.dim=n.dim, otimizador=otimizador, tipo="Sobol", X=X, Z=Z,

Y=dados.id[[i]]$y, beta.fixo=beta.fixo, prec.pars=prec.pars,log=TRUE)}

}

return(sum(log(ll))) }

4.4. MODELOPOISSON COM INTERCEPTO ALEATÓRIO 155

Código 4.68: Função de verossimilhança marginal para o modelo de regres-são de Poisson com efeito aleatório de intercepto.

mod.Poisson <- function(b0, tau, integral, pontos, otimizador, n.dim, dados) {

ll = veroM(modelo = Poisson.Int, formu.X = "~1", formu.Z = "~1", beta.fixo = b0, prec.pars = tau, integral = integral,

pontos = pontos, otim = otimizador, n.dim = n.dim, dados = dados)

return(-ll) }

multivariada. Alternativamente e de forma mais eficiente, podemos sor-tear apenas uma vez e usar os mesmos pontos em todas as iterações do algoritmo numérico. O mesmo se aplicada a todos os outros métodos.

Para implementações mais eficientes devemos abandonar ou alterar a função genérica apresentada aqui apenas como exemplo didático. Algorit-mos mais eficientes podem já receber os pontos de integração como argu-mento da função. Implementações análogas podem ser feitas para imple-mentar a quadratura de Gauss-Hermite de forma mais eficiente. Ressalta-mos que neste momento não estaRessalta-mos interessados em eficiência computa-cional, apenas em apresentar os aspectos gerais dos métodos de integração numérica.

O mesmo ajuste feito anteriormente utilizando Laplace fornece o resul-tado a seguir usando quadratura de Gauss-Hermite.

system.time(P.GH <- mle2(mod.Poisson,start=list(b0=0,tau=log(1/4)), data=list(integral="GH",pontos=100, n.dim=1, dados=dados))) user system elapsed

6.916 0.012 6.928 summary(P.GH)

Maximum likelihood estimation Call:

mle2(minuslogl = mod.Poisson, start = list(b0 = 0, tau = log(1/4)), data = list(integral = "GH", pontos = 100, n.dim = 1, dados = dados)) Coefficients:

Estimate Std. Error z value Pr(z) b0 2.016415 0.073391 27.4749 < 2.2e-16 tau 1.635619 0.291655 5.6081 2.046e-08 -2 log L: 491.7102

Repetimos ainda o ajuste com quasi-Monte Carlo com os pontos de So-bol. Neste exemplo, obtemos resultados semelhantes porém com tempos computacionais diferentes.

system.time(P.AQMS <- mle2(mod.Poisson,start=list(b0=0,tau=log(1/4)), data=list(integral="AQMS",pontos=10,otimizador="BFGS",

n.dim=1, dados=dados))) user system elapsed 2.836 0.000 2.837 summary(P.AQMS)

Maximum likelihood estimation Call:

mle2(minuslogl = mod.Poisson, start = list(b0 = 0, tau = log(1/4)), data = list(integral = "AQMS", pontos = 10, otimizador = "BFGS",

n.dim = 1, dados = dados)) Coefficients:

Estimate Std. Error z value Pr(z) b0 2.006742 0.072648 27.6227 < 2.2e-16 tau 1.622157 0.296599 5.4692 4.521e-08 -2 log L: 491.7037

Com isso, passamos por todas as etapas do processo de estimação de um modelo de regressão com efeitos aleatórios ilustrando os princípios básicos e fundamentos dos algoritmos. Na sequência, vamos discutir alguns mode-los com mais elementos, como por exemplo, com diferentes estruturas de efeitos aleatórios. O processo de especificação/implementação do modelo e os métodos de integração seguem os mesmos princípios vistos até aqui.

Nos próximos exemplos, mudamos a matrizZde delineamento associada aos efeitos aleatórios.