您需要计算的自由度的正确术语是模型自由度。您还可以计算剩余自由度。
模型自由度确实是通过将模型中参数和非参数(或平滑)项使用的自由度相加来计算的。
这是一个 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() 函数用于计算模型自由度。