我正在尝试使用RSTAN拟合随机效果模型。我的设计矩阵有198列。它是如此宽,因为我的原始数据帧是一堆因子变量,我转换为二进制指标,以尝试在STAN中拟合模型。我可以使用从一个或两个预测器转换而来的几列来安装模型,但是需要10个小时才能完成1/2的采样。
这是我用来尝试拟合模型的STAN代码(基本线性模型)。我试图进行矢量化,但也许还有一种方法可以进一步优化?此外,为什么花费这么长时间的直觉是什么?
data {
int<lower=0> N;
int<lower=0> J;
int<lower=0> K;
int<lower=1,upper=J> geo[N];
matrix[N,K] X;
vector[N] y;
}
parameters {
vector[J] a;
vector[K] B;
real mu_a;
real<lower=0,upper=100> sigma_a;
real<lower=0,upper=100> sigma_y;
}
model {
vector[N] y_hat;
for (i in 1:N)
y_hat[i] <- a[geo[i]];
mu_a ~ normal(0, 1);
a ~ normal(0, 1);
y ~ normal(mu_a + sigma_a * y_hat + X * B, sigma_y);
}
答案 0 :(得分:5)
你可以做些什么来加速这个模型的问题与如何更有效地采样的问题交织在一起。关于为什么花费这么长时间的直觉可能与a
和sigma_a
之间的先前依赖关系(以及较小程度mu_a
)有关。
sigma_a
在某些迭代中较小时,a
的元素必须接近mu_a
sigma_a
对于某些迭代而言较大时,a
的元素可能远离mu_a
。 由于Stan只有一个stepize参数可供操作,因此很难找到适合两种情况的步长。在最好的情况下,你得到一个足够小的步长,以保持前一种情况下的准确性,但是壁挂时间会受到不利影响,因为在后一种情况下它需要采取许多跳跃步骤和小步长。
对于这些模型,我们通常建议重新参数化
data {
int<lower=0> N;
int<lower=0> J; // 47 apparently but don't hardcode it
int<lower=1,upper=J> geo[N];
vector[N] y;
}
parameters {
vector[J] a;
real mu_a;
real<lower=0,upper=100> sigma_a;
real<lower=0,upper=100> sigma_y;
}
model {
vector[N] y_hat;
for (i in 1:N)
y_hat[i] <- a[geo[i]];
mu_a ~ normal(0, 1);
a ~ normal(0, 1);
y ~ normal(mu_a + sigma_a * y_hat, sigma_y);
}