문제

This

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

breaks down, when VGAM package is loaded:

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

Both implement s() function, but this shouldn't happen right? Is this an error in mgcv or VGAM package?

도움이 되었습니까?

해결책

mgcv:gam calls mgcv:interpret.gam which is where the fail is.

interpret.gam seems to parse the formula for special functions, including 's', and then evaluates s(x) in the environment of the formula. Which means it will find whatever the current 's' is from the caller. Which could be something that returns something that gam doesn't like.

You can't fix it like this:

> 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)'

But you can like this:

> 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

So its not an error in either package. You asked for a gam with s(x), and happened to have currently defined s(x) to be incompatible with that gam needs. You can't just plug any old function in there.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top