Как рассчитать плотность вероятности для отдельных и для комбинированных компонентов из me.weighted ()

Я использую Mclust для оценки вероятности членства в компонентах, но плотность не включается в вывод me.weighted (). Следовательно, я не могу изобразить плотность вероятности. Следующий код является длинным, потому что я хочу четко проиллюстрировать мою цель и проблему, но я четко указываю, где возникает моя проблема / вопрос. Моя последняя часть кода - это моя попытка решения, но она, вероятно, только подчеркивает мое незнание плотностей вероятностей.

В этом исследовательском проекте моя первая цель - вычислить индекс численности рыбы возраста 1 для последующего анализа. Для этого я хочу оценить долю рыбы возраста 1 определенной длины (т.е. ключ длины к возрасту). Разумно предположить, что меньшая мода - это в основном рыба возраста 1, а большая мода - рыба возраста 2+. Мои данные - это длина тела рыбы (длина вилки, см) и численность в процентах от общей численности (т.е. взвешенная одномерная величина). Обратите внимание, что некоторые очень большие длины с небольшими пропорциями были опущены; таким образом, сумма (dat.df $ пропорции) ‹1.

Моя конкретная цель здесь - проиллюстрировать плотности вероятности, наложенные на размерный состав рыбы, который отражает две возрастные группы. По сути, в последнем фрагменте кода ggplot я хочу поменять местами предполагаемую вероятность принадлежности к каждому (красному) или любому (зеленому) компоненту с плотностями вероятности, потому что это сделало бы красивую информативную фигуру в моей рукописи.

Я читал соответствующие статьи (Мерфи; Скрукка и др .; Миньян; R-Bloggers и т. Д.), Но не нашел ответа.

Итак, я был бы весьма признателен за любую помощь в вычислении плотности вероятности для каждого компонента, а также плотности вероятности, объединенной в компоненты.

Пакеты

library(ggplot2)
library(mclust) 

Данные

dat.df <- data.frame(flcm = 15:33, proportion = c(0.0043, 0.0114, 0.0296, 0.0519, 0.0540, 0.0403, 0.0294, 0.0152, 0.0257, 0.0793, 0.1458, 0.1505, 0.1277, 0.0909, 0.0389, 0.0308, 0.0121, 0.0101, 0.0085), z1 = c(rep(1,9), rep(0,10)), z2 = c(rep(0,9), rep(1,10)))

Данные графика

ggplot()+
  geom_bar(aes(x=dat.df$flcm, y=dat.df$proportion),
           fill = "gray", position="dodge", stat="identity")+
  xlab("Fork length (cm)")+
  ylab("Probability density")+
  theme_bw()

БЕЗ ВЕСА (т.е. игнорировать пропорцию dat.df $)

Подходит для модели смеси без грузов

mod1 <- densityMclust(dat.df[, "flcm"], modelName = "V")

Постройте плотность вероятности

plot(mod1, what = "density", data = dat.df$flcm, breaks = 5)

С ВЕСОМ (т. е. с учетом доли dat.df $)

Установить модель с грузами

mod1_w <- me.weighted(modelName = "V", 
            data = dat.df$flcm,
            z = cbind(dat.df$z1, dat.df$z2),
            weights = dat.df$proportion)

Данные графика с предполагаемым дробным членством (обновлено z)

ggplot()+
  geom_bar(aes(x=dat.df$flcm, y=dat.df$proportion),
           fill = "gray", position="dodge", stat="identity")+
  geom_line(aes(x = dat.df$flcm, 
                y = (mod1_w$z[,1] * dat.df$proportion)), 
            color = "red") +
  geom_line(aes(x = dat.df$flcm, 
                y = (mod1_w$z[,2] * dat.df$proportion)), 
            color = "red") +
    geom_line(aes(x = dat.df$flcm, 
                y = (mod1_w$z[,1] * dat.df$proportion) +
                  mod1_w$z[,2] * dat.df$proportion), 
              color = "green") +
  xlab("Fork length (cm)")+
  ylab("Probability density")+
  theme_bw()

