Я пытаюсь записать плотность смешанного гауссовского распределения в произвольную степень b в R. В настоящее время у меня есть два метода, которые работают, но я бы предпочел, чтобы я мог избежать цикла 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)
}
Если я определяю dnorm_mix_tempered_unnorm с for for, это работает без проблем, и я могу использовать кривую () чтобы построить плотность.Но если я определяю 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
Кто-нибудь знает, что происходит, когда я вместо этого векторизируюсь и пытаюсь интегрировать?
Спасибо ваванс, р.