Assitive functions, data processing

In [1]:
get3DVecLength <- function(x,y,z){
    return(sqrt(x^2+y^2+z^2))
}

calculateSignificanceTable <- function(data, targetcol){
    values = c(0,1,2,3,4,5) # All different rotation models
    cat("",paste("RM",values[1:length(values)-1],sep=""),sep="\t", "\n")
    for (outer in values[2:length(values)]){
        row = c(paste("RM",outer,sep=""))
        for(inner in values ){
            if(inner==outer){
                break;
            } else {
                pval = t.test(data[[targetcol]][which(data$RotationModel==outer)], 
                              data[[targetcol]][which(data$RotationModel==inner)])[["p.value"]]
                signif = "NS."
                if(pval < 0.001){
                    signif = "***"
                } else if(pval < 0.01){
                    signif = "**"
                } else if(pval < 0.05){
                    signif = "*"
                }

                row = c(row, signif)
            }
        }
        cat(row,sep="\t", "\n")
    }
    cat("\n")
    cat("Signif. codes: *** p>0.001; ** p>0.01; * p>0.05")
}

readTrials <- function(file.name, interval=15){
    exp.data = read.csv(file=file.name, header=TRUE, sep=",")
    generalised.exp.data = data.frame()
    for(i in min(exp.data$ExperimentNumber):max(exp.data$ExperimentNumber)){
        trial.data <- exp.data[ which(exp.data$ExperimentNumber==i), ]
        len <- nrow(trial.data)
        for(k in 1:((len-len%%interval)/interval)){
            end.index = k*interval
            if ((k+1)*interval>len){
                end.index = len
            }
            indices=c(((k-1)*interval+1):end.index)
            newrow <- data.frame(trial.data[1,]$ExperimentNumber, trial.data[1,]$CurrentScene, 
                                 trial.data[1,]$RotationModel, max(trial.data[indices,]$T),
                                 sum(trial.data[indices,]$DeltaT), sum(trial.data[indices,]$DeltaX),
                                 sum(trial.data[indices,]$DeltaY), sum(trial.data[indices,]$DeltaZ))
            generalised.exp.data = rbind(generalised.exp.data, newrow)
        }
    }
    names(generalised.exp.data) = c("ExperimentNumber", "CurrentScene",
                                    "RotationModel", "T",
                                    "DeltaT", "DeltaX", "DeltaY", "DeltaZ")
    generalised.exp.data$Delta = get3DVecLength(generalised.exp.data$DeltaX,
                                                generalised.exp.data$DeltaY,
                                                generalised.exp.data$DeltaZ)
    generalised.exp.data$VX = generalised.exp.data$DeltaX/generalised.exp.data$DeltaT
    generalised.exp.data$VY = generalised.exp.data$DeltaY/generalised.exp.data$DeltaT
    generalised.exp.data$VZ = generalised.exp.data$DeltaZ/generalised.exp.data$DeltaT
    generalised.exp.data$V = generalised.exp.data$Delta/generalised.exp.data$DeltaT
    
    #generalised.exp.data$RotationModel <- as.factor(generalised.exp.data$RotationModel)
    #generalised.exp.data$ExperimentNumber <- as.factor(generalised.exp.data$ExperimentNumber)
    return(generalised.exp.data)
}

summarizeTrials <- function(exp.data){
    summary.data = data.frame()
    for(i in min(exp.data$ExperimentNumber):max(exp.data$ExperimentNumber)){
        trial.data <- exp.data[ which(exp.data$ExperimentNumber==i), ]
        trial.summary = data.frame(trial.data[1,]$ExperimentNumber, trial.data[1,]$CurrentScene,
                                   trial.data[1,]$RotationModel, max(trial.data$T),
                                   sum(abs(trial.data$DeltaX)), sum(abs(trial.data$DeltaY)),
                                   sum(abs(trial.data$DeltaZ)), sum(trial.data$Delta),
                                   mean(trial.data$VX), mean(trial.data$VY), mean(trial.data$VZ), mean(trial.data$V),
                                   sd(trial.data$VX), sd(trial.data$VY), sd(trial.data$VZ), sd(trial.data$V),
                                   sum(abs(trial.data$DeltaX))/max(trial.data$T), sum(abs(trial.data$DeltaY))/max(trial.data$T),
                                   sum(abs(trial.data$DeltaZ))/max(trial.data$T), sum(abs(trial.data$Delta))/max(trial.data$T))
        summary.data <- rbind(summary.data, trial.summary)
    }
    names(summary.data) = c("ExperimentNumber", "CurrentScene",
                            "RotationModel", "T",
                            "TraveledX", "TraveledY",
                            "TraveledZ", "TraveledTotal",
                            "VX", "VY", "VZ", "V", 
                            "StdVX", "StdVY", "StdVZ", "StdV",
                            "AbsVX", "AbsVY",
                            "AbsVZ", "AbsV")
    return(summary.data)
}

