[R-sig-ME] MCMCglmm_2.13

Jarrod Hadfield j.hadfield at ed.ac.uk
Thu Jul 28 11:20:25 CEST 2011


Hi Malcolm,

I don't think it's as fancy as you think/hope. The covariance  
structure has to be seperable into a matrix of prameters (V) and a  
fixed matrix (A), whereas in many spatial/time-series models A is also  
a function of some parameter(s). It is flexible in the sense that A  
can be any positive-definite matrix.

I've edited your code below to get MCMCglmm to fit the AR1 model (with  
fixed phi).

Cheers,

Jarrod


On 27 Jul 2011, at 19:18, Malcolm Fairbrother wrote:

> Dear Jarrod,
>
> Can I please just confirm what you meant here by "covariance  
> structures for the random effects"? If I understand correctly, this  
> technique might be very useful for quite a lot of things--though I'm  
> also trying to think it through.
>
> Specifically, the nlme package for example allows for error  
> structures like AR1, etc., in the *residuals* of a mixed model. Are  
> you saying that MCMCglmm's "ginverse" function allows for similar  
> sorts of structure to be modelled in the *random effects*? Consider:
>
> library(nlme); library(MCMCglmm)
>
> # models with uncorrelated random effects (16 Rats observed on 11  
> occasions):
> m1 <- lme(weight ~ Time, random = ~ 1 | Rat, BodyWeight)
> m2 <- MCMCglmm(weight ~ Time, random = ~ Rat, data=BodyWeight,  
> verbose=F) # m1 and m2 are the same
>
> # same model as the above, but allowing for AR1 residuals errors:
> cs1AR1 <- corAR1(0.8, form = ~ Time | Rat)
> cs1AR1 <- Initialize(cs1AR1, BodyWeight)
> corMatrix(cs1AR1)[[1]] # shows the correlation structure for each  
> Rat (all 16 are the same, since each Rat is measured on the same  
> occasions)
> m3 <- lme(weight ~ Time, random = ~ Time | Rat, correlation =  
> cs1AR1, BodyWeight)

# The models below (m4,m5 & m6) are not ideal, so I'll ft a MCMCglmm  
model that is close to m3:

phi<-0.756197

# get phi from m3 - tried to extract this number from m3 but gave up  
looking!?

csEAR1 <- corAR1(phi, form = ~ Time | Rat)
csEAR1 <- Initialize(cs1AR1, BodyWeight)

mat <- as(corMatrix(csEAR1)[[1]], "sparseMatrix")

# generate AR1 covariance matrix

# IMPORTANT: the inverse needs to be passed, rather than the actual  
covariance matrix. This is preferable because the inverse is often  
sparser, and MCMCglmm may not "know" this from the matrix and a brute  
force solve. Your example is a good one, because the inverse of an AR1  
covaraince matrix  (when time points are ordered) only has non-zero  
elements along the diagonal and sub-diagonals.  However, inverting mat  
gives a dense matrix because of numerical inaccuracies:

length(solve(mat)@x)

# gives 121 non-zero elements, but should really be :

dim(mat)[1]+2*(dim(mat)[1]-1)

# 31 non-zero elements. So:

smat<-solve(mat)
smat<-band(smat,c(-1,1), c(1,-1))

# also, it makes more sense for this to define the autocovariance  
structure within each Rat (rather than across Rats) as in m3.  Since  
the deisgn is balanced this is easy to form:

invC<-kronecker(diag(nlevels(BodyWeight$Rat)), smat)
invC<-as(invC,  "CsparseMatrix")

# create a new variable with a unique name for each datum (and have  
the rownames in invC correspond)

rownames(invC) <- 1:dim(BodyWeight)[1]
BodyWeight$timeRat<-as.factor(1:dim(BodyWeight)[1])

# Then fit

prior=list(R=list(V=1, nu=0.02), G=list(G1=list(V=diag(2), nu=2,  
alpha.mu=c(0,0), alpha.V=diag(2)*1000), G2=list(V=1, nu=1, alpha.mu=0,  
alpha.V=1000)))

m3.mcmc <- MCMCglmm(weight ~ Time, random=~us(1+Time):Rat+timeRat,  
ginverse=list(timeRat=invC), data=BodyWeight, verbose=F, nitt=53000,  
pr=T, prior=prior)

