【问题标题】:s() in mgcv doesn't work when VGAM package loaded加载 VGAM 包时,mgcv 中的 s() 不起作用
【发布时间】:2013-12-19 23:45:00
【问题描述】:

这个

x <- rnorm(100)
y <- rnorm(100) 
gam(y ~ s(x))
## Family: gaussian 
## Link function: identity 

## Formula:
## y ~ s(x)

## Estimated degrees of freedom:
## 1  total = 2 

## GCV score: 0.8116283

在加载VGAM 包时崩溃:

library(VGAM)
gam(y ~ s(x))
##Error: $ operator is invalid for atomic vectors

两者都实现了s() 功能,但这不应该发生,对吧?这是mgcvVGAM 包中的错误吗?

【问题讨论】:

  • vglm 包从何而来?它不在 CRAN 上。
  • 我猜你的意思是VGAM 包(它有一个函数vglm)并演示了这个问题。
  • 这是“用户错误”。是你忽略了警告信息。

标签: r mgcv vgam


【解决方案1】:

mgcv:gam 调用 mgcv:interpret.gam 失败的地方。

interpret.gam 似乎将公式解析为特殊函数,包括“s”,然后在公式的环境中评估s(x)。这意味着它会从调用者那里找到当前的“s”。这可能是返回 gam 不喜欢的东西。

你不能这样修复它:

> gam(y ~ mgcv::s(x))
Error in model.frame.default(formula = y ~ mgcv::s(x), drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'mgcv::s(x)'
> gam(y ~ mgcv:::s(x))
Error in model.frame.default(formula = y ~ mgcv:::s(x), drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'mgcv:::s(x)'

但你可以这样:

> s=mgcv:::s
> gam(y ~ s(x))

Family: gaussian 
Link function: identity 

Formula:
y ~ s(x)

Estimated degrees of freedom:
1  total = 2 

GCV score: 0.9486058

所以它在任何一个包中都不是错误。您要求与s(x) 进行游戏,并且碰巧当前已将s(x) 定义为与gam 的需求不兼容。您不能只在其中插入任何旧功能。

【讨论】:

  • 谢谢,很好的答案!我承认这不是一个错误,但这不应该更健壮吗?至少可以在公式if(s != mgcv:::s)的环境下检查一下,产生警告,否则两个包都加载的时候总会报错,很难抓。。 .
  • 那么您到底要向包裹警察提出什么指控?如果先加载mgcv再加载VGAM,是mgcv的作者负责产生警告,还是VGAM的作者?如果 mgcv::s 或 mgcv::interpret.gam 在加载第二个包时被屏蔽,您会收到警告。您只是选择忽略警告。
  • 根本问题是 mgcv 试图让你变得灵活,但代价是允许你破坏东西,同时它本身打破了最小意外原则。如果你这样做:f=mgcv:::s ; gam(y~f(x)) 它会中断,即使fs,因为gam() 实际上会寻找s 字符。 s 函数对gam() 来说非常特别。我建议mgcv 的人让s 成为一个带有类的函数,并在gam() 中检查该类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多