R 贝塔二项分布负对数似然和中α和β的优化
我试图用数据集中的变量创建sigma/求和函数,如下所示: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
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