gam 包上的命名空间说明符不起作用
Namespace specifier on gam package does not work
我不明白为什么下面两个 gam 模型会产生不同的结果。唯一的区别是在其中一个模型中,我在函数 gam
和 s
.
之前添加了名称空间说明符 gam::
我想这样做是因为我正在探索 运行 gam 包和 mgcv 包中的 gam 函数之间的差异。
library(ISLR)
library(gam)
gam.m3 <- gam::gam(wage ~ gam::s(year,4) + gam::s(age,5) + education,data=Wage)
gam.m3.orig <- gam(wage ~ s(year,4) + s(age,5) + education, data=Wage)
#Coefficients are different
coef(gam.m3)[1]; coef(gam.m3.orig)[1]
#Models are different
gam.m3$df.residual; gam.m3.orig$df.residual
这是输出。似乎系数和自由度不应该不同;事实上这两个模型应该是完全一样的。但是,它们是不同的,我不明白为什么。欢迎任何建议,我现在有点不知所措。
> library(ISLR)
> library(gam)
Loading required package: splines
Loading required package: foreach
Loaded gam 1.16
> gam.m3 <- gam::gam(wage ~ gam::s(year,4) + gam::s(age,5) + education, data=Wage)
Warning message:
In model.matrix.default(mt, mf, contrasts) :
non-list contrasts argument ignored
> gam.m3.orig <- gam(wage ~ s(year,4) + s(age,5) + education, data=Wage)
Warning message:
In model.matrix.default(mt, mf, contrasts) :
non-list contrasts argument ignored
>
> #Coefficients are different
> coef(gam.m3)[1]; coef(gam.m3.orig)[1]
(Intercept)
-2058.077
(Intercept)
-2339.364
>
> #Models are different
> gam.m3$df.residual; gam.m3.orig$df.residual
[1] 2993
[1] 2986
gam
调用 gam.fit
并且 gam.fit
具有处理平滑器的特定代码。此代码仅在 model.frame 的 "terms" 属性已在其 "specials" 属性中正确指定的情况下才能正常工作。否则,平滑器的处理方式与任何其他函数一样,显然会产生不同的结果。如果您想知道平滑器的处理方式究竟有何不同,您需要详细研究 gam.fit
的源代码。
基本上,这显示了您对 gam
的两次调用之间的关键区别:
gam.smoothers()$slist
#[1] "s" "lo" "random"
attr(terms(wage ~ s(year,4) + s(age,5) + education,
specials = gam.smoothers()$slist), "specials")
#$s
#[1] 2 3
#
#$lo
#NULL
#
#$random
#NULL
attr(terms(wage ~ gam::s(year,4) + gam::s(age,5) + education,
specials = gam.smoothers()$slist), "specials")
#$s
#NULL
#
#$lo
#NULL
#
#$random
#NULL
为什么需要使用gam::s
?调用 gam::gam
应该足以确保调用正确的平滑函数(通过命名空间查找):
gam::gam(wage ~ s(year,4) + s(age,5) + education,data=Wage)
编辑:
好的,mgcv::s
实际上在搜索路径上屏蔽了gam::s
。可以找到解决该问题的一种方法 。
我不明白为什么下面两个 gam 模型会产生不同的结果。唯一的区别是在其中一个模型中,我在函数 gam
和 s
.
gam::
我想这样做是因为我正在探索 运行 gam 包和 mgcv 包中的 gam 函数之间的差异。
library(ISLR)
library(gam)
gam.m3 <- gam::gam(wage ~ gam::s(year,4) + gam::s(age,5) + education,data=Wage)
gam.m3.orig <- gam(wage ~ s(year,4) + s(age,5) + education, data=Wage)
#Coefficients are different
coef(gam.m3)[1]; coef(gam.m3.orig)[1]
#Models are different
gam.m3$df.residual; gam.m3.orig$df.residual
这是输出。似乎系数和自由度不应该不同;事实上这两个模型应该是完全一样的。但是,它们是不同的,我不明白为什么。欢迎任何建议,我现在有点不知所措。
> library(ISLR)
> library(gam)
Loading required package: splines
Loading required package: foreach
Loaded gam 1.16
> gam.m3 <- gam::gam(wage ~ gam::s(year,4) + gam::s(age,5) + education, data=Wage)
Warning message:
In model.matrix.default(mt, mf, contrasts) :
non-list contrasts argument ignored
> gam.m3.orig <- gam(wage ~ s(year,4) + s(age,5) + education, data=Wage)
Warning message:
In model.matrix.default(mt, mf, contrasts) :
non-list contrasts argument ignored
>
> #Coefficients are different
> coef(gam.m3)[1]; coef(gam.m3.orig)[1]
(Intercept)
-2058.077
(Intercept)
-2339.364
>
> #Models are different
> gam.m3$df.residual; gam.m3.orig$df.residual
[1] 2993
[1] 2986
gam
调用 gam.fit
并且 gam.fit
具有处理平滑器的特定代码。此代码仅在 model.frame 的 "terms" 属性已在其 "specials" 属性中正确指定的情况下才能正常工作。否则,平滑器的处理方式与任何其他函数一样,显然会产生不同的结果。如果您想知道平滑器的处理方式究竟有何不同,您需要详细研究 gam.fit
的源代码。
基本上,这显示了您对 gam
的两次调用之间的关键区别:
gam.smoothers()$slist
#[1] "s" "lo" "random"
attr(terms(wage ~ s(year,4) + s(age,5) + education,
specials = gam.smoothers()$slist), "specials")
#$s
#[1] 2 3
#
#$lo
#NULL
#
#$random
#NULL
attr(terms(wage ~ gam::s(year,4) + gam::s(age,5) + education,
specials = gam.smoothers()$slist), "specials")
#$s
#NULL
#
#$lo
#NULL
#
#$random
#NULL
为什么需要使用gam::s
?调用 gam::gam
应该足以确保调用正确的平滑函数(通过命名空间查找):
gam::gam(wage ~ s(year,4) + s(age,5) + education,data=Wage)
编辑:
好的,mgcv::s
实际上在搜索路径上屏蔽了gam::s
。可以找到解决该问题的一种方法