Comment feriez-vous l'ANOVA bayésienne et la régression dans R? [fermé]

14

J'ai un ensemble de données assez simple composé d'une variable indépendante, d'une variable dépendante et d'une variable catégorielle. J'ai beaucoup d'expérience dans les tests fréquentistes comme aov()et lm(), mais je ne sais pas comment effectuer leurs équivalents bayésiens en R.

Je voudrais exécuter une régression linéaire bayésienne sur les deux premières variables et une analyse bayésienne de la variance en utilisant la variable catégorielle comme regroupements, mais je ne trouve aucun exemple simple sur la façon de le faire avec R. Est-ce que quelqu'un peut fournir un exemple de base pour tous les deux? De plus, quelles sont exactement les statistiques de sortie créées par l'analyse bayésienne et qu'expriment-elles?

Je ne connais pas très bien les statistiques, mais le consensus semble être que l'utilisation de tests de base avec des valeurs de p est maintenant considérée comme quelque peu erronée, et j'essaie de suivre. Cordialement.

Barzov
la source
2
Faire l'analyse des données bayésiennes: un tutoriel avec R et BUGS peut être un bon début. Il existe également des liens pour l'ANOVA bayésienne sur cette question connexe: l'ANOVA bayésienne à deux facteurs . Je ne suis pas clair avec votre dernière phrase, car au lieu d'interpréter la valeur de p, nous recommandons généralement d'utiliser une mesure de la taille de l' effet .
chl

Réponses:

12

Si vous avez l'intention de faire beaucoup de statistiques bayésiennes, il vous serait utile d'apprendre le langage BUGS / JAGS, accessible en R via les packages R2OpenBUGS ou R2WinBUGS.

Cependant, pour un exemple rapide qui ne nécessite pas de comprendre la syntaxe BUGS, vous pouvez utiliser le package "bayesm" qui a la fonction runiregGibbs pour l'échantillonnage à partir de la distribution postérieure. Voici un exemple avec des données similaires à celles que vous décrivez .....

library(bayesm)

podwt <- structure(list(wt = c(1.76, 1.45, 1.03, 1.53, 2.34, 1.96, 1.79, 1.21, 0.49, 0.85, 1, 1.54, 1.01, 0.75, 2.11, 0.92), treat = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("I", "U"), class = "factor"), mus = c(4.15, 2.76, 1.77, 3.11, 4.65, 3.46, 3.75, 2.04, 1.25, 2.39, 2.54, 3.41, 1.27, 1.26, 3.87, 1.01)), .Names = c("wt", "treat", "mus"), row.names = c(NA, -16L), class = "data.frame")

# response
y1 <- podwt$wt

# First run a one-way anova

# Create the design matrix - need to insert a column of 1s
x1 <- cbind(matrix(1,nrow(podwt),1),podwt$treat)

# data for the Bayesian analysis
dt1 <- list(y=y1,X=x1)

# runiregGibbs uses a normal prior for the regression coefficients and 
# an inverse chi-squared prior for va

# mean of the normal prior. We have 2 estimates - 1 intercept 
# and 1 regression coefficient
betabar1 <- c(0,0)

# Pecision matrix for the normal prior. Again we have 2
A1 <- 0.01 * diag(2)
# note this is a very diffuse prior

# degrees of freedom for the inverse chi-square prior
n1 <- 3  

# scale parameter for the inverse chi-square prior
ssq1 <- var(y1) 

Prior1 <- list(betabar=betabar1, A=A1, nu=n1, ssq=ssq1)

# number of iterations of the Gibbs sampler
iter <- 10000  

# thinning/slicing parameter. 1 means we keep all all values
slice <- 1 

MCMC <- list(R=iter, keep=slice)

sim1 <- runiregGibbs(dt1, Prior1, MCMC)

plot(sim1$betadraw)
    plot(sim1$sigmasqdraw)

summary(sim1$betadraw)
    summary(sim1$sigmasqdraw)

# compare with maximum likelihood estimates:
fitpodwt <- lm(wt~treat, data=podwt)
summary(fitpodwt)
anova(fitpodwt)


# now for ordinary linear regression

x2 <- cbind(matrix(1,nrow(podwt),1),podwt$mus)

dt2 <- list(y=y1,X=x2)

sim2 <- runiregGibbs(dt1, Prior1, MCMC)

summary(sim1$betadraw)
    summary(sim1$sigmasqdraw)
plot(sim$betadraw)
    plot(sim$sigmasqdraw)

# compare with maximum likelihood estimates:
summary(lm(podwt$wt~mus,data=podwt))


# now with both variables

x3 <- cbind(matrix(1,nrow(podwt),1),podwt$treat,podwt$mus)

dt3 <- list(y=y1,X=x3)

# now we have an additional estimate so modify the prior accordingly

betabar1 <- c(0,0,0)
A1 <- 0.01 * diag(3)
Prior1 <- list(betabar=betabar1, A=A1, nu=n1, ssq=ssq1)

