## The function is currently defined as
function (Z, EZ, rho, Y, YL, odmax, odobs)
{
sz <- sqrt(1 - rho^2)
ut <- upper.tri(Z)
lt <- lower.tri(Z)
rws <- outer(1:nrow(Z), rep(1, nrow(Z)))
for (y in sample(c(0:ncol(YL)))) {
if (y < 2) {
if (y == 0) {
lbm <- rep(-Inf, nrow(Z))
}
if (y == 1) {
lbm <- pmax(0, apply(Z - (Y != 0) * (Inf^(Y !=
0)), 1, max, na.rm = TRUE))
}
}
if (y >= 2) {
lbm <- Z[cbind(1:nrow(Z), YL[, y - 1])]
}
if (y < ncol(YL)) {
ubm <- Z[cbind(1:nrow(Z), YL[, y + 1])]
}
if (y == 0) {
ubm[odobs < odmax] <- 0
}
if (y == ncol(YL)) {
ubm <- rep(Inf, nrow(Z))
}
ubm[is.na(ubm)] <- Inf
lbm[is.na(lbm)] <- -Inf
for (k in sample(1:2)) {
if (k == 1) {
up <- ut & Y == y
rwb <- rws[up]
lb <- lbm[rwb]
ub <- ubm[rwb]
ez <- EZ[up] + rho * (t(Z)[up] - t(EZ)[up])
Z[up] <- ez + sz * qnorm(runif(sum(up), pnorm((lb -
ez)/sz), pnorm((ub - ez)/sz)))
}
if (k == 2) {
up <- lt & Y == y
rwb <- rws[up]
lb <- lbm[rwb]
ub <- ubm[rwb]
ez <- EZ[up] + rho * (t(Z)[up] - t(EZ)[up])
Z[up] <- ez + sz * qnorm(runif(sum(up), pnorm((lb -
ez)/sz), pnorm((ub - ez)/sz)))
}
}
}
diag(Z) <- rnorm(nrow(Z), diag(EZ), 1)
Z
}
Run the code above in your browser using DataLab