Векторизация плотности смеси Гауссово распределение и интегрирование / построение в R - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь записать плотность смешанного гауссовского распределения в произвольную степень 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 

Кто-нибудь знает, что происходит, когда я вместо этого векторизируюсь и пытаюсь интегрировать?

Спасибо ваванс, р.

1 Ответ

0 голосов
/ 30 января 2019

Возможный вариант:

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

Но я думаю, что он очень похож на ваше первое предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...