You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制lm()和glm()函数在线性回归中不重构权重?

在lm()和glm()线性回归中直接使用指定权重(不重构)

问题背景

lm()和glm()做线性回归时,会将输入的权重视为相对权重——即便传入w或w*100,得到的系数、p值和置信区间完全一致。这是因为函数仅关注权重的比例关系,而非绝对值。

实现方法

要让函数直接使用你指定的权重绝对值,需要手动修正统计量的计算(系数估计不受权重缩放影响,但标准误、p值等会受影响):

  1. 拟合基础模型
    先用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"))
    
  2. 手动计算绝对权重下的统计量
    提取模型矩阵和权重矩阵,计算基于原始权重的方差-协方差矩阵,进而得到标准误、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:29