# This is almost identical to m3 except the AR1 process is for the  
random effects rather than the residuals. In m3 the covariance  
structure within each Rat is equal to vr*mat where vr is the residual  
variance. In  MCMCglmm  it is  equal to   va*mat +vb*I  where va is  
the variance associated with the timeRat term and vb is the variance  
associated with the units term (residual variance).

# Nevertheless, the lme point estimates correspond very closely to the  
posterior modes for all parameters:

f1<-summary(m3)$coef$fixed[1]
f2<-summary(m3)$coef$fixed[2]
v1<-as.numeric(VarCorr(summary(m3))[1])
v2<-as.numeric(VarCorr(summary(m3))[2])
c12<-as.numeric(VarCorr(summary(m3))[,3][2])*sqrt(v1*v2)
vr<-as.numeric(VarCorr(summary(m3))[3])


par(mfrow=c(1,2))
hist(m3.mcmc$Sol[,1], breaks=30)
abline(v=f1, col="red")
hist(m3.mcmc$Sol[,2], breaks=30)
abline(v=f2, col="red")

par(mfrow=c(2,2))
hist(m3.mcmc$VCV[,1], breaks=30)
abline(v=v1, col="red")
hist(m3.mcmc$VCV[,4], breaks=30)
abline(v=v2, col="red")
hist(m3.mcmc$VCV[,2], breaks=30)
abline(v=c12, col="red")
hist(rowSums(m3.mcmc$VCV[,5:6]), breaks=30)
abline(v=vr, col="red")



>
> # now, for an illustrative experiment, treat *Time* as the random  
> grouping factor, instead of Rat:
> m4 <- lme(weight ~ Diet, random = ~ 1 | Time, BodyWeight)
> m5 <- MCMCglmm(weight ~ Diet, random=~Time, data=BodyWeight,  
> verbose=F, nitt=53000, pr=T)
> # estimates for the variance of the random intercepts is somewhat  
> different, but otherwise m4 and m5 yield similar results
>
> # now, create a "ginverse" matrix, and incorporate it in a call to  
> MCMCglmm:
> mat <- as(corMatrix(cs1AR1)[[1]], "sparseMatrix")
> rownames(mat) <- unique(BodyWeight$Time)
> m6 <- MCMCglmm(weight ~ Diet, random=~Time, ginverse=list(Time=mat),  
> data=BodyWeight, verbose=F, nitt=53000, pr=T)
>
> The variance for the random effects for Time is now substantially  
> reduced. Does this mean that the "estimates" for the U_j terms has  
> taken into account their correlation, whereas m5 treated them as  
> independent? (Maybe I should have inverted "mat" before including it  
> in the call?)
>
> Do you see what I'm getting at? Maybe I've not understood, but this  
> seemed to raise the possibility of allowing for random effects to be  
> structured in many interesting ways (serially in time, spatially,  
> etc.), which I don't think other packages can handle…
>
> Many thanks for any clarification, as always,
> Malcolm
>
>
>
>
>> Date: Mon, 25 Jul 2011 12:41:43 +0100
>> From: Jarrod Hadfield <j.hadfield at ed.ac.uk>
>> To: r-sig-mixed-models at r-project.org
>> Subject: [R-sig-ME] MCMCglmm_2.13
>>
>> Hi,
>>
>> A new version of MCMCglmm (MCMCglmm_2.13) has been submitted to CRAN
>> and should be on-line soon.
>>
>> NEW FEATURES:
>>
>> a) Covariance structures for the random effects of the form
>> kronecker(V,A) where A is some arbitrary matrix can now be fitted.
>> Previous versions only allowed A matrices defined by a pedigree or
>> phylogeny, and even then only single phylogenies/pedigrees could be
>> passed. The A matrices (actually their sparse inverses) are passed  
>> via
>> the argument ginverse.
>>
>> b) c. 10% increase in speed for phylogenetic and pedigree models.
>>
>> BUG FIXES:
>>
>> i) If a column sum of Z was zero the associated term could be
>> incorrectly omitted from the mixed model equations. This is unlikely
>> to affect the vast majority of users.
>>
>> ii) If a prior was specified with too many structures then the
>> redundant prior structures were ignored. An error message is now  
>> issued.
>>
>> iii) MCMCglmm failed with a cryptic error message if the internal
>> nodes of a phylogeny were labelled but not uniquely. A more helpful
>> error message is now given.
>>
>> Cheers,
>>
>> Jarrod
>
>


-- 
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.




More information about the R-sig-mixed-models mailing list