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)
}
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)
head(data)
qplot(AbsVZ, T, data=data, color=RotationModel)# +
#ggtitle("Relationship between trial completion time and standard deviation of speed")
cor(data$AbsVZ, data$T)
This shows that these are somewhat independant variables which later are displayed to both be significantly different from baseline in their own way.
style = theme(text = element_text(size=20))
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
fit <- aov(T~RotationModel+Error(Name/RotationModel),data=data)
summary(fit)
calculateSignificanceTable(data,"T")
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
fit <- aov(AbsVZ~RotationModel+Error(Name/RotationModel),data=data)
summary(fit)
calculateSignificanceTable(data,"AbsVZ")
# 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
ggplot(data.wo0, aes(x=Order, y=T))+geom_boxplot()
fit <- aov(T~Order*RotationModel+Error(Name/(RotationModel)),data=data)
summary(fit)
Ordering effects on AbsVZ
ggplot(data.wo0, aes(x=Order, y=AbsVZ))+geom_boxplot()
fit <- aov(AbsVZ~Order*RotationModel+Error(Name/(RotationModel)),data=data)
summary(fit)
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.
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)
ggplot(data.wo0, aes(x=CurrentScene, y=T))+geom_boxplot()
fit <- aov(T~CurrentScene*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
ggplot(data.wo0, aes(x=CurrentScene, y=AbsVZ))+geom_boxplot()
fit <- aov(AbsVZ~CurrentScene*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
ggplot(data.wo0, aes(x=Gender, y=T))+geom_boxplot()
fit <- aov(T~Gender*RotationModel*Order+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
ggplot(data.wo0, aes(x=Gender, y=AbsVZ))+geom_boxplot()
Female sample size is small, deviation not significant
fit <- aov(T~Gender*Order*RotationModel+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
above.median = data$Age>=median(data$Age)
data$AboveMedianAge = ifelse(above.median,'yes', 'no')
data.wo0 = data[which(data$RotationModel!=0),]
ggplot(data.wo0, aes(x=AboveMedianAge, y=T))+geom_boxplot()
fit <- aov(T~AboveMedianAge*Order*RotationModel+Error(Name/(Order*RotationModel)),data=data)
summary(fit)
ggplot(data.wo0, aes(x=AboveMedianAge, y=AbsVZ))+geom_boxplot()
fit <- aov(AbsVZ~AboveMedianAge*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)
ggplot(data.wo0, aes(x=TookOffGlasses, y=T))+geom_boxplot()
fit <- aov(T~TookOffGlasses*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)
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.
fit <- aov(AbsVZ~TookOffGlasses*RotationModel*Order+Error(Name/(RotationModel*Order)),data=data)
summary(fit)