relativizeTrials <- function(exp.data){
    # Create a baseline
    bs.data <- exp.data[which(exp.data$RotationModel==0), ]
    bs.data <- bs.data[3:nrow(bs.data),]  # First two trials tend to be outliers
    bs = list(T=mean(bs.data$T), 
              TraveledX=mean(bs.data$TraveledX), TraveledY=mean(bs.data$TraveledY),
              TraveledZ=mean(bs.data$TraveledZ), TraveledTotal=mean(bs.data$TraveledTotal),
              VX=mean(bs.data$VX), VY=mean(bs.data$VY), VZ=mean(bs.data$VZ), V=mean(bs.data$V),
              StdVX=mean(bs.data$StdVX), StdVY=mean(bs.data$StdVY), StdVZ=mean(bs.data$StdVZ), StdV=mean(bs.data$StdV),
              AbsVX=mean(bs.data$AbsVX), AbsVY=mean(bs.data$AbsVY) ,AbsVZ=mean(bs.data$AbsVZ), AbsV=mean(bs.data$AbsV))
    
    # Relativize units
    rel.data <- data.frame()
    for(i in 1:nrow(exp.data)){
        trial = exp.data[i,]
        rel.trial = data.frame(trial$ExperimentNumber, trial$CurrentScene,
                               trial$RotationModel, trial$T/bs$T,
                               trial$TraveledX/bs$TraveledX, trial$TraveledY/bs$TraveledY,
                               trial$TraveledZ/bs$TraveledZ, trial$TraveledTotal/bs$TraveledTotal,
                               trial$VX/bs$VX, trial$VY/bs$VY, trial$VZ/bs$VZ, trial$V/bs$V,
                               trial$StdVX/bs$StdVX, trial$StdVY/bs$StdVY, trial$StdVZ/bs$StdVZ, trial$StdV/bs$StdV,
                               trial$AbsVX/bs$AbsVX, trial$AbsVY/bs$AbsVY, trial$AbsVZ/bs$AbsVZ, trial$AbsV/bs$AbsV)
        rel.data <- rbind(rel.data, rel.trial)
    }
    
    # Clean up table headers
    names(rel.data) = c("ExperimentNumber", "CurrentScene",
                        "RotationModel", "T",
                        "TraveledX", "TraveledY",
                        "TraveledZ", "TraveledTotal",
                        "VX", "VY", "VZ", "V",
                        "StdVX", "StdVY", "StdVZ", "StdV",
                        "AbsVX", "AbsVY", "AbsVZ", "AbsV")
    return(rel.data)
}
In [2]:
library(ggsignif)
library(ggplot2)
setwd("Data")
metadata <- read.csv(file="metadata.csv", header=TRUE, sep=",")
data <- data.frame()
for (row in 1:nrow(metadata)){
    metarow <- metadata[row,]
    name <- toString(metarow$FileName)
    summary <- summarizeTrials(readTrials(name))
    rel <- relativizeTrials(summary)
    rel$Name <- name
    rel$Age <- metarow$Age
    rel$Gender <- metarow$Gender
    rel$TookOffGlasses = metarow$TookOffGlasses
    data <-rbind(data,rel[3:nrow(rel),]) # Throw away first two RM0 from the set
}
data$RotationModel <- as.factor(data$RotationModel)
data$ExperimentNumber <- as.factor(data$ExperimentNumber)
data$ExperimentNumber <- as.factor(data$ExperimentNumber)
data$TookOffGlasses <- as.factor(data$TookOffGlasses)
data$Gender <- as.factor(data$Gender)
In [4]:
head(data)
ExperimentNumberCurrentSceneRotationModelTTraveledXTraveledYTraveledZTraveledTotalVXVY...StdVZStdVAbsVXAbsVYAbsVZAbsVNameAgeGenderTookOffGlasses
32 vortex 0 1.176445 0.9992387 0.8503598 1.1377812 0.9989803 0.8387281 0.94928835 ... 0.9527032 1.1253887 0.8407046 0.7101537 0.9607603 0.8404223 2017-04-13-02-59-PM.csv28 m n
43 vortex 3 2.957641 1.0000899 1.1182844 4.9604697 1.1631584 0.3334135 0.07104386 ... 1.7702489 1.1616892 0.3346874 0.3714736 1.6661159 0.3892294 2017-04-13-02-59-PM.csv28 m n
54 vortex 4 1.338007 0.9982194 0.7710703 1.4124685 0.9996646 0.7421381 0.32187694 ... 0.9660572 0.6885926 0.7384369 0.5661830 1.0486928 0.7394488 2017-04-13-02-59-PM.csv28 m n
65 vortex 3 1.929364 1.0012004 1.1078882 4.0495403 1.1063598 0.5105371 0.16644075 ... 2.2652469 1.3216800 0.5136326 0.5641608 2.0850639 0.5675372 2017-04-13-02-59-PM.csv28 m n
76 vortex 5 1.643943 1.0007496 0.8687205 3.6928845 1.0695157 0.5996671 0.37117883 ... 2.3068157 1.2795847 0.6025379 0.5191758 2.2315508 0.6438913 2017-04-13-02-59-PM.csv28 m n
87 vortex 0 1.107551 0.9991371 0.9705893 0.9746846 0.9976527 0.8939307 0.68349717 ... 0.8700624 0.7234365 0.8929086 0.8609795 0.8742348 0.8915131 2017-04-13-02-59-PM.csv28 m n

