混合高斯分布的矢量化和R中的积分/绘图

时间:2019-01-29 15:10:01

标签: r

我正在尝试用R将混合高斯分布的密度写为任意幂b。当前,我有两种有效的方法,但是如果可以避免for循环,我更喜欢。

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)
}

或者,我可以向量化它以避免for循环:

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

这两个都给出相同的结果,但是第二个效率更高,因为它是矢量化的。但是我接下来需要对此进行标准化,以使密度积分为1,我可以使用:

 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)
}

如果我使用for循环定义dnorm_mix_tempered_unnorm,则可以正常工作,并且可以使用curve()绘制密度。但是,如果我使用向量化定义dnorm_mix_tempered_unnorm,则会收到以下错误:

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

有人在我进行向量化并尝试集成时知道发生了什么吗?

预先感谢, R。

1 个答案:

答案 0 :(得分:0)

可能的选项是

PHP_EOL

但是我认为这与您的第一个建议非常相似。