对于小(1e-4)参数值,无法使用rethinking::quap拟合贝叶斯模型
我正试图使用对于小(1e-4)参数值,无法使用rethinking::quap拟合贝叶斯模型,r,numerical-methods,bayesian,R,Numerical Methods,Bayesian,我正试图使用重新思考软件包版本2.13计算p的后验值: rethinking::quap( alist( n ~ dbinom(N, p), p ~ dnorm(1e-4, 0.5e-4) ), data = list(n = 10, N = 10e4), start = list(p = 10 / 10e4) ) 它抛出一个错误: 重新思考时出错::quap(alist(n~dbinom(n,p),p~dnorm(1e-04,5e-05)),: 非有限
重新思考软件包版本2.13计算p
的后验值:
rethinking::quap(
alist(
n ~ dbinom(N, p),
p ~ dnorm(1e-4, 0.5e-4)
),
data = list(n = 10, N = 10e4),
start = list(p = 10 / 10e4)
)
它抛出一个错误:
重新思考时出错::quap(alist(n~dbinom(n,p),p~dnorm(1e-04,5e-05)),:
非有限差分值[1]
参数的起始值可能离映射太远。
尝试更好的优先级或使用明确的起始值。
如果对随机开始值进行采样,只需重试即可。
此尝试中使用的起始值:
p=1e-04
start
实际上就是地图。
它适用于更大的p
值。
如何解决该问题?tl;dr您遇到了数值近似问题;添加control=list(ndeps=1e-6)
调整有限差分公差是解决该问题的最快方法
或者,您可以更改模型以适应对数刻度上的p
:
alist(
n ~ dbinom2(N, exp(logp)),
logp ~ dnorm(-4, 2)
)
更一般地说,如果你正在处理一个p
可能大于(比如)0.5的问题,你可能应该使用plogis(logit\p)
而不是exp(log\p)
(我使用log/exp而不是logit(qlogis))来适应对数赔率或logit标度,而不是对数标度/普洛吉斯:因为我首先想到了它,而且大多数人对它更熟悉。)
我尝试过的两种方法不起作用(我认为应该有;我需要进一步挖掘以找出原因):(1)通过control=list(parscale=1e-4)
指定参数的预期范围;(2)使用method=“L-BFGS-B”,lower=0
设置概率参数的下限
可悲的现实是,对可能性、后验概率等进行数值评估的工具非常脆弱,以至于你很快就需要了解引擎盖下发生的事情
我们可以通过编写一个dbinom2()
函数来诊断发生了什么,该函数只是dbinom
的一个“嘈杂”包装器:
dbinom2您的软件包版本是否与我的软件包版本提供相同的大量错误消息?谢谢,我添加了更多信息。
10 1e+05 1e-04 -2.078512
10 1e+05 0.0011 -78.1496
10 1e+05 -9e-04 NaN