normalmixinit.r
normalmix.init = function (x, lambda = NULL, mu = NULL, s = NULL, k = 2,
arbmean = TRUE, arbvar = TRUE) {
if (!is.null(s)) {
arbvar <- (length(s) > 1)
if (arbvar)
k <- length(s)
}
if (!is.null(mu)) {
arbmean <- (length(mu) > 1)
if (arbmean) {
k <- length(mu)
if (!is.null(s) && length(s) > 1 && k != length(s)) {
stop("mu and sigma are each of length >1 but not of the same length.")
}
}
}
if(!arbmean && !arbvar){
stop("arbmean and arbvar cannot both be FALSE")
}
n = length(x)
x = sort(x)
x.bin = list()
for (j in 1:k) {
x.bin[[j]] <- x[max(1, floor((j - 1) * n/k)):ceiling(j * n/k)]
}
if (is.null(s)) {
s.hyp = as.vector(sapply(x.bin, sd))
if (arbvar) {
s = 1/rexp(k, rate = s.hyp)
} else {
s = 1/rexp(1, rate = mean(s.hyp))
}
}
if (is.null(mu)) {
mu.hyp <- as.vector(sapply(x.bin, mean))
if (arbmean) {
mu = rnorm(k, mean = mu.hyp, sd = s)
} else {
mu = rnorm(1, mean = mean(mu.hyp), sd = mean(s))
}
}
if (is.null(lambda)) {
lambda <- runif(k)
lambda <- lambda/sum(lambda)
} else {
lambda <- rep(lambda, length.out=k)
lambda <- lambda/sum(lambda)
}
list(lambda = lambda, mu = mu, s = s, k = k,
arbvar = arbvar, arbmean = arbmean)
}