Initial renderings of data

In [5]:
qplot(AbsVZ, T, data=data, color=RotationModel)# + 
#ggtitle("Relationship between trial completion time and standard deviation of speed")
In [6]:
cor(data$AbsVZ, data$T)
0.250080713193528

This shows that these are somewhat independant variables which later are displayed to both be significantly different from baseline in their own way.


In [145]:
style = theme(text = element_text(size=20))

Rotation model effects of completion time

In [180]:
completiontime = ggplot(data, aes(x=RotationModel, y=T))+geom_boxplot() + 
style + 
xlab("Rotation Model") +
ylab("Standardized trial completion time")
ggsave("images/completiontime.png",plot=completiontime, width = 16, height = 9, dpi = 120)
completiontime
In [8]:
fit <- aov(T~RotationModel+Error(Name/RotationModel),data=data)
summary(fit)
Error: Name
              Df Sum Sq Mean Sq F value Pr(>F)
RotationModel  1   0.56   0.563   0.143  0.711
Residuals     13  51.09   3.930               

Error: Name:RotationModel
              Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel  5  27.01   5.403   14.54 9.27e-10 ***
Residuals     70  26.01   0.372                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 299  76.11  0.2545               
In [9]:
calculateSignificanceTable(data,"T")
	RM0	RM1	RM2	RM3	RM4	
RM1	***	
RM2	***	NS.	
RM3	***	NS.	NS.	
RM4	***	NS.	NS.	NS.	
RM5	***	NS.	NS.	*	NS.	

Signif. codes: *** p>0.001; ** p>0.01; * p>0.05

Rotation model effects on average absolute speed on Z-axis

In [181]:
zspeed = ggplot(data, aes(x=RotationModel, y=AbsVZ))+geom_boxplot()+ 
style + 
xlab("Rotation Model") +
ylab("Standardized absolute Z-axis speed")
ggsave("images/zspeed.png",plot=zspeed, width = 16, height = 9, dpi = 120)
zspeed
In [12]:
fit <- aov(AbsVZ~RotationModel+Error(Name/RotationModel),data=data)
summary(fit)
Error: Name
              Df Sum Sq Mean Sq F value Pr(>F)
