我想知道是否有可能(也许是推荐)从stan_glm()
包中的rstanarm
获取标准化系数? (未在文档中找到任何具体内容)
我可以像在正常回归中一样标准化所有变量吗? (见下文)
示例:
library("rstanarm")
fit <- stan_glm(wt ~ vs*gear, data = mtcars)
标准化:
design <- wt ~ vs*gear
vars <- all.vars(design)
stand.vars <- lapply(mtcars[, vars], scale)
fit <- stan_glm(stand.vars, data = mtcars)
答案 0 :(得分:3)
我不会说它是肯定推荐的,但我建议你不减去样本均值并除以结果的样本标准差,因为这两个统计中的估计不确定性将会不会传播到后验分布。
标准化预测因素更具争议性。你可以做到这一点,但它会使新数据的后验预测变得更难,因为你必须记住从新数据中减去旧方法并除以旧的标准偏差。
计算效率最高的方法是保留变量,但指定非默认参数QR = TRUE
,尤其是如果您不打算修改系数的默认(正常)先验。
然后,如果感兴趣的是标准化系数,则可以在事后标准化后验系数。要做到这一点,你可以做到
X <- model.matrix(fit)
sd_X <- apply(X, MARGIN = 2, FUN = sd)[-1]
sd_Y <- apply(posterior_predict(fit), MARGIN = 1, FUN = sd)
beta <- as.matrix(fit)[ , 2:ncol(X), drop = FALSE]
b <- sweep(sweep(beta, MARGIN = 2, STATS = sd_X, FUN = `*`),
MARGIN = 1, STATS = sd_Y, FUN = `/`)
summary(b)
然而,标准化回归系数只是给出了变量之间可比性的错觉,并没有说明一个标准偏差差异是多么密切,尤其是虚拟变量。如果你的问题确实是在操纵这个预测器还是预测器会对结果变量产生更大的影响,那么只需模拟那些操作就像
PPD_0 <- posterior_predict(fit)
nd <- model.frame(fit)
nd[ , 2] <- nd[ , 2] + 1 # for example
PPD_1 <- posterior_predict(fit, newdata = nd)
summary(c(PPD_1 - PPD_0))
并重复该过程以进行其他感兴趣的操作。