我有一个棒球统计数据集。 at-bats
有1列,hits
有1列。
我的目标是使用alpha
方法(最大似然估计)计算β分布的beta
和mle
参数。
mlf1 = function (alpha, beta) {
-sum(dbetabinom.ab(data$hits, data$atbats, alpha, beta, log=T))
}
mlf2 = function (alpha, beta) {
-sum(dbeta(data$hits/data$atbats, alpha, beta, log=T))
}
因此mlfX
是计算负对数似然的函数。 mlf1
使用beta-binomial分布,这意味着您传递成功(data$hits
)和总观察值(data$atbat
)进行计算。 mlf2
使用普通 beta分发版,它按照上述列的比例进行操作。它们应该基本上产生相同的结果。
我可以毫无问题地执行以下操作:
mle(mlf1, start=list(alpha=1, beta=10) method="L-BFGS-B")
它产生alpha
~74和beta
~222
如果我使用第二个负对数似然法执行mle
:
mle(mlf2, start=list(alpha=1, beta=10) method="L-BFGS-B")
它给了我这个:
Error in optim(start, f, method = method, hessian = TRUE, ...) :
L-BFGS-B needs finite values of 'fn'
如果我修改mlf2
以过滤掉超过30 at-bats
的玩家,则会开始有效。
mlf2modified = function (alpha, beta) {
data = filter(data, atbats > 30)
-sum(dbeta(data$hits/data$atbats, alpha, beta, log=T))
}
我的问题是为什么这两种基本相同的方法会使优化器的行为完全不同?如果你只有比例并且不想因为优化器正在运行而不想丢弃数据点,你可以做些什么来避免这种情况?
更新:
dbetabinom.ab
来自包VGAM
,mle
来自stats4
而dbeta
来自stats
答案 0 :(得分:0)
正如其他人所说,你正在比较估算费率的两种不同方法。当直接在y / n上使用beta分布时,您将每个速率视为提供与任何其他速率一样多的信息。当您使用beta二项式时,您使用y和n两者的信息,即2中的1个提供的基础速率等于50%的信息少于200%中的100个。
估算速率的最简单方法是使用二项分布,但要么是因为你是贝叶斯分布,要么是因为你认为观察结果比二项分数更多(证明额外使用分散参数)你最终得到了beta二项分布。因此,如果你的n并不完全相同,你会得到不同的结果也就不足为奇了。