sim3 <- runiregGibbs(dt3, Prior1, MCMC)

plot(sim3$betadraw)
    plot(sim3$sigmasqdraw)
summary(sim3$betadraw)
    summary(sim3$sigmasqdraw)

# compare with maximum likelihood estimates:
summary(lm(podwt$wt~treat+mus,data=podwt))

Les extraits de la sortie sont: Anova: Bayésien:

Summary of Posterior Marginal Distributions 
Moments 
   mean std dev num se rel eff sam size
1  2.18    0.40 0.0042    0.99     9000
2 -0.55    0.25 0.0025    0.87     9000

Quantiles 
  2.5%    5%   50%   95%  97.5%
1  1.4  1.51  2.18  2.83  2.976
2 -1.1 -0.97 -0.55 -0.13 -0.041

lm ():

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   1.6338     0.1651   9.895 1.06e-07 ***
treatU       -0.5500     0.2335  -2.355   0.0336 *  

Régression linéaire simple: bayésienne:

Summary of Posterior Marginal Distributions 
Moments 
  mean std dev  num se rel eff sam size
1 0.23   0.208 0.00222     1.0     4500
2 0.42   0.072 0.00082     1.2     4500

Quantiles
   2.5%    5%  50%  95% 97.5%
1 -0.18 -0.10 0.23 0.56  0.63
2  0.28  0.31 0.42 0.54  0.56

lm ():

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.23330    0.14272   1.635    0.124    
mus          0.42181    0.04931   8.554 6.23e-07 ***

2 modèle covariable: Bayésien:

Summary of Posterior Marginal Distributions 
Moments 
   mean std dev  num se rel eff sam size
1  0.48   0.437 0.00520     1.3     4500
2 -0.12   0.184 0.00221     1.3     4500
3  0.40   0.083 0.00094     1.2     4500

Quantiles 
   2.5%    5%   50%  95% 97.5%
1 -0.41 -0.24  0.48 1.18  1.35
2 -0.48 -0.42 -0.12 0.18  0.25
3  0.23  0.26  0.40 0.53  0.56

lm ():

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.36242    0.19794   1.831   0.0901 .  
treatU      -0.11995    0.12688  -0.945   0.3617    
mus          0.39590    0.05658   6.997 9.39e-06 ***

à partir de laquelle nous pouvons voir que les résultats sont largement comparables, comme prévu avec ces modèles simples et a priori diffus. Bien sûr, il vaut également la peine d'inspecter les tracés de diagnostic MCMC - densité postérieure, tracé, auto-corrélation - pour lesquels j'ai également donné le code ci-dessus (tracés non représentés).

Johnson Chang
la source
J'ai donc exécuté la régression linéaire contre deux variables indépendantes séparément, qui fonctionnent toutes les deux avec des valeurs de p assez bonnes (~ 0,01) en utilisant le test fréquentiste lm (). Avec le test bayésien, l'une de ces variables produit des résultats très similaires et significatifs pour l'ordonnée à l'origine et la pente, mais pour l'autre, qui a en fait une valeur p légèrement inférieure, le résultat bayésien donne des valeurs très différentes (et statistiquement non significatives). Une idée de ce que cela pourrait signifier?
Barzov
@Barzov, vous devez publier une nouvelle question et inclure votre code et (si possible) vos données.
P Sellaz
2

Le package BayesFactor (illustré ici: http://bayesfactorpcl.r-forge.r-project.org/ et disponible sur CRAN) permet l'ANOVA bayésienne et la régression. Il utilise des facteurs de Bayes pour la comparaison des modèles et permet un échantillonnage postérieur pour l'estimation.

richarddmorey
la source
1

C'est assez pratique avec le LearnBayespackage.

fit <- lm(Sepal.Length ~ Species, data=iris, x=TRUE, y=TRUE)
library(LearnBayes)
posterior_sims <- blinreg(fit$y, fit$x, 50000)

La blinregfonction utilise un prior non informatif par défaut, ce qui donne une inférence très proche de la fréquentiste.

Estimations :

> # frequentist 
> fit$coefficients
      (Intercept) Speciesversicolor  Speciesvirginica 
            5.006             0.930             1.582 
> # Bayesian
> colMeans(posterior_sims$beta)
      X(Intercept) XSpeciesversicolor  XSpeciesvirginica 
         5.0066682          0.9291718          1.5807763 

Intervalles de confiance :

> # frequentist
> confint(fit)
                      2.5 %   97.5 %
(Intercept)       4.8621258 5.149874
Speciesversicolor 0.7265312 1.133469
Speciesvirginica  1.3785312 1.785469
> # Bayesian
> apply(posterior_sims$beta, 2, function(x) quantile(x, c(0.025, 0.975)))
      X(Intercept) XSpeciesversicolor XSpeciesvirginica
2.5%      4.862444          0.7249691          1.376319
97.5%     5.149735          1.1343101          1.783060
Stéphane Laurent
la source