Подгонка смеси гаммы и нормального распределения к данным в R

Я хотел бы совместить гамму и нормальное распределение с моими данными в R.

Данные:

dput(A)
0.0838, 0.081, 0.0816, 0.0838, 0.0824, 0.0871, 0.0899, 0.0938, 0.099, 0.1018, 0.0998, 0.1, 0.0955, 0.0972

Основываясь на данных, которые я считаю (глядя на гистограмму), смесь гаммы и нормального распределения является лучшим кандидатом.

Для подбора распределения смеси я использовал следующие коды, используя функцию fitdist из пакета fitdistrplus:

# Define the quantile
qgm_normal <- function(p, 
                   w_gm=0.5,
                   par_shape=2,
                   par_rate=1,
                   mean=0,
                   sd=1) {
  w_normal=1-w_gm
  qgm=qgamma(p,shape=shape, rate=rate)
  qnormal=qnorm(p,mean =mean,sd = sd)
  return(w_gm*qgm+w_normal*qnormal)
}

# Define the distribution function
pgm_normal <- function(q, 
                   w_gm=0.5,
                   par_shape=2,
                   par_rate=1,
                   mean=0,
                   sd=1) {
  w_normal=1-w_gm
  pgm=pgamma(q,shape=shape, rate=rate)
  pnormal=pnorm(q,mean =mean,sd = sd)
  return(w_gm*pgm+w_norm*pnormal)
}

# Define the density
dgm_normal <-function(x,
                  w_gm=0.5,
                  par_shape=2,
                  par_rate=1,
                  mean=0,
                  sd=1) {
  w_normal=1-w_gm
  dgm=dgamma(x,shape=par_shape, rate=par_rate)
  dnormal=dnorm(x,mean =mean,sd = sd)
  return(w_gm*dgm+w_normal*dnormal)
}

fit_A <- fitdist(A, "gm_normal",start=list(w_gm=0.5, par_shape=2,par_rate=1, mean=0, sd=1))

Я прочитал вопрос, размещенный здесь R - подгонка дистрибутива смеси с помощью fitdistrplus, но у меня следующая ошибка:

Error in fitdist(A, "gm_normal", start = list(w_gm = 0.5, par_shape = 100,  : the function mle failed to estimate the parameters, 
            with the error code 1

Я мог, вероятно, не полностью понять решение, размещенное там. Если бы кто-то мог оказать некоторую помощь, был бы очень благодарен. Заранее спасибо!

1 ответ

Для всех, кто хочет сделать что-то подобное, этот пример кода работает, если вы просто замените и на и, соответственно.

Проблема заключалась в том, что rate а также shape параметры в вызовах функций не определены, поскольку он обозначает их как par_rate а также par_shape.

Также добавьте lower=c(0,0,0,0,0), upper=c(1,1000,1000,1000,1000) к fitdistвызовите, чтобы убедиться, что параметр микширования остается в [0,1]. Удачи.

Другие вопросы по тегам