Jean V Adams
2012-May-23 15:20 UTC
[R] how a latent state matrix is updated using package R2WinBUGS
I'm trying to understand how a latent state matrix is updated by the MCMC
iterations in a WinBUGS model, using the package R2WinBUGS and an example
from Kery and Schaub's (2012) book, "Bayesian Population Analysis Using
WinBUGS". The example I'm using is 7.3.1. from a chapter on the
Cormack-Jolly-Seber model. Some excerpted code is included at the end of
this message; the full code is available at
http://www.vogelwarte.ch/downloads/files/publications/BPA/bpa-code.txt
The latent state of individual i on occasion t is stored in the z matrix
where rows index individuals (owls that are marked and released) and
columns index capture occasions. Each value in the matrix represents the
latent state for individual i at occasion t: z[i,t]=0 if individual i is
dead at time t, and =1 if individual i is alive at time t.
In the example, a matrix of known values for z is created from the capture
histories and provided as data; I will call it known.z. And a matrix of
initial values (where z is unknown) is also created and provided; I will
call it init.z. The dimensions of these two matrices are 250 individuals
by 6 capture occasions. However, if I save z as a parameter of interest,
the dimensions of the last saved z matrix from the last chain,
last.z <- cjs.c.c$last.values[[cjs.c.c$n.chains]]$z,
are 217 by 5. Why are the dimensions different? What happened to the
other 33 rows (individuals) and 1 column (occasion)? I thought perhaps
that the missing rows corresponded to those rows where all the latent
states are known, but that does not appear to be the case. There were no
individuals with 6 known latent states, and only 4 (not 33) with 5:
table(apply(!is.na(known.z), 1, sum))
0 1 2 3 4 5
162 39 27 14 4 4
Also, how can I verify that the known values of z are maintained in the
iterated z matrices? Even with the loss of 33 rows, those individuals
with 5 known 1=alive latent states don't seem to line up.
seq(known.z[,1])[apply(known.z[,-1], 1, paste,
collapse="")=="11111"]
[1] 2 6 17 46
seq(last.z[,1])[apply(last.z, 1, paste,
collapse="")=="11111"]
[1] 1 26 110 112 115 116
I would appreciate any insight you might have to offer. I am experienced
with R, but relatively inexperienced with WinBUGS and the R2WinBUGS
package. I am using R 2.15.0, R2WinBUGS 2.1-18, and WinBUGS 1.4.3 on
Windows 7.
Thanks.
Jean
> init.z[1:10, ]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA 0 0 0 0 0
[2,] NA NA NA NA NA NA
[3,] NA NA 0 0 0 0
[4,] NA 0 0 0 0 0
[5,] NA 0 0 0 0 0
[6,] NA NA NA NA NA NA
[7,] NA 0 0 0 0 0
[8,] NA NA 0 0 0 0
[9,] NA NA NA 0 0 0
[10,] NA NA NA 0 0 0
> known.z[1:10, ]
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA NA NA NA NA NA
[2,] NA 1 1 1 1 1
[3,] NA 1 NA NA NA NA
[4,] NA NA NA NA NA NA
[5,] NA NA NA NA NA NA
[6,] NA 1 1 1 1 1
[7,] NA NA NA NA NA NA
[8,] NA 1 NA NA NA NA
[9,] NA 1 1 NA NA NA
[10,] NA 1 1 NA NA NA
> last.z[1:10, ]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 0 0 0 0 1
[3,] 0 0 0 0 1
[4,] 0 0 0 0 0
[5,] 0 0 0 0 1
[6,] 1 1 1 0 0
[7,] 0 0 0 0 0
[8,] 0 0 0 0 1
[9,] 0 0 0 0 0
[10,] 0 0 0 0 0
model {
# Priors and constraints
for (i in 1:nind){
for (t in f[i]:(n.occasions-1)){
phi[i,t] <- mean.phi
p[i,t] <- mean.p
} #t
} #i
mean.phi ~ dunif(0, 1) # Prior for mean survival
mean.p ~ dunif(0, 1) # Prior for mean recapture
# Likelihood
for (i in 1:nind){
# Define latent state at first capture
z[i,f[i]] <- 1
for (t in (f[i]+1):n.occasions){
# State process
z[i,t] ~ dbern(mu1[i,t])
mu1[i,t] <- phi[i,t-1] * z[i,t-1]
# Observation process
y[i,t] ~ dbern(mu2[i,t])
mu2[i,t] <- p[i,t-1] * z[i,t]
} #t
} #i
}
# Call WinBUGS from R
cjs.c.c <- bugs(
data = list(z = known.z, <snipped>),
inits = list(z = init.z, <snipped>),
parameters.to.save = c("z", <snipped>),
<snipped>
)
[[alternative HTML version deleted]]
Uwe Ligges
2012-May-26 14:30 UTC
[R] how a latent state matrix is updated using package R2WinBUGS
On 23.05.2012 17:20, Jean V Adams wrote:> I'm trying to understand how a latent state matrix is updated by the MCMC > iterations in a WinBUGS model, using the package R2WinBUGS and an example > from Kery and Schaub's (2012) book, "Bayesian Population Analysis Using > WinBUGS". The example I'm using is 7.3.1. from a chapter on the > Cormack-Jolly-Seber model. Some excerpted code is included at the end of > this message; the full code is available at > > http://www.vogelwarte.ch/downloads/files/publications/BPA/bpa-code.txt > > The latent state of individual i on occasion t is stored in the z matrix > where rows index individuals (owls that are marked and released) and > columns index capture occasions. Each value in the matrix represents the > latent state for individual i at occasion t: z[i,t]=0 if individual i is > dead at time t, and =1 if individual i is alive at time t. > > In the example, a matrix of known values for z is created from the capture > histories and provided as data; I will call it known.z. And a matrix of > initial values (where z is unknown) is also created and provided; I will > call it init.z. The dimensions of these two matrices are 250 individuals > by 6 capture occasions. However, if I save z as a parameter of interest, > the dimensions of the last saved z matrix from the last chain, > last.z<- cjs.c.c$last.values[[cjs.c.c$n.chains]]$z, > are 217 by 5. Why are the dimensions different? What happened to the > other 33 rows (individuals) and 1 column (occasion)? I thought perhaps > that the missing rows corresponded to those rows where all the latent > states are known, but that does not appear to be the case. There were no > individuals with 6 known latent states, and only 4 (not 33) with 5: > table(apply(!is.na(known.z), 1, sum)) > 0 1 2 3 4 5 > 162 39 27 14 4 4 > > Also, how can I verify that the known values of z are maintained in the > iterated z matrices? Even with the loss of 33 rows, those individuals > with 5 known 1=alive latent states don't seem to line up. > seq(known.z[,1])[apply(known.z[,-1], 1, paste, collapse="")=="11111"] > [1] 2 6 17 46 > seq(last.z[,1])[apply(last.z, 1, paste, collapse="")=="11111"] > [1] 1 26 110 112 115 116 > > I would appreciate any insight you might have to offer. I am experienced > with R, but relatively inexperienced with WinBUGS and the R2WinBUGS > package. I am using R 2.15.0, R2WinBUGS 2.1-18, and WinBUGS 1.4.3 on > Windows 7.R2WinBUGS is just an interface package for R that exports data, calls WinBUGS and imports the results. For BUGS related questions, i.e. in particular the correct specification of the model (file), I'd recommend to ask on the BUGS related mailing lists. Note that the new version of WinBUGS is called OpenBUGS and the is a more "direct" R interface called BRugs. Best, Uwe Ligges> Thanks. > > Jean > > > >> init.z[1:10, ] > [,1] [,2] [,3] [,4] [,5] [,6] > [1,] NA 0 0 0 0 0 > [2,] NA NA NA NA NA NA > [3,] NA NA 0 0 0 0 > [4,] NA 0 0 0 0 0 > [5,] NA 0 0 0 0 0 > [6,] NA NA NA NA NA NA > [7,] NA 0 0 0 0 0 > [8,] NA NA 0 0 0 0 > [9,] NA NA NA 0 0 0 > [10,] NA NA NA 0 0 0 > >> known.z[1:10, ] > [,1] [,2] [,3] [,4] [,5] [,6] > [1,] NA NA NA NA NA NA > [2,] NA 1 1 1 1 1 > [3,] NA 1 NA NA NA NA > [4,] NA NA NA NA NA NA > [5,] NA NA NA NA NA NA > [6,] NA 1 1 1 1 1 > [7,] NA NA NA NA NA NA > [8,] NA 1 NA NA NA NA > [9,] NA 1 1 NA NA NA > [10,] NA 1 1 NA NA NA > >> last.z[1:10, ] > [,1] [,2] [,3] [,4] [,5] > [1,] 1 1 1 1 1 > [2,] 0 0 0 0 1 > [3,] 0 0 0 0 1 > [4,] 0 0 0 0 0 > [5,] 0 0 0 0 1 > [6,] 1 1 1 0 0 > [7,] 0 0 0 0 0 > [8,] 0 0 0 0 1 > [9,] 0 0 0 0 0 > [10,] 0 0 0 0 0 > > model { > # Priors and constraints > for (i in 1:nind){ > for (t in f[i]:(n.occasions-1)){ > phi[i,t]<- mean.phi > p[i,t]<- mean.p > } #t > } #i > > mean.phi ~ dunif(0, 1) # Prior for mean survival > mean.p ~ dunif(0, 1) # Prior for mean recapture > # Likelihood > for (i in 1:nind){ > # Define latent state at first capture > z[i,f[i]]<- 1 > for (t in (f[i]+1):n.occasions){ > # State process > z[i,t] ~ dbern(mu1[i,t]) > mu1[i,t]<- phi[i,t-1] * z[i,t-1] > # Observation process > y[i,t] ~ dbern(mu2[i,t]) > mu2[i,t]<- p[i,t-1] * z[i,t] > } #t > } #i > } > > # Call WinBUGS from R > cjs.c.c<- bugs( > data = list(z = known.z,<snipped>), > inits = list(z = init.z,<snipped>), > parameters.to.save = c("z",<snipped>), > <snipped> > ) > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.