[R] gamm design matrices
Simon Wood
s.wood at bath.ac.uk
Mon Mar 3 14:35:04 CET 2014
Dear Jarrod,
I've only managed to have a very quick look at this, but I wonder if the
difference is to do with identifiability constraints? It looks to me as
if your smooth.construct call does not have sum to zero constraints
applied to the smooth, but by default 'gamm' will impose these (even
when the model has only one smooth). 'gamm' then includes an explicit
intercept term, which would explain why the model matrix dimensions
still look ok.
If you mimic gamm by calling smoothCon rather than smooth.construct and
asking for constraints to be absorbed, and then add the model matrix
column for the intercept back in, then it should be possible to get the
model matrices to match.
best,
Simon
On 02/03/14 17:16, Jarrod Hadfield wrote:
> Hi All,
>
> I would like to fit a varying coefficient model using MCMCglmm. To do
> this it is possible to reparameterise the smooth terms as a mixed model
> as Simon Wood neatly explains in his book.
>
> Given the original design matrix W and penalisation matrix S, I would
> like to find the fixed (X) and random (Z) design matrices for the mixed
> model parameteristaion. X are the columns of W for which S has zero
> eigenvalues and Z is the random effect design matrix for which ZZ' =
> W*S*^{-1}W* where W* is W with the fixed effect columns dropped and S*
> is S with the fixed effect row/columns dropped.
>
> Having e as the eigenvlaues of S* and L the associated eigenvectors then
> Z can be formed as W*LE^{-1} where E = Diag(sqrt(e)).
>
> However, obtaining W and S from mgcv's smooth.construct and applying the
> above logic I can recover the X but not the Z that gamm is passing to
> nlme. I have posted an example below.
>
> I have dredged the mgcv code but to no avail to see why I get
> differences. I want to fit the model to ordinal data, and I also have a
> correlated random effect structure (through a pedigree) hence the need
> to use MCMCglmm.
>
> Any help would be greatly appreciated.
>
> Cheers,
>
> Jarrod
>
>
>
>
> library(mgcv)
>
> x<-rnorm(100)
> y<-sin(x)+rnorm(100)
>
> dat<-data.frame(y=y,x=x) # generate some data
>
> smooth.spec.object<-interpret.gam(y~s(x,k=10))$smooth.spec[[1]]
>
> sm<-smooth.construct(smooth.spec.object,data=dat, knots=NULL)
>
> # get penalty matrix S = sm$S[[1]] and original design matrix W=sm$X
>
> Sed<-eigen(sm$S[[1]])
> Su<-Sed$vectors
> Sd<-Sed$values
> nonzeros <- which(Sd > sqrt(.Machine$double.eps))
>
> Xn<-sm$X[,-nonzeros]
>
> Zn<-sm$X%*%Su[,nonzeros]%*%diag(1/sqrt(Sd[nonzeros]))
>
> # form X and Z
>
> m2.lme<-gamm(y~s(x,k=10), data=dat)
>
> Xo<-m2.lme$lme$data$X
> Zo<-m2.lme$lme$data$Xr
>
> # fit gamm and extract X and Z used by lme
>
> plot(Xo,Xn) # OK
> plot(Zo,Zn) # not OK
>
>
>
>
>
>
>
>
>
>
>
>
>
--
Simon Wood, Mathematical Science, University of Bath BA2 7AY UK
+44 (0)1225 386603 http://people.bath.ac.uk/sw283
More information about the R-help
mailing list