Skip to content

MCMCglmm_2.13

1 message · Malcolm Fairbrother

#
Hi Jarrod,

Thanks--that makes sense.

I'm not familiar with ASReml, but it would be difficult, if not impossible, to use nlme to fit the kind of model I have in mind. Bracketing the issue of estimating the variance structure parameters, the problem with nlme is that it can't handle distances of zero in the covariance structure. But where data consisting of repeated observations are located on a spatial grid that doesn't change over time, there will be zero distances for the spatial covariances (i.e., any observation location will have zero spatial distance from itself at another time).

The approach below, which I think takes into account your responses to my e-mails, allows for *both* temporal and spatial autocorrelation.

Cheers,
Malcolm


library(nlme); library(MCMCglmm)
cs1AR1 <- corAR1(0.8, form = ~ Time | Rat) # value here could be estimated roughly using a semivariogram
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)

smat <- band(solve(corMatrix(cs1AR1)[[1]]), -1, 1)
invC <- as(kronecker(diag(nlevels(BodyWeight$Rat)), smat),  "CsparseMatrix")
rownames(invC) <- 1:dim(BodyWeight)[1]
BodyWeight$timeRat <- as.factor(1:dim(BodyWeight)[1])

BodyWeight$x <- sample(1:length(unique(BodyWeight$Rat)))[BodyWeight$Rat]
BodyWeight$y <- sample(1:length(unique(BodyWeight$Rat)))[BodyWeight$Rat]
plot(unique(BodyWeight$x), unique(BodyWeight$y)) # a map

cE <- corExp(form = ~ x + y | Time)
cE <- Initialize(cE, BodyWeight)
corMatrix(cE)[[1]] # a spatial correlation structure
smat2 <- Matrix(solve(corMatrix(cE)[[1]]), sparse=T) # not actually sparse, unfortunately
rownames(smat2) <- unique(BodyWeight$Rat)
BodyWeight$Rat2 <- BodyWeight$Rat # seems necessary to prevent R from crashing when calling MCMCglmm

# add some simulated spatial structure to the data (imagining these were not rats but, say, spatial observation points):
BodyWeight$weight.xy <- BodyWeight$weight + matrix(rnorm(nlevels(BodyWeight$Rat), sd=25) %*% chol(corMatrix(cE)[[1]]), ncol=1)[BodyWeight$Rat]

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)))
MC3a <- MCMCglmm(weight.xy ~ as.numeric(Time), random= ~ us(1+Time):Rat + timeRat, ginverse=list(timeRat=invC), data=BodyWeight, prior=prior)
MC3b <- MCMCglmm(weight.xy ~ as.numeric(Time), random= ~ us(1+Time):Rat + timeRat, ginverse=list(timeRat=invC, Rat2=smat2), data=BodyWeight, prior=prior)

# MC3b treats the spatial covariance between observations at different times as the same as observations at the same time
# I can imagine objections to this, but I think that conditional on everything else this should in many instances be OK
On 29 Jul 2011, at 09:33, Jarrod Hadfield wrote: