r - 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
解决方案
这里有几个问题:
- 问题中定义的对数似然函数仅对标量 y 值有效。向量 y 的对数似然函数是各个 y 值的对数似然之和。将 sum 添加到定义中。
- 优化的默认值是最小化,但使用对数似然作为我们需要最大化的目标,因此指定 maximum=TRUE 作为优化的参数(或者传递负对数似然函数)。
- y 需要传递给对数似然函数。这可以通过将其指定为要优化的参数来完成。
- 尽管在问题中指定 lower 和 upper 并没有错,但将 range(newdata) 传递给优化的间隔参数会更短一些。
- 尽管使用像 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)
推荐阅读
- html - Bootstrap 4 textarea填充剩余的第二列高度
- neo4j - neo4j 索引立即失败,没有错误
- angular - Angular Reactive forms - 动态创建输入字段并使用 id 获取填充输入
- apache-spark - Spark 阶段停留在待处理状态
- swift - “用户”类型的值没有成员“setIdentifer” - Swift
- github - 从 Github 存储库中提取信息
- python - 如何比较python中的两列字符串?
- objective-c - 如何为多个屏幕拍摄没有图标和窗口的桌面壁纸屏幕?
- bash - Bash - 用单引号打印变量,但默认值不带引号
- sql - 这是蛮力尝试吗?(AWS SQL 服务器)