从我的模型中,我得到了下面的对数似然,我正试图将其写为R中的一个函数.

enter image description here

我的问题来了,因为我不知道如何写θ的函数方面.如下图所示,我对此进行了几次try ,如有任何关于这些是否接近正确的提示/建议,我将不胜感激.

将θ写入θ的函数

#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)
}

我的下一次try 是用数据集中的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

这两种方法中有哪一种接近正确,如果没有,我会错在哪里?

更新日志(log)可能性的来源;

模型;

enter image description here

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

enter image description here

推荐答案

基本问题是,必须将beta(问题一个分量的截距和斜率)和theta作为单个参数向量的一部分进行传递.我修复了括号位置的其他问题,并稍微重新组织了表达式.

代码中还有几个更重要的错误.

  • 第一项为not a fraction;这是一个二项式系数.(即,您应该使用lchoose(),如下所示)
  • 您在第一学期将a+1改为a-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)的起始参数有点危险-了解meaning个参数的一些信息并猜测生物学上合理的值会更有意义-但似乎没有问题.

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

由于我们没有将θ限制为正值,因此我们得到了一些关于记录负数的警告,但这些警告可能是无害的(例如,请参阅here)


Select

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

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

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

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

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

所有这三种方法(修正的负对数似然函数+optimMASS::glm.nbbbmle::mle2)都给出了相同的结果.

R相关问答推荐

使用预定值列表将模拟数量(n)替换为rnorm()

是否可以 Select 安装不带文档的R包以更有效地存储?

从多个前置日期中获取最长日期

MCMC和零事件二元逻辑回归

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

如何在区分不同条件的同时可视化跨时间的连续变量?

将多列合并为单独的名称—值对

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

用R ggplot2求上、下三角形中两个变量的矩阵热图

R:用GGPLATE,如何在两个独立的变量中制作不同形状的散点图?

R如何计算现有行的总和以添加新的数据行

如何使用字符串从重复的模式中提取多个数字?

R -基线图-图形周围的阴影区域

减少雨云面之间的间距并绘制所有统计数据点

R仅当存在列时才发生变异

对R中的列表列执行ROW Mean操作

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

如何使用包metaviz更改标签的小数位数?

使用其他DF中的文件名将列表中的每个元素保存到文件中

如何在给定的环境中找到函数的函数参数?