在贝叶斯模型中绘制交互效应(使用rstanarm)

时间:2017-11-04 17:18:56

标签: r bayesian stan rstan

我试图展示一个变量的效果如何随着rstanarm()中贝叶斯线性模型中另一个变量的值而变化。我能够拟合模型并从后验中抽取来查看每个参数的估计值,但不清楚如何在交互中给出某种变量影响的某种情节作为其他变化和相关的不确定性(即边际效应图)。以下是我的尝试:

library(rstanarm)

# Set Seed
set.seed(1)

# Generate fake data
w1 <- rbeta(n = 50, shape1 = 2, shape2 = 1.5)
w2 <- rbeta(n = 50, shape1 = 3, shape2 = 2.5)

dat <- data.frame(y = log(w1 / (1-w1)),
                  x = log(w2 / (1-w2)),
                  z = seq(1:50))

# Fit linear regression without an intercept:
m1 <- rstanarm::stan_glm(y ~ 0 + x*z, 
                         data = dat,
                         family = gaussian(),
                         algorithm = "sampling",
                         chains = 4,
                         seed = 123,
                         )


# Create data sets with low values and high values of one of the predictors
dat_lowx <- dat
dat_lowx$x <- 0

dat_highx <- dat
dat_highx$x <- 5

out_low <- rstanarm::posterior_predict(object = m1,
                                   newdata = dat_lowx)

out_high <- rstanarm::posterior_predict(object = m1,
                                        newdata = dat_highx)

# Calculate differences in posterior predictions
mfx <- out_high - out_low

# Somehow get the coefficients for the other predictor?

2 个答案:

答案 0 :(得分:3)

在此(线性,高斯,身份链接,无拦截)情况下,

mu = beta_x * x + beta_z * z + beta_xz * x * z 
   = (beta_x + beta_xz * z) * x 
   = (beta_z + beta_xz * x) * z

因此,要绘制xz的边际效应,您只需要一个适当的范围和系数的后验分布,您可以通过

获得
post <- as.data.frame(m1)

然后

dmu_dx <- post[ , 1] + post[ , 3] %*% t(sort(dat$z))
dmu_dz <- post[ , 2] + post[ , 3] %*% t(sort(dat$x))

然后,您可以使用以下内容估算数据中每个观察值的单一边际效应,该数据计算了xmu对数据中每个观察值的影响以及效果每个观察z mu {/ 1}}。

colnames(dmu_dx) <- round(sort(dat$x), digits = 1)
colnames(dmu_dz) <- dat$z
bayesplot::mcmc_intervals(dmu_dz)
bayesplot::mcmc_intervals(dmu_dx)

请注意,列名只是这种情况下的观察结果。

答案 1 :(得分:2)

您也可以使用ggeffects-package,尤其是边际效应;或sjPlot-package边际效应和其他情节类型(对于边际效应, sjPlot 只是简单地包装来自 ggeffects 的函数)。

要绘制互动的边际效应,请将sjPlot::plot_model()type = "int"一起使用。使用mdrt.values定义要为连续主持人变量绘制的值,并使用ppd让预测基于线性预测变量的后验分布或从后验预测分布中提取。

library(sjPlot)
plot_model(m1, type = "int", terms = c("x", "z"), mdrt.values = "meansd")

enter image description here

plot_model(m1, type = "int", terms = c("x", "z"), mdrt.values = "meansd", ppd = TRUE)

enter image description here

或绘制其他特定值的边际效应,使用type = "pred"并指定terms - 参数中的值:

plot_model(m1, type = "pred", terms = c("x", "z [10, 20, 30, 40]"))
# same as:
library(ggeffects)
dat <- ggpredict(m1, terms = c("x", "z [10, 20, 30, 40]"))
plot(dat)

enter image description here

还有更多选项,以及自定义绘图外观的不同方法。请参阅相关的帮助文件和包装晕影。