# The MIT License
# Copyright (c) 2007 The GGobi Foundation
# http://www.ggobi.org/book/code-license.txt


# Read data, and subset
d.crabs<-read.csv("australian-crabs.csv")
d.blue.crabs <- subset(d.crabs,species=="Blue", select=c(sex,FL:BD))

# Load libraries
library(mclust)
library(rggobi)

# Utility functions
f.vc.ellipse <- function(vc, xm, n=500) {
  p<-ncol(vc)
  x<-f.gen.sphere(n,p)

  evc<-eigen(vc)
  vc2<-(evc$vectors)%*%diag(sqrt(evc$values))%*%t(evc$vectors)
  x<-x%*%vc2

  x + matrix(rep(xm, each=n),ncol=p)
}

f.gen.sphere<-function(n=100,p=5) {
  x<-matrix(rnorm(n*p),ncol=p)
  xnew<-t(apply(x,1,f.norm.vec))
  xnew
}

f.norm.vec<-function(x) {
  x<-x/f.norm(x)
  x
}

f.norm<-function(x) { sqrt(sum(x^2)) }

# Model-based clustering
blue.crabBIC <- mclustBIC(subset(d.blue.crabs,select=c(FL,RW)),
    modelNames=c("EEE","EEV","VVV"))
blue.crabBIC
plot(blue.crabBIC)

 # Examine 2 cluster, equal volume, equal shape, variable orientation model
mclst1 <- mclustBIC(subset(d.blue.crabs,select=c(FL,RW)), G=2,
    modelNames="EEV")
smry1 <- mclustModel(subset(d.blue.crabs,select=c(FL,RW)), mclst1,
    G=2, modelNames="EEV")
cl1<-summary(smry1)$classification
table(d.blue.crabs[,1],cl1)
 # Compute the ellipses and plot
vc<-smry1$parameters$variance$sigma[,,1]
xm<-smry1$parameters$mean[,1]
y1<-f.vc.ellipse(vc,xm)
vc<-smry1$parameters$variance$sigma[,,2]
xm<-smry1$parameters$mean[,2]
y2<-f.vc.ellipse(vc,xm)

 # Examine 3 cluster, equal volume, equal shape, variable orientation model
mclst2<-mclustBIC(subset(d.blue.crabs,select=c(FL,RW)),G=3,modelNames="EEV")
smry2<-mclustModel(subset(d.blue.crabs,select=c(FL,RW)),mclst2,G=3,modelNames="EEV")
cl2<-summary(smry2)$classification
table(d.blue.crabs[,1],cl2)
 # Compute the ellipses and plot
vc<-smry2$parameters$variance$sigma[,,1]
xm<-smry2$parameters$mean[,1]
y1<-f.vc.ellipse(vc,xm)
vc<-smry2$parameters$variance$sigma[,,2]
xm<-smry2$parameters$mean[,2]
y2<-f.vc.ellipse(vc,xm)
vc<-smry2$parameters$variance$sigma[,,3]
xm<-smry2$parameters$mean[,3]
y3<-f.vc.ellipse(vc,xm)

 # Examine 2 cluster, variable volume, variable shape, 
 # variable orientation model
mclst3<-mclustBIC(subset(d.blue.crabs,select=c(FL,RW)),G=2,modelNames="VVV")
smry3<-mclustModel(subset(d.blue.crabs,select=c(FL,RW)),mclst3,G=2,modelNames="VVV")
cl3<-summary(smry3)$classification
table(d.blue.crabs[,1],cl3)
 # Compute the ellipses and plot
vc<-smry3$parameters$variance$sigma[,,1]
xm<-smry3$parameters$mean[,1]
y1<-f.vc.ellipse(vc,xm)
vc<-smry3$parameters$variance$sigma[,,2]
xm<-smry3$parameters$mean[,2]
y2<-f.vc.ellipse(vc,xm)

 # All 5 variables
mclst4 <- mclustBIC(subset(d.crabs,select=c(FL:BD)),
    G=1:8, modelNames=c("EEE","EEV","VVV"))
plot(mclst4)

mclst5<-mclustBIC(subset(d.crabs,select=c(FL:BD)),G=4,modelNames="EEV")
smry5<-mclustModel(subset(d.crabs,select=c(FL:BD)),mclst5,G=4,modelNames="EEV")
vc<-smry5$parameters$variance$sigma[,,1]
mn<-smry5$parameters$mean[,1]
y1<-f.vc.ellipse(vc,mn)
vc<-smry5$parameters$variance$sigma[,,2]
mn<-smry5$parameters$mean[,2]
y2<-f.vc.ellipse(vc,mn)
vc<-smry5$parameters$variance$sigma[,,3]
mn<-smry5$parameters$mean[,3]
y3<-f.vc.ellipse(vc,mn)
vc<-smry5$parameters$variance$sigma[,,4]
mn<-smry5$parameters$mean[,4]
y4<-f.vc.ellipse(vc,mn)
mclst5.model<-cbind(matrix(NA,500*4,3),rbind(y1,y2,y3,y4))
colnames(mclst5.model)<-c("species","sex","index","FL","RW","CL","CW","BD")
d.crabs.model<-rbind(d.crabs,mclst5.model)
gd<-ggobi(d.crabs.model)[1]
glyph_color(gd) = c(rep(4,50), rep(1,50), rep(9,50), rep(6,50), rep(8,2000))

