如何使用泊松分布估计 [和绘制] 最大似然?
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")
我设置了一个函数来计算分布的可能性。我得到负值,我想知道我的功能是否正确?如果可以,我该如何将我的函数绘制成曲线?
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")