Как ускорить 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).

  1. когда sigma_a мал для некоторой итерации, элементы a должен быть близко к mu_a
  2. когда 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); }

Другие вопросы по тегам