计算 GAM 的总估计自由度

机器算法验证 广义加法模型 自由程度
2022-03-29 02:19:25

我试图弄清楚如何计算 GAM 的总 edf。模型输出为:

Family: poisson 
Link function: log 

Formula:
TotAbund ~ s(MeanDepth, by = fPeriod) + fPeriod + offset(LogSA)

Parametric coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept) -5.82135    0.01003 -580.39   <2e-16 ***
fPeriod2    -0.49759    0.02043  -24.36   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
                         edf Ref.df Chi.sq p-value    
s(MeanDepth):fPeriod1 8.887  8.995  13849  <2e-16 ***
s(MeanDepth):fPeriod2 8.891  8.995   4697  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =   0.35   Deviance explained = 73.7%
UBRE =   81.8  Scale est. = 1         n = 147

我知道每个平滑样条的 edf 都列在“edf”列中。但是,要计算总模型估计的自由度,我是否只需将每个平滑器的 edf 相加?(8.887 + 8.891 = 17.778)

1个回答

您需要计算的自由度的正确术语是模型自由度您还可以计算剩余自由度

模型自由度确实是通过将模型中参数和非参数(或平滑)项使用的自由度相加来计算的。

这是一个 gam 模型示例,您可以检查模型自由度的计算:

library(mgcv) 

set.seed(6)
dat <- gamSim(1,n=400,dist="poisson",scale=.1)

m <-gam(y~s(x0)+s(x1)+s(x2)+ s(x3),family=poisson,data=dat,method="REML")

plot(m,pages=1)

summary(m)

该模型产生的输出如下:

Family: poisson 
Link function: log 

Formula:
y ~ s(x0) + s(x1) + s(x2) + s(x3)

Parametric coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.82292    0.03419   24.07   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Approximate significance of smooth terms:
        edf Ref.df Chi.sq  p-value    
s(x0) 2.432  3.029  5.517    0.141    
s(x1) 1.563  1.928 33.913 3.12e-08 ***
s(x2) 6.317  7.473 99.405  < 2e-16 ***
s(x3) 1.001  1.003  0.240    0.626    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

R-sq.(adj) =  0.256   Deviance explained = 24.2%
-REML = 744.98  Scale est. = 1         n = 400

如果将参数项使用的自由度(即截距的 1 个自由度)和非参数项使用的自由度(即 edf 列中列出的有效自由度)相加,你得到:

1 + 2.432 + 1.563 + 6.317 + 1.001 = 12.313

您可以通过以下命令仔细检查您的计算是否正确:

sum(influence(m))

产生以下输出:

> sum(influence(m))
[1] 12.31309

剩余自由度将计算为模型中包含的观测数 (n) 与模型自由度 (mdf) 之间的差异:n - mdf。对于本示例,n = 400 和 mdf = 12.313,因此剩余自由度将为 400 - 12.313 = 387.687。

请注意,如果您要将模型与仅截距模型进行比较,则方差分析函数会报告略有不同的剩余自由度,因为它使用不同的公式来计算模型自由度,这会影响剩余自由度。

m0 <- gam(y~1,family=poisson,data=dat,method="REML")
m0

m <-gam(y~s(x0)+s(x1)+s(x2)+ s(x3),family=poisson,data=dat,method="REML")
m

anova(m0,m, test="Chisq")

anova 命令的输出如下所示:

> anova(m0,m, test="Chisq")
Analysis of Deviance Table

Model 1: y ~ 1
Model 2: y ~ s(x0) + s(x1) + s(x2) + s(x3)
      Resid. Df Resid.   Dev     Df Deviance  Pr(>Chi)    
1    399.00     625.87                              
2    383.45   474.38   15.552   151.48 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

模型 2 的 anova 报告的剩余自由度(即 m)等于 383.45(而不是 387.687)。

请参阅https://web.as.uky.edu/statistics/users/pbreheny/621/F12/notes/11-29.pdf(幻灯片 25/30)以了解摘要中使用的公式的差异()和 anova() 函数用于计算模型自由度。