这个
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()
功能,但这不应该发生吗?这是mgcv
或VGAM
包中的错误吗?
答案 0 :(得分:4)
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
的需求不兼容。你不能只在那里插入任何旧功能。