Постройте график плотности вероятности - Вот где возникает моя проблема / вопрос

plot(mod1_w, what = "density", data = dat.df$flcm, breaks = 5)`

Вот моя попытка решения. По сути, для каждого компонента (age1, age2) умножьте вероятности и масштабируйте пропорционально численности:

#age1 probability density
age1 <- mod1_w$z[,1]* #probability of age1 membership multiplied by
  dnorm(dat.df$flcm, mod1_w$parameters$mean[1], #probability of flcm given age1
        mod1_w$parameters$variance$sigmasq[1])* 
  sum(mod1_w$z[,1]*mod1_w$weights) #and scaled to proportional abundance of age1

#age2 probability density
age2 <- mod1_w$z[,2]* #probability of age2 membership multiplied by
  dnorm(dat.df$flcm, mod1_w$parameters$mean[2],
        mod1_w$parameters$variance$sigmasq[2])* #probability of flcm given age2
  sum(mod1_w$z[,2]*mod1_w$weights) #and scaled to proportional abundance of age2

#combined ages probability density
age_all <- age1 + age2

#looks bad - the probability densities don't correspond well with proportional abundance
ggplot()+
  geom_bar(aes(x=dat.df$flcm, y=dat.df$proportion),
           fill = "gray", position="dodge", stat="identity")+
  geom_line(aes(x = dat.df$flcm, 
                y = age1), 
            color = "red") +
  geom_line(aes(x = dat.df$flcm, 
                y = age2), 
            color = "red") +
    geom_line(aes(x = dat.df$flcm, 
                y = age_all), 
              color = "green") +
  xlab("Fork length (cm)")+
  ylab("Probability density")+
  theme_bw()

person JPollock    schedule 24.02.2021    source источник
comment
Вы должны всегда включать library(.) вызовы для загрузки пакетов require. Я почти уверен, что в различных plot функциях пакетов в моей рабочей области нет аргументов what. Вы также должны включать данные либо в dput вывод, либо в код, который создает данные в форме, необходимой для этих пакетов.   -  person IRTFM    schedule 25.02.2021
comment
Я добавил выписки из библиотеки. Оператор data.frame () создает необходимый объект для ввода данных в эти пакеты. Извините за беспокойство!   -  person JPollock    schedule 25.02.2021


Ответы (1)


Я публикую решение своего вопроса; надеюсь, это поможет другим. По сути, я переключился на пакет mxdist, который дает мне желаемый результат, как показано в следующем коде.

library(mxdist)

#input data (dat.df is created by code in my original question)
dat.mx <- as.mixdata(dat.df[, 1:2])
#preliminary plot
plot(dat.mx)
#define initial parameters
dat_parms <- data.frame(pi=c(0.3, 0.7), mu=c(18, 26), sigma=c(2, 3))
#fit the model
fit1 <- mix(dat.mx, dat_parms, "gamma", constr=mixconstr(consigma="CCV"))
#plot default
plot(fit1)
#replot using ggplot for greater flexibility over appearance
z <- fitted(fit1)
dat.mx[dat.mx$flcm == "Inf", "flcm"] <- 34
ggplot()+
  geom_bar(aes(x=dat.mx$flcm, y=dat.mx$proportion),
           fill = "gray", position="dodge", stat="identity")+
  geom_line(aes(x = dat.mx$flcm, 
                y = z$joint[,1]), 
            color = "red") +
  geom_line(aes(x = dat.mx$flcm, 
                y = z$joint[,2]), 
            color = "red") +
    geom_line(aes(x = dat.mx$flcm, 
                y = z$mixed), 
              color = "green") +
  xlab("Fork length (cm)")+
  ylab("Probability density")+
  theme_bw()
#conditional probabilities are output
z$conditprob

person JPollock    schedule 25.02.2021