Как оценить [и построить] максимальное правдоподобие с помощью распределения Пуассона?

У меня есть функция для вычисления вероятности распределения. Я получаю отрицательные значения, и мне интересно, верна ли моя функция? и если да, то как я могу изобразить свою функцию в виде кривой?

y <- function(mu, x) {
  n <- length(x)
  -n*mu + log(mu)*sum(x) - sum(lfactorial(x))
}

x<-c(5,4,0,1,4,7,3,5,4)
mu<-c(3,4,2.5)
y(x,mu)

Любые советы были бы очень полезны.


person irene    schedule 15.11.2020    source источник
comment
Не могли бы вы рассказать нам, какой дистрибутив вы пытаетесь записать?   -  person Álvaro A. Gutiérrez-Vargas    schedule 15.11.2020
comment
то, как вы использовали эту функцию, неверно, потому что у вас есть 9 значений и только 3 средства ... как средства рециркулируются? Нет смысла строить функцию правдоподобия   -  person StupidWolf    schedule 15.11.2020


Ответы (2)


Ниже вы можете найти полное выражение логарифмической вероятности распределения Пуассона. Кроме того, я смоделировал данные из распределения Пуассона, используя rpois для тестирования с mu, равным 5, а затем восстановил его из данных, оптимизируя логарифмическую вероятность, используя optimize

#set seed
set.seed(777)
#loglikeliood of poisson
log_like_poissson <- function(y) {
  n <- length(y)
  function(mu) {
    log(mu) * sum(y) - n * mu - sum(lfactorial(y))
  }
}
# Data simulation: Poisson with lambda = 5
y <- rpois(n=10000, lambda = 5)
# Optimization of the loglikelihood
optimise(log_like_poissson(y), 
         interval = c(0, 100), 
         maximum = TRUE)

#$maximum
#[1] 4.994493
#
#$objective
#[1] -22033.2

Этот код в значительной степени основан на главе 10 Advanced R где вы можете найти подробное обсуждение того, как оптимизировать вероятность, описанную выше.

[ИЗМЕНЕНО]

Что касается графической части вашего вопроса, вы можете использовать следующий код, чтобы увидеть, как ваша логарифмическая вероятность ведет себя при различных значениях mu. Как видно из графика, максимум функции находится при значении mu, равном 5 (как и ожидалось).

library(ggplot2)
values_for_mu<- seq(from=0.05, to = 10 ,   by =0.05 )
#new loglikelihood (only depends on mu)
log_like_poissson2 <- function(mu) {
  n <- length(y)
  (log(mu) * sum(y)) - (n * mu) - sum(lfactorial(y))
}
#Evaluate the loglikelihood at different values of mu
values_log_like <- unlist(lapply(values_for_mu, 
             FUN = log_like_poissson2))
#generate a dataframe to ggplot2
df <- data.frame(values_for_mu, values_log_like)
# Plot
ggplot(df, aes(x=values_for_mu, y=values_log_like)) +
  geom_line() + geom_vline(xintercept = 5, linetype="dotted", 
                           color = "red", size=1.5) + 
  xlab("mu") + ylab("Value of Log-likelihood")

введите описание изображения здесь

person Álvaro A. Gutiérrez-Vargas    schedule 15.11.2020
comment
Уважаемый @irene, я только что обновил свой ответ, включая график, который вы ищете. Я надеюсь, что это может вам помочь, если да, пожалуйста, осторожно подумайте, чтобы принять и проголосовать за мой ответ. Лучший. - person Álvaro A. Gutiérrez-Vargas; 15.11.2020

Я не знаю, верна ли ваша функция, потому что я не знаю, чего вы хотите. Однако я действительно видел, что ваш результат представляет собой сумму двух отрицательных чисел и одного положительного (если только этот lfactorial() не делает что-то особенное; я не знаю, что это такое). Тем не менее, я думаю, что могу помочь вам с кривой.

Не знаю, знакомы ли вы с пакетом ggplot2, но я много о нем узнал здесь. В любом случае, как сделать линейную кривую будет описано в разделе этого веб-сайта, по крайней мере, если вы хотите буквально соединить точки. Если вам нужна плавная кривая, то это это место.

В любом случае ваш код будет:

library(ggplot2)
yourData <- y(x,mu)

ggplot()+
  geom_line(aes(x = x, y = yourData))

Это основы, которые будут выводить:  введите описание изображения здесь Кстати, я предполагаю, что вектор x - это ваши x значения, которые будут идти по оси x, особенно потому, что в противном случае был беспорядок, и это было довольно мило. Если это не так, вы можете это изменить.

Немного доработав, вы сможете:

ggplot()+
  geom_line(aes(x = x, y = yourData), colour = "blue", size = 1.5)+
  theme_minimal()+
  xlab("Whatever this is")+
  ylab("What are your results?")+
  ggtitle("This is your graph. Enjoy!")

введите описание изображения здесь

PS: Я не совсем понимаю вашу функцию, но вы, кажется, понимаете, так что, возможно, эти графики помогут вам визуализировать ваши результаты и посмотреть, выглядят ли они так, как должны.

person Érico Patto    schedule 15.11.2020