Как ускорить STAN при установке модели со случайным эффектом на большой, разреженный кадр данных?
Я пытаюсь подобрать модель со случайным эффектом, используя RSTAN. Моя матрица дизайна имеет 198 столбцов. Он настолько широк, потому что мой исходный фрейм данных представляет собой набор факторных переменных, которые я конвертирую в двоичные индикаторы, чтобы попытаться вписать модель в STAN. Я могу уместить модели с несколькими столбцами, преобразованными из одного или двух предикторов, но для завершения 1/2 выборки потребовалось 10 часов.
Вот код 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);
}
1 ответ
Вопрос о том, что вы можете сделать, чтобы ускорить эту модель, переплетен с вопросом о том, как ее можно сделать более эффективно. Интуиция о том, почему это занимает так много времени, может иметь отношение к предшествующей зависимости между a
а также sigma_a
(и в меньшей степени mu_a
).
- когда
sigma_a
мал для некоторой итерации, элементыa
должен быть близко кmu_a
- когда
sigma_a
большой для некоторой итерации, элементыa
может быть далеко отmu_a
,
Поскольку у Стэна есть только один параметр размера шага, которым можно манипулировать, может быть трудно найти размер шага, который подходит в обеих ситуациях. В лучшем случае вы получите размер шага, который достаточно мал, чтобы сохранить точность в первом случае, но на время стены будет оказано негативное влияние, поскольку в последнем случае он должен предпринять много шагов с перепрыгиванием с небольшим шагом.
Для таких моделей, как правило, мы рекомендуем повторную настройку, например,
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);
}