Stan fait-il des postérieurs prédictifs?

9

Stan (en particulier, rstan) a-t-il des installations intégrées pour générer des distributions postérieures prédictives?

Il n'est pas difficile de générer la distribution à partir du stan fit, mais je préfère ne pas réinventer la roue.

Anon
la source
2
Il y a une section sur les quantités générées à la fin qui est censée être capable de gérer la simulation, mais la documentation (à partir de la version 1.3, mais la version 2 devrait être bientôt disponible) n'explique pas en détail comment y parvenir. Vous pourriez envisager de demander la liste de diffusion.
John

Réponses:

4

Selon le manuel d'utilisation de Stan v2.2.0 (pages 361–362):

Dans Stan, les simulations postérieures peuvent être générées de deux manières. La première approche consiste à traiter les variables prédites comme des paramètres, puis à définir leurs distributions dans le bloc de modèle. La deuxième approche, qui fonctionne également pour les variables discrètes, consiste à générer des données répliquées à l'aide de générateurs de nombres aléatoires dans le bloc de quantités générées.

J'utilise habituellement ce dernier.

Avraham
la source
3

Ce qui suit n'est pas une réponse complète, mais j'espère que c'est mieux que pas de réponse. Dans mes propres applications, j'applique des vérifications prédictives postérieures pour examiner les prédictions du modèle pour une seule mesure dépendante qui a été générée à partir d'un modèle linéaire. C'est simple dans JAGS, mais un peu plus opaque dans Stan.

data{
    int<lower=1> N; // no. rows
    real x[N]; // predictor
    real y[N]; // dependent variable
}
parameters{
    real alpha; // int.
    real beta; // slope
    real<lower=0> sigma_e; // resid. var.
    real y_tilde[N]; // post. pred.
}
model{
    real mu[N];
    for(i in 1:N){
        mu[i] <- alpha + beta*x[i];
    }

    y ~ normal(mu,sigma_e); //lik
    y_tilde ~ normal(mu,sigma_e);

    alpha ~ normal(0,5);
    beta ~ normal(0,5);
    sigma_e ~ cauchy(0,5);
}
generated quantities{
    real minimum;
    real maximum;
    minimum <- min(y_tilde);
    maximum <- max(y_tilde);
}

Il doit y avoir une meilleure façon de le faire, donc quelqu'un s'il vous plaît postez une meilleure réponse. Mais le code ci-dessus génère N distributions prédictives postérieures, une pour chaque observation. Je le fais pour que la distribution prédictive des extrema puisse être trouvée, mais si vous êtes uniquement intéressé par la quantité prédictive postérieure, y_tildevous pourrez peut-être vous en passer. Pour les grands ensembles de données, la solution ci-dessus est évidemment trop gourmande en espace.

RNG
la source