RotationModel  1   0.01   0.006   0.002  0.967
Residuals     13  42.44   3.264               

Error: Name:RotationModel
              Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel  5  23.95   4.790   13.54 3.08e-09 ***
Residuals     70  24.77   0.354                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 299  32.94  0.1102               
In [13]:
calculateSignificanceTable(data,"AbsVZ")
	RM0	RM1	RM2	RM3	RM4	
RM1	***	
RM2	***	*	
RM3	***	NS.	NS.	
RM4	***	NS.	**	*	
RM5	***	*	NS.	NS.	**	

Signif. codes: *** p>0.001; ** p>0.01; * p>0.05

Effects of ordering on metrics

In [14]:
# prep ordering data
data$Order = ifelse(as.numeric(data$ExperimentNumber)<15,'first', 'second')
data$SceneOrder = paste(data$CurrentScene, data$Order, sep=" ")
# prep data without RM0
data.wo0 = data[which(data$RotationModel!=0),]

Ordering effects on T

In [17]:
ggplot(data.wo0, aes(x=Order, y=T))+geom_boxplot()
In [122]:
fit <- aov(T~Order*RotationModel+Error(Name/(RotationModel)),data=data)
summary(fit)
Error: Name
          Df Sum Sq Mean Sq F value Pr(>F)
Order      1   0.56   0.563   0.143  0.711
Residuals 13  51.09   3.930               

Error: Name:RotationModel
              Df Sum Sq Mean Sq F value   Pr(>F)    
Order          1 23.499  23.499  62.496 2.98e-11 ***
RotationModel  5  3.582   0.716   1.905    0.105    
Residuals     69 25.944   0.376                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
                     Df Sum Sq Mean Sq F value  Pr(>F)    
Order                 1  15.73  15.735  80.793 < 2e-16 ***
Order:RotationModel   5   3.31   0.662   3.397 0.00534 ** 
Residuals           293  57.06   0.195                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ordering effects on AbsVZ

In [23]:
ggplot(data.wo0, aes(x=Order, y=AbsVZ))+geom_boxplot()
In [123]:
fit <- aov(AbsVZ~Order*RotationModel+Error(Name/(RotationModel)),data=data)
summary(fit)
Error: Name
          Df Sum Sq Mean Sq F value Pr(>F)
Order      1   0.01   0.006   0.002  0.967
Residuals 13  42.44   3.264               

Error: Name:RotationModel
              Df Sum Sq Mean Sq F value  Pr(>F)    
Order          1 18.566  18.566  51.822 5.8e-10 ***
RotationModel  5  5.429   1.086   3.031  0.0157 *  
Residuals     69 24.721   0.358                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
                     Df Sum Sq Mean Sq F value Pr(>F)
Order                 1   0.25 0.24864   2.259  0.134
Order:RotationModel   5   0.44 0.08744   0.794  0.554
Residuals           293  32.25 0.11008               

Granular inspection

In [178]:
granulart = ggplot(data, aes(x=interaction(Order,RotationModel), y=T, fill=RotationModel))+geom_boxplot()+
geom_signif(comparisons=list(c("first.0","second.0"), 
                             c("first.1","second.1"),
                             c("first.2","second.2"),
                             c("first.3","second.3"),
                             c("first.4","second.4"),
                             c("first.5","second.5")
                            ), map_signif_level=TRUE, size=0.8, textsize=9)
granulart
granulart= granulart +
style + 
xlab("Interaction of order of environment and rotation model") +
ylab("Standardized trial completion time")
ggsave("images/granularcompletiontime.png",plot=granulart, width = 16, height = 9, dpi = 120)

Significance levels look bad here because they look good on the exported plots.

In [179]:
granularz = ggplot(data, aes(x=interaction(Order,RotationModel), y=AbsVZ, fill=RotationModel))+geom_boxplot()+
geom_signif(comparisons=list(c("first.0","second.0"), 
                             c("first.1","second.1"),
                             c("first.2","second.2"),
                             c("first.3","second.3"),
                             c("first.4","second.4"),
                             c("first.5","second.5")
                            ), map_signif_level=TRUE, size=0.8, textsize=9)
