2

我想知道是否有可能(并且可能推荐)从包中获得标准化系数?(在文档中没有找到任何具体内容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)
4

1 回答 1

4

我不会说它是肯定推荐的,但我建议您不要减去样本均值并除以结果的样本标准差,因为这两个统计数据中的估计不确定性不会传播到后验分布。

标准化预测变量更值得商榷。你可以这样做,但它使使用新数据进行后验预测变得更加困难,因为你必须记住从新数据中减去旧均值并除以旧标准差。

计算效率最高的方法是让变量保持原样,但指定非默认参数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)) 对其他感兴趣的操作重复该过程。

于 2018-03-17T03:56:53.757 回答