Dear List:
 
I am estimating a gls model and am having to make some rather unconventional 
modifications to handle a particular problem I have identified. My aim is to 
fit a GLS with an AR1 structure, obtain the variance-covariance matrix (V), 
modify it as needed given my research problem, and then reestimate the GLS by 
brute force using matrix operations. All seems to be working almost perfectly, 
yet there is one small issue that I cannot seem to resolve and would appreciate 
any thoughts on my problem.
 
I have developed some code for simulating a longitudinal analysis of student 
achievement test scores. For the current model, I want constant variance over 
time with a correlation of r = .2 with means of 100, 150, 200, and 250 over 
time. The code is below. 
 
library(MASS)
library(nlme)
# These are the generating values
Sigma<-matrix(c(400,80,80,80,80,400,80,80,80,80,400,80,80,80,80,400),4,4)
mu<-c(100,150,200,250)
sample.size<-100
# Simulate data and restructure for longitudinal analysis
data<- as.data.frame(cbind(seq(1:sample.size),(mvrnorm(n = sample.size, mu, 
Sigma))))
colnames(data)<-c("stuid","Grade 2","Grade 3","Grade 4","Grade 5")
long<-reshape(data, idvar="stuid", varying=list(names(data)[2:5]),
v.names="score", direction="long")
long$time<-long$time-1

With these data I then use the gls function to estimate the following model
 
Y_{ti} = mu + beta(time) + e_{ti}
fm1 <- gls(score ~ time, long, correlation=corAR1(form=~1|stuid), method='ML')
 
>From here I can obtain V, the variance covariance matrix using the getVarCov 
>function as follows:
 
var.mat<-getVarCov(fm1)
I<-diag(1,sample.size) # The following 2 steps are needed to make V conformable 
for multiplication later
V<-kronecker(I,var.mat)
 
I then need to modify the V matrix and then reestimate the gls() by brute force 
using matrix operations. None of the current corClass or varFunc options would 
work for my current application, which is why I am doing this manually for now. 
 For reasons outside the scope of this email, I don't show that code or reasons 
why. Here is the code for brute force GLS which should replicate the estimates 
obtained from the built in gls function:
 
score<-long$score
intercept<-rep(1,sample.size)
time<-long$time
X.mat<-cbind(intercept,time)

# Estimate the GLS by brute force with the obtained V  
# Obtain point estimates (X'V^{-1}X)^{-1}X'V^{-1}y
pe.original<-solve(t(X.mat)%*%solve(V)%*%X.mat)%*%t(X.mat)%*%solve(V)%*%score
# Obtain variance covariance matrix (X'V^{-1}X)^{-1}
# This is to obtain the standard errors from the variance-covariance matrix
varcov.original<-solve(t(X.mat)%*%solve(V)%*%X.mat)
cat("Original GLS Estimates","\n","Value","\t","\t","Std. Error","\n", 
pe.original[1], 
"\t", 
sqrt(varcov.original[1,1]),"\n",pe.original[2],"\t",sqrt(varcov.original[2,2]),"\n")

All of this works perfectly when I execute the brute force method using the 
Orthodont dataset available in the nlme package. That is, the point estimates 
and standard errors are exactly the same as those estimated using the built-in 
functionality. This gives me confidence that the code I have above for the 
brute force model is accurate. 
 
However, when I run the simulated data above through the exact same code, the 
standard errors differ by a hair, but the point estimates are the same. This 
difference decreases in larger sample sizes, but it is still off and I can't 
seem to identify why. I first thought it was rounding error, but the difference 
in standard errors are generally larger in the range of .1 to .3 between the 
built-in gls function and the brute force model. In one of the many runs the 
se's were off by almost .8, but this occurred only once.
 
In Orthodont, N=27 and the se's are exactly the same, so I'm not convinced that 
rounding error or sample size is an issue here. The estimates differ by just 
enough to seem "different" but are so close that I am confident most things are 
working as expected. Actually, when I used round((code),0) for generating the 
data the se were off still. 
 
So, at this point, I am rather confused and cannot seem to account for the 
difference. Can anyone offer any reason why my standard errors are ALMOST 
exactly the same between built-in gls() function and the brute force operations 
above using simulated data, but exactly the same when using Orthodont? 
 
I also need to clean up the code above and would appreciate any thoughts. For 
example, I know I should be using model.matrix instead of the steps outlined 
above for constructing X.mat.
 
Thank you for any thoughts,
Harold
1.9.1
Windows 95
 
 
 

 

        [[alternative HTML version deleted]]

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html

Reply via email to