哪个在 Stan 中更有效率?
Which is more efficient in 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 时)?
效率(相对于时间)基本相同。如果您在 transformed parameters
块中声明某些内容,通常需要少量时间来验证您在每个转换参数上声明的约束。基本上,约束检查值得注意的唯一情况是当您正在形成相关矩阵或协方差矩阵时,必须考虑因素以验证它是正定的。在您给出的示例中,Mu
不受约束,因此无需检查。如果您对中间参数不感兴趣,那么在 model
块中声明它们是有意义的,在这种情况下,您将通过不存储所有这些参数来节省一些 RAM(在 RStan 或 PyStan 中),也许是一点点通过避免相应的 I/O 来节省时间。
如果我不需要在输出中返回转换后的参数,那么在转换后的参数块或模型块中声明转换后的参数是否更有效。
例如
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 时)?
效率(相对于时间)基本相同。如果您在 transformed parameters
块中声明某些内容,通常需要少量时间来验证您在每个转换参数上声明的约束。基本上,约束检查值得注意的唯一情况是当您正在形成相关矩阵或协方差矩阵时,必须考虑因素以验证它是正定的。在您给出的示例中,Mu
不受约束,因此无需检查。如果您对中间参数不感兴趣,那么在 model
块中声明它们是有意义的,在这种情况下,您将通过不存储所有这些参数来节省一些 RAM(在 RStan 或 PyStan 中),也许是一点点通过避免相应的 I/O 来节省时间。