使用 WinBUGS 截断正态分布

机器算法验证 回归 贝叶斯 软件
2022-04-07 06:53:24

我正在尝试使用带有 WinBUGS 的截断正态分布进行非常简单的回归分析。

假设以下模型其中是 13 名学生(从 0 到 10)的年级,是每个学生的性别( 1 代表男性,0 代表女性)。我们想知道成绩是否取决于性别,所以我们可以说明男性的成绩是否高于女性,或者相反。以下代码很好,可以完成这项工作。但是,随着等级从 0 到 10,我认为使用截断的正态分布可以改进模型: 其中,分别是下限和上限。Y|β0,β1,σNormal(β0+β1X,σ)YXY|β0,β1,σTrNormal(β0+β1X,σ,α=0,β=10)αβ

WinBUGS 的截断正态分布可用作WBDev 共享组件但是,当我尝试将它与以下脚本一起使用时,它会意外挂起。返回标题为“未定义的真实结果”的消息。我究竟做错了什么?

WinBUGS 脚本:

#MODEL
model
{
    for(i in 1:N)
    {
       mu[i]<-b0+b1*x[i]
       #y[i]~dnorm(mu[i],tau)
       y[i]~djl.dnorm.trunc(mu[i],tau,0,10)
    }
    tau~dgamma(0.01,0.01)
    b0~dnorm(0,1.0E-6)
    b1~dnorm(0,1.0E-6)
    sigma<-sqrt(1/tau)
}
#DATA
list(N=13,y=c(9.6,7.0,5.0,8.0,8.4,6.4,6.1,9.1,8.8,5.7,8.9,6.1,6.5),x=c(1,1,1,1,1,1,0,0,0,0,0,0,0))
#INITS
list(tau=1, b0=0, b1=0)
3个回答

在 openbugs 中(所以我会在 winbugs 中假设相同,但可能是错误的)您可以使用 T 函数进行截断分布,例如:

y[i] ~ dnorm(x[i],tau)T(0,10)

我通过查阅WinBUGS 用户手册(第 47 页)找到了解决方案。我不得不修改初始参数,但我最终将I()函数与dnorm.

undefined real result表示数值溢出。可能的原因包括:

  • 从“模糊”先验分布生成的初始值可能在数值上是极端的——指定适当的初始值;

  • 数值上不可能的值,例如非正数的对数 - 例如,检查泊松建模时没有给出零期望;

  • 抽样中的数值困难。可能的解决方案包括:

    • 更好的初始值;
    • 提供更多信息的先验——可能仍会使用统一的先验,但其范围仅限于合理的值;
    • 更好的参数化以提高正交性;
    • 协变量的标准化,使其均值为 0,标准差为 1。
  • 如果所有初始值都相等,则可能发生。

Probit 模型特别容易受到这个问题的影响,即生成未定义的实际结果。如果一个概率是一个随机节点,它可能有助于对其分布设置合理的界限,例如

probit(p[i]) <- delta[i] delta[i] ~ dnorm(mu[i], tau)I(-5, 5)

有时只需单击更新按钮即可摆脱此陷阱。等效结构

p[i] <- phi(delta[i])

可能更宽容。

根据http://www.unc.edu/courses/2010fall/ecol/563/001/docs/solutions/assign10.htm,可能适用的两个问题是

  1. 可能需要调整上截断点(例如,从 10 到 10.0001)
  2. 种子链的初始值需要明确指定,因为 WinBUGS 可能会选择位于 ( , ) 之外的值。αβ