本文將介紹如何在R中用rstan和rjags作貝葉斯迴歸分析,R中有很多包能夠用來作貝葉斯迴歸分析,好比最先的(同時也是參考文獻和例子最多的)R2WinBUGS包。這個包會調用WinBUGS軟件來擬合模型,後來的JAGS軟件也使用與之相似的算法來作貝葉斯分析。然而JAGS的自由度更大,擴展性也更好。近來,STAN和它對應的R包rstan一塊兒進入了人們的視線。STAN使用的算法與WinBUGS和JAGS不一樣,它改用了一種更強大的算法使它能完成WinBUGS沒法勝任的任務。同時Stan在計算上也更爲快捷,能節約時間。python
設Yi爲地區i=1,…,ni=1,…,n從2012年到2016年選舉支持率增長的百分比。咱們的模型算法
式中,Xji是地區i的第j個協變量。全部變量均中心化並標準化。咱們選擇σ2∼InvGamma(0.01,0.01)和α∼Normal(0100)做爲偏差方差和截距先驗分佈,並比較不一樣先驗的迴歸係數。編程
# 加載數據 load("elec.RData") Y <- Y[!is.na(Y+rowSums(X))] X <- X[!is.na(Y+rowSums(X)),] n <- length(Y) p <- ncol(X)
## [1] 3111
p
## [1] 15
X <- scale(X) # 將模型擬合到大小爲100的訓練集,並對剩餘的觀測值進行預測 test <- order(runif(n))>100 table(test)
## test ## FALSE TRUE ## 100 3011
Yo <- Y[!test] # 觀測數據 Xo <- X[!test,] Yp <- Y[test] # 爲預測預留的地區 Xp <- X[test,]
boxplot(X, las = 3
image(1:p, 1:p, main = "預測因子之間的相關性")
若是模型沒有明確指定先驗分佈,默認狀況下,Stan將在參數的合適範圍內發出一個統一的先驗分佈。注意這個先驗多是不合適的,可是隻要數據建立了一個合適的後驗值就能夠了。app
data { int<lower=0> n; // 數據項數 int<lower=0> k; // 預測變量數 matrix[n,k] X; // 預測變量矩陣 vector[n] Y; // 結果向量 } parameters { real alpha; // 截距 vector[k] beta; // 預測變量係數 real<lower=0> sigma; // 偏差
rstan_options(auto_write = TRUE) #fit <- stan(file = 'mlr.stan', data = dat)
print(fit)
hist(fit, pars = pars)
dens(fit)
traceplot(fit)
library(rjags) model{ # 預測 for(i in 1:np){ Yp[i] ~ dnorm(mup[i],inv.var) mup[i] <- alpha + inprod(Xp[i,],beta[]) # 先驗機率 alpha ~ dnorm(0, 0.01) inv.var ~ dgamma(0.01, 0.01) sigma <- 1/sqrt(inv.var)
# 注意:Yp不發送給JAGS jags.model(model, data = list(Yo=Yo,no=no,np=np,p=p,Xo=Xo,Xp=Xp))
coda.samples(model, variable.names=c("beta","sigma","Yp","alpha"),
#提取每一個參數的樣本 samps <- samp[[1]] Yp.samps <- samps[,1:np] #計算JAGS預測的後驗平均值 beta.mn <- colMeans(beta.samps) # 繪製後驗預測分佈和JAGS預測 for(j in 1:5) # JAGS預測 y <- rnorm(20000,mu,sigma.mn) plot(density(y),col=2,xlab="Y",main="PPD") # 後驗預測分佈 lines(density(Yp.samps[,j])) # 真值 abline(v=Yp[j],col=3,lwd=2)
# 95% 置信區間 alpha.mn+Xp%*%beta.mn - 1.96*sigma.mn alpha.mn+Xp%*%beta.mn + 1.96*sigma.mn
## [1] 0.9452009
# PPD 95% 置信區間 apply(Yp.samps,2,quantile,0.025) apply(Yp.samps,2,quantile,0.975)
## [1] 0.9634673
請注意,PPD密度比JAGS預測密度略寬。這是考慮β和σ中不肯定性的影響,它解釋了JAGS預測的covarage略低的緣由。可是,對於這些數據,JAGS預測的覆蓋率仍然能夠。學習
最受歡迎的看法優化
1.matlab使用貝葉斯優化的深度學習spa
2.matlab貝葉斯隱馬爾可夫hmm模型實現code
4.R語言中的block Gibbs吉布斯採樣貝葉斯多元線性迴歸rem