nof1.inits <- function(nof1, n.chains){
response <- nof1$response
inits <- tryCatch({
value <- if(response == "normal"){
nof1.inits.normal(nof1, n.chains)
} else if(response == "ordinal"){
nof1.inits.ordinal(nof1, n.chains)
} else if(response == "binomial" || response == "poisson"){
nof1.inits.binom.poisson(nof1, n.chains)
}
if(any(is.nan(unlist(value)))) value <- NULL
#if initial value generated is too big (i.e. model didn't work because of sparse data), just set inital value to be NULL
if(!is.null(value)){
if(any(abs(unlist(value)) > 100)) value <- NULL
}
value
}, error = function(err){
print(paste("Initial value not working: ",err))
return(NULL)
}, warning = function(warning){
print(paste("Warning: ", warning))
return(NULL)
})
return(inits)
}
nof1.inits.normal <- function(nof1, n.chains){
with(nof1, {
Treat.matrix <- NULL
for(i in Treat.name){
Treat.matrix <- cbind(Treat.matrix, nof1[[paste0("Treat_", i)]])
}
model <- lm(Y ~ Treat.matrix)
co <- coef(summary(model))
# else{
# model <- lm(Y ~ Treat.matrix + BS)
# co <- coef(summary(model))
# }
############# Generate initial values
initial.values = list()
for(i in 1:n.chains){
initial.values[[i]] = list()
}
for(i in 1:n.chains){
initial.values[[i]][["alpha"]] <- co[1,1] + rnorm(1) *co[1,2]
for(j in 1:length(Treat.name)){
initial.values[[i]][[paste0("beta_", Treat.name[j])]] <- co[1+j,1] + rnorm(1) * co[1+j,2]
}
# if(!is.null(knots)){
# for(j in 1:ncol(BS)){
# initial.values[[i]][[paste0("gamma", j)]] <- co[1+length(Treat.name)+j, 1] + rnorm(1) * co[1+length(Treat.name)+j, 2]
# }
# }
}
if(!is.nan(summary(model)$fstat[1])){
for(i in 1:n.chains){
fit <- summary(model)
df <- fit$df[2]
random.ISigma <- rchisq(1, df)
resid.var <- fit$sigma^2
sigma2 <- resid.var * df/ random.ISigma
if(hy.prior[[1]] == "dunif"){
if(sqrt(sigma2) > hy.prior[[3]]){
stop("data has more variability than your prior does")
}
}
if(hy.prior[[1]] == "dgamma"){
initial.values[[i]][["prec"]] <- 1/sigma2
} else if(hy.prior[[1]] == "dunif" || network$hy.prior[[1]] == "dhnorm"){
initial.values[[i]][["sd"]] <- sqrt(sigma2)
}
}
}
return(initial.values)
})
}
nof1.inits.binom.poisson <- function(nof1, n.chains){
with(nof1, {
Treat.matrix <- NULL
for(i in Treat.name){
Treat.matrix <- cbind(Treat.matrix, nof1[[paste0("Treat_", i)]])
}
if(response == "binomial"){
model <- glm(Y ~ Treat.matrix, family = binomial(link = "logit"))
co <- coef(summary(model))
# else{
# model <- glm(Y ~ Treat.matrix + BS, family = binomial(link = "logit"))
# co <- coef(summary(model))
# }
} else if(response == "poisson"){
model <- glm(Y ~ Treat.matrix, family = "poisson")
co <- coef(summary(model))
# else{
# model <- glm(Y ~ Treat.matrix + BS, family = "poisson")
# co <- coef(summary(model))
# }
}
initial.values = list()
for(i in 1:n.chains){
initial.values[[i]] = list()
}
for(i in 1:n.chains){
initial.values[[i]][["alpha"]] <- co[1,1] + rnorm(1) *co[1,2]
for(j in 1:length(Treat.name)){
initial.values[[i]][[paste0("beta_", Treat.name[j])]] <- co[1+j,1] + rnorm(1) * co[1+j,2]
}
# if(!is.null(knots)){
# for(j in 1:ncol(BS)){
# initial.values[[i]][[paste0("gamma", j)]] <- co[1+length(Treat.name)+j, 1] + rnorm(1) * co[1+length(Treat.name)+j, 2]
# }
# }
}
return(initial.values)
})
}
nof1.inits.ordinal <- function(nof1, n.chains){
with(nof1, {
p <- rep(NA, ncat)
c <- rep(NA, ncat-1)
for (i in seq(ncat)) {
p[i] = sum(Y[!is.na(Y)]==i)/nobs
if (!is.na(p[i]) & p[i] == 0) { p[i] = 0.05 }
}
if(sum(p[!is.na(p)])> 1) {
p[max(which(p == max(p)))] = p[max(which(p == max(p)))] + 1 - sum(p)
}
initial.values = list()
for(i in 1:n.chains){
initial.values[[i]] = list()
}
for(i in 1:n.chains){
p <- combinat::rmultz2(nobs,p)/nobs
if (any(p == 0)) {
p[which(p == 0)] <- 0.05
p[max(which(p == max(p)))] <- p[max(which(p == max(p)))] + 1 - sum(p)
}
q <- 1 - cumsum(p)
for(j in seq(ncat -1)){
c[j] <- -log(q[j]/(1-q[j]))
}
dc <- c(c[1], c[-1] - c[-(ncat-1)])
initial.values[[i]][["dc"]] <- dc
}
Treat.matrix <- NULL
for(i in Treat.name){
Treat.matrix <- cbind(Treat.matrix, nof1[[paste0("Treat_", i)]])
}
# if(is.na(knots)){
# model <- polr(as.ordered(Y) ~ Treat.matrix, Hess = TRUE)
# co = coef(summary(model))
# }
model <- MASS::polr(as.ordered(Y) ~ Treat.matrix, Hess = TRUE)
co = coef(summary(model))
if(!is.null(model)){
co_Treat <- co[grep('Treat.matrix', rownames(coef(summary(model)))),,drop = FALSE]
#co_BS <- co[grep('BS', rownames(coef(summary(model)))), ]
for(i in 1:n.chains){
for(j in 1:length(Treat.name)){
initial.values[[i]][[paste0("beta_", Treat.name[j])]] <- co_Treat[j,1] + rnorm(1) * co_Treat[j,2]
}
# if(!is.na(knots)){
# for(j in 1:ncol(BS)){
# initial.values[[i]][[paste0("gamma", j)]] <- co_BS[j, 1] + rnorm(1) * co_BS[j, 2]
# }
# }
}
}
return(initial.values)
})
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.