2011-11-24 21 views
6

Me pregunto si alguien tiene algún código R que use el paquete R2WinBUGS para ejecutar la regresión logística, idealmente con datos simulados para generar la 'verdad' y dos covariables continuas.R2WinBUGS - regresión logística con datos simulados

Gracias.

Cristiano

PS:

código potencial para generar datos artificiales (un caso) y dimensiones Winbugs ejecutar a través de r2winbugs (que no funciona todavía).

library(MASS) 
library(R2WinBUGS) 

setwd("d:/BayesianLogisticRegression") 

n.site <- 150 

X1<- sort(runif(n = n.site, min = -1, max =1)) 

xb <- 0.0 + 3.0*X1 

occ.prob <- 1/(1+exp(-xb)) 

plot(X1, occ.prob,xlab="X1",ylab="occ.prob") 

true.presence <- rbinom(n = n.site, size = 1, prob = occ.prob) 

plot(X1, true.presence,xlab="X1",ylab="true.presence") 

# combine data as data frame and save 
data <- data.frame(X1, true.presence) 
write.matrix(data, file = "data.txt", sep = "\t") 

sink("model.txt") 
cat(" 
model { 

# Priors 
alpha ~ dnorm(0,0.01) 
beta ~ dnorm(0,0.01) 

# Likelihood 
for (i in 1:n) { 
    C[i] ~ dbin(p[i], N)  # Note p before N 
    logit(p[i]) <- alpha + beta *X1[i] 
} 
} 
",fill=TRUE) 
sink() 

# Bundle data 
win.data <- list(mass = X1, n = length(X1)) 

# Inits function 
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1))} 

# Parameters to estimate 
params <- c("alpha", "beta") 

# MCMC settings 
nc <- 3 #Number of Chains 
ni <- 1200 #Number of draws from posterior 
nb <- 200 #Number of draws to discard as burn-in 
nt <- 2 Thinning rate 

# Start Gibbs sampling 
out <- bugs(data=win.data, inits=inits, parameters.to.save=params, 
model.file="model.txt", n.thin=nt, n.chains=nc, n.burnin=nb, 
n.iter=ni, debug = TRUE) 
+1

la página 140 de http://books.google.ca/books?id = WpeZyTc6U94C le da una respuesta parcial. Google "regresión logística WinBUGS" también recibe muchos éxitos, no los he visto todos pero sospecha que probablemente haya código allí. ¿Puedes publicar lo que has intentado hasta ahora? También vea el paquete 'glmmBUGS' ... –

+0

Estoy buscando especialmente el código R (paquete R2WinBUGS) junto con la generación artificial de datos. – cs0815

+0

Hola csetzkorn! ¿Conoces a Marc Kery? De la pregunta anterior parece que estás usando un código del libro de Marc Kery :-) Tiene muchos ejemplos sobre esto ... – TMS

Respuesta

5

Su secuencia de comandos es exactamente la manera de hacerlo. Casi se está trabajando, sólo se requiere un cambio sencillo de hacer que funcione:

win.data <- list(X1 = X1, n = length(X1), C = true.presence, N = 1) 

que define qué datos van a WinBugs. La variable C debe llenarse con verdadera. La presencia, N debe ser 1 de acuerdo con los datos generados. Tenga en cuenta que este es un caso especial de distribución binomial para N = 1, que se llama Bernoulli, un simple "lanzamiento de moneda".

Aquí está la salida:

> print(out, dig = 3) 
Inference for Bugs model at "model.txt", fit using WinBUGS, 
3 chains, each with 1200 iterations (first 200 discarded), n.thin = 2 
n.sims = 1500 iterations saved 
      mean sd 2.5%  25%  50%  75% 97.5% Rhat n.eff 
alpha  -0.040 0.221 -0.465 -0.187 -0.037 0.114 0.390 1.001 1500 
beta  3.177 0.478 2.302 2.845 3.159 3.481 4.165 1.000 1500 
deviance 136.438 2.059 134.500 135.000 135.800 137.200 141.852 1.001 1500 

como ves, los parámetros se corresponden con los parámetros utilizados para generar los datos. Además, si lo compara con la solución frecuentadora, verá que corresponde.

EDIT: pero la típica regresión logística (~ binomial) mediría algunos conteos con algún valor superior N [i], y permitiría diferentes N [i] para cada observación. Por ejemplo, diga la proporción de juveniles a toda la población (N). Para ello sería necesario sólo para añadir índice a N en su modelo:

C[i] ~ dbin(p[i], N[i]) 

La generación de los datos sería algo como:

N = rpois(n = n.site, lambda = 50) 
juveniles <- rbinom(n = n.site, size = N, prob = occ.prob) 
win.data <- list(X1 = X1, n = length(X1), C = juveniles, N = N) 

(final de edición)

Para más ejemplos de ecología de la población, ver books of Marc Kéry (Introducción a WinBUGS para ecologistas, y especialmente a Bayesian Population Analysis usando WinBUGS: una perspectiva jerárquica, que es un gran libro).

El guión completo que utiliza - el guión corregido de los suyos está aquí (la comparación con soluciones frequentist al final):

#library(MASS) 
library(R2WinBUGS) 

#setwd("d:/BayesianLogisticRegression") 

n.site <- 150 

X1<- sort(runif(n = n.site, min = -1, max =1)) 

xb <- 0.0 + 3.0*X1 

occ.prob <- 1/(1+exp(-xb)) # inverse logit 

plot(X1, occ.prob,xlab="X1",ylab="occ.prob") 

true.presence <- rbinom(n = n.site, size = 1, prob = occ.prob) 

plot(X1, true.presence,xlab="X1",ylab="true.presence") 

# combine data as data frame and save 
data <- data.frame(X1, true.presence) 
write.matrix(data, file = "data.txt", sep = "\t") 

sink("tmp_bugs/model.txt") 
cat(" 
model { 

# Priors 
alpha ~ dnorm(0,0.01) 
beta ~ dnorm(0,0.01) 

# Likelihood 
for (i in 1:n) { 
    C[i] ~ dbin(p[i], N)  # Note p before N 
    logit(p[i]) <- alpha + beta *X1[i] 
} 
} 
",fill=TRUE) 
sink() 

# Bundle data 
win.data <- list(X1 = X1, n = length(X1), C = true.presence, N = 1) 

# Inits function 
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1))} 

# Parameters to estimate 
params <- c("alpha", "beta") 

# MCMC settings 
nc <- 3 #Number of Chains 
ni <- 1200 #Number of draws from posterior 
nb <- 200 #Number of draws to discard as burn-in 
nt <- 2 #Thinning rate 

# Start Gibbs sampling 
out <- bugs(data=win.data, inits=inits, parameters.to.save=params, 
model.file="model.txt", n.thin=nt, n.chains=nc, n.burnin=nb, 
n.iter=ni, 
working.directory = paste(getwd(), "/tmp_bugs/", sep = ""), 
debug = TRUE) 

print(out, dig = 3) 

# Frequentist approach for comparison 
m1 = glm(true.presence ~ X1, family = binomial) 
summary(m1) 

# normally, you should do it this way, but the above also works: 
#m2 = glm(cbind(true.presence, 1 - true.presence) ~ X1, family = binomial) 
+1

Como tu ejemplo no es una regresión logística típica, he agregado una nota sobre dicha regresión típica. Ver editar. – TMS

+0

Gracias Tomas T. Esto es exactamente lo que necesitaba. Ya tengo el libro: Introducción a WinBUGS para ecologista.De ahí tomé un código. Tengo que admitir que aún no entiendo completamente la generación de datos. Por lo general, habría aplicado un umbral al resultado de la función de enlace (por ejemplo, si la probabilidad> = 0.5 luego 1 más 0 para la verdadera.presencia). ¿La distribución binomial introduce otra capa de aleatoriedad? – cs0815

+0

BTW en última instancia, me gustaría ajustar esto para el caso de presencia única como se discute aquí: Aumento de datos en modelado bayesiano de datos de solo presencia (¿se puede acceder a él?). Podría publicar esto como otra pregunta y realmente apreciaría si pudieras ayudarme con esto ... ¡Gracias hasta ahora! – cs0815

Cuestiones relacionadas