为什么 gam::step.gam return NULL?
Why does gam::step.gam return NULL?
关于 'gam' 包,尽管下面显示的 help("step.gam")
中的示例工作得很好,从模型中的考虑中删除更平滑的术语 's(x,12)' 会产生 NULL。为什么?
s(x,12) 项最终并未包含在模型中 step.object
... 那么为什么将其从考虑中删除会成为一个问题?
工作正常:
data(gam.data)
gam.object <- gam(y~x+z, data=gam.data)
step.object <-step.gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6)+s(x,12),"z"=~1+z+s(z,4)))
不好:
step.object <-step.gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6),"z"=~1+z+s(z,4)))
如果您 运行 带有 trace=2
的代码,
data(gam.data)
gam.object <- gam(y~x + z, data=gam.data)
step.object <- step.Gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6),"z"=~1+z+s(z,4)),
trace = 2)
它将打印有关算法结果的更多信息:
Start: y ~ x + z; AIC= 127.7316
Trial: y ~ 1 + z ; AIC= 234.8821
Trial: y ~ s(x, 4) + z ; AIC= 44.0543
Trial: y ~ x + 1 ; AIC= 126.5148
Trial: y ~ x + s(z, 4) ; AIC= 131.028
Step:1 y ~ s(x, 4) + z ; AIC= 44.0543
Trial: y ~ s(x, 6) + z ; AIC= 43.7495
Trial: y ~ s(x, 4) + 1 ; AIC= 43.1799
Trial: y ~ s(x, 4) + s(z, 4) ; AIC= 47.1024
Step:2 y ~ s(x, 4) ; AIC= 43.1799
Trial: y ~ s(x, 6) + 1 ; AIC= 42.6681
Step:3 y ~ s(x, 6) ; AIC= 42.6681
问题出在最后一步,即第3步。由于默认搜索方向是向前和向后,所以它会搜索所有复杂度相差一阶的可能性。可以进行两个试验,即s(x,4) + 1
和s(x,6) + z
。然而,这两个都已在步骤 1 中计算,因此没有进一步计算试验。
通常,搜索算法应该在所有试验中的 AIC 增加一个步骤时终止。在这种情况下,在第 2 步中 AIC 有所减少,这会导致第 3 步,但在第 3 步中没有进行任何试验。因此算法不会终止并且没有进一步的计算,导致结果 NULL
.
关于 'gam' 包,尽管下面显示的 help("step.gam")
中的示例工作得很好,从模型中的考虑中删除更平滑的术语 's(x,12)' 会产生 NULL。为什么?
s(x,12) 项最终并未包含在模型中 step.object
... 那么为什么将其从考虑中删除会成为一个问题?
工作正常:
data(gam.data)
gam.object <- gam(y~x+z, data=gam.data)
step.object <-step.gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6)+s(x,12),"z"=~1+z+s(z,4)))
不好:
step.object <-step.gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6),"z"=~1+z+s(z,4)))
如果您 运行 带有 trace=2
的代码,
data(gam.data)
gam.object <- gam(y~x + z, data=gam.data)
step.object <- step.Gam(gam.object, scope=list("x"=~1+x+s(x,4)+s(x,6),"z"=~1+z+s(z,4)),
trace = 2)
它将打印有关算法结果的更多信息:
Start: y ~ x + z; AIC= 127.7316
Trial: y ~ 1 + z ; AIC= 234.8821
Trial: y ~ s(x, 4) + z ; AIC= 44.0543
Trial: y ~ x + 1 ; AIC= 126.5148
Trial: y ~ x + s(z, 4) ; AIC= 131.028
Step:1 y ~ s(x, 4) + z ; AIC= 44.0543
Trial: y ~ s(x, 6) + z ; AIC= 43.7495
Trial: y ~ s(x, 4) + 1 ; AIC= 43.1799
Trial: y ~ s(x, 4) + s(z, 4) ; AIC= 47.1024
Step:2 y ~ s(x, 4) ; AIC= 43.1799
Trial: y ~ s(x, 6) + 1 ; AIC= 42.6681
Step:3 y ~ s(x, 6) ; AIC= 42.6681
问题出在最后一步,即第3步。由于默认搜索方向是向前和向后,所以它会搜索所有复杂度相差一阶的可能性。可以进行两个试验,即s(x,4) + 1
和s(x,6) + z
。然而,这两个都已在步骤 1 中计算,因此没有进一步计算试验。
通常,搜索算法应该在所有试验中的 AIC 增加一个步骤时终止。在这种情况下,在第 2 步中 AIC 有所减少,这会导致第 3 步,但在第 3 步中没有进行任何试验。因此算法不会终止并且没有进一步的计算,导致结果 NULL
.