Como você faria ANOVA Bayesiana e regressão em R? [fechadas]

14

Eu tenho um conjunto de dados bastante simples que consiste em uma variável independente, uma variável dependente e uma variável categórica. Tenho muita experiência executando testes freqüentes como aov()e lm(), mas não consigo descobrir como executar seus equivalentes bayesianos em R.

Gostaria de executar uma regressão linear bayesiana nas duas primeiras variáveis ​​e uma análise de variância bayesiana usando a variável categórica como agrupamentos, mas não consigo encontrar exemplos simples de como fazer isso com R. Alguém pode fornecer um exemplo básico para ambos? Além disso, quais são exatamente as estatísticas de saída criadas pela análise bayesiana e o que elas expressam?

Não sou muito versado em estatísticas, mas o consenso parece ser que o uso de testes básicos com valores-p agora parece um pouco equivocado e estou tentando acompanhar. Saudações.

Barzov
fonte
2
Fazendo análise de dados bayesiana: um tutorial com R e BUGS pode ser um bom começo. Existem também alguns links para a ANOVA Bayesiana nesta questão relacionada: ANOVA Bayesiana de dois fatores . Não estou claro com sua última frase, porque, em vez de interpretar o valor p, geralmente recomendamos o uso da medida do tamanho do efeito .
chl

Respostas:

12

Se você pretende fazer muitas estatísticas bayesianas, seria útil aprender a linguagem BUGS / JAGS, que pode ser acessada no R através dos pacotes R2OpenBUGS ou R2WinBUGS.

No entanto, para obter um exemplo rápido que não requer compreensão da sintaxe do BUGS, você pode usar o pacote "bayesm", que possui a função runiregGibbs para amostragem da distribuição posterior. Aqui está um exemplo com dados semelhantes aos que você descreve .....

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))

Os extratos da saída são: Anova: Bayesian:

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 *  

Regressão linear simples: Bayesiana:

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 modelo covariável: Bayesiano:

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 ***

das quais podemos ver que os resultados são amplamente comparáveis, como esperado com esses modelos simples e anteriores difusos. É claro que também vale a pena inspecionar os gráficos de diagnóstico do MCMC - densidade posterior, traço, correlação automática - que eu também dei o código acima do qual (gráficos não mostrados).

Johnson Chang
fonte
Então, eu executei a regressão linear contra duas variáveis ​​independentes separadamente - ambas com valores p razoavelmente bem (~ 0,01) usando o teste frequentist lm (). Com o teste bayesiano, uma dessas variáveis ​​produz resultados muito semelhantes e significativos para a interceptação e a inclinação, mas para a outra, que na verdade tem um valor p ligeiramente menor, o resultado bayesiano fornece valores totalmente diferentes (e estatisticamente insignificantes). Alguma idéia do que isso pode significar?
Barzov
@ Barzov, você deve postar uma nova pergunta e incluir seu código e (se possível) seus dados.
P Sellaz
2

O pacote BayesFactor (demonstrado aqui: http://bayesfactorpcl.r-forge.r-project.org/ e disponível no CRAN) permite ANOVA Bayesiana e regressão. Utiliza fatores de Bayes para comparação de modelos e permite amostragem posterior para estimativa.

richarddmorey
fonte
1

Isso é bastante conveniente com o LearnBayespacote.

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

A blinregfunção usa um não-informativo prévio por padrão, e isso gera uma inferência muito próxima da freqüentista.

Estimativas :

> # 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 

Intervalos de confiança :

> # 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
fonte