gam软件包上的命名空间说明符不起作用

时间:2019-06-04 04:07:19

标签: r namespaces gam

我不明白为什么以下两种gam模型会产生不同的结果。唯一的区别是在其中一个模型中,我在函数gam::gam之前添加了名称空间说明符s

我要这样做是因为我正在探索在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

1 个答案:

答案 0 :(得分:3)

gam调用gam.fitgam.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::sthere是解决该问题的一种方法。