关于rstanarm包stan_glm()对象的linear.predictors及预测变量提取的咨询
我来帮你把这两个问题掰扯清楚,都是用rstanarm时容易搞混的点~
stan_glm()中linear.predictors的解释 首先得明确:linear.predictors不是你输入的原始预测变量,它是模型计算出来的线性预测值——简单说就是用模型估计出的系数(包括截距)和你的预测变量做线性组合得到的结果。
拿你用mom_iq作为单预测变量的例子来说,假设模型公式是y ~ mom_iq,那线性预测值的计算公式就是:linear_prediction = 截距项 + mom_iq的回归系数 × mom_iq的观测值
每个观测都会对应一个这样的计算结果,所以它和你输入的mom_iq原始数值肯定不一样,本质是模型对每个观测的“潜在线性输出”,是模型内部的中间计算产物,而不是输入的自变量本身。
在rstanarm里,linear.predictors其实是基于参数后验分布的每个样本计算出来的,所以它会是一个(后验样本数 × 观测数)的矩阵(用extract(model, "linear.predictors")可以看到完整的后验分布);如果用fitted(model),得到的是每个观测线性预测值的后验均值,和linear.predictors的后验均值是一致的。
stan_glm()对象中获取原始预测变量的方法 如果你想从拟合好的模型对象里直接提取输入的预测变量(比如mom_iq),有几种简单的方法:
方法1:从模型的框架(model.frame)提取
stan_glm拟合时会保留拟合所用的模型框架,直接从这里提取最方便:
# 假设你的模型对象叫model model.frame(model)$mom_iq
这个方法拿到的是原始的、未做任何变换的预测变量(比如如果你在公式里用了log(mom_iq),这里拿到的还是原始的mom_iq值)。
方法2:从模型矩阵(model.matrix)提取
模型矩阵是模型实际用来计算的变量矩阵(会自动处理截距、因子哑变量、变量变换等),如果你的预测变量是直接输入的(没有变换),可以这样提取:
model.matrix(model)[, "mom_iq"]
如果你的预测变量做了变换(比如log(mom_iq)),这里拿到的就是变换后的数值,适合需要查看模型实际使用的变量时用。
方法3:拟合时设置x=TRUE,从模型对象的x元素提取
如果你在拟合模型的时候加上x=TRUE参数,模型对象会直接保存所用的预测变量矩阵:
# 拟合时设置x=TRUE model <- stan_glm(y ~ mom_iq, data = your_data, x = TRUE, ...) # 提取mom_iq model$x[, "mom_iq"]
这个方法和model.matrix的结果一致,都是模型实际计算用的变量值。
内容的提问来源于stack exchange,提问作者rnorouzian

