如何强制lm()和glm()函数在线性回归中不重构权重?
在lm()和glm()线性回归中直接使用指定权重(不重构)
问题背景
lm()和glm()做线性回归时,会将输入的权重视为相对权重——即便传入w或w*100,得到的系数、p值和置信区间完全一致。这是因为函数仅关注权重的比例关系,而非绝对值。
实现方法
要让函数直接使用你指定的权重绝对值,需要手动修正统计量的计算(系数估计不受权重缩放影响,但标准误、p值等会受影响):
拟合基础模型
先用lm()或glm()(指定family=gaussian(link="identity"))拟合模型,传入原始权重:# 示例数据 set.seed(123) x <- rnorm(100) y <- 1 + 2*x + rnorm(100, sd=1) w <- runif(100, 1, 10) # 自定义绝对权重 # 拟合模型 mod <- lm(y ~ x, weights = w) # 或用glm # mod <- glm(y ~ x, weights = w, family = gaussian(link = "identity"))手动计算绝对权重下的统计量
提取模型矩阵和权重矩阵,计算基于原始权重的方差-协方差矩阵,进而得到标准误、p值和置信区间:# 提取模型矩阵和权重 X <- model.matrix(mod) W <- diag(mod$weights) # 计算绝对权重对应的方差-协方差矩阵 vcov_absolute <- solve(t(X) %*% W %*% X) # 计算标准误、t值、p值 se_absolute <- sqrt(diag(vcov_absolute)) t_vals <- coef(mod) / se_absolute p_vals <- 2 * pt(abs(t_vals), df = mod$df.residual) # 整理系数表 coef_table <- cbind( 估计值 = coef(mod), 标准误 = se_absolute, t值 = t_vals, p值 = p_vals ) # 计算置信区间 confint_absolute <- coef(mod) + qt(c(0.025, 0.975), df = mod$df.residual) %o% se_absolute rownames(confint_absolute) <- names(coef(mod)) colnames(confint_absolute) <- c("2.5%", "97.5%")
说明
- lm()和glm()的系数估计本身不受权重缩放影响,因为加权最小二乘的解仅依赖权重比例;但标准误、p值等统计量会因权重绝对值改变,因此需要手动修正。
- 逻辑回归的glm()处理权重的方式是正确的(直接使用绝对值),无需额外修正。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

