Làm thế nào bạn sẽ làm Bayesian ANOVA và hồi quy trong R? [đóng cửa]


14

Tôi có một bộ dữ liệu khá đơn giản bao gồm một biến độc lập, một biến phụ thuộc và biến phân loại. Tôi có nhiều kinh nghiệm khi chạy các bài kiểm tra thường xuyên như aov()lm(), nhưng tôi không thể tìm ra cách thực hiện tương đương bayes của họ trong R.

Tôi muốn chạy hồi quy tuyến tính bayes trên hai biến đầu tiên và phân tích phương sai bayes sử dụng biến phân loại làm nhóm, nhưng tôi không thể tìm thấy bất kỳ ví dụ đơn giản nào về cách thực hiện điều này với R. Ai đó có thể cung cấp một ví dụ cơ bản cho cả hai? Ngoài ra, chính xác các số liệu thống kê đầu ra được tạo ra bởi phân tích bayes là gì và chúng thể hiện điều gì?

Tôi không rành về các số liệu thống kê, nhưng sự đồng thuận dường như là việc sử dụng các bài kiểm tra cơ bản với giá trị p hiện được cho là hơi sai lầm và tôi đang cố gắng theo kịp. Trân trọng.


2
Thực hiện phân tích dữ liệu Bayes: Hướng dẫn với R và BUGS có thể là một khởi đầu tốt. Ngoài ra còn có một số liên kết cho ANOVA Bayes về câu hỏi liên quan này: ANOVA hai yếu tố Bayesian . Tuy nhiên, tôi không rõ với câu cuối cùng của bạn, vì thay vì diễn giải giá trị p, chúng tôi thường khuyên bạn nên sử dụng thước đo kích thước hiệu ứng .
chl

Câu trả lời:


12

Nếu bạn dự định thực hiện nhiều số liệu thống kê Bayes, bạn sẽ thấy hữu ích khi học ngôn ngữ BUGS / JAGS, có thể được truy cập trong R thông qua các gói R2OpenBUGS hoặc R2WinBUGS.

Tuy nhiên, vì một ví dụ nhanh không yêu cầu hiểu cú pháp BUGS, bạn có thể sử dụng gói "bayesm" có chức năng runiregGibbs để lấy mẫu từ phân phối sau. Dưới đây là một ví dụ với dữ liệu tương tự như dữ liệu mà bạn mô tả .....

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

Chiết xuất từ ​​đầu ra là: 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 *  

Hồi quy tuyến tính đơn giản: Bayesian:

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

Mô hình đồng biến 2: Bayesian:

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

từ đó chúng ta có thể thấy rằng các kết quả có thể so sánh rộng rãi, như mong đợi với các mô hình đơn giản và các linh mục khuếch tán này. Tất nhiên cũng đáng để kiểm tra các lô chẩn đoán MCMC - mật độ sau, âm mưu theo dõi, tương quan tự động - mà tôi cũng đã đưa ra mã cho ở trên (các ô không được hiển thị).


Vì vậy, tôi đã chạy hồi quy tuyến tính chống lại hai biến độc lập - cả hai biến này thực hiện với các giá trị p (~ 0,01) khá tốt bằng cách sử dụng phép thử lm () thường xuyên. Với thử nghiệm bayes, một trong các biến này tạo ra kết quả rất giống nhau và có ý nghĩa đối với giao thoa và độ dốc, nhưng đối với biến còn lại, thực sự có giá trị p thấp hơn một chút, kết quả bayes cho các giá trị khác nhau (và không đáng kể về mặt thống kê). Bất cứ ý tưởng này có nghĩa là gì?
Barzov

@Barzov bạn nên đăng một câu hỏi mới, bao gồm mã của bạn và (nếu có thể) dữ liệu của bạn.
P Sellaz


1

Điều này khá thuận tiện với LearnBayesgói.

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

Các blinregchức năng sử dụng một noninformative trước theo mặc định, và điều này mang lại một kết luận rất gần với một frequentist.

Ước tính :

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

Khoảng tin cậy :

> # 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.