Nothing
##### Arquivo modificado em 20 de março de 2013.
#####
### Funções obtidas da library lme4 (Douglas Bates)
### para a inserção da fórmula
### Utilities for parsing the mixed model formula
findbars <- function(term)
### Return the pairs of expressions that separated by vertical bars
{
if (is.name(term) || !is.language(term)) return(NULL)
if (term[[1]] == as.name("(")) return(findbars(term[[2]]))
if (!is.call(term)) stop("term must be of class call")
if (term[[1]] == as.name('|')) return(term)
if (length(term) == 2) return(findbars(term[[2]]))
c(findbars(term[[2]]), findbars(term[[3]]))
}
nobars <- function(term)
### Return the formula omitting the pairs of expressions that are
### separated by vertical bars
{
if (!('|' %in% all.names(term))) return(term)
if (is.call(term) && term[[1]] == as.name('|')) return(NULL)
if (length(term) == 2) {
nb <- nobars(term[[2]])
if (is.null(nb)) return(NULL)
term[[2]] <- nb
return(term)
}
nb2 <- nobars(term[[2]])
nb3 <- nobars(term[[3]])
if (is.null(nb2)) return(nb3)
if (is.null(nb3)) return(nb2)
term[[2]] <- nb2
term[[3]] <- nb3
term
}
subbars <- function(term)
### Substitute the '+' function for the '|' function
{
if (is.name(term) || !is.language(term)) return(term)
if (length(term) == 2) {
term[[2]] <- subbars(term[[2]])
return(term)
}
stopifnot(length(term) >= 3)
if (is.call(term) && term[[1]] == as.name('|'))
term[[1]] <- as.name('+')
for (j in 2:length(term)) term[[j]] <- subbars(term[[j]])
term
}
subnms <- function(term, nlist)
### Substitute any names from nlist in term with 1
{
if (!is.language(term)) return(term)
if (is.name(term)) {
if (any(unlist(lapply(nlist, get("=="), term)))) return(1)
return(term)
}
stopifnot(length(term) >= 2)
for (j in 2:length(term)) term[[j]] <- subnms(term[[j]], nlist)
term
}
slashTerms <- function(x)
### Return the list of '/'-separated terms in an expression that
### contains slashes
{
if (!("/" %in% all.names(x))) return(x)
if (x[[1]] != as.name("/"))
stop("unparseable formula for grouping factor")
list(slashTerms(x[[2]]), slashTerms(x[[3]]))
}
makeInteraction <- function(x)
### from a list of length 2 return recursive interaction terms
{
if (length(x) < 2) return(x)
trm1 <- makeInteraction(x[[1]])
trm11 <- if(is.list(trm1)) trm1[[1]] else trm1
list(substitute(foo:bar, list(foo=x[[2]], bar = trm11)), trm1)
}
expandSlash <- function(bb)
### expand any slashes in the grouping factors returned by findbars
{
if (!is.list(bb)) return(expandSlash(list(bb)))
## I really do mean lapply(unlist(... - unlist returns a
## flattened list in this case
unlist(lapply(bb, function(x) {
if (length(x) > 2 && is.list(trms <- slashTerms(x[[3]])))
return(lapply(unlist(makeInteraction(trms)),
function(trm) substitute(foo|bar,
list(foo = x[[2]],
bar = trm))))
x
}))
}
### Utilities used in lmer, glmer and nlmer
createCm <- function(A, s)
### Create the nonzero pattern for the sparse matrix Cm from A.
### ncol(A) is s * ncol(Cm). The s groups of ncol(Cm) consecutive
### columns in A are overlaid to produce Cm.
{
stopifnot(is(A, "dgCMatrix"))
s <- as.integer(s)[1]
if (s == 1L) return(A)
if ((nc <- ncol(A)) %% s)
stop(gettextf("ncol(A) = %d is not a multiple of s = %d",
nc, s))
ncC <- as.integer(nc / s)
TA <- as(A, "TsparseMatrix")
as(new("dgTMatrix", Dim = c(nrow(A), ncC),
i = TA@i, j = as.integer(TA@j %% ncC), x = TA@x),
"CsparseMatrix")
}
### FIXME: somehow the environment of the mf formula does not have
### .globalEnv in its parent list. example(Mmmec, package = "mlmRev")
### used to have a formula of ~ offset(log(expected)) + ... and the
### offset function was not found in eval(mf, parent.frame(2))
lmerFrames <- function(mc, formula, contrasts, vnms = character(0))
### Create the model frame, X, Y, wts, offset and terms
### mc - matched call of calling function
### formula - two-sided formula
### contrasts - contrasts argument
### vnms - names of variables to be included in the model frame
{
mf <- mc
m <- match(c("data", "subset", "weights", "na.action", "offset"),
names(mf), 0)
mf <- mf[c(1, m)]
## The model formula for evaluation of the model frame. It looks
## like a linear model formula but includes any random effects
## terms and any names of parameters used in a nonlinear mixed model.
frame.form <- subbars(formula) # substitute `+' for `|'
if (length(vnms) > 0) # add the variables names for nlmer
frame.form[[3]] <-
substitute(foo + bar,
list(foo = parse(text = paste(vnms, collapse = ' + '))[[1]],
bar = frame.form[[3]]))
## The model formula for the fixed-effects terms only.
fixed.form <- nobars(formula) # remove any terms with `|'
if (inherits(fixed.form, "name")) # RHS is empty - use `y ~ 1'
fixed.form <- substitute(foo ~ 1, list(foo = fixed.form))
## attach the correct environment
environment(fixed.form) <- environment(frame.form) <- environment(formula)
## evaluate a model frame
mf$formula <- frame.form
mf$drop.unused.levels <- TRUE
mf[[1]] <- as.name("model.frame")
fe <- mf # save a copy of the call
mf <- eval(mf, parent.frame(2))
## evaluate the terms for the fixed-effects only (used in anova)
fe$formula <- fixed.form
fe <- eval(fe, parent.frame(2)) # allow model.frame to update them
## response vector
Y <- model.response(mf, "any")
## avoid problems with 1D arrays, but keep names
if(length(dim(Y)) == 1) {
nm <- rownames(Y)
dim(Y) <- NULL
if(!is.null(nm)) names(Y) <- nm
}
mt <- attr(fe, "terms")
## Extract X checking for a null model. This check shouldn't be
## needed because an empty formula is changed to ~ 1 but it can't hurt.
X <- if (!is.empty.model(mt))
model.matrix(mt, mf, contrasts) else matrix(,NROW(Y),0)
storage.mode(X) <- "double" # when ncol(X) == 0, X is logical
fixef <- numeric(ncol(X))
names(fixef) <- colnames(X)
dimnames(X) <- NULL
## Extract the weights and offset. For S4 classes we want the
## `not used' condition to be numeric(0) instead of NULL
wts <- model.weights(mf); if (is.null(wts)) wts <- numeric(0)
off <- model.offset(mf); if (is.null(off)) off <- numeric(0)
## check weights and offset
if (any(wts <= 0))
stop(gettextf("negative weights or weights of zero are not allowed"))
if(length(off) && length(off) != NROW(Y))
stop(gettextf("number of offsets is %d should equal %d (number of observations)",
length(off), NROW(Y)))
## remove the terms attribute from mf
attr(mf, "terms") <- mt
list(Y = Y, X = X, wts = as.double(wts), off = as.double(off), mf = mf, fixef = fixef)
}
##' Is f1 nested within f2?
##'
##' Does every level of f1 occur in conjunction with exactly one level
##' of f2? The function is based on converting a triplet sparse matrix
##' to a compressed column-oriented form in which the nesting can be
##' quickly evaluated.
##'
##' @param f1 factor 1
##' @param f2 factor 2
##' @return TRUE if factor 1 is nested within factor 2
isNested <- function(f1, f2)
{
f1 <- as.factor(f1)
f2 <- as.factor(f2)
stopifnot(length(f1) == length(f2))
sm <- as(new("ngTMatrix",
i = as.integer(f2) - 1L,
j = as.integer(f1) - 1L,
Dim = c(length(levels(f2)),
length(levels(f1)))),
"CsparseMatrix")
all(diff(sm@p) < 2)
}
##' dimsNames and devNames are in the package's namespace rather than
##' in the function lmerFactorList because the function sparseRasch
##' needs to access them.
dimsNames <- c("nt", "n", "p", "q", "s", "np", "LMM", "REML",
"fTyp", "lTyp", "vTyp", "nest", "useSc", "nAGQ",
"verb", "mxit", "mxfn", "cvg")
dimsDefault <- list(s = 1L) # identity mechanistic model
# mxit= 300L, # maximum number of iterations
# mxfn= 900L, # maximum number of function evaluations
# verb= 0L, # no verbose output
# np= 0L, # number of parameters in ST
# LMM= 0L, # not a linear mixed model
# REML= 0L, # glmer and nlmer don't use REML
# fTyp= 2L, # default family is "gaussian"
# lTyp= 5L, # default link is "identity"
# vTyp= 1L, # default variance function is "constant"
# useSc= 1L, # default is to use the scale parameter
# nAGQ= 1L, # default is Laplace
# cvg = 0L) # no optimization yet attempted
devNames <- c("ML", "REML", "ldL2", "ldRX2", "sigmaML",
"sigmaREML", "pwrss", "disc", "usqr", "wrss",
"dev", "llik", "NULLdev")
##' Create model matrices from r.e. terms.
##'
##' Create the list of model matrices from the random-effects terms in
##' the formula and the model frame.
##'
##' @param formula model formula
##' @param fr: list with '$mf': model frame; '$X': .. matrix
##' @param rmInt logical scalar - should the `(Intercept)` column
##' be removed before creating Zt
##' @param drop logical scalar indicating if elements with numeric
##' value 0 should be dropped from the sparse model matrices
##'
##' @return a list with components named \code{"trms"}, \code{"fl"}
##' and \code{"dims"}
lmerFactorList <- function(formula, fr, rmInt, drop)
{
mf <- fr$mf
## record dimensions and algorithm settings
## create factor list for the random effects
bars <- expandSlash(findbars(formula[[3]]))
if (!length(bars)) stop("No random effects terms specified in formula")
names(bars) <- unlist(lapply(bars, function(x) deparse(x[[3]])))
fl <- lapply(bars,
function(x)
{
ff <- eval(substitute(as.factor(fac)[,drop = TRUE],
list(fac = x[[3]])), mf)
im <- as(ff, "sparseMatrix") # transpose of indicators
## Could well be that we should rather check earlier .. :
if(!isTRUE(validObject(im, test=TRUE)))
stop("invalid conditioning factor in random effect: ", format(x[[3]]))
mm <- model.matrix(eval(substitute(~ expr, # model matrix
list(expr = x[[2]]))),
mf)
if (rmInt) {
if (is.na(icol <- match("(Intercept)", colnames(mm)))) break
if (ncol(mm) < 2)
stop("lhs of a random-effects term cannot be an intercept only")
mm <- mm[ , -icol , drop = FALSE]
}
ans <- list(f = ff,
A = do.call(rBind,
lapply(seq_len(ncol(mm)), function(j) im)),
Zt = do.call(rBind,
lapply(seq_len(ncol(mm)),
function(j) {im@x <- mm[,j]; im})),
ST = matrix(0, ncol(mm), ncol(mm),
dimnames = list(colnames(mm), colnames(mm))))
if (drop) {
## This is only used for nlmer models.
## Need to do something more complicated for A
## here. Essentially you need to create a copy
## of im for each column of mm, im@x <- mm[,j],
## create the appropriate number of copies,
## prepend matrices of zeros, then rBind and drop0.
ans$A@x <- rep(0, length(ans$A@x))
ans$Zt <- drop0(ans$Zt)
}
ans
})
dd <-
VecFromNames(dimsNames, "integer",
c(list(n = nrow(mf), p = ncol(fr$X), nt = length(fl),
q = sum(sapply(fl, function(el) nrow(el$Zt)))),
dimsDefault))
## order terms by decreasing number of levels in the factor but don't
## change the order if this is already true
nlev <- sapply(fl, function(el) length(levels(el$f)))
## determine the number of random effects at this point
if (any(diff(nlev)) > 0) fl <- fl[rev(order(nlev))]
## separate the terms from the factor list
trms <- lapply(fl, "[", -1)
names(trms) <- NULL
fl <- lapply(fl, "[[", "f")
attr(fl, "assign") <- seq_along(fl)
## check for repeated factors
fnms <- names(fl)
if (length(fnms) > length(ufn <- unique(fnms))) {
## check that the lengths of the number of levels coincide
fl <- fl[match(ufn, fnms)]
attr(fl, "assign") <- match(fnms, ufn)
}
names(fl) <- ufn
## check for nesting of factors
dd["nest"] <- all(sapply(seq_along(fl)[-1],
function(i) isNested(fl[[i-1]], fl[[i]])))
list(trms = trms, fl = fl, dims = dd)
}
checkSTform <- function(ST, STnew)
### Check that the 'STnew' argument matches the form of ST.
{
stopifnot(is.list(STnew), length(STnew) == length(ST),
all.equal(names(ST), names(STnew)))
lapply(seq_along(STnew), function (i)
stopifnot(class(STnew[[i]]) == class(ST[[i]]),
all.equal(dim(STnew[[i]]), dim(ST[[i]]))))
all(unlist(lapply(STnew, function(m) all(diag(m) > 0))))
}
#######################################################################
########################################################################
#######################################################################
#######################################################################
#######################################################################
VecFromNames <- function(nms, mode = "numeric", defaults = list())
### Generate a named vector of the given mode
{
ans <- vector(mode = mode, length = length(nms))
names(ans) <- nms
ans[] <- NA
if ((nd <- length(defaults <- as.list(defaults))) > 0) {
if (length(dnms <- names(defaults)) < nd)
stop("defaults must be a named list")
stopifnot(all(dnms %in% nms))
ans[dnms] <- as(unlist(defaults), mode)
}
ans
}
mkZt <- function(FL, start, s = 1L)
### Create the standard versions of flist, Zt, Gp, ST, A, Cm,
### Cx, and L. Update dd.
{
dd <- FL$dims
fl <- FL$fl
asgn <- attr(fl, "assign")
trms <- FL$trms
ST <- lapply(trms, `[[`, "ST")
Ztl <- lapply(trms, `[[`, "Zt")
Zt <- do.call(rBind, Ztl)
Zt@Dimnames <- vector("list", 2)
# Gp <- unname(c(0L, cumsum(sapply(Ztl, nrow))))
# .Call(mer_ST_initialize, ST, Gp, Zt)
# A <- do.call(rBind, lapply(trms, `[[`, "A"))
# rm(Ztl, FL) # because they could be large
nc <- sapply(ST, ncol) # of columns in els of ST
# Cm <- createCm(A, s)
# L <- .Call(mer_create_L, Cm)
# if (s < 2) Cm <- new("dgCMatrix")
# if (!is.null(start) && checkSTform(ST, start)) ST <- start
nvc <- sapply(nc, function (qi) (qi * (qi + 1))/2) # no. of var. comp.
### FIXME: Check number of variance components versus number of
### levels in the factor for each term. Warn or stop as appropriate
dd["np"] <- as.integer(sum(nvc)) # number of parameters in optimization
dev <- VecFromNames(devNames, "numeric")
fl <- do.call(data.frame, c(fl, check.names = FALSE))
attr(fl, "assign") <- asgn
list(ST = ST, Zt = Zt, dd = dd, dev = dev, flist = fl)
}
# For one variance component (vu*A)
#
# A = Variance and covariance matrix
#
# vu = Prior of the variance component
#
Avu1 <- function(Zz, Dd, A, Vu, FL)
{
V <- rbind(Zz, cbind(Dd, Vu*A))
return(V)
}
# For more two variance compoents (vu*A)
Avuall <- function(Zz, Dd, A, Vu, FL)
{
m <- dim(A)[1]
n <- dim(A)[2]
tc <- length(Vu)
ifc <- unlist(lapply(FL$fl, function(x) length(levels(x))))
il <- 1
ic <- ifc[1]
for(i in 2:tc){
ic[i] <- ifc[i]+ic[i-1]
il[i] <- ic[i]-ifc[i]+1
}
storage.mode(A) <- "double"
Aux <- .Fortran("vua", as.double(Vu), A=A, as.integer(ic), as.integer(il), as.integer(m),
as.integer(n), as.integer(tc), PACKAGE="Bayesthresh")$A
V <- rbind(Zz, cbind(Dd,Aux))
return(V)
}
# Obtained an estimate for conditional variance
#
UniComp <- function(naleat, ru, u, su, A = NULL, Vu = NULL, FL = NULL)
{
c1 <- (naleat+2*ru)/2
c2 <- (crossprod(u)+2*su)/2
Vu <- rgamma(1,c1,c2)
Vu <- as.double(1/Vu)
return(Vu)
}
VarComp <- function(naleat, ru, u, su, A, Vu, FL)
{
m <- dim(A)[1]
tc <- length(Vu)
ifc <- unlist(lapply(FL$fl, function(x) length(levels(x))))
il <- 1
ic <- ifc[1]
for(i in 2:tc){
ic[i] <- ifc[i]+ic[i-1]
il[i] <- ic[i]-ifc[i]+1
}
storage.mode(A) <- "double"
Vu <- .Fortran("part", A, as.integer(m), as.double(u), Vu=as.double(Vu),as.double(ru),
as.double(su), as.integer(tc), as.integer(il),as.integer(ic), PACKAGE="Bayesthresh")$Vu
return(Vu)
}
# WriT <- function(saida = NULL){}
# wriT <- function(theta,tau,vu,verossim,ef.iter)
# {
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
# op.mcmc <- NULL
# op.mcmc$theta <- matrix(0,nrow=ef.iter, ncol=length(theta))
# op.mcmc$tau <- matrix(0,nrow=ef.iter, ncol=length(tau))
# op.mcmc$vu <- matrix(0,nrow=ef.iter, ncol=length(vu))
# return(op.mcmc)
# }
#
priors.control <- function(ru = 3, su = 5, dre = 20, dse = 5, method = c("AC", "MC", "NC"))
{
method <- match.arg(method)
if(method == "AC" | method == "MC")
{
if(ru <= 0 || su <= 0) stop("Priors more zero")
else
prior <- list(ru=ru, su=su)
}
# if(method == "MC")
# {
# if(se <= 0 || ru <= 0 || su <= 0) stop("Priores devem ser maior que zero")
# prior <- list(se=se, ru=ru, su=su)
# }
else
{
if(ru <= 0 || su <= 0){
if(dre <= 0 || dse <= 0){
stop("Priors more zero")
}
}
prior <-list(ru=ru, su=su, dre = dre, dse = dse)
}
return(prior)
}
algorithm <- function(method = c("AC", "MC", "NC") , link = c("Gaussian","t"))
{
method <- match.arg(method)
link <- match.arg(link)
if(method == c("AC")){
if(link == c("Gaussian"))list("ACGaussian", "AC")
else
list("ACt", "AC")
}
else if(method == c("MC")){
if(link == c("Gaussian"))list("MCGaussian","MC")
else
list("MCt", "MC")
}
else{
if(link == c("Gaussian"))list("NCGaussian", "NC")
else
list("NCt", "NC")
}
}
#############################################################################
###
### Albert and Chib algorithm with Gaussian distribution for latent variable
###
############################################################################
ACGaussian <- function(Y,X,Z2,W,A,escala, ru, su, ntrat, nfixo, naleat,
burn, jump, ef.inter, Write = FALSE, FL,nomes,nomes2)
{
### Initial random value
N <- length(Y)
L <- c(1:N)
L <- sapply(L,function(x)qnorm(pnorm(0)+pnorm(0)*runif(1)))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0,3)))
tau <- taunovo
delta2 <- 1
vero <- rep(1,N)
verossim <- 0
Ww <- crossprod(W)
tW <- t(W)
iA <- solve(A)
rowmcmc <- 1
output <- rep(0,length(c(theta,tau,vu,verossim)))
Lout <- length(output)
sumsquare <- output
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
# WFun <- match.fun(WriT)
# }
# else {
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=length(tau))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
# write(nomes2, file="output.txt", ncolumns=length(nomes2))
}
### Auxiliar step for construction W matrix
Zz <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
verossim <- 0
### Initialize sample posterior
iter <- burn + jump*ef.inter
for(cont in 1:iter){
### Conditional for theta
V <- aVu(Zz, Dd, A, vu, FL)
S <- solve(V)
Iw <- solve(Ww + S)
theta <- Iw%*%tW%*%L
var <- ve*Iw
thetaest <- rmvnorm(1,theta,var, method="chol")
theta <- thetaest
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):ct]
### Conditional for variance of random effects
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
### Conditional for L
m <- tcrossprod(W,theta)
### Cummulative density for latent variable
probacum <- .C("acumN", as.integer(Y), L=as.double(L), as.integer(escala),
as.integer(max(escala)), as.integer(min(escala)), as.integer(length(escala)),
as.integer(N), as.double(vero), as.double(m), as.double(tau), as.double(ve),
verossim=as.double(verossim), PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
### Conditional for thresholds parameters
min <- as.vector(tapply(L,Y,min))
max <- as.vector(tapply(L,Y,max))
for(j in 2:(length(escala)-1)) {
tau[j] <- runif(1,max[j],min[j+1])
}
### Print output
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau,vu,verossim)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
###############################################################################
###
###
### Albert and Chib algorithm with t-Student distribution for latent variable
###
###
##############################################################################
ACt <- function(Y,X,Z2,W,A,escala, ru, su, ntrat, nfixo, naleat, burn, jump,
ef.inter, Write = FALSE, FL,nomes,nomes2)
{
### Arbitrary initial values
N <- length(Y)
L <- qnorm(pnorm(0)+pnorm(0)*runif(N))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0,3)))
tau <- taunovo
pnuc <- 0.5
pnu <- 0.5
nu <- 10
lambda <- rep(1,N)
R <- diag(N)
dw1 <- dim(W)[1]
dw2 <- dim(W)[2]
### Object necessary for estimate of likelihood
vero <- rep(1,N)
verossim <- 0
output <- rep(0,length(c(theta,tau,vu,verossim)))
Lout <- length(output)
sumsquare <- output
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
# WFun <- match.fun(WriT)
# }
# else {
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=length(tau))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
# write(nomes2, file="output.txt", ncolumns=length(nomes2))
}
### Auxiliary step of W matrix
Zz <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
verossim <- 0
tW <- t(W)
iA <- solve(A)
### Sampling of posteriori
iter <- burn + jump*ef.inter
rowmcmc <- 1
for(cont in 1:iter){
### Conditional for theta
V <- aVu(Zz, Dd, A, vu, FL)
S <- ve*(solve(V))
Iw <- solve(crossprod(W,R)%*%W + S)
theta <- Iw%*%tW%*%R%*%L
var <- ve*Iw
thetaest <- rmvnorm(1,theta,var, method="chol")
theta <- thetaest
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):ct]
### Conditional for variance of random effects
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
### Sampling lambda (elementwise)
storage.mode(W) <- "double"
lambda <- .Fortran("gslambda", lambda=as.double(lambda), as.double(nu), as.double(L),
W, as.double(theta), as.integer(dw1), as.integer(dw2), PACKAGE="Bayesthresh")$lambda
R <- diag(lambda)
### Passo Metropolis-Hastings para amostrar nu
nuc <- 2
while(nuc < 3) {
nuc <- rpois(1,nu)
}
# pnu <- N*((nu/2)*log(nu/2)-lgamma(nu/2))+sum((nu/2-1)*log(lambda)+(-(nu/2)*lambda))-2*log(1+nu)
# pnuc <- N*((nuc/2)*log(nuc/2)-lgamma(nuc/2))+sum((nuc/2-1)*log(lambda)+(-(nuc/2)*lambda))-2*log(1+nuc)
pnu <- N*((nu/2)*(nu/2)-lgamma(nu/2))+sum((nu/2-1)*(lambda)+(-(nu/2)*lambda))-2*(1+nu)
pnuc <- N*((nuc/2)*(nuc/2)-lgamma(nuc/2))+sum((nuc/2-1)*(lambda)+(-(nuc/2)*lambda))-2*(1+nuc)
# pnu <- exp(pnu)
# pnuc <- exp(pnuc)
dnu <- dpois(nu,nuc)
dnuc <- dpois(nuc,nu)
num <- pnuc*dnu
denom <- pnu*dnuc
ifelse(num > denom, alfa <- 1, alfa <- num/denom)
if(runif(1) < alfa) nu <- nuc
### Condicional para L
mw <- tcrossprod(W,theta)
dp <- sqrt(ve/lambda)
probacum <- .C("acumt", as.integer(Y), L=as.double(L), as.integer(escala), as.integer(max(escala)),
as.integer(min(escala)), as.integer(length(escala)), as.integer(N), as.double(vero),
as.double(mw), as.double(tau), as.double(dp), verossim=as.double(verossim),
PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
### Amostragem dos thresholds
mini <- as.vector(tapply(L,Y,min))
maxi <- as.vector(tapply(L,Y,max))
for(j in 2:(length(escala)-1)) {
tau[j] <- runif(1, maxi[j], mini[j+1])
}
### Gera a saida no arquivo cadeia.txt
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau,vu,verossim)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
#############################################################
###
###
### Algoritimo MC e variavel latente com distribuicao normal
###
###
############################################################
MCGaussian <- function(Y,X,Z2,W,A,escala, ru, su, ntrat, nfixo, naleat, burn, jump,
ef.inter, Write = FALSE, FL,nomes,nomes2)
{
### Valores arbitrarios iniciais
N <- length(Y)
L <- qnorm(pnorm(0)+pnorm(0)*runif(N))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0.5,3.5)),1000)
tau <- taunovo
ftau <- runif(N,0.5,1.5)
ftaunovo <- ftau
dw1 <- dim(W)[1]
dw2 <- dim(W)[2]
### Iteracoes totais
iter <- burn + jump*ef.inter
rowmcmc <- 1
### Objetos necessarios para o calculo da verossimilhanca
vero <- rep(1,N)
lvero <- log(vero)
verossim <- 1
### Matrix com os objetos p1, p2, ..., pn.
ce <- length(escala)
mp <- matrix(0,ce-2,ce-1)
nl <- nrow(mp)
nc <- ncol(mp)
### Desvio-padrao para a candidata
dp <- 0.15
d <- rep(1,iter) # Vetor para atualizacao do dp
output <- rep(0,length(c(theta,tau[-(length(tau))],vu,verossim)))
Lout <- length(output)
sumsquare <- output
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
# WFun <- match.fun(WriT)
# }
# else {
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=(length(tau)-1))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
# write(nomes2, file="output.txt", ncolumns=length(nomes2))
}
### Passo auxiliar na construcao da matriz W
Zz <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
verossim <- 0
tW <- t(W)
Ww <- crossprod(W)
iA <- solve(A)
### Laco de Amostragem da Posteriori
for(cont in 1:iter){
### Condicional para theta
V <- aVu(Zz, Dd, A, vu, FL)
S <- ve*(solve(V))
Iw <- solve(Ww + S)
theta <- Iw%*%tW%*%L
var <- ve*Iw
thetaest <- rmvnorm(1,theta,var, method="chol")
theta <- thetaest
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):ct]
m <- tcrossprod(W,theta)
### Condicional para variancia dos efeitos aleatorios
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
############# AMOSTRAGEM DOS THRESHOLDS ###########
taunovo <- .C("taunN", taunovo=as.double(taunovo), as.double(tau), as.double(dp), as.integer(ce),
PACKAGE="Bayesthresh")$taunovo
### Matrix com as probabilidades de aceitacao do tau/taunovo
mp <- matrix(.C("calcpN", as.double(tau), as.double(taunovo), as.double(dp),
p=as.double(vec(mp)), as.integer(nl), PACKAGE="Bayesthresh")$p, nrow = ce-2)
### Funcao para estimar a probabilidade de tau/taunovo
probtau <- .C("probtauN", as.integer(Y), ftau=as.double(ftau), ftaunovo=as.double(ftaunovo),
as.integer(escala), as.integer(max(escala)), as.integer(min(escala)), as.integer(ce),
as.integer(N), as.double(m), as.double(tau), as.double(taunovo),
PACKAGE="Bayesthresh")[c("ftau","ftaunovo")]
ftau <- probtau$ftau
ftaunovo <- probtau$ftaunovo
mpvet <- mp[,3]-mp[,4]
mpvet[mpvet <= 0.00] <- 1E-45
alfa <- exp(sum(log(mp[,1]-mp[,2]) - log(mpvet)) + sum(log(ftaunovo) - log(ftau)))
R <- min(1,alfa)
if(runif(1) < R) {
tau <- taunovo
### Funcao para a densidade acumulada da variavel Latente
probacum <- .C("acumN", as.integer(Y), L=as.double(L), as.integer(escala), as.integer(max(escala)),
as.integer(min(escala)), as.integer(ce), as.integer(N), vero=as.double(vero),
as.double(m), as.double(tau), as.double(ve), verossim=as.double(verossim),
PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
}
### Atualizacao do desvio-padrao da candidata
d[cont] <- c(tau[2])
ifelse(cont > 20, dp <- sd(d[(cont-20):cont]), dp <- 0.25)
### Gera a saida no arquivo cadeia.txt
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau[-(length(tau))],vu,verossim)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau[-(length(tau))]
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
########################################################
###
###
### Algoritimo MC e variavel latente com distribuicao t
###
###
########################################################
MCt <- function(Y,X,Z2,W,A,escala, ru, su, ntrat, nfixo, naleat, burn, jump,
ef.inter, Write = FALSE, FL, nomes, nomes2)
{
### Valores arbitrarios iniciais
ce <- length(escala)
N <- length(Y)
L <- qnorm(pnorm(0)+pnorm(0)*runif(N))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0.5,3.5)),1000)
tau <- taunovo
ftau <- rep(1,N)
ftaunovo <- ftau
lambda <- ftau
nu <- 10
nuc <- ce
pnu <- 0.5
pnuc <- pnu
R <- diag(N)
d <- NULL
dw1 <- dim(W)[1]
dw2 <- dim(W)[2]
### Iteracoes totais
iter <- burn + jump*ef.inter
rowmcmc <- 1
### Objetos necessarios para o calculo da verossimilhanca
vero <- rep(1,N)
verossim <- 1
mp <- matrix(0,ce-2,ce-1)
nl <- nrow(mp)
nc <- ncol(mp)
### Desvio-padrao para a candidata
dpc <- 0.15
dc <- rep(1,iter) # Vetor para atualizacao do dp
output <- rep(0,length(c(theta,tau[-(length(tau))],vu,verossim)))
Lout <- length(output)
sumsquare <- output
### Para vu*A
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
# WFun <- match.fun(WriT)
# }
# else {
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=(length(tau)-1))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
# write(nomes2, file="output.txt", ncolumns=length(nomes2))
}
### Passo auxiliar na construcao da matriz W
Zz <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
verossim <- 0
tW <- t(W)
Ww <- crossprod(W)
iA <- solve(A)
### Laco de Amostragem da Posteriori
for(cont in 1:iter){
### Condicional para theta
V <- aVu(Zz, Dd, A, vu, FL)
S <- ve*solve(V)
Iw <- solve(tW%*%R%*%W + S)
theta <- Iw%*%tW%*%R%*%L
var <- ve*Iw
thetaest <- rmvnorm(1,theta, var, method="chol")
theta <- thetaest
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):length(theta)]
mw <- tcrossprod(W,theta)
### Condicional para variancia de blocos
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
############## AMOSTRAGEM DOS THRESHOLDS ###############
taunovo <- .C("taunt", taunovo=as.double(taunovo), as.double(tau), as.double(dpc),
as.integer(ce-1), PACKAGE="Bayesthresh")$taunovo
### Matrix com as probabilidades de aceitacao do tau/taunovo
mp <- matrix(.C("calcpt", as.double(tau), as.double(taunovo), as.double(dpc),
p=as.double(vec(mp)), as.integer(nl), PACKAGE="Bayesthresh")$p, nrow = ce-2)
### Amostra lambda (GS elemento a elemento)
storage.mode(W) <- "double"
lambda <- .Fortran("gslambda", lambda=as.double(lambda), as.double(nu), as.double(L),
W, as.double(theta), as.integer(dw1), as.integer(dw2), PACKAGE="Bayesthresh")$lambda
R <- diag(lambda)
dp <- sqrt(ve/lambda)
### Funcao para estimar a probabilidade de tau/taunovo - TESTADA E APROVADA!!!
probtau <- .C("probtaut", as.integer(Y), ftau=as.double(ftau), ftaunovo=as.double(ftaunovo),
as.integer(escala), as.integer(max(escala)), as.integer(min(escala)), as.integer(ce),
as.integer(N), as.double(mw), as.double(tau), as.double(taunovo),
as.double(dp), PACKAGE="Bayesthresh")[c("ftau","ftaunovo")]
ftau <- probtau$ftau
ftaunovo <- probtau$ftaunovo
mpvet <- mp[,3]-mp[,4]
mpvet[mpvet <= 0.00] <- 1E-45
alfa <- exp(sum(log((mp[,1]-mp[,2])) - log(mpvet)) + sum(log(ftaunovo) - log(ftau)))
D <- min(1,alfa)
if(runif(1) < D) {
tau <- taunovo
### Amostra nu (Metropolis-Hastings)
nuc <- 2
while(nuc < 3){
nuc <- rpois(1,nu)
}
#
# pnu <- exp(N*((nu/2)*log(nu/2)-lgamma(nu/2))+sum(((nu/2)-1)*log(lambda)+(-(nu/2)*lambda)) - 2*log(1+nu))
# pnuc <- exp(N*((nuc/2)*log(nuc/2)-lgamma(nuc/2))+sum(((nuc/2)-1)*log(lambda)+(-(nuc/2)*lambda)) - 2*log(1+nuc))
pnu <- N*((nu/2)*(nu/2)-lgamma(nu/2))+sum(((nu/2)-1)*(lambda)+(-(nu/2)*lambda)) - 2*(1+nu)
pnuc <- N*((nuc/2)*(nuc/2)-lgamma(nuc/2))+sum(((nuc/2)-1)*(lambda)+(-(nuc/2)*lambda)) - 2*(1+nuc)
dnu <- dpois(nu,nu)
dnuc <- dpois(nuc,nuc)
num <- pnuc*dnu
denom <- pnu*dnuc
ifelse((num > denom), alfa <- 1, (alfa <- as.double(num/denom)))
if(runif(1) < alfa) { nu <- nuc }
### Funcao para a densidade acumulada da variavel Latente
probacum <- .C("acumt", as.integer(Y), L=as.double(L), as.integer(escala), as.integer(max(escala)),
as.integer(min(escala)), as.integer(length(escala)), as.integer(N), as.double(vero),
as.double(mw), as.double(tau), as.double(dp), verossim=as.double(verossim),
PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
}
### Atualizacao do desvio-padrao da candidata
d[cont] <- c(tau[3])
ifelse(cont > 20, dpc <- sd(d[(cont-20):cont]), dpc <- 0.25)
### Gera a saida no arquivo cadeia.txt
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau[-(length(tau))],vu,verossim)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau[-(length(tau))]
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
#############################################################
###
###
### Algoritimo NC e variavel latente com distribuicao normal
###
###
#############################################################
NCGaussian <- function(Y,X,Z2,W,A,escala, ru, su, dre, dse, ntrat, nfixo, naleat, burn,
jump, ef.inter, Write = FALSE, FL,nomes,nomes2)
{
### Valores arbitrarios iniciais
ce <- length(escala)
N <- length(Y)
L <- qnorm(pnorm(0)+pnorm(0)*runif(N))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0.5,3.5)),1000)
nk <- tapply(L,Y,length)
tau <- taunovo
ftau <- rep(1,N)
ftaunovo <- ftau
delta2 <- 0.5
delta <- sqrt(delta2)
pnovo <- sort(nk[c(-1,-2)]/10)
p <- pnovo
nomes[length(nomes)+1] <- c("delta")
### Iteracoes totais
iter <- burn + jump*ef.inter
rowmcmc <- 1
### Objetos necessarios para o calculo da verossimilhanca
vero <- rep(1,N)
verossim <- 1
output <- rep(0,length(c(theta,tau[-(length(tau))],vu,verossim,delta2)))
Lout <- length(output)
sumsquare <- output
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
# WFun <- match.fun(WriT)
# }
# else {
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
# Lout <- length(saida)
# write(saida, file="output.txt", ncolumns=Lout, append=TRUE)
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=(length(tau)-1))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
# write(nomes2, file="output.txt", ncolumns=length(nomes2))
}
### Passo auxiliar na construcao da matriz W
Zz <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
tW <- t(W)
Ww <- crossprod(W)
iA <- solve(A)
### Laco de Amostragem da Posteriori
for(cont in 1:iter){
### Condicional para theta
V <- aVu(Zz, Dd, A, vu, FL)
Iv <- solve(V)
S <- delta2*Iv
Iw <- solve(Ww + S)
theta <- Iw%*%tW%*%L
vari <- delta2*Iw
theta <- rmvnorm(1,theta, vari)
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):(length(theta))]
### Condicional para variancia de blocos
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
### Parametros para acelerar a convergencia (reparametrizacao)
npWT <- L-tcrossprod(W,theta)
np1 <- crossprod(npWT)
Ivtheta <- theta%*%Iv
np2 <- tcrossprod(Ivtheta,theta)
delta2 <- 1/rgamma(1,(N+naleat+ce+2*dre)/2,(np1+2*dse+np2)/2)
delta <- sqrt(delta2)
### Amostragem dos parametros de limiar
nkp <- 0.8*nk[2:(ce-1)]
pnovo <- c(rdiric(1,shape=nkp))
for(j in 2:(ce-1)) taunovo[j] <- sum(pnovo[1:(j-1)])
lfp <- nkp*log(p)
lfpnovo <- nkp*log(pnovo)
mw <- tcrossprod(W,theta)
probtau <- .C("probtauN", as.integer(Y), ftau=as.double(ftau), ftaunovo=as.double(ftaunovo),
as.integer(escala), as.integer(max(escala)), as.integer(min(escala)), as.integer(ce),
as.integer(N), as.double(mw), as.double(tau), as.double(taunovo), as.double(delta),
PACKAGE="Bayesthresh")[c("ftau","ftaunovo")]
ftau <- probtau$ftau
ftaunovo <- probtau$ftaunovo
lftau <- log(ftau)
lftaunovo <- log(ftaunovo)
lftau[is.infinite(lftau)] <- log(1e-15)
lftaunovo[is.infinite(lftaunovo)] <- log(1e-20)
alfa <- exp(sum(lftaunovo-lftau)-sum(lfpnovo-lfp))
if(runif(1) < (min(1,alfa))){
p <- pnovo
tau <- taunovo
### Condicional para L
### Funcao para a densidade acumulada da variavel Latente
probacum <- .C("acumN", as.integer(Y), L=as.double(L), as.integer(escala), as.integer(max(escala)),
as.integer(min(escala)), as.integer(ce), as.integer(N), vero=as.double(vero),
as.double(mw), as.double(tau), as.double(delta), verossim=as.double(verossim),
PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
}
### Gera a saida no arquivo output.txt
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau[-(length(tau))],vu,verossim,delta2)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau[-(length(tau))]
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
#######################################################
###
###
### Algoritimo NC e variavel latente com distribuicao t
###
###
#######################################################
NCt <- function(Y,X,Z2,W,A,escala, ru, su, dre, dse, ntrat, nfixo, naleat, burn,
jump, ef.inter, Write = FALSE,FL,nomes,nomes2)
{
### Valores arbitrarios iniciais
ce <- length(escala)
N <- length(Y)
L <- qnorm(pnorm(0)+pnorm(0)*runif(N))
theta <- ginv(crossprod(W))%*%t(W)%*%L
ct <- length(theta)
e <- L - W%*%theta
ve <- 1
vu <- unlist(lapply(FL$fl, function(x) length(levels(x))))
taunovo <- c(0,sort(runif((length(escala))-2,0.5,3.5)),1000)
nk <- tapply(L,Y,length)
tau <- taunovo
ftau <- rep(1,N)
ftaunovo <- ftau
delta2 <- 0.5
delta <- sqrt(delta2)
pnovo <- sort(nk[c(-1,-2)]/10)
p <- pnovo
lambda <- ftau
nu <- 10
nuc <- ce
pnu <- 0.5
pnuc <- pnu
R <- diag(lambda)
nomes[length(nomes)+1] <- c("delta")
### Iteracoes totais
iter <- burn + jump*ef.inter
rowmcmc <- 1
### Objetos necessarios para o calculo da verossimilhanca
vero <- rep(1,N)
verossim <- 1
output <- rep(0,length(c(theta,tau[-(length(tau))],vu,verossim,delta2)))
Lout <- length(output)
sumsquare <- output
if(length(vu) == 1){
aVu <- match.fun(Avu1)
Wpart <- match.fun(UniComp)
}
else {
aVu <- match.fun(Avuall)
Wpart <- match.fun(VarComp)
}
outp.mcmc <- NULL
if(Write == TRUE){
wriT <- function(theta,tau,vu,nrow=ef.inter)
{
op.mcmc <- NULL
op.mcmc$theta <- matrix(0,nrow=nrow, ncol=length(theta))
op.mcmc$tau <- matrix(0,nrow=nrow, ncol=(length(tau)-1))
op.mcmc$vu <- matrix(0,nrow=nrow, ncol=length(vu))
return(op.mcmc)
}
outp.mcmc <- wriT(theta,tau,vu,nrow=ef.inter)
}
### Passo auxiliar
Wm <- cbind(1000*diag(nfixo), matrix(0,nfixo,naleat))
Dd <- matrix(0,naleat,nfixo)
Wt <- t(W)
Ag <- solve(A)
verossim <- 0
### Laco de Amostragem da Posteriori (Gibbs Sampling)
for(cont in 1:iter){
### Condicional para theta
V <- aVu(Wm, Dd, A, vu, FL)
Iv <- ginv(V)
S <- delta2*Iv
Wrw <- solve(crossprod(W,R)%*%W + S)
theta <- Wrw%*%Wt%*%R%*%L
vari <- delta2*Wrw
theta <- rmvnorm(1,theta, vari, method="chol")
beta <- theta[1:nfixo]
u <- theta[(nfixo+1):(length(theta))]
### Condicional para variancia de blocos
vu <- Wpart(naleat, ru, u, su, A, vu, FL)
### Parametros para acelerar a convergencia (reparametrizacao)
npWT <- L-tcrossprod(W,theta)
np1 <- crossprod(npWT)
Ivtheta <- theta%*%Iv
np2 <- tcrossprod(Ivtheta,theta)
delta2 <- 1/rgamma(1,(N+naleat+ce+2*dre)/2,(np1+2*dse+np2)/2)
delta <- sqrt(delta2)
### Amostra lambda (GS elemento a elemento)
lambda <- rgamma(N, (nu+1)/2, (nu+(npWT)^2)/2)
R <- diag(lambda)
### Amostra nu (Metropolis-Hastings)
nuc <- 2
while(nuc < 3){
nuc <- rpois(1,nu)
}
# pnu <- exp(N*((nu/2)*log(nu/2)-lgamma(nu/2))+sum(((nu/2)-1)*log(lambda)+(-(nu/2)*lambda)) - 2*log(1+nu))
# pnuc <- exp(N*((nuc/2)*log(nuc/2)-lgamma(nuc/2))+sum(((nuc/2)-1)*log(lambda)+(-(nuc/2)*lambda)) - 2*log(1+nuc))
pnu <- N*((nu/2)*(nu/2)-lgamma(nu/2))+sum(((nu/2)-1)*(lambda)+(-(nu/2)*lambda)) - 2*(1+nu)
pnuc <- N*((nuc/2)*(nuc/2)-lgamma(nuc/2))+sum(((nuc/2)-1)*(lambda)+(-(nuc/2)*lambda)) - 2*(1+nuc)
dnu <- dpois(nu,nu)
dnuc <- dpois(nuc,nuc)
num <- pnuc*dnu
denom <- pnu*dnuc
ifelse((num > denom), alfa <- 1, (alfa <- as.double(num/denom)))
if(runif(1) < alfa) nu <- nuc
### Amostragem dos parametros de limiar
nkp <- 0.8*nk[2:(ce-1)]
pnovo <- c(rdiric(1,shape=nkp))
for(j in 2:(ce-1)) taunovo[j] <- sum(pnovo[1:(j-1)])
lfp <- nkp*log(p)
lfpnovo <- nkp*log(pnovo)
mw <- tcrossprod(W,theta)
dp <- sqrt(delta/lambda)
probtau <- .C("probtaut", as.integer(Y), ftau=as.double(ftau), ftaunovo=as.double(ftaunovo),
as.integer(escala), as.integer(max(escala)), as.integer(min(escala)), as.integer(ce),
as.integer(N), as.double(mw), as.double(tau), as.double(taunovo), as.double(dp),
PACKAGE="Bayesthresh")[c("ftau","ftaunovo")]
ftau <- probtau$ftau
ftaunovo <- probtau$ftaunovo
lftau <- log(ftau)
lftaunovo <- log(ftaunovo)
lftau[is.infinite(lftau)] <- log(1e-15)
lftaunovo[is.infinite(lftaunovo)] <- log(1e-20)
alfa <- exp(sum(lftaunovo-lftau)-sum(lfpnovo-lfp))
mini <- min(1,alfa)
if(runif(1) < mini){
p <- pnovo
tau <- taunovo
### Condicional para L
### Funcao para a densidade acumulada da variavel Latente
probacum <- .C("acumt", as.integer(Y), L=as.double(L), as.integer(escala), as.integer(max(escala)),
as.integer(min(escala)), as.integer(length(escala)), as.integer(N), as.double(vero),
as.double(mw), as.double(tau), as.double(dp), verossim=as.double(verossim),
PACKAGE="Bayesthresh")[c("L","verossim")]
L <- probacum$L
verossim <- probacum$verossim
# if(verossim == 0) verossim <- 1e-320
}
### Gera a saida no arquivo cadeia.txt
if(cont > burn && (cont-burn)%%jump == 0) {
saida <- c(theta,tau[-(length(tau))],vu,verossim,delta2)
output <- output + saida
sumsquare <- sumsquare + (saida^2)
if(Write==TRUE){
outp.mcmc[[1]][rowmcmc,] <- theta
outp.mcmc[[2]][rowmcmc,] <- tau[-(length(tau))]
outp.mcmc[[3]][rowmcmc,] <- vu
rowmcmc <- rowmcmc + 1
}
}
}
list(Sum=output, SumSquare = sumsquare,outp.mcmc=outp.mcmc)
}
### Funcao que retorna a matriz de delineamento dos efeitos aleatorios
MatrixW <- function(FL)
{
dimen <- NULL
nL <- FL$dims[1]
W <- t(as.matrix(FL$trms[[1]]$Zt))
if(nL > 1){
for(i in 2:FL$dims[1]){
Ww <- t(as.matrix(FL$trms[[i]]$Zt))
W <- cbind(W,Ww)
}
}
return(W)
}
### Promove a saida
outp <- function(formula,res,method,nomesX,nomesZ,ntau,NomesVu, inter)
{
resi <- NULL
ans <- NULL
ifelse(method$algorithm != "NC", lik <- res[nrow(res),], lik <- res[(nrow(res))-1,])
colnames(lik) <- c("Post. mean","Post.std.dev")
rownames(lik) <- c("")
dim1 <- (length(nomesX)+length(nomesZ)+length(ntau)+1)
dimCompVar <- c(dim1:(dim1+length(NomesVu)))
compVar <- res[dimCompVar,]
# compVar[,2] <- sqrt(compVar[,1] )
colnames(compVar) <- c("Post.variance", "Post.std.dev")
rownames(compVar) <- c(NomesVu,"Residuals")
ifelse(method$algorithm != "NC", resi <- c(1,1), resi <- res[nrow(res),])
compVar[nrow(compVar),] <- resi
EfFixef <- res[1:(length(nomesX)),]
colnames(EfFixef) <- c("Estimate", "Std. Dev")
rownames(EfFixef) <- nomesX
ans$compVar <- compVar
ans$NomesZ <- nomesZ
ans$algorithm <- method$algorithm
EfRandom <- res[((length(nomesX))+1):((length(nomesX))+length(nomesZ)),]
ans$EfRandom <- data.frame(EfRandom)
Ntau <- res[(dim1-(length(ntau))):(dim1-1),1][-1]
names(Ntau) <- ntau[-1]
ans$method <- method$method
ans$link <- method$link
ans$Ntau <- Ntau
ans$EfFixef <- EfFixef
ans$lik <- lik
ans$inter <- inter
ans$formula <- formula
return(ans)
}
summary.Bayesthresh <- function(object, ...)
{
if(!inherits(object, "Bayesthresh"))
stop("Use an object of class Bayesthresh")
else{
veros <- as.numeric(object$lik)
Postmean <- veros[1]
Poststd <- veros[2]
vero_dat <- data.frame(Postmean, Poststd)
colnames(vero_dat) <- c("Post. mean", "Post.std.dev")
rownames(vero_dat) <- c(" ")
cat("Threshold model with algorithm",object$algorithm, "and link", object$link, "\n")
cat("Formula:", deparse(object$formula), "\n")
cat("\nDeviance:", -2*veros[1], "\n")
cat("\nMarginal Log-likelihood:\n")
print(vero_dat)
# cat("\nThresholds:\n")
# print(object$Ntau)
cat("\nRandom effects:\n")
print(object$compVar)
cat("\nFixed effects:\n")
print(object$EfFixef)
cat("\nIteraction Control:\n")
cat(paste("Burn =",object$inter$burn),",", paste("Jump =",object$inter$jump),",", paste("Iteraction =",object$inter$ef.iter),fill=TRUE)
cat("Time elapsed", object$final.time, "seconds", "\n")
}
}
print.Bayesthresh <- function(x,...)
{
summary.Bayesthresh(x,...)
}
### The main function
Bayesthresh <-function(formula, data, subset, na.action, A=NULL, algor = list(algorithm = "NC", link = "Gaussian"),
Write = FALSE, priors = list(ru=10, su=2, dre=20, dse=5),
burn = 50, jump = 2, ef.iter = 4000, model=TRUE)
### Linear Mixed-Effects in R with threshold models
{
mc <- match.call()
stopifnot(length(formula <- as.formula(formula)) == 3)
fr <- lmerFrames(mc, formula, contrasts) # model frame, X, etc.
FL <- lmerFactorList(formula, fr, 0L, 0L)
Zl <- MatrixW(FL)
X <- fr$X
Y <- fr$Y
nomesX <- names(fr$fixef)
nomesZ <- colnames(Zl)
escala <- as.numeric(levels(factor(Y)))
NomesVu <- names(FL$fl)
ntau <- paste("tau", 1:(length(escala)-1), sep=".")
nomes <- c(nomesX,nomesZ,ntau,NomesVu, c("verossim"))
nomes2 <- c(nomesX,nomesZ,NomesVu)
W <- cbind(as.matrix(X),as.matrix(Zl))
ntrat <- ncol(as.matrix(X))
nfixo <- ntrat
naleat <- ncol(as.matrix(Zl))
if(!is.null(A)){
if(dim(A)[1] != dim(A)[2]) stop("non-square matrix A")
}
else
A <- diag(naleat)
alg <- algorithm(algor$algorithm, algor$link)
alg <- as.character(call(alg[[1]]))
FUN <- match.fun(alg)
prior <- priors.control(priors$ru, priors$su, priors$dre, priors$dse, algor$algorithm)
initial.time <- proc.time()
if(algor$algorithm == "NC"){
result <- FUN(Y,X,Zl,W,A,escala, prior$ru, prior$su,
prior$dre, prior$dse, ntrat, nfixo,
naleat, burn, jump, ef.iter, Write,FL,nomes,nomes2)
}
else
result <- FUN(Y,X,Zl,W,A,escala, prior$ru, prior$su, ntrat, nfixo,
naleat, burn, jump, ef.iter, Write, FL,nomes,nomes2)
Mean <- result$Sum/ef.iter
stadev <- sqrt((result$SumSquare - ((result$Sum)^2)/ef.iter)/ef.iter)
res <- data.frame(Mean,stadev)
colnames(res) <- c("Post.mean", "Post.std.dev")
inter <- list(burn=burn, jump=jump, ef.iter=ef.iter)
saida <- outp(formula,res,algor,nomesX,nomesZ,ntau,NomesVu, inter)
saida$fl <- unlist(lapply(FL$fl, function(x) length(levels(x))))
saida$X <- X
saida$Zl <- Zl
saida$Y <- Y
saida$NamesTheta <- c(nomesX,nomesZ)
saida$NomesVu <- NomesVu
saida$outp.mcmc <- result$outp.mcmc
saida$Write <- Write
# cat("Threshold model with algorithm", algor$algorithm, "and link", algor$link, "\n")
# cat("Formula:", deparse(formula), "\n")
# cat(paste("Burn =",inter$burn),",", paste("Jump =",inter$jump),",", paste("Iteraction =",inter$ef.iter),fill=TRUE)
final.time <- proc.time()-initial.time
final.time <- final.time[3]
# cat("Time elapsed", final.time, "seconds", "\n")
saida$final.time <- final.time
class(saida) <- c("Bayesthresh")
invisible(saida)
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.