[R] Two-factorial Huynh-Feldt-Test

Bela Bauer bela_b at gmx.net
Fri Feb 18 09:05:15 CET 2005


Hi,

I'm currently working on porting some SAS scripts to R, and hence need 
to do the same calculation (and get the same results) as SAS in order to 
make the transition easier for users of the script.
In the script, I'm dealing with a two-factorial repeated-measures anova. 
I'll try to give you a short overview of the setup:

- two between-cell factors: facBetweenROI (numbering regions of 
interest, 6 levels) and facBetweenCond (numbering conditions, 2 levels).
- one within-cell factor: facWithin (which numbers subjects, while 
subjects are considered repetitions of the same measurement). This is 
basically the repeatedness of the data.

For this data, I do anovas for several linear models. SAS also 
calculates the Huynh-Feldt-Test, which is in this case very important to 
the users and cannot be replaced with nlme or something of the kind (as 
recommended in http://maths.newcastle.edu.au/~rking/R/help/03b/0813.html.

The models I use for the anovas are the following:

aov(vecData ~ (facWithin + facBetweenROI + facBetweenCond)^2)
aov(vecData ~ facBetweenROI + facBetweenCond %in% facWithin + 
Error(facBetweenROI %in% facWithin))
aov(vecData ~ facBetweenCond + facBetweenROI %in% facWithin + 
Error(facBetweenCond %in% facWithin))

SAS seems to calculate the Huynh-Feldt test for the first and the second 
model. The SAS output is (for the second aov)

Source                    DF   Type III SS   Mean Square  F Value  Pr > F

 roi                        5   258.7726806    51.7545361    21.28  <.0001
 Error(roi)                95   231.0511739     2.4321176

                                           Adj Pr > F
                  Source                 G - G     H - F

                  roi                   <.0001    <.0001
                  Error(roi)


                   Greenhouse-Geisser Epsilon    0.5367
                   Huynh-Feldt Epsilon           0.6333

and for the first one:

Source                    DF   Type III SS   Mean Square  F Value  Pr > F

 ord                        1     2.2104107     2.2104107     0.24  0.6276
 Error(ord)                19   172.7047994     9.0897263


 Source                    DF   Type III SS   Mean Square  F Value  Pr > F

 roi*ord                    5   10.37034918    2.07406984     2.89  0.0180
 Error(roi*ord)            95   68.25732255    0.71849813

                                           Adj Pr > F
                  Source                 G - G     H - F

                  roi*ord               0.0663    0.0591
                  Error(roi*ord)

Now, to do this in R, I have a short (and not very thorough) description 
of it in "Lehrbuch der Statistik", Bortz and I have the script from 
http://maths.newcastle.edu.au/~rking/R/help/03b/7891.html
Still, I can't figure out how to do this correctly in the two-factorial 
way (and with the different models that SAS seems to use.) I'll attach 
my code at the end, in case there's something that makes sense about it. 
I've tried to do it in several ways, but this is the only one that gives 
a somewhat reasonable result.

Can anyone give me a suggestion of how I could do this, where I could 
find information about it etc? Google doesn't help much except more SAS 
examples...:-(

hf <- function(mtxCov,ncol,nrow) {
  X <- mtxCov*(nrow-1)
  r <- length(X[,1])
  D <- 0
  for (i in 1: r) D<- D+ X[i,i]
  D <- D/r
  SPm  <- mean(X)
  SPm2 <- sum(X^2)
  SSrm <- 0
  for (i in 1: r) SSrm<- SSrm + mean(X[i,])^2
  epsilon <- (ncol^2*(D-SPm)^2) / ((ncol-1) * (SPm2 - 2*ncol*SSrm + 
ncol^2*SPm^2))
  print(epsilon)
}

# 2. do variance-covariance matrices for conditions first
avCov2 <- matrix(rep(0,36),ncol=length(unique( roi )))
for (iCond in 1:length(preparedData[1,3:4])) {
  mtx <- NULL
  for (iROI in 1:length(unique( roi ))) {
    mtx <- c(mtx,
             preparedData[roi==unique(roi)[iROI],iCond + 4])
  }
  mtx <- matrix(mtx, ncol=length(unique( roi )), byrow=F)
  avCov2 <- avCov2 + cov(mtx)
}
avCov2 <- avCov2 / length(preparedData[1,3:4])

hf(avCov2,
   length(unique( roi )),
   length(unique( subj )))




More information about the R-help mailing list