Número máximo de parâmetros
Depende muito da estrutura do seu problema. Por exemplo, minha experiência com vários modelos lineares hierárquicos em Stan foi que ele começa a ser muito lento (horas ou dias para ser concluído) em cerca de 10.000 a 30.000 parâmetros (alguns números reproduzíveis estão no meu blog sobre Stan vs. INLA ). Ao trabalhar com modelos que envolvem equações diferenciais ordinárias e estrutura complexa, 10 parâmetros podem ser muitos. Ao ajustar apenas um vetor de normais independentes (veja abaixo), Stan leva cerca de 40 minutos para concluir os parâmetros 1e5, usando as configurações padrão (aquecimento de 1000 iter, amostragem de 1000 iter, 4 cadeias). Portanto, ter muito mais do que 1e5 parâmetros é muito impraticável.
A parte mais longa de uma execução de Stan é, no entanto, a fase de aquecimento, quando os hiperparâmetros do algoritmo são ajustados. Se você puder fornecer bons valores para si mesmo (o que é difícil), poderá melhorar ainda mais o desempenho.
Além disso, o suporte do MPI para operações de matriz de paralelismo e descarregamento dentro da cadeia para a GPU deve ser adicionado em breve a Stan (veja, por exemplo, discussão aqui http://discourse.mc-stan.org/t/parallelization-again-mpi-to- the-rescue / 455/11 , e aqui http://discourse.mc-stan.org/t/stan-on-the-gpu/326/10 ) para que modelos ainda maiores provavelmente se tornem práticos no futuro próximo.
Diagnóstico em alta dimensão
A implementação do HMC em Stan fornece vários diagnósticos úteis que funcionam mesmo com grande número de parâmetros: transições divergentes n_eff
(tamanho efetivo da amostra) e divisão Rhat
(redução potencial de escala). Consulte o manual do Stan , seção "Monitoramento de Inicialização e Convergência", para obter uma explicação detalhada.
Código R para um modelo simples - apenas um conjunto de normais independentes que podem ser dimensionados no número de parâmetros, cabem no 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))