我正在尝试用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。
答案 0 :(得分:0)
可能的选项是
PHP_EOL
但是我认为这与您的第一个建议非常相似。