granularz
granularz= granularz +
style + 
xlab("Interaction of order of environment and rotation model") +
ylab("Standardized absolute Z-axis speed")
ggsave("images/granularzspeed.png",plot=granularz, width = 16, height = 9, dpi = 120)

Effects of environment on metrics

In [212]:
ggplot(data.wo0, aes(x=CurrentScene, y=T))+geom_boxplot()
In [94]:
fit <- aov(T~CurrentScene*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
Error: Name
                   Df Sum Sq Mean Sq F value Pr(>F)  
CurrentScene        1   0.56   0.563   0.187  0.673  
CurrentScene:Order  1  15.04  15.042   5.007  0.045 *
Residuals          12  36.05   3.004                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order
              Df Sum Sq Mean Sq F value Pr(>F)  
CurrentScene   1  0.018   0.018   0.018 0.8947  
RotationModel  2 10.668   5.334   5.510 0.0201 *
Residuals     12 11.617   0.968                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel
                                 Df Sum Sq Mean Sq F value   Pr(>F)    
CurrentScene                      1   2.61   2.612   7.074  0.00987 ** 
RotationModel                     5  33.51   6.703  18.154 3.57e-11 ***
CurrentScene:RotationModel        1   0.19   0.190   0.513  0.47628    
CurrentScene:RotationModel:Order  4   0.92   0.231   0.626  0.64567    
Residuals                        64  23.63   0.369                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order:RotationModel
                           Df Sum Sq Mean Sq F value  Pr(>F)   
CurrentScene                1  0.121  0.1212   0.604 0.43973   
CurrentScene:RotationModel  4  1.131  0.2828   1.410 0.24055   
RotationModel:Order         5  3.431  0.6862   3.421 0.00833 **
Residuals                  65 13.037  0.2006                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
              Df Sum Sq Mean Sq F value Pr(>F)
CurrentScene   1  0.048 0.04755   0.351  0.554
Residuals    208 28.187 0.13552               
In [31]:
ggplot(data.wo0, aes(x=CurrentScene, y=AbsVZ))+geom_boxplot()
In [93]:
fit <- aov(AbsVZ~CurrentScene*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
Error: Name
                   Df Sum Sq Mean Sq F value Pr(>F)
CurrentScene        1   0.01   0.006   0.002  0.967
CurrentScene:Order  1   3.42   3.420   1.052  0.325
Residuals          12  39.02   3.252               

Error: Name:Order
              Df Sum Sq Mean Sq F value Pr(>F)
CurrentScene   1  0.650  0.6497   1.387  0.262
RotationModel  2  0.027  0.0133   0.028  0.972
Residuals     12  5.623  0.4685               

Error: Name:RotationModel
                                 Df Sum Sq Mean Sq F value   Pr(>F)    
CurrentScene                      1  0.659   0.659   1.908    0.172    
RotationModel                     5 24.733   4.947  14.321 2.11e-09 ***
CurrentScene:RotationModel        1  0.094   0.094   0.271    0.604    
CurrentScene:RotationModel:Order  4  0.634   0.158   0.459    0.766    
Residuals                        64 22.106   0.345                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order:RotationModel
                           Df Sum Sq Mean Sq F value Pr(>F)  
CurrentScene                1  0.079  0.0793   0.540 0.4653  
CurrentScene:RotationModel  4  1.416  0.3539   2.407 0.0583 .
RotationModel:Order         5  0.497  0.0995   0.677 0.6426  
Residuals                  65  9.558  0.1470                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
              Df Sum Sq Mean Sq F value Pr(>F)
CurrentScene   1  0.029 0.02915    0.39  0.533
Residuals    208 15.553 0.07478               

Person identifiers

In [154]:
ggplot(data.wo0, aes(x=Gender, y=T))+geom_boxplot()
In [92]:
fit <- aov(T~Gender*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
Error: Name
              Df Sum Sq Mean Sq F value Pr(>F)
Gender         1   2.56   2.565   0.627  0.444
RotationModel  1   0.00   0.003   0.001  0.978
Residuals     12  49.09   4.091               

Error: Name:Order
                     Df Sum Sq Mean Sq F value Pr(>F)  
RotationModel         2 10.505   5.253   5.346 0.0219 *
Gender:RotationModel  1  0.006   0.006   0.006 0.9388  
Residuals            12 11.791   0.983                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel
                     Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel         5  32.21   6.442  15.286 7.22e-10 ***
Gender:RotationModel  5   1.66   0.331   0.785    0.564    
RotationModel:Order   1   0.04   0.035   0.083    0.774    
Residuals            64  26.97   0.421                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order:RotationModel
                           Df Sum Sq Mean Sq F value Pr(>F)  
RotationModel:Order         5  3.308  0.6615   3.038 0.0159 *
Gender:RotationModel:Order  5  0.260  0.0520   0.239 0.9439  
Residuals                  65 14.154  0.2177                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  28.23  0.1351               
In [155]:
ggplot(data.wo0, aes(x=Gender, y=AbsVZ))+geom_boxplot()

Female sample size is small, deviation not significant

In [100]:
fit <- aov(T~Gender*Order*RotationModel+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
Error: Name
          Df Sum Sq Mean Sq F value Pr(>F)
Gender     1   2.56   2.565   0.627  0.444
Order      1   0.00   0.003   0.001  0.978
Residuals 12  49.09   4.091               

Error: Name:Order
              Df Sum Sq Mean Sq F value  Pr(>F)   
Order          1 10.477  10.477  10.663 0.00676 **
RotationModel  1  0.028   0.028   0.029 0.86834   
Gender:Order   1  0.006   0.006   0.006 0.93877   
Residuals     12 11.791   0.983                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel
                     Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel         5  32.21   6.442  15.286 7.22e-10 ***
Gender:RotationModel  5   1.66   0.331   0.785    0.564    
Order:RotationModel   1   0.04   0.035   0.083    0.774    
Residuals            64  26.97   0.421                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order:RotationModel
                           Df Sum Sq Mean Sq F value Pr(>F)  
Order:RotationModel         5  3.308  0.6615   3.038 0.0159 *
Gender:Order:RotationModel  5  0.260  0.0520   0.239 0.9439  
Residuals                  65 14.154  0.2177                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  28.23  0.1351               

In [157]:
above.median = data$Age>=median(data$Age)
data$AboveMedianAge = ifelse(above.median,'yes', 'no')
data.wo0 = data[which(data$RotationModel!=0),]
In [159]:
ggplot(data.wo0, aes(x=AboveMedianAge, y=T))+geom_boxplot()
In [112]:
fit <- aov(T~AboveMedianAge*Order*RotationModel+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
Error: Name
               Df Sum Sq Mean Sq F value Pr(>F)
AboveMedianAge  1   0.14   0.142   0.033  0.858
Order           1   0.46   0.460   0.108  0.748
Residuals      12  51.05   4.254               

Error: Name:Order
                     Df Sum Sq Mean Sq F value  Pr(>F)   
Order                 1 10.477  10.477  10.922 0.00628 **
RotationModel         1  0.028   0.028   0.029 0.86676   
AboveMedianAge:Order  1  0.286   0.286   0.298 0.59495   
Residuals            12 11.511   0.959                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel
                             Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel                 5  32.21   6.442  14.771 1.28e-09 ***
AboveMedianAge:RotationModel  5   0.70   0.140   0.320    0.899    
Order:RotationModel           1   0.05   0.052   0.119    0.732    
Residuals                    64  27.91   0.436                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order:RotationModel
                                   Df Sum Sq Mean Sq F value Pr(>F)  
Order:RotationModel                 5  3.308  0.6615   3.127 0.0137 *
AboveMedianAge:Order:RotationModel  5  0.665  0.1329   0.629 0.6786  
Residuals                          65 13.749  0.2115                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  28.23  0.1351               
In [160]:
ggplot(data.wo0, aes(x=AboveMedianAge, y=AbsVZ))+geom_boxplot()
In [161]:
fit <- aov(AbsVZ~AboveMedianAge*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)
Error: Name
               Df Sum Sq Mean Sq F value Pr(>F)
AboveMedianAge  1   3.54   3.544   1.102  0.315
RotationModel   1   0.31   0.310   0.096  0.762
Residuals      12  38.59   3.216               

Error: Name:RotationModel
                             Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel                 5 23.948   4.790  13.450 5.76e-09 ***
Order                         1  0.047   0.047   0.133    0.717    
AboveMedianAge:RotationModel  5  1.930   0.386   1.084    0.378    
Residuals                    64 22.791   0.356                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order
                     Df Sum Sq Mean Sq F value Pr(>F)
Order                 1  0.249  0.2486   0.556  0.470
AboveMedianAge:Order  1  0.141  0.1409   0.315  0.585
RotationModel:Order   1  0.053  0.0532   0.119  0.736
Residuals            12  5.365  0.4471               

Error: Name:RotationModel:Order
                                   Df Sum Sq Mean Sq F value Pr(>F)
RotationModel:Order                 5  0.436 0.08728   0.524  0.758
AboveMedianAge:RotationModel:Order  5  0.280 0.05610   0.337  0.889
Residuals                          65 10.833 0.16667               

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  15.58 0.07456               

In [162]:
ggplot(data.wo0, aes(x=TookOffGlasses, y=T))+geom_boxplot()
In [120]:
fit <- aov(T~TookOffGlasses*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)
Error: Name
               Df Sum Sq Mean Sq F value Pr(>F)
TookOffGlasses  1   1.00   1.000   0.241  0.633
RotationModel   1   0.79   0.791   0.190  0.670
Residuals      12  49.86   4.155               

Error: Name:RotationModel
                             Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel                 5 27.014   5.403  13.519 5.32e-09 ***
Order                         1  0.067   0.067   0.167    0.684    
TookOffGlasses:RotationModel  5  0.367   0.073   0.184    0.968    
Residuals                    64 25.577   0.400                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order
                     Df Sum Sq Mean Sq F value  Pr(>F)   
Order                 1 15.735  15.735  13.825 0.00294 **
TookOffGlasses:Order  1  0.655   0.655   0.576 0.46257   
RotationModel:Order   1  0.101   0.101   0.089 0.77099   
Residuals            12 13.658   1.138                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel:Order
                                   Df Sum Sq Mean Sq F value Pr(>F)  
RotationModel:Order                 5  3.308  0.6615   3.115 0.0139 *
TookOffGlasses:RotationModel:Order  5  0.610  0.1220   0.575 0.7192  
Residuals                          65 13.803  0.2124                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  28.23  0.1351               
In [163]:
ggplot(data.wo0, aes(x=TookOffGlasses, y=AbsVZ))+geom_boxplot()

Sample size even smaller than that of women, observably interesting but cant honestly claim significance.

In [121]:
fit <- aov(AbsVZ~TookOffGlasses*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)
Error: Name
               Df Sum Sq Mean Sq F value Pr(>F)  
TookOffGlasses  1  10.55  10.546   3.983 0.0692 .
RotationModel   1   0.12   0.124   0.047 0.8323  
Residuals      12  31.77   2.648                 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:RotationModel
                             Df Sum Sq Mean Sq F value   Pr(>F)    
RotationModel                 5 23.948   4.790  14.896 1.11e-09 ***
Order                         1  0.047   0.047   0.147   0.7025    
TookOffGlasses:RotationModel  5  4.143   0.829   2.577   0.0347 *  
Residuals                    64 20.578   0.322                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Error: Name:Order
                     Df Sum Sq Mean Sq F value Pr(>F)
Order                 1  0.249  0.2486   0.553  0.471
TookOffGlasses:Order  1  0.158  0.1579   0.351  0.564
RotationModel:Order   1  0.007  0.0065   0.015  0.906
Residuals            12  5.395  0.4496               

Error: Name:RotationModel:Order
                                   Df Sum Sq Mean Sq F value Pr(>F)
RotationModel:Order                 5  0.436 0.08728   0.523  0.758
TookOffGlasses:RotationModel:Order  5  0.264 0.05273   0.316  0.902
Residuals                          65 10.850 0.16693               

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 209  15.58 0.07456