Introduction à la statistique bayésienne: MCMC avec Stan

Transcription

Introduction à la statistique bayésienne: MCMC avec Stan
Introduction à la statistique bayésienne: MCMC
avec Stan
Simon Barthelmé, Université de Genève
December 1, 2014
MCMC avec Stan
I Stan est un ensemble d'outils pour l'inférence bayésienne,
contenant:
I Un langage de programmation pour dénir des modèles
statistiques bayésiens
I Un échantilloneur MCMC basé sur un algorithme appellé
Monte Carlo Hamiltonien (beaucoup plus rapide que
l'échantilloneur de Gibbs implementé dans BUGS)
I Un optimiseur type Quasi-Newton (pour trouver des
estimateurs ML/MAP)
I Interfaces R, Python, Julia
Avantages de Stan
I Pas besoin d'implémenter des algorithmes MCMC vous même
I Documentation très complète
I Open source
I Communauté de développeurs et d'utilisateurs très active,
évolue rapidement
Inconvénients de Stan
I Black box (on ne sait pas forcément toujours très bien ce qui
se passe)
I Permet d'attaquer un grand nombre de problèmes, mais pas
tous
I Tous les paramètres doivent être des valeurs continues (il
existe des moyens de contourner ce problème pour les
utilisateurs
très
avancés)
I La loi a posteriori doit être continue et dérivable
I On aura potentiellement des soucis avec les lois multimodales
(mais il n'y a pas de solutions simples à ce problème)
Comment ça marche: l'échantilloneur
I L'échantilloneur est un black box à qui on donne en entrée une
∂
fonction L (θ) et sa dérivée
∂θ L, et qui génère
(asymptotiquement) des échantillons de la loi
π (θ) = exp (L (θ))
I L'algorithme utilise les infos du gradient pour accélerer
l'échantillonage
I Monte Carlo Hamiltonien avec ajustement automatique
(NUTS, No U-Turn Sampler)
I un peu complexe, je ne vais pas l'expliquer, lisez le manuel si
ça vous intéresse
Comment ça marche: la dénition du modèle
I Vous écrivez un programme qui décrit le modèle statistique
I Quelles sont les données?
I Quels sont les paramètres?
I Quelles sont les priors sur les paramètres? (i.e.,
p (y|θ))
I Quelle est la vraisemblance? (
p (θ))
Comment ça marche: interprétation, compilation
I Interprétation: stan lit le modèle, le transforme en fonctions
C++ qui calculent:
L (θ) = log p (y|θ) + log p (θ)
∂
L
, sa dérivée (par diérentiation automatique)
∂θ
I Le log de la loi a posteriori
I
I Stan compile les fonctions C++ (cette étape prend du temps)
I On peut maintenant utiliser l'échantilloneur
Un premier exemple: loi a priori seulement
parameters {
real beta; //Coefficient
}
model {
beta ~ normal(0,1); //Gaussian prior for beta
}
Rajouter une option
data {
real<lower=0> sd_prior; //beta has prior N(0,sd_prior)
}
parameters {
real beta; //Coefficient
}
model {
beta ~ normal(0,sd_prior); //Gaussian prior for beta
}
A noter
I La structure en blocks: data { },parameters { },model { }
I La syntaxe est un mélange entre C et R
I La notation ~ pour est distribué selon
I Important: toujours déclarer les contraintes sur les variables,
ex. real<lower=0> sd_prior; real<lower=0,upper=1> proba;
Rajouter une observation
data {
real<lower=0> sd_prior; //beta has prior N(0,sd_prior)
real y;
}
parameters {
real beta; //Coefficient
}
model {
beta ~ normal(0,sd_prior); //Gaussian prior for beta
y ~ normal(beta,1); //Gaussian likelihood for y|beta
}
Rajouter *des* observations
data {
real<lower=0> sd_prior; //beta has prior N(0,sd_prior)
int<lower=1> n; //Number of observations
vector[n] y; //Observations
}
parameters {
real beta; //Coefficient
}
model {
beta ~ normal(0,sd_prior); //Gaussian prior for beta
y ~ normal(beta,1); //Gaussian likelihood for y|beta (vectorised!!!
}
Régression bayésienne
I On reprend et on étend le scénario d'hier:
I Modèle:
y
=
β+
X
∼ N
0, σ
∼ N
0, τ
β
i
σ ∼
2
2
Half-Cauchy(0, 1)
I La matrice Xn×m contient les covariés (design matrix).
I On a
m
coecients et
n
observations y
Régression bayésienne (programme Stan)
data {
int<lower=1> n; //Number of observations
int<lower=1> m; //Number of covariates matrix[n,m]
matrix[n,m] X; //Design matrix real<lower=0>
real<lower=0> sd_prior; //Coefficients have prior N(0,sd_prior)
vector[n] y; //Outcomes
}
parameters {
vector[m] beta; //Regression coefficients
real<lower=0> sd_noise; //Std. dev of measurement noise
}
model {
sd_noise ~ cauchy(0,1); //Half-cauchy prior on sd_noise
beta ~ normal(0,sd_prior); //Gaussian prior for coefficients
y ~ normal(X*beta,sd_noise);
}
Qu'est-ce qui sort de Stan?
I Par défaut, Stan lance quatre chaînes MCMC initialisées à des
endroits diérents, avec 1000 itérations burn-in et 1000
itérations conservées
I Si les chaînes se comportent bien, les résultats devraient de
toutes les chaînes devraient être semblables
I Toujours vérier que les chaînes ne sont pas trop autocorrélées!
Comment travailler avec Stan?
I Toujours commencer par le modèle le plus simple possible, en
faisant des tests avec des données synthétiques
I Vérier sur des données synthétiques que la loi a posteriori se
concentre sur les bonnes valeurs (quand la quantité de données
est élevée).
I Sur les vraies données, plutôt commencer par quelque chose de
simple, en introduisant de la complexité si elle est nécessaire
I Vérier que le posterior predictive est relativement sensé
I Si problème: la documentation est très riche et la
communauté d'utilisateurs est active