R 贝塔二项分布负对数似然和中α和β的优化

R 贝塔二项分布负对数似然和中α和β的优化,r,for-loop,sum,R,For Loop,Sum,我试图用数据集中的变量创建sigma/求和函数,如下所示: paste0("(choose(",zipdistrib$Leads[1],",",zipdistrib$Starts[1],")*beta(a+",zipdistrib$Starts[1],",b+",zipdistrib$Leads[1],"-",zipdistrib$Starts[1],")/beta(a,b))") betafcn <-function (a,b) { (choose(7,3)*beta(a+3,b

我试图用数据集中的变量创建sigma/求和函数,如下所示:

paste0("(choose(",zipdistrib$Leads[1],",",zipdistrib$Starts[1],")*beta(a+",zipdistrib$Starts[1],",b+",zipdistrib$Leads[1],"-",zipdistrib$Starts[1],")/beta(a,b))")
betafcn <-function (a,b) {
   (choose(7,3)*beta(a+3,b+7-3)/beta(a,b))+
   (choose(4,1)*beta(a+4,b+4-1)/beta(a,b))+
   (choose(2,0)*beta(a+0,b+2-0)/beta(a,b))
  }
当我输入代码时,我得到

[1] "(choose(9,6)*beta(a+6,b+9-6)/beta(a,b))"
我想创建一个sigma/求和函数,其中
a
b
是未知的自由浮动变量,
Leads[I]
Starts[I]
的值由我的数据集中
Leads
Starts
的值决定。我曾尝试将
sum
函数与
mapply
sapply
结合使用,但没有效果。目前,我采用的方法是使用
for
循环和
paste0
命令将函数创建为字符串,因此唯一需要更改的是变量
Leads
start
的值。然后,我尝试将结果强制转换为函数。令我惊讶的是,我实际上可以在不产生语法错误的情况下输入此代码,但是当我尝试优化变量
a
b
的函数时,我没有成功

下面是我用字符串创建函数的尝试

betafcn <- function (a,b) {
abfcnstring <- 
  for (i in 1:length(zipdistrib$Zip5))
    toString(
      paste0("      (choose(",zipdistrib$Leads[i],",",zipdistrib$Starts[i],")*beta(a+",zipdistrib$Starts[i],",b+",zipdistrib$Leads[i],"-",zipdistrib$Starts[i],")/beta(a,b))+")
   )
as.function(
  as.list(
    substr(abfcnstring, 1, nchar(abfcnstring)-1) 
  )
)
}
是否有更好的方法可以使用
mapply
lapply
或其他
*apply
函数将
sigma
i=1
编译为数据集长度?还是我一直在使用可怕的
for
循环?然后,一旦我创建了函数,我如何确保我可以优化
a
b

更新

这就是我的数据集的外观:

leads <-c(7,4,2)
sales <-c(3,1,0)
zipcodes <-factor(c("11111", "22222", "33333"))
zipleads <-data.frame(ZipCode=zipcodes, Leads=leads, Sales=sales)
zipleads
##  ZipCode Leads Sales
# 1   11111     7     3
# 2   22222     4     1
# 3   33333     2     0

leads由于默认情况下R对其大部分操作进行了矢量化,因此可以根据
a
b
的单个值(将自动循环到数据长度)和
x
y
的向量(即
leads
Sales
)编写表达式;如果在对数刻度上进行计算,则可以使用
sum()
(而不是
prod()
)组合结果。因此,我认为您正在寻找类似于:

betafcn <- function(a,b,x,y,log=FALSE) {
   r <- lchoose(x,y)+lbeta(a+x,b+x-y)-lbeta(a,b)
   if (log) r else exp(r)
}
对于这个例子,我得到了疯狂的答案(两个形状参数的值都非常大),但我认为这是因为很难将两个参数的模型拟合到三个数据点


由于beta二项式的形状参数(看起来是这样)必须为正,因此使用无约束优化可能会遇到麻烦。您可以使用
method=“L-BFGS-B”,lower=c(0,0)
或优化对数刻度上的参数…

由于默认情况下R将其大部分操作矢量化,因此您可以编写一个表达式,表示
a
B
的单个值(将自动循环到数据长度)以及
x
y
的向量(即
线索
销售
);如果在对数刻度上进行计算,则可以使用
sum()
(而不是
prod()
)组合结果。因此,我认为您正在寻找类似于:

betafcn <- function(a,b,x,y,log=FALSE) {
   r <- lchoose(x,y)+lbeta(a+x,b+x-y)-lbeta(a,b)
   if (log) r else exp(r)
}
对于这个例子,我得到了疯狂的答案(两个形状参数的值都非常大),但我认为这是因为很难将两个参数的模型拟合到三个数据点


由于beta二项式的形状参数(看起来是这样)必须为正,因此使用无约束优化可能会遇到麻烦。您可以使用
method=“L-BFGS-B”,lower=c(0,0)
或优化对数刻度上的参数…

我认为您的示例非常复杂。如果要尝试通过粘贴字符值来生成函数,首先需要了解如何使用未赋值表达式生成函数体,在理解基本任务后,可以详细说明。。。如果事实上是必要的,请注意BenBolker的建议

choosefcn <- function (a,b) {}
txtxpr <- paste0("choose(",9,",",6,")" )
body(choosefcn) <- parse(text= txtxpr)
#----------
> betafcn
function (a, b) 
choose(9, 6)

val1 <- "a"
val2 <- "b"
txtxpr <- paste0("choose(", val1, ",", val2, ")" )
body(choosefcn) <- parse(text= txtxpr)
#
choosefcn 
#function (a, b) 
#choose(a, b)

我觉得你的例子太复杂了。如果要尝试通过粘贴字符值来生成函数,首先需要了解如何使用未赋值表达式生成函数体,在理解基本任务后,可以详细说明。。。如果事实上是必要的,请注意BenBolker的建议

choosefcn <- function (a,b) {}
txtxpr <- paste0("choose(",9,",",6,")" )
body(choosefcn) <- parse(text= txtxpr)
#----------
> betafcn
function (a, b) 
choose(9, 6)

val1 <- "a"
val2 <- "b"
txtxpr <- paste0("choose(", val1, ",", val2, ")" )
body(choosefcn) <- parse(text= txtxpr)
#
choosefcn 
#function (a, b) 
#choose(a, b)

我不知道怎样才能最好地开始帮助你。首先,您是否知道
choose(7285341)
将返回什么?试着运行它,你可能会决定采取一种不同的方法,数学上。第二,这种“从字符串创建函数”的方法是完全错误的,我认为应该放弃这种方法,转而使用一些关于创建函数的基本R教程。假设为了进行论证,m sub 1和x sub 1的值是m1=9和x1=6。为了反映这一点,我改变了问题。如何创建一个beta函数的总和,将beta函数表示为固定变量和自由浮动变量的函数?我不知道如何最好地开始帮助您。首先,您是否知道
choose(7285341)
将返回什么?试着运行它,你可能会决定采取一种不同的方法,数学上。第二,这种“从字符串创建函数”的方法是完全错误的,我认为应该放弃这种方法,转而使用一些关于创建函数的基本R教程。假设为了进行论证,m sub 1和x sub 1的值是m1=9和x1=6。为了反映这一点,我改变了问题。如何使用表示为固定变量和自由浮动变量函数的beta函数来创建beta函数的总和?第一个函数似乎工作正常,但optim函数出现此错误:
lbeta中的错误(a+y,b+x-y):缺少参数“b”,除此之外,没有默认值:警告消息:在a+y中:较长的对象长度不是较短对象长度的倍数
第一个函数似乎工作正常,但我在optim函数中得到此错误:
lbeta中的错误(a+y
?formals
?body
?'function'   # needs to be quoted