smooth.construct.fs.smooth.spec {mgcv} | R Documentation |
Factor smooth interactions in GAMs
Description
Simple factor smooth interactions, which are efficient when used with gamm
.
This smooth class allows a separate smooth for each level of a factor, with the same smoothing parameter for all
smooths. It is an alternative to using factor by
variables.
See factor.smooth
for more genral alternatives for factor smooth interactions (including interactions of tensor product smooths with factors).
Usage
## S3 method for class 'fs.smooth.spec'
smooth.construct(object, data, knots)
## S3 method for class 'fs.interaction'
Predict.matrix(object, data)
Arguments
object |
For the |
data |
a list containing just the data (including any |
knots |
a list containing any knots supplied for smooth basis setup. |
Details
This class produces a smooth for each level of a single factor variable. Within a gam
formula this is done with something like s(x,fac,bs="fs")
, which is almost equivalent to s(x,by=fac,id=1)
(with the gam
argument select=TRUE
). The terms are fully penalized, with separate penalties on each null
space component: for this reason they are not centred (no sum-to-zero constraint).
The class is particularly useful for use with gamm
, where estimation efficiently exploits
the nesting of the smooth within the factor. Note however that: i) gamm
only allows one conditioning
factor for smooths, so s(x)+s(z,fac,bs="fs")+s(v,fac,bs="fs")
is OK, but s(x)+s(z,fac1,bs="fs")+s(v,fac2,bs="fs")
is not; ii) all aditional random effects and correlation structures will be treated as nested within the factor
of the smooth factor interaction. To facilitate this the constructor is called from gamm
with an attribute
"gamm"
attached to the smooth specification object. The result differs from that resulting from the case where this is
not done.
Note that gamm4
from the gamm4
package suffers from none of the restrictions that apply to gamm
, and
"fs"
terms can be used without side-effects. Constructor is still called with a smooth specification object having a
"gamm"
attribute.
Any singly penalized basis can be used to smooth at each factor level. The default is "tp"
, but alternatives can
be supplied in the xt
argument of s
(e.g. s(x,fac,bs="fs",xt="cr")
or
s(x,fac,bs="fs",xt=list(bs="cr")
). The k
argument to s(...,bs="fs")
refers to the basis dimension to
use for each level of the factor variable.
Note one computational bottleneck: currently gamm
(or gamm4
) will produce the full posterior covariance matrix for the
smooths, including the smooths at each level of the factor. This matrix can get large and computationally costly if there
are more than a few hundred levels of the factor. Even at one or two hundred levels, care should be taken to keep
down k
.
The plot method for this class has two schemes. scheme==0
is in colour, while scheme==1
is black and white.
Value
An object of class "fs.interaction"
or a matrix mapping the coefficients of the factor smooth interaction to the smooths themselves. The contents of an "fs.interaction"
object will depend on whether or not smooth.construct
was called with an object with attribute gamm
: see below.
Author(s)
Simon N. Wood simon.wood@r-project.org with input from Matteo Fasiolo.
See Also
factor.smooth
, gamm
, smooth.construct.sz.smooth.spec
Examples
library(mgcv)
set.seed(0)
## simulate data...
f0 <- function(x) 2 * sin(pi * x)
f1 <- function(x,a=2,b=-1) exp(a * x)+b
f2 <- function(x) 0.2 * x^11 * (10 * (1 - x))^6 + 10 *
(10 * x)^3 * (1 - x)^10
n <- 500;nf <- 25
fac <- sample(1:nf,n,replace=TRUE)
x0 <- runif(n);x1 <- runif(n);x2 <- runif(n)
a <- rnorm(nf)*.2 + 2;b <- rnorm(nf)*.5
f <- f0(x0) + f1(x1,a[fac],b[fac]) + f2(x2)
fac <- factor(fac)
y <- f + rnorm(n)*2
## so response depends on global smooths of x0 and
## x2, and a smooth of x1 for each level of fac.
## fit model...
bm <- gamm(y~s(x0)+ s(x1,fac,bs="fs",k=5)+s(x2,k=20))
plot(bm$gam,pages=1)
summary(bm$gam)
## Also efficient using bam(..., discrete=TRUE)
bd <- bam(y~s(x0)+ s(x1,fac,bs="fs",k=5)+s(x2,k=20),discrete=TRUE)
plot(bd,pages=1)
summary(bd)
## Could also use...
## b <- gam(y~s(x0)+ s(x1,fac,bs="fs",k=5)+s(x2,k=20),method="ML")
## ... but its slower (increasingly so with increasing nf)
## b <- gam(y~s(x0)+ t2(x1,fac,bs=c("tp","re"),k=5,full=TRUE)+
## s(x2,k=20),method="ML"))
## ... is exactly equivalent.