r - 在 R 中编写对数似然函数(什么是 theta?)

标签 r function log-likelihood

我的模型有以下对数似然,我正在尝试将其编写为 R 中的函数。

enter image description here

我的问题是因为我不知道如何根据函数编写 theta 。我对此进行了几次尝试,如下所示,任何有关这些是否接近正确的提示/建议都值得赞赏。

将 theta 写为 theta 的函数

#my likelihood function
mylikelihood = function(beta) {

#log-likelihood
result = sum(log(dengue$cases + theta + 1 / dengue$cases)) +
  sum(theta*log(theta / theta + exp(beta[1]+beta[2]*dengue$time))) + 
  sum(theta * log(exp(beta[1]+beta[2]*dengue$time / dengue$cases + exp(beta[1]+beta[2]*dengue$time))))

#return negative log-likelihood
return(-result)
}

我的下一次尝试将 thetas 替换为数据集中的 Xi,这里是(登革热$时间)

#my likelihood function attempt 2
mylikelihood = function(beta) {

#log-likelihood
result = sum((log(dengue$Cases + dengue$Time + 1 / dengue$Cases))) +
sum(dengue$Time*log(dengue$time / dengue$Time + exp(beta[1]+beta[2]*dengue$Time))) + 
sum(dengue$Cases * log(exp(beta[1]+beta[2]*dengue$Time / dengue$Cases + 
exp(beta[1]+beta[2]*dengue$Time))))

 #return negative log-likelihood
 return(-result)
 }

数据

   head(dengue)
  Cases Week Time
1   148   36    1
2   275   37    2
3   205   38    3
4   133   39    4
5   123   40    5
6   138   41    6

其中任何一个都接近正确吗?如果不是,我哪里出错了?

更新了对数似然的来源;

模型;

enter image description here

均值 µ 和色散参数 θ 的负二项分布有 pmf;

enter image description here

最佳答案

根本问题是您必须将 beta (问题的一个组成部分的截距和斜率)和 theta 作为单个参数向量的一部分传递。您还遇到了括号放置的其他问题,我已经修复了,并且我稍微重新组织了表达式。

您的代码中有几个更重要的错误。

  • 第一项不是分数;它是一个二项式系数。 (即,您应该使用 lchoose(),如下所示)
  • 您在第一个学期将 +1 更改为 -1。
nll <- function(pars) {                                                                                      
    beta <- pars[1:2]                                                                                        
    theta <- pars[3]                                                                                         
                                                                                                             
    ##log-likelihood                                                                                         
    yi <- dengue$Cases                                                                                       
    xi <- dengue$Time                                                                                        
    ri <- exp(beta[1]+beta[2]*xi)                                                                            
    result <- sum(lchoose(yi + theta - 1,yi)) +                                                              
        sum(theta*log(theta / (theta + ri))) +                                                               
        sum(yi * log(ri/(theta+ri)))                                                                         
    ##return negative log-likelihood                                                                         
    return(-result)                                                                                          
}                                                                                                            

读取数据

dengue <- read.table(row.names = 1, header = TRUE, text = "                                                  
 Cases Week Time                                                                                             
1   148   36    1                                                                                            
2   275   37    2                                                                                            
3   205   38    3                                                                                            
4   133   39    4                                                                                            
5   123   40    5                                                                                            
6   138   41    6                                                                                            
")         

拟合

猜测 (1,1,1) 的起始参数有点危险 - 了解参数的含义并猜测生物学上合理的值会更有意义 - 但它似乎没事。

nll(c(1,1,1))                                                                                                
optim(par = c(1,1,1), nll)                                                                                   

由于我们没有将 theta 限制为正数,因此我们会收到一些关于取负数的对数的警告,但这些可能是无害的(例如,请参阅 here )


替代方案

R 有很多用于拟合负二项式模型的内置机制(我应该知道你在做什么!)

MASS::glm.nb 自动为您设置所有内容,您只需指定预测变量(它使用对数链接并添加截距,因此指定 ~Time 将使平均值等于 exp(beta0 + beta1*Time))。

library(MASS)
glm.nb(Cases ~ Time, data = dengue)

bbmle 自动化程度较低,但更灵活(这里我在对数刻度上拟合 theta 以避免尝试任何负值)

library(bbmle)
mle2(Cases ~ dnbinom(mu = exp(logmu), size = exp(logtheta)),
                     parameters = list(logmu ~ Time),
                     data = dengue,
                     start = list(logmu = 0, logtheta = 0))

所有这三种方法(修正的负对数似然函数 + optim、MASS::glm.nb、bbmle::mle2) )给出相同的结果。

关于r - 在 R 中编写对数似然函数(什么是 theta?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72450237/

相关文章:

python - 在 Python 中计算分布的对数似然

r - facet_wrap 按列填充

C - 如何设置函数指针的关联数组?

r - 使用 r 中的预测概率求对数似然

scikit-learn - 属性错误 : 'str' object has no attribute 'parameters' due to new version of sklearn

c++ - 如何制作具有非特定类型的 vector 参数?

r - 如何使用 st_write 将 sf 对象作为 shapefile 写入 ESRI 文件地理数据库?

r - 在每个单元格中构建具有自定义颜色的六角形热图

使用查找另一个数据帧替换一个数据帧中的文本

C++ typedef 函数定义作为类成员以便稍后用于函数指针?