## Funktionen zur Cluster-Analyse
## ------------------------------

# require(cluster)

f.agnes <- function(data, group, distance="euclidean", method="average",
		      k=2, plot=TRUE, main=tit, ...) 
{
  ## Purpose: hierarchical Clustering
  ## ------------------------------------------------------------------
  ## Arguments:  data : Datenmatrix oder Data Frame
  ##            group : schon bekannte Gruppenzugehoerigkeit
  ##         distance : zu gebrauchendes Distanzmass:
  ##                    'euclidean', 'maximum', 'manhatten', 'binary' ,...
  ##             meth : Clustermethode:
  ##                                   'single'   (= single linkage)
  ##                                   'average'
  ##                                   'complete'  (= complete linkage)
  ##                                   ........
  ##                k : gewünschte Anzahl Gruppen
  ##             plot : falls T wird ein Dendrogramm gezeichnet  
  ## ------------------------------------------------------------------
  ## Author: Markus Huerzeler, Christian Keller
  ## Update: 13. Nov. 2003, R. Frisullo
  erg.hcl  <- agnes(data, metric = distance, method=method)

  tit <- paste("Methode: `", method, "', Distanz: `", distance, "'", sep="")
  #  'title' überschreibt den Titel von 'plot'
  #  if(plot) { plot(erg.hcl, ...); title(main=main, ...) }
  if(plot) { plot(erg.hcl, main=main, ...) }

  erg.cut <- cutree(erg.hcl, k=k)
  cat("\nHierarchisches Clustering:", tit) 
  cat("\nKlassifikation:\n")
  print(table(group, erg.cut))
  
  invisible(erg.cut)
}


f.pam <- function(data, group, distance = "euclidean", k = 2)
{
## Purpose:  k-means Clustering Methode
## ------------------------------------------------------------------
## Arguments:  data : Datenmatrix oder Data Frame
##            group : schon bekannte Gruppenzugehoerigkeit
##                k : gewnschte Anzahl Gruppen
## folgende Argumente werden fuer die Bestimmung der Startwerte der
## Zentren benuetzt:
##             dist : zu gebrauchendes Distanzmass:
##                    'euclidean', 'maximum', 'manhatten', 'binary' 
##             meth : Clustermethode:
##                                   'average'
##                                   'ward'
##                                   'connected'   (= single linkage)
## ------------------------------------------------------------------
## Author: Markus Huerzeler, Christian Keller, Monika Ferster

	erg.k <- pam(daisy(data,metric=distance),k=k,diss=T)
	cat("\nK-medoid (PAM) Clustering:")
	cat("\nKlassifikation:\n")
	print(table(group, erg.k$cluster))
	invisible(erg.k$cluster)
}


plot.PCclust <- function(clust.res, data, labels=clust.res, col=clust.res,
			 main=deparse(substitute(clust.res)), ...)
{
  ## Purpose: Cluster in Hauptkomponenten-Koordinaten
  ## -------------------------------------------------------------------------
  ## Arguments: clust.res : Resultat aus f.agnes() oder f.pam()
  ##                        [oder f.cluster oder f.kmean]
  ##                 data : Datenmatrix oder Data Frame
  ## -------------------------------------------------------------------------
  ## Author: Martin Maechler, Christian Keller

  pr12 <- prcomp(data)$x[,1:2]
  plot(pr12, xlab="1. Hauptkomponenten-Achse", ylab="2. Hauptkomponenten-Achse",
       type="n", main=main, ...)
  text(pr12, labels=labels, col=col, ...)
}

