Número máximo de parámetros.
Depende mucho de la estructura de su problema. Por ejemplo, mi experiencia con varios modelos lineales jerárquicos en Stan fue que comienza a ser muy lento (horas o días para completar) en alrededor de 10 000 - 30 000 parámetros (algunos números reproducibles están en mi blog en Stan vs. INLA ). Cuando se trabaja con modelos que involucran ecuaciones diferenciales ordinarias y estructuras complejas, 10 parámetros pueden ser demasiados. Al ajustar solo un vector de normales independientes (ver más abajo), Stan tarda unos 40 minutos en completar con los parámetros 1e5, utilizando la configuración predeterminada (calentamiento de 1000 iter, muestreo de 1000 iter, 4 cadenas). Por lo tanto, es muy poco práctico tener mucho más de 1e5 parámetros.
Sin embargo, la parte más larga de una ejecución de Stan es la fase de calentamiento cuando se ajustan los hiperparámetros del algoritmo. Si pudiera proporcionar buenos valores para usted solo (lo cual es difícil), podría impulsar aún más el rendimiento.
Además, el soporte de MPI para el paralelismo dentro de la cadena y las operaciones de la matriz de descarga a la GPU debería agregarse a Stan pronto (ver, por ejemplo, discusión aquí http://discourse.mc-stan.org/t/parallelization-again-mpi-to- the-rescue / 455/11 , y aquí http://discourse.mc-stan.org/t/stan-on-the-gpu/326/10 ), por lo que es probable que modelos más grandes se vuelvan prácticos en el futuro cercano.
Diagnóstico en alta dimensión
La implementación de HMC en Stan proporciona múltiples diagnósticos útiles que funcionan incluso con una gran cantidad de parámetros: transiciones divergentes n_eff
(tamaño de muestra efectivo) y división Rhat
(reducción de escala potencial). Consulte el manual de Stan , sección "Inicialización y monitoreo de convergencia" para obtener una explicación detallada de estos.
Código R para un modelo simple: solo un conjunto de normales independientes que puede escalar en el número de parámetros, encajar en Stan:
library(rstan)
model_code = "
data {
int N;
}
parameters {
vector[N] a;
}
model {
a ~ normal(0,1);
}
"
model = stan_model(model_code = model_code)
fit_large = sampling(model, data = list(N = 1e5))