在rstan(贝叶斯分析)中转换变量

在rstan(贝叶斯分析)中转换变量,r,bayesian,stan,R,Bayesian,Stan,我是贝叶斯分析的新手,正在尝试使用rstan来估计后验密度分布。这个练习试图重新创建我所在大学使用stan给我们提供的一个示例,但我对如何正确转换变量有点困惑。我当前的代码运行没有错误,但结果与大学给出的结果不匹配(尽管很接近),为了清晰起见,下面的图表使用了黑色的斯坦估计值。我通过查阅手册并将随机位拼凑在一起使代码正常工作,但我不太清楚为什么需要target,以及gamma的转换是否确实正确。任何指导都将不胜感激 型号 标准代码 data { int<lower=0> I;

我是贝叶斯分析的新手,正在尝试使用rstan来估计后验密度分布。这个练习试图重新创建我所在大学使用stan给我们提供的一个示例,但我对如何正确转换变量有点困惑。我当前的代码运行没有错误,但结果与大学给出的结果不匹配(尽管很接近),为了清晰起见,下面的图表使用了黑色的斯坦估计值。我通过查阅手册并将随机位拼凑在一起使代码正常工作,但我不太清楚为什么需要
target
,以及gamma的转换是否确实正确。任何指导都将不胜感激

型号

标准代码

data {
  int<lower=0> I;
  int<lower=0> n[I];
  int<lower=0> x[I];
  real<lower=0> a;
  real<lower=0> b;
  real m;
  real<lower=0> p;
}

parameters {
  real<lower=0> lambda;
  real mu;
  real<lower=0, upper=1> theta[I];
}

transformed parameters {
  real gam[I];
  for( j in 1:I)
   gam[j] = log(theta[j] / (1-theta[j])) ;
}


model {
  target +=  gamma_lpdf( lambda |  a, b);
  target +=  normal_lpdf( mu | m , 1/sqrt(p));
  target +=  normal_lpdf( gam | mu, 1/sqrt(lambda));
  target +=  binomial_lpmf( x | n , theta);
}
library(rstan)
fit <- stan(
  file = "hospital.stan" , 
  data = dat , 
  iter = 20000,
  warmup = 2000,   
  chains = 1
)
structure(
  list(
      I = 12L, 
      n = c(47, 211, 810, 148, 196, 360, 119,  207, 97, 256, 148, 215), 
      x = c(0, 8, 46, 9, 13, 24, 8, 14, 8, 29, 18, 31), 
      a = 2, 
      b = 2, 
      m = 0, 
      p = 0.01), 
  .Names = c("I", "n", "x", "a", "b", "m", "p")
)
---使用解决方案更新---

Ben Goodrich指出的问题是,我是从θ推导gamma的,而θ应该是另一种方式,因为gamma是我的随机变量。下面是正确的stan代码

data {
    int<lower=0> I;
    int<lower=0> n[I];
    int<lower=0> x[I];
    real<lower=0> a;
    real<lower=0> b;
    real m;
    real<lower=0> p;
}

parameters {
    real<lower=0> lambda;
    real mu;
    real gam[I];
}

transformed parameters {
    real<lower=0 , upper=1> theta[I];
    // theta = inv_logit(gam);  // Alternatively can use the in-built inv_logit function which is vectorised
    for(j in 1:I){
        theta[j] = 1 / ( 1 + exp(-gam[j]));
    }
}

model {
    target +=  gamma_lpdf( lambda |  a, b);
    target +=  normal_lpdf( mu | m , 1/sqrt(p));
    target +=  normal_lpdf( gam | mu, 1/sqrt(lambda));
    target +=  binomial_lpmf( x | n ,  theta );
}
数据{
int I;
int n[I];
int x[I];
真正的a;
实数b;
实m;
实p;
}
参数{
真lambda;
实木;
真伽马[I];
}
变换参数{
实θ[I];
//theta=inv_logit(gam);//或者可以使用向量化的内置inv_logit函数
对于(j in 1:I){
θ[j]=1/(1+exp(-gam[j]);
}
}
模型{
目标+=伽马| uLPDF(λa,b);
目标+=正常的lpdf(μm,1/sqrt(p));
目标+=正常的lpdf(gam | mu,1/sqrt(λ));
目标+=二项式lpmf(x | n,θ);
}

作为提示,尝试将
gam
(ma)放入
参数
块中,然后根据您在开始时给出的分布在
转换参数
块中声明和定义
θ

<初学者> Stan经常假设Stan有能力逻辑地计算出你的STAN程序的含义,当它真正地被完全地转换成C++时,代码从“代码>转换的参数和 Mult> 块被反复执行。


之所以区别于
gam
(ma)还是
theta
,是因为原始参数与变量变化原理有关。如果你真的想,如果你在
target
中添加一个雅可比行列式项(以对数单位),你可以得到与原始参数化相同的结果,但是通过将
gam
(ma)移动到
参数
块,将
θ
移动到
转换参数
块,可以更容易地避免这种情况。有关变量更改原理的详细信息,请参见此。

转换数据的
块只执行一次;
转换参数
块在马尔可夫链的每次迭代中执行多次。这修复了它!在我把它标记为答案之前,你能解释一下为什么它会被修复吗?我认为θ作为伽马的函数,或者伽马作为θ的函数应该是可互换的?我已经说过,我现在认为,因为伽马是rv,所以我们从正态分布中取样,而θ是rv的函数。