首页 > 解决方案 > 在 Stan 中哪个更有效?

问题描述

如果我不需要在输出中返回转换后的参数,那么在转换后的参数块或模型块中声明转换后的参数是否更有效。

例如

data {
  real<lower=0> tt[N]; 
  ...
}
parameters {
  real <lower = 0> mu;
  real <lower = 0> eta;
  ...
}
transformed parameters{
  real Mu[N];
  for(i in 1:N){
    Mu[i] = eta + mu*log(tt[i]);
  }
  ...
}

相比

data {
  real<lower=0> tt[N]; 
  ...
}
parameters {
  real <lower = 0> mu;
  real <lower = 0> eta;
  ...
}
model{
  real Mu[N];
  for(i in 1:N){
    Mu[i] = eta + mu*log(tt[i]);
  }
  ...
}

是否需要更多运行时间才能将 Mu 的所有值存储在第一个代码块中(当我在转换后的参数块中声明 Mu 时)?

标签: rstan

解决方案


效率(相对于时间)基本相同。如果您在transformed parameters块中声明某些内容,通常需要很短的时间来验证您在每个转换参数上声明的约束。基本上,约束检查明显的唯一情况是当您形成相关矩阵或协方差矩阵时,必须考虑它以验证它是正定的。在您给出的示例中,Mu不受约束,因此无需检查。如果您对中间参数不感兴趣,那么在块中声明它们是有意义的model,在这种情况下,您可以通过不存储所有这些参数来节省一些 RAM(在 RStan 或 PyStan 中),并且通过避免对应的 I/O。


推荐阅读