[R] gamm(): nested tensor product smooths

Fabian Scheipl f.abian at gmx.net
Tue Nov 7 23:39:31 CET 2006


I'd like to compare tests based on the mixed model representation of additive models, testing among others

y=f(x1)+f(x2) vs y=f(x1)+f(x2)+f(x1,x2)
(testing for additivity)

In mixed model representation, where X represents the unpenalized part of the spline functions and Z the "wiggly" parts, this would be:

y=X%*%beta+ Z_1%*%b_1+ Z_2%*%b_2
vs
y=X%*%beta+ Z_1%*%b_1+ Z_2%*%b_2 + Z_12 %*% b_12

where b are random effect vectors and the hypothesis to be tested is

H_0: Var(b_12)=0 (<=> b_12_i == 0 for all i)

the problem:
gamm() does not seem to support the use of nested tensor product splines,
does anybody know how to work around this?

example code:  (you'll need to source the P-spline constructor from ?p.spline beforehand)

###########
test1<-function(x,z,sx=0.3,sz=0.4)
     { (pi**sx*sz)*(1.2*exp(-(x-0.2)^2/sx^2-(z-0.3)^2/sz^2)+
       0.8*exp(-(x-0.7)^2/sx^2-(z-0.8)^2/sz^2))
     }
 n<-400
 x<-runif(n);z<-runif(n);
 f <- test1(x,z)
 y <- f + rnorm(n)*0.1

 b<-gam(y~s(x,bs="ps",m=c(3,2))+s(z,bs="ps",m=c(3,2))+te(x,z,bs=c("ps","ps"),m=c(3,1),mp=F)) 

##works fine

b <- gamm(y~s(x,bs="ps",m=c(3,2),k=10))+s(z,bs="ps",m=c(3,2),k=10)+te(x,z,bs=c("ps","ps"),m=c(3,1),k=c(5,5)))

# : Singularity in backsolve at level 0, block 1

b <- gamm(y~te(x,z,bs=c("ps","ps"),m=c(3,0),k=c(5,5))) #works fine

# Additionallly, i'd like to work with
# just one smoothness parameter
# for the interaction, but mp=F doesn't work either:

b <- gamm(y~s(x,bs="ps",m=c(3,2),k=10)+s(z,bs="ps",m=c(3,2),k=10)+te(x,z,bs=c("ps","ps"),m=c(3,1),k=c(5,5),mp=F))

# Tensor product penalty rank appears to be too low

# which i don't really understand, since the penalty matrix for the
# p-spline should be

S<-t(diff(diag(5),diff=1))%*%(diff(diag(5),diff=1))   
# penalizing deviations from constant function 
# for the tensor product spline --> m=c(3,1)
S
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1   -1    0    0    0
#[2,]   -1    2   -1    0    0
#[3,]    0   -1    2   -1    0
#[4,]    0    0   -1    2   -1
#[5,]    0    0    0   -1    1

#and
tensor.prod.penalties(list(S,S))

#which should be the penalties for the tensor prod smooth,
# has rank 20-  that's not enough ? 
 
sum(eigen(S[[2]])$values>1e-10)
#> [1] 20

######

I hope some of the experts out there can help me out- any hints would be appreciated....
the problem is not caused by the p-splines, it also douesn't work with bs="tp".

thank you for your time.
--



More information about the R-help mailing list