## Theorem 6.4(for balanced data & variable order p): call the functions of theorem 5.6 (a)(b)(c) test.r.order<-function(data, covariate, p0, p1){ data <- as.matrix(data) Z <- as.matrix(covariate) N <- nrow(data) n <- ncol(data) m <- ncol(Z) p <- p0 q <- p1-p0 ##theorem 5.6(c) partial <- partial.inter(cov.cor(REMLE.cov(data, Z, p+q, REMLE=TRUE))) sum <- 0 sum.M <- 0 for(i in 2:n){ sum1 <- 0 sum1.M <- 0 if(q[i]!=0){ for(j in 1:q[i]){ r <- partial[i,i-p[i]-j] sum1 <- sum1+log(1-r^2) sum1.M <- sum1.M+(N-p[i]-j)*log(1-r^2) } } sum <- sum+sum1 sum.M <- sum.M+sum1.M } LRT <- -N*sum MLRT <- -sum.M df <- sum(q[2:n]) pvalue.LRT <- 1-pchisq(LRT, df) pvalue.MLRT <- 1-pchisq(MLRT, df) list(LRT=LRT, pvalue.LRT=pvalue.LRT, MLRT=MLRT, pvalue.MLRT=pvalue.MLRT) } #################################################################################### ## the following functions are of theorem 5.6 (a)(b)(c) ###############Theorem 5.6(a)############### ## set REMLE=TRUE for REML estimation ## set REMLE=FALSE for ML estimation REMLE.para<-function(data, covariate, p, REMLE){ data <- as.matrix(data) Z <- as.matrix(covariate) N <- nrow(data) n <- ncol(data) m <- ncol(Z) V <- matrix(rep(0, n*n), nrow = n) if(length(p)==1) p <- rep(0:p, c(rep(1,p),(n-p))) if(m==1){ beta.hat <- as.vector(apply(data,2, mean)) A <- as.matrix(cov(data))*(N-m)/N } else{ Y <- NULL for(i in 1:N) Y <- cbind(Y, t(data[i,])) Y <- t(Y) A <- matrix(rep(0, n*n), nrow = n) ## (5.30) p.134 beta.hat <- kronecker(solve(t(Z)%*%Z)%*%t(Z), diag(n))%*%Y for(i in 1:N){ M <- matrix(data[i,], nr=n)-kronecker(matrix(Z[i,], nr=1), diag(n))%*%beta.hat A <- A+M%*%t(M) } A <- A/N } ## (5.31, 5.32) if(REMLE==TRUE) cov <- (N/(N-m))*A else cov <- A for(i in 1:n){ for(j in (i-p[i]):i) V[j,i] <- V[i,j] <- cov[i,j] } if(m==1) list(muhat=beta.hat, cov.p=V) else list(betahat=beta.hat, cov.p=V) } ###############Theorem 5.6(b)############### ## calculate the correlations on off diagonals cov.cor<-function(V){ for(i in 2: nrow(V)){ for(j in 1:(i-1)) V[j,i] <- V[i,j] <- V[i,j]/sqrt(V[i,i]*V[j,j]) } V } ## recursive formula for mle in(2.32) recur.mle<-function(i, p, cov){ kasi <- matrix(t(cov[c((i-p):(i-1)), c(1:(i-p-1))]), nr=(i-p-1)) %*% solve(t(cov[c((i-p):(i-1)), c((i-p):(i-1))])) %*% matrix(t(cov[i, c((i-p):(i-1))]), nr=p) kasi } REMLE.cov<-function(data, covariate, p, REMLE){ n <- ncol(data) if(length(p)==1) p <- rep(0:p, c(rep(1,p),(n-p))) cov <- REMLE.para(data, covariate, p, REMLE=REMLE)$cov.p for(i in 2:n){ if((i-p[i]) > 1 && (i-p[i]) < i){ kasi <- recur.mle(i,p[i], cov) ## recursive formula in (2.44) for(j in 1:(i-p[i]-1)) cov[j,i] <- cov[i,j] <- as.vector(kasi[j]) } } cov } ###############Theorem 5.6(c)############### ## inverse inv <- function(cov){ solve(cov) } ## pi>0 for i>1 ## intervenor-adjusted partial correlation ## recursion formula for partial correlations in (2.6) recur.pcor<-function(index1, index2, index3, V){ index1 <- index1 index2 <- index2 index3 <- index3 index <- c(index1, index2, index3) if(length(index3)==1){ rxy.z <- (V[index[1], index[2]]-V[index[1], index[3]]*V[index[2], index[3]])/ (sqrt(1-V[index[1], index[3]]^2)*sqrt(1-V[index[2], index[3]]^2)) return(rxy.z) } else{ index1 <- index[1] index2 <- index[2] index30 <- index[3] index3c <- index[-c(1,2,3)] rxy.zc <- recur.pcor(index1, index2, index3c, V) rxz0.zc <- recur.pcor(index1,index30,index3c, V) ryz0.zc <- recur.pcor(index2,index30,index3c, V) rxy.z <- (rxy.zc - rxz0.zc*ryz0.zc)/(sqrt(1-rxz0.zc^2)*sqrt(1-ryz0.zc^2)) return(rxy.z) } } partial.inter<-function(cor){ V <- cor n <- ncol(cor) m <- n-2 for(k in 1:m){ if(k==m) V[1, n] <- V[n, 1] <- recur.pcor(1, n, c(2:(n-1)), cor) else diag(V[1:(n-k-1), (k+2):n]) <- diag(V[(k+2):n, 1:(n-k-1)]) <- sapply(1:(m+1-k), function(i) if(k==1) recur.pcor(i, i+k+1, i+1, cor) else recur.pcor(i, i+k+1, c((i+1):(i+k)), cor)) } V }