简体   繁体   中英

Vectorising density of mixture Gaussian distribution and integrating/plotting in R

I'm trying to write the density of a mixture Gaussian distribution to an arbitrary power, b, in R. Currently, I have two methods that works, but I prefer if I could avoid a for loop.

dnorm_mix_tempered_unnorm <- function(x, w, m, s, b) {
  value <- 0
  for (i in 1:length(w)) {value <- value + w[i]*dnorm(x, mean = m[i], sd = s[i])}
  value <- value^(b)
  return(value)
}

Alternatively, I can vectorise this to avoid the for loop:

dnorm_mix_tempered_unnorm <- function(x, w, m, s, b) {
  return(sum(w*dnorm(x, mean = m, sd = s))^b)
}

Both of these give the same result, but the second is more efficient since it is vectorised. But I need to next normalise this so that the density integrates to 1, I do this by using:

 dnorm_mix_tempered <- function(x, weights, means, sds, beta) {
  norm_constant <- integrate(function(x) dnorm_mix_tempered_unnorm(x, w = weights, 
                             m = means, s = sds, b = 1/beta), lower = -Inf, 
                             upper = Inf)$value
  value <- dnorm_mix_tempered_unnorm(x, w = weights, m = means, s = sds, b = 1/beta) 
           / norm_constant
  return(value)
}

If I define dnorm_mix_tempered_unnorm with for loops, this works with no problem, and I can use curve() to plot the density. But if I define dnorm_mix_tempered_unnorm by using vectorisation, then I get the following error:

 Error in integrate(function(x) dnorm_mix_tempered_unnorm(x, w = weights,  : 
  evaluation of function gave a result of wrong length 

Does anyone know what is going on when I am vectorising instead and trying to integrate?

Thanks in advance, R.

A possible option is

dnorm_mix_tempered_unnorm <- function(x, w, m, s, b) {
      return(rowSums(mapply(dnorm, mean = m, sd = m, MoreArgs = list(x = x)))^b)
}

But I think it is quite similar to your first proposal.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM