负二项回归中已缩放连续变量的系数如何还原至原始尺度
首先需要明确:MASS::glm.nb()默认使用对数链接,不是你提到的logit链接(logit链接仅用于二分类Logistic回归),两种链接下的系数转换逻辑一致,核心是基于标准化的线性变换推导。
核心原理
连续变量的标准化公式为:
$$x_{scaled} = \frac{x_{raw} - \mu}{\sigma}$$
其中$\mu$是变量原始均值,$\sigma$是变量原始标准差。
负二项回归的线性预测器形式为:
$$\log(E(y)) = \beta_0 + \beta_1 \times ind.1 + \beta_{scaled} \times x_{scaled}$$
将标准化公式代入线性预测器,整理得到原始变量对应的系数:
$$\log(E(y)) = (\beta_0 - \beta_{scaled} \times \frac{\mu}{\sigma}) + \beta_1 \times ind.1 + \frac{\beta_{scaled}}{\sigma} \times x_{raw}$$
因此原始变量每提升1个单位,对应的对数预期值增量为$\frac{\beta_{scaled}}{\sigma}$,取指数后即为原始单位下的发生率比(IRR)。
代码实现
基于你的示例代码,实现转换的步骤如下:
# 1. 提取标准化时使用的标准差 sc <- attr(df$ind.2, "scaled:scale") # 如果你提前保存了原始变量,也可以直接用 sc <- sd(原始ind.2) 计算 # 2. 计算原始单位下的系数(对数尺度) beta_raw_ind2 <- summz$coefficients["ind.2","Estimate"] / sc # 3. 取指数得到原始单位下的发生率比IRR irr_ind2 <- exp(beta_raw_ind2) irr_ind2
结果验证
你可以通过拟合未标准化的模型来验证转换结果的正确性:
# 还原ind.2为原始值 df$ind.2_raw <- df$ind.2 * sc + attr(df$ind.2, "scaled:center") # 拟合未标准化的模型 m_raw <- MASS::glm.nb(dep ~ ind.1 + ind.2_raw, data = df) # 直接提取原始模型的IRR,和转换结果完全一致 exp(coef(m_raw)["ind.2_raw"])
常见误区说明
你之前看到的「系数乘以标准差」的操作,是原始系数转每标准差效应的场景,和你的需求方向相反:
- 如果你需要解释原始变量每提升1个标准差的效应:直接
exp(β_scaled)即可,无需转换 - 如果你已有原始变量的系数,需要转换为每标准差的效应:才需要计算
exp(β_raw * σ)
Logit链接(Logistic回归)的扩展
如果是使用logit链接的二分类Logistic回归,转换逻辑完全一致:
- 原始单位下的OR值为
exp(β_scaled / σ) - 每标准差的OR值为
exp(β_scaled)
内容的提问来源于stack exchange,提问作者Thomas

