R 编写似然函数时使用积分的问题

R 编写似然函数时使用积分的问题,r,R,我试图为一个由积分定义的分布写一个似然函数。我使用的是integrate()函数,但是当我尝试在函数的其余部分使用它时,我得到了一个错误: “B(alpha+i,beta+6-i)/B(alpha,beta)中出错:二进制运算符的非数字参数” 积分值为“9.501501,绝对误差

我试图为一个由积分定义的分布写一个似然函数。我使用的是integrate()函数,但是当我尝试在函数的其余部分使用它时,我得到了一个错误:

“B(alpha+i,beta+6-i)/B(alpha,beta)中出错:二进制运算符的非数字参数”

积分值为“9.501501,绝对误差<0.00078”。我尝试过使用trunc(),但这也没用。我对R比较陌生,所以有已知的解决方案吗?任何帮助都将不胜感激

B <- function(a,b){ 
   integrand <- function(t){(t^(a-1))*((1-t)^(b-1))} 
   integrate(integrand,lower=0,upper=1) 
} 
betalik <- function(alpha,beta){ 
    likelihood <- 0 Z <- c(37,22,25,29,34,49) 
    for(i in 1:6) 
       likelihood <- likelihood + 
         Z[i]*log((B(alpha+i,beta+6-i))/B(alpha,beta)) 
    return(likelihood) 

B使用
中的集成示例?集成

integrate(dnorm, -1.96, 1.96)
# 0.9500042 with absolute error < 1e-11
因此,如果您只需要整数的值,那么您必须提取由该函数创建的列表的
字段,以便进行计算。例如

10*integrate(dnorm, -1.96, 1.96)$value
# [1] 9.500042

使用
?integrate
中的integrate示例

integrate(dnorm, -1.96, 1.96)
# 0.9500042 with absolute error < 1e-11
因此,如果您只需要整数的值,那么您必须提取由该函数创建的列表的
字段,以便进行计算。例如

10*integrate(dnorm, -1.96, 1.96)$value
# [1] 9.500042

跟进上述评论和答案

以下是您的原始函数,它们的格式更精确,集成了@Fhnuzoag关于从
integrate()
结果中提取
$value
组件的注释:

B <- function(a,b){
    integrand <- function(t){(t^(a-1))*((1-t)^(b-1))}
    integrate(integrand,lower=0,upper=1)$value
}
betalik <- function(alpha,beta){
    likelihood <- 0
    Z <- c(37,22,25,29,34,49)
    for(i in 1:6) likelihood <- likelihood +
        Z[i]*log((B(alpha+i,beta+6-i))/B(alpha,beta))
    return(likelihood)
} 
我更喜欢单独指定“数据”:

Z <- c(37,22,25,29,34,49)

(最好进一步概括一下,用
length(Z)
..替换代码中
6
的值)

跟进上面的注释和答案

以下是您的原始函数,它们的格式更精确,集成了@Fhnuzoag关于从
integrate()
结果中提取
$value
组件的注释:

B <- function(a,b){
    integrand <- function(t){(t^(a-1))*((1-t)^(b-1))}
    integrate(integrand,lower=0,upper=1)$value
}
betalik <- function(alpha,beta){
    likelihood <- 0
    Z <- c(37,22,25,29,34,49)
    for(i in 1:6) likelihood <- likelihood +
        Z[i]*log((B(alpha+i,beta+6-i))/B(alpha,beta))
    return(likelihood)
} 
我更喜欢单独指定“数据”:

Z <- c(37,22,25,29,34,49)

(最好进一步概括一下,用
length(Z)
替换代码中
6
的值)

您没有给我们提供足够的信息。至少对于这样一个问题,你应该发布导致错误的代码。没问题,代码如下:B Hmmm,tyepsetting不太配合…你应该将其编辑到你的问题中,而不是将其添加为注释。此外,beta函数有一个内置函数(试试
beta
)而且已经有一个内置的beta密度函数(请尝试
dbeta
),您没有给我们提供足够的信息。至少对于这样一个问题,你应该发布导致错误的代码。没问题,代码如下:B Hmmm,tyepsetting不太配合…你应该将其编辑到你的问题中,而不是将其添加为注释。此外,beta函数有一个内置函数(试试
beta
)而且beta密度已经有了一个内置的函数(请尝试
dbeta
),谢谢大家的宝贵反馈。如果您使用integrate(),很高兴知道事情是如何工作的,但对于我想做的事情,lbeta已经足够了。optim()还有其他一些小错误需要解决,但总的来说一切正常!好啊如果你觉得你的问题已经得到了回答,你可以接受一个或另一个答案。根据您对似然估计所做的操作,您可能会发现
stats4
程序包中的
mle
函数或
bbmle
程序包中的
mle2
函数非常有用(还有一个
maxLik
程序包…)只是作为警告,这些软件包中的大多数都要求您指定负对数可能性…感谢您对每个人的深刻反馈。如果您使用integrate(),很高兴知道事情是如何工作的,但对于我想做的事情,lbeta已经足够了。optim()还有其他一些小错误需要解决,但总的来说一切正常!好啊如果你觉得你的问题已经得到了回答,你可以接受一个或另一个答案。根据您对似然估计所做的操作,您可能会发现
stats4
程序包中的
mle
函数或
bbmle
程序包中的
mle2
函数非常有用(还有一个
maxLik
程序包…)只是作为警告,这些包中的大多数要求您指定负对数可能性。。。