Suppose I have longitudinal data and want to use the econometric strategy of "de-meaning" a model matrix by time. For sake of illustration 'mat' is a model matrix for 3 individuals each with 3 observations where ``1'' denotes that individual i was in group j at time t or ``0'' otherwise. mat <- matrix(c(1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,1,0), ncol=3) mat <- data.frame(mat, id=gl(3,3)) I can conceive of two ways of de-meaning: either use an explicit loop or use mapply, both of which are below. # put this in a loop over each column to create the de-meaned X matrix mat2 <- matrix(0, 9,3) for(i in 1:3){ mat2[,i] <- mat[,i] - ave(mat[,i], mat$id) } # Or use mapply as follows mat[,1:3]-mapply(ave, mat[,1:3], MoreArgs=list(mat$id)) Both work, but they require that the model matrix is explictly created and then used in the regression. For example, assume I am using the star data in the mlmRev package data(star, package='mlmRev') I would first need to explictly create the model matrix for the fixed effects as follows and then use the strategy above to de-mean this matrix. mat <-model.matrix(lm(math~ -1 + sch, star)) Of course in R, this is rather inefficient as one generally only needs to have a factor for any independent variables and the model matrix is created for you when using lm(). So, my question is whether there is a more efficient way of creating the time de-meaned model matrix? Or, is the solution above the kind of strategy that must be used for this situation? Harold [[alternative HTML version deleted]]