首页 > 解决方案 > R优化对数似然

问题描述

我有一个函数,它接受 lambda 和一个数据样本,并为每个数据点找到相应的对数似然值:

data <- rpois(n=25, lambda=4)
generateLogLikelihood <- function(lambda, y){
  return(dpois(y, lambda, log=TRUE))
}

LogLikelihood = generateLogLikelihood (4,data)
LogLikelihood

我正在寻求满足此要求的解决方案:

我需要使用优化函数来返回 lambda 的值,它使给定数据样本的对数似然最大化,但我遇到了困难(这是我第一次尝试使用优化)。我需要调整函数以仅将“数据”作为输入。

我遇到困难的地方: 我不确定如何/何时应用优化......鉴于我的函数只需要一个输入(数据 - 现在称为 newdata)的要求,我是否需要在函数之外进行优化(但我的函数需要 lambda 值),所以我不知道该怎么做。

我当前的代码代表我不知道如何组合(或可能完全错误)的 2 个独立部分,如下所示:

newdata <- c(23,16,18,14,19,20,12,15,15,21)
newlambdas <- seq(min(newdata),max(newdata),0.5)

generateLogLikelihoodNew <- function(y){
  return(dpois(y, lambda, log=TRUE))
}

LogLikelihood = optimise(generateLogLikelihoodNew,newdata,lower = min(newlambdas), upper = max(newlambdas), maximum = TRUE)
LogLikelihood

标签: rlog-likelihood

解决方案


这里有几个问题:

  1. 问题中定义的对数似然函数仅对标量 y 值有效。向量 y 的对数似然函数是各个 y 值的对数似然之和。将 sum 添加到定义中。
  2. 优化的默认值是最小化,但使用对数似然作为我们需要最大化的目标,因此指定 maximum=TRUE 作为优化的参数(或者传递负对数似然函数)。
  3. y 需要传递给对数似然函数。这可以通过将其指定为要优化的参数来完成。
  4. 尽管在问题中指定 lower 和 upper 并没有错,但将 range(newdata) 传递给优化的间隔参数会更短一些。
  5. 尽管使用像 generateLogLikelihood 这样的长名称并没有错,但它会让人难以阅读,并且会使代码跑到最后。生成这个词真的什么也没增加。我会选择一个更好的名字。通常对于科学代码,它与数学公式一起阅读。假设在这种情况下,公式使用 ll 或 LL。ll 有点难以阅读,因为小写 L 和 one 看起来几乎相同,因此我们可以使用 LL,或者如果您真的想使用将其写出,请将其缩短为 logLikelihood。此外,代码中名为 logLikelihood 的变量不是对数似然。它是一个列表,由两个分量组成,分别代表 lambda 的值和最佳目标。

因此我们有:

LL <- function(lambda, y) sum(dpois(y, lambda, log = TRUE))
optimize(LL, range(newdata), y = newdata, maximum = TRUE)

推荐阅读