2014-06-24 43 views
3

我想知道如何模擬利用R中的armrstanarm包估計的迴歸模型中的感興趣的數量。我是貝葉斯方法和R中的新手,並且已經使用Zelig包一段時間了。我問了一個類似的問題before,但我想知道是否可以使用這些包估計的後驗分佈來模擬這些數量。如何在R中使用arm或rstanarm包來模擬感興趣的數量?

Zelig中,您可以設置獨立值所需的值,並計算結果變量(期望值,概率等)的結果。一個例子:

# Creating a dataset: 
set.seed(10) 
x <- rnorm(100,20,10) 
z <- rnorm(100,10,5) 
e <- rnorm(100,0,1) 
y <- 2*x+3*z+e 
df <- data.frame(x,z,e,y) 

# Loading Zelig 
require(Zelig) 

# Model 
m1.zelig <- zelig(y ~ x + z, model="ls", data=df) 
summary(m1.zelig) 

# Simulating z = 10 
s1 <- setx(m1.zelig, z = 10) 
simulation <- sim(m1.zelig, x = s1) 
summary(simulation) 

所以Zelig保持X在其平均值(20.56),以及模擬的其中Z = 10感興趣的量在這種情況下,y爲約71

使用arm同樣的模型:

# Model 
require(arm) 
m1.arm <- bayesglm(y ~ x + z, data=df) 
summary(m1.arm) 

而且使用rstanarm

# Model 
require(rstanarm) 
m1.stan <- stanlm(y ~ x + z, data=df) 
print(m1.stan) 

有沒有什麼辦法來模擬z = 10,x等於它的平均值,用這兩個包估計的後驗分佈並得到y的期望值?非常感謝你!

回答

1

在bayesglm的情況下,你可以做

sims <- arm::sim(m1.arm, n = 1000) 
y_sim <- rnorm(n = 1000, mean = [email protected] %*% t(as.matrix(s1)), sd = [email protected]) 
mean(y_sim) 

對於(未發行)rstanarm,這將是類似

sims <- as.matrix(m1.stan) 
y_sim <- rnorm(n = nrow(sims), mean = sims[,1:(ncol(sims)-1)] %*% t(as.matrix(s1)), 
       sd = sims[,ncol(sims)]) 
mean(y_sim) 

一般斯坦,你可以通過S1作爲row_vector並將其用於.stan文件的生成數量塊中,如

generated quantities { 
    real y_sim; 
    y_sim <- normal_rng(s1 * beta, sigma); 
} 

在這種情況下,p當你的print後面的摘要時,會出現y_sim的後綴分佈。

+0

非常感謝您的回答,@BenGoodrich!它完美的工作!只有兩個小問題:是否有任何方法可以在不使用'Zelig'的情況下創建's1'?另外,如果我想運行邏輯迴歸,計算結果是否相同?再次感謝! :-) – danilofreire

+1

當所有預測變量都是連續的時,'s1'幾乎就是'colMeans(model.matrix(m1.arm))'。一般來說,你可以讓's1'任意一致的向量。對於具有bayesglm的邏輯迴歸模型,您可以使用'rbinom(n = 1000,size = 1,prob = plogis(sims @ coef%*%t(as.matrix(s1))))'所有這些公式都被記錄在Zelig手冊中。 –