Raw File
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)
}
back to top