Как бы вы сделали байесовский ANOVA и регрессия в R? [закрыто]

14

У меня есть довольно простой набор данных, состоящий из одной независимой переменной, одной зависимой переменной и категориальной переменной. У меня есть большой опыт проведения тестов на частоту, таких как aov()и lm(), но я не могу понять, как выполнить их байесовские эквиваленты в R.

Я хотел бы запустить байесовскую линейную регрессию по первым двум переменным и байесовский дисперсионный анализ, используя категориальную переменную в качестве группировки, но я не могу найти простых примеров того, как это сделать с R. Может ли кто-нибудь предоставить базовый пример для и то и другое? Кроме того, что именно представляет собой выходная статистика, создаваемая байесовским анализом, и что они выражают?

Я не очень хорошо разбираюсь в статистике, но, похоже, все согласны с тем, что использование базовых тестов с p-значениями в настоящее время считается ошибочным, и я стараюсь не отставать. С уважением.

Варзоб
источник
2
Выполнение байесовского анализа данных. Хорошим началом может стать учебник с R и BUGS . Есть также некоторые ссылки для Байесовского ANOVA по этому связанному вопросу: Байесовский двухфакторный ANOVA . Мне не совсем понятно ваше последнее предложение, потому что вместо интерпретации p-значения мы обычно рекомендуем использовать меру размера эффекта .
хл

Ответы:

12

Если вы собираетесь делать много байесовской статистики, вам будет полезно изучить язык BUGS / JAGS, к которому можно получить доступ в R через пакеты R2OpenBUGS или R2WinBUGS.

Однако, для быстрого примера, который не требует понимания синтаксиса BUGS, вы можете использовать пакет "bayesm", который имеет функцию runiregGibbs для выборки из апостериорного распределения. Вот пример с данными, похожими на те, которые вы описываете .....

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

Выдержки из вывода: 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

лм ():

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 *  

Простая линейная регрессия: байесовская:

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

лм ():

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 ковариатическая модель: байесовская:

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

лм ():

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

из которого мы можем видеть, что результаты в целом сопоставимы, как и ожидалось с этими простыми моделями и диффузными априорами. Конечно, также стоит проверить диагностические графики MCMC - заднюю плотность, график трассировки, автокорреляцию - которые я также дал код, для которого выше (графики не показаны).

Джонсон Чанг
источник
Поэтому я провел линейную регрессию по двум независимым переменным по отдельности, каждая из которых работает с довольно хорошими (~ 0,01) p-значениями, используя тест lm (). В байесовском тесте одна из этих переменных дает очень похожие и значимые результаты для пересечения и наклона, но для другой, которая на самом деле имеет немного более низкое значение p, байесовский результат дает сильно отличающиеся (и статистически незначимые) значения. Есть идеи, что это может значить?
Барзов
@ Барзов, вы должны опубликовать новый вопрос и включить свой код и (если возможно) свои данные.
P Sellaz
2

Пакет BayesFactor (продемонстрированный здесь: http://bayesfactorpcl.r-forge.r-project.org/ и доступный на CRAN) позволяет использовать байесовский ANOVA и регрессию. Он использует байесовские коэффициенты для сравнения моделей и позволяет апостериорный отбор для оценки.

richarddmorey
источник
1

Это довольно удобно с LearnBayesпакетом.

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

blinregФункция использует неинформативны до по умолчанию, и это дает вывод очень близко к одному частотным.

Оценки :

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

Доверительные интервалы :

> # 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
Стефан Лоран
источник