R 优化对数似然

R optimise log-likelihood

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

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

LogLikelihood = generateLogLikelihood (4,data)
LogLikelihood

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

我需要使用优化函数来 return 最大化给定数据样本的对数似然的 lambda 值,但我被卡住了(这是我第一次尝试使用优化) .我需要调整函数以仅将 'data' 作为输入。

我卡住的地方: 我不确定 how/when 应用优化...考虑到我的函数只接受一个输入(数据 - 现在称为 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

如果您只想检查所提供的 lambda 中哪个 returns 最适合您

generateLogLikelihoodNew <- function(y){
  -sum(dpois(newdata, y, log=TRUE))
}
which.min(lapply(newlambdas,generateLogLikelihoodNew))

但是,如果您想找到这样的 lambda 值,则无需提供 lambda 序列向量

optimise(
  function(x){-sum(dpois(newdata,x,log=TRUE))},
  c(0,100)
)

$minimum
[1] 17.3

$objective
[1] 26.53437

这里有几个问题:

  1. 问题中定义的对数似然函数仅对标量 y 值有效。向量 y 的对数似然函数是各个 y 值的对数似然之和。将 sum 添加到定义中。
  2. 优化的默认设置是最小化,但要使用对数似然作为 objective 我们需要最大化,因此指定 maximum=TRUE 作为参数进行优化(或者传递负对数似然函数)。
  3. y 需要传递给对数似然函数。这可以通过将其指定为优化参数来完成。
  4. 尽管在问题中指定 lower 和 upper 并没有错,但将 range(newdata) 传递给 optimize 的 interval 参数要短一些。
  5. 虽然使用像 generateLogLikelihood 这样的长名称并没有错,但它会让人难以阅读,并且会使代码 运行 偏离结尾。生成这个词真的没有增加任何东西。我会选择一个更好的名字。通常对于科学代码,它是连同它的数学公式一起阅读的。假设在这种情况下,公式使用 ll 或 LL。 ll 有点难以阅读,因为小写 L 和 one 看起来几乎相同,所以我们可以使用 LL,或者如果您真的想使用它,请将其写下来,将其缩短为 logLikelihood。此外,代码中名为 logLikelihood 的变量不是对数似然。它是一个由两个组件组成的列表,它们代表 lambda 的值和最优的 objective。显然在选择名称时有一定的自由裁量权,您的意见可能与我的不同,但我发现处理这么长的变量名很尴尬。

因此我们有:

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