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

mgcv包中广义可加模型的调整R²计算公式是什么?

mgcv中GAM模型调整R²的计算方式

mgcv包中针对高斯分布的广义可加模型(GAM,即你示例中连续因变量、误差服从正态分布的情况),其调整R²的计算是在经典调整R²的基础上,用模型的有效自由度做修正,具体规则如下:

计算步骤与公式

  1. 先计算普通R²:
    ( R^2 = 1 - \frac{SS_{残差}}{SS_{总}} )
    其中:
  • ( SS_{残差} ) 是模型的残差偏差(高斯模型下等价于残差平方和,对应deviance(m)的结果)
  • ( SS_{总} ) 是仅含截距的零模型偏差(等价于因变量围绕均值的总平方和,对应m$null.deviance的结果)
  1. 基于普通R²推导调整R²:
  • 若模型包含截距(默认设置):
    ( R^2_{adj} = 1 - (1 - R^2) \times \frac{n-1}{n - df_{有效}} )
  • 若模型不含截距:
    ( R^2_{adj} = 1 - (1 - R^2) \times \frac{n-1}{n - df_{有效} - 1} )

参数说明:

  • ( n ):样本量(对应m$n)
  • ( df_{有效} ):模型的有效自由度,即所有平滑项的edf之和加上截距的自由度1(对应gam模型对象的m$edf值,也是summary输出中各项edf的总和)

对应mgcv的实现代码

你可以通过查看summary.gam的源码确认上述逻辑,核心计算片段如下:

if (family$family == "gaussian") {
    r2 <- 1 - deviance(m)/m$null.deviance
    n <- m$n
    p <- m$edf
    adj.r2 <- 1 - (1 - r2) * (n - 1)/(n - p - if (m$intercept) 0 else 1)
    attr(r2, "label") <- "R-sq.(adj)"
}

结合你的示例说明

以你提供的代码为例:

  • 样本量( n = 100 )
  • 模型的有效自由度是s(x)和s(x2)两个平滑项的edf之和,再加上截距的1(比如summary输出中两个平滑项的edf分别为3.8和3.7,总有效自由度就是7.5)
  • 将这些值代入公式,就能得到summary输出中的调整R²结果

内容的提问来源于stack exchange,提问作者Ly T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:35:15