Skip to content

Instantly share code, notes, and snippets.

@JLBaroja
Created March 16, 2022 21:54
Show Gist options
  • Save JLBaroja/fa2fc31a8af7d3f91d912a0da1508736 to your computer and use it in GitHub Desktop.
Save JLBaroja/fa2fc31a8af7d3f91d912a0da1508736 to your computer and use it in GitHub Desktop.
Cool traceplot to explore JAGS chains
new_traceplot <- function(bys,node_name){
# Grafica cada cadena del nodo 'node_name' dentro del
# objeto 'bys' que contiene el resultado de JAGS.
# El nombre del nodo 'node_name' permite indexación,
# es decir que permite graficar una sola posición de nodos
# multidimensionales.
# Las cadenas (y sus dimensiones) están en la partición
# 'bys$BUGSoutput$sims.array',
# en donde 'bys' es la lista en R que guarda el resultado
# que genera la función 'jags()'.
n_iter <- dim(bys$BUGSoutput$sims.array)[1] # Primera dimensión *siempre* tiene iteraciones
n_chains <- dim(bys$BUGSoutput$sims.array)[2] # Segunda *siempre* tiene número de cadenas
iterations <- bys$BUGSoutput$sims.array[,,node_name] # 'node_name' es una cadena que incluye índice
# e.g., 'node_name' puede ser 'theta_post[2]', 'a_post[9]', o 'k_prior[45,12,1]' si dicho nodo tuviera
# tres dimensiones...
# Extrayendo información adicional (p.s., ¡todo está en algún lado de 'bys'!):
r_hat <- round(bys$BUGSoutput$summary[node_name,'Rhat'],3) # Rhat
n_eff <- bys$BUGSoutput$summary[node_name,'n.eff'] # n.eff
model_file <- bys$model.file # Nombre del archivo de texto que contiene el modelo
n_burnin <- bys$BUGSoutput$n.burnin
n_thin <- bys$BUGSoutput$n.thin
n_iter_tot <- bys$BUGSoutput$n.iter
paleta <- c('#fd2c3b','#6314af','#fe8f06','#88dc40','#21f0b6','#2379cc','#e1d936')
cols <- sample(x = paleta,size = n_chains) # Colores aleatorios cada que corre la función
ylims <- c(min(iterations),max(iterations))
par(bg='#000000',fg='#aaaaaa',col.axis='#aaaaaa',oma=c(1,1,1,1))
plot(NULL,xlim=c(1,n_iter),ylim=ylims,axes=F,ann=F)
for(cc in 1:n_chains){
lines(1:n_iter,iterations[,cc],lwd=2,
col=cols[cc])
}
axis(1)
mtext('iteraciones',1,line=2,cex=1.5)
axis(2,cex.axis=1.5)
mtext('nodo',2,line=2.5,cex=1.5)
# 'paste()' permite crear una sola cadena de caracteres pegando varias cadenas
# definidas en objetos diferentes:
mtext(paste(model_file,', ',
node_name,
', R.hat=',r_hat,
', n.eff=',n_eff,
'\nn_cadenas=',n_chains,
', iteraciones por cadena=',n_iter_tot,
', iteraciones "quemadas"=',n_burnin,
', n_thin=',n_thin,
sep=''),cex=2)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment