如何使用泊松分布估计 [和绘制] 最大似然?

How to estimate [and plot] maximum likelihood with Poisson distribution?

我设置了一个函数来计算分布的可能性。我得到负值,我想知道我的功能是否正确?如果可以,我该如何将我的函数绘制成曲线?

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)

任何建议都会很有帮助。

不知道你的功能对不对,因为我不知道你想要什么。但是,我确实看到您的结果是两个负数和一个正数的总和(除非 lfactorial() 做了一些特别的事情;我不知道它是什么)。不过,我想我可以帮你解决曲线问题。

不知道大家是否熟悉这个包ggplot2, but I learned a lot about it here. Anyway, how to do the line curve would be described in a section of that website, at least if you want to literally connect the dots. If you want a smooth curve, that it's this place

无论如何,您的代码将是:

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:我不太了解你的功能,但你似乎很了解,所以也许这些图表可以帮助你可视化你的输出,看看它们是否看起来像他们应该的那样。

您可以在下面找到泊松分布的对数似然的完整表达式。此外,我使用 rpois 模拟了来自泊松分布的数据以使用等于 5 的 mu 进行测试,然后使用 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

此代码高度基于 Advanced R 的第 10 章,您可以在其中找到有关如何优化上述可能性的广泛讨论。

[已编辑]

对于问题的图形部分,您可以使用以下代码查看对数似然在不同 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")