cotecora-team-2 / quickcountmx

Functions to simulate and estimate Mexican election results based on a random sample, the functions were used, among other methodologies, to anticipate the final results of the 2021 Mexican elections.
Other
21 stars 9 forks source link

Usar inv_metric de corridas anteriores #41

Closed felipegonzalez closed 7 months ago

felipegonzalez commented 7 months ago

Parte del warmup de Stan requiere afinar la métrica para las perturbaciones de la energía cinética:

All HMC implementations in Stan utilize quadratic kinetic energy functions which are specified up to the choice of a symmetric, positive-definite matrix known as a mass matrix or, more formally, a metric

En cmdstanr existe un parámetro inv_metric donde se puede pasar un guess inicial de esta matriz. Si dejamos el default que ya usamos adapt_engaged = TRUE, de todas formas afina esta matriz:

adapt_engaged (logical) Do warmup adaptation? The default is TRUE. If a precomputed inverse metric is specified via the inv_metric argument (or metric_file) then, if adapt_engaged=TRUE, Stan will use the provided inverse metric just as an initial guess during adaptation. To turn off adaptation when using a precomputed inverse metric set adapt_engaged=FALSE.

En el pdf de abajo hay tres experimentos:

  1. Uno con una muestra de ~ 950 para elección presidencial, sin inicialización, que tarda 180 segundos
  2. El siguiente con la misma muestra, con inicialización de inv_metric de la corrida anterior, que tarda 80 segundos.
  3. Una corrida con más de 6 mil casillas, con inicialización de inv_metric de la corrida de 1), que tarda 387 segundos.

Independientemente de otras mejoras, creo que no será necesario paralelizar los modelos nacionales (presidencial y diputados) para obtener estimaciones cada 10 minutos en ambos, en una sola computadora, si vamos utilizando como initial guess la métrica de la remesa previa:

using-inv-metric.pdf

MichelleAnzarut commented 7 months ago

Está excelente! Muy buena idea.

Si le pasamos inv_metric no podríamos probar también con menos iteraciones de calentamiento?

MichelleAnzarut commented 7 months ago

Esto serviría para estimar las 100 muestras que produjimos de cada estado? Son los mismos parámetros a estimar, pero distintos datos por completo

felipegonzalez commented 7 months ago

Está excelente! Muy buena idea.

Si le pasamos inv_metric no podríamos probar también con menos iteraciones de calentamiento?

Creo que sí, siempre y cuando sigamos corriendo todos los diagnósticos al final. Si la adaptación no es muy buena entonces creo que puede haber divergencia, rechazos y ESS bajo.

felipegonzalez commented 7 months ago

El modelo de diputados todavía está lento, así que creo que podríamos decidir qué intentar (@tereom @MichelleAnzarut @ammadrigal ), de fácil a difícil según yo:

  1. Anular en el cálculo de proporciones/votos todas las partes que tengan que ver con partidos que no tienen candidatos en cada distrito. El modelo queda del mismo tamaño en número de parámetros pero el cálculo de log_p y su gradiente quizá es más rápido. Los parámetros no usados quedan con la inicial, pero no se usan en ninguna parte
  2. Intentar hacer una estructura ragged de parámetros porque cada distrito tiene un número distinto de parámetros (usando forma larga) y reescribir el código. Aquí reducimos el número de parámetros pero hay más que hacer, así que vamos a tener ganancias.
  3. Paralelizar varias corridas de stan por 4 regiones. En esta parte no hay que modificar el modelo, pero hay que escribir código para separar datos, correr los modelos, y juntar al final las simulaciones. Creo que esta funcionaría bien. Si queremos usar inv_metric también hay que producir por separado las métricas.