Análisis multivariante en R: aplicación en ecología

Rosana Ferrero 5 de febrero de 2014

Índice
1. Análisis cluster con R: datos iris (ambos métodos). 1.1. Análisis jerárquico . . . . . . . . . . . . . . . . . 1.2. Análisis no jerárquico: k-medias . . . . . . . . . 1.3. Análisis no jerárquico: k-medoides . . . . . . . . 1.4. Análisis no jerárquico: método de densidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 7 9 11

1

1.
1.1.

Análisis cluster con R: datos iris (ambos métodos).
Análisis jerárquico

Con los datos iris vamos a aplicar el método jerárquico de clasificación. http://cran.r-project.org/ doc/contrib/Zhao_R_and_data_mining.pdf. Vamos a crear una muestra aleatoria del conjunto de datos, quitándole la variable Species, para clasificarlo según los casos o flores y luego ver si esta clasificación se corresponde o no con la especie. # 1) miramos los datos que tenemos str(iris) ## 'data.frame': 150 obs. of 5 variables: ## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... ## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... ## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... ## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... ## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... # resumimos las variables summary(iris) ## ## ## ## ## ## ## ## ## ## ## ## ## ## Sepal.Length Min. :4.30 1st Qu.:5.10 Median :5.80 Mean :5.84 3rd Qu.:6.40 Max. :7.90 Species setosa :50 versicolor:50 virginica :50 Sepal.Width Min. :2.00 1st Qu.:2.80 Median :3.00 Mean :3.06 3rd Qu.:3.30 Max. :4.40 Petal.Length Min. :1.00 1st Qu.:1.60 Median :4.35 Mean :3.76 3rd Qu.:5.10 Max. :6.90 Petal.Width Min. :0.1 1st Qu.:0.3 Median :1.3 Mean :1.2 3rd Qu.:1.8 Max. :2.5

# miramos la dimensión de los datos dim(iris) #150 filas o casos, y 5 columnas o variables ## [1] 150 5

# 2) tomamos una muestra de 40 casos para realizar el dendrograma (y # que no sea muy extenso) obtenemos el vector de números aleatorios # para escoger la muestra idx <- sample(1:dim(iris)[1], 40) # nos quedamos con aquellos números (filas) que seleccionamos, y # todas las variables irisSample <- iris[idx, ] # borramos la variable Species irisSample$Species <- NULL # el conjunto de datos queda: head(irisSample)

2

## ## ## ## ## ## ##

88 6 48 33 22 3

Sepal.Length Sepal.Width Petal.Length Petal.Width 6.3 2.3 4.4 1.3 5.4 3.9 1.7 0.4 4.6 3.2 1.4 0.2 5.2 4.1 1.5 0.1 5.1 3.7 1.5 0.4 4.7 3.2 1.3 0.2

# 3) Escalar o no? summary(irisSample) ## ## ## ## ## ## ## Sepal.Length Min. :4.30 1st Qu.:5.10 Median :5.90 Mean :5.90 3rd Qu.:6.53 Max. :7.70 Sepal.Width Min. :2.30 1st Qu.:2.80 Median :3.00 Mean :3.06 3rd Qu.:3.20 Max. :4.10 Petal.Length Min. :1.10 1st Qu.:1.68 Median :4.50 Mean :3.84 3rd Qu.:5.10 Max. :6.70 Petal.Width Min. :0.10 1st Qu.:0.30 Median :1.40 Mean :1.22 3rd Qu.:1.80 Max. :2.50

boxplot(irisSample, las = 2) # vemos que las variables tienen un rango similar de valores, por lo # que no será necesario escalar (centrar o tipificar) los datos.

8 6 4 2 0 Sepal.Width Sepal.Length Petal.Length Petal.Width

# 4) Calculamos el cluster con el método average y construyendo la # matriz de distancias con los datos iniciales (por defecto usa la # distancia euclídea). hc <- hclust(dist(irisSample), method = "ave") # graficamos el resultado, agregándole el nombre de las especies a # los casos plot(hc, hang = -1, labels = iris$Species[idx]) # 5) Como conocemos que pueden pertenecer a 3 especies distintas, # Cortamos el dendrograma en 3 grupos o clusters rect.hclust(hc, k = 3) 3

groups <- cutree(hc, k = 3) # se observa que el cluster ’setosa’ puede ser separado de los otros # dos cluster, y que los clusters ’versicolor’ y ’virginica’ tienen # mayor similitud (o solapamiento) # 6) Interpretación: vemos cómo quedaron formados los 3 grupos table(groups, iris$Species[idx]) ## ## groups setosa versicolor virginica ## 1 0 14 9 ## 2 13 0 0 ## 3 0 0 4 # 7) Ahora veremos cuál sería la mejor clasificación de esta muestra # según el índice de silueta. podemos repetir este paso para # distintos valores de k, o también podemos hacer un gráfico para # todos los anchos de silueta download and install fpc in order to # use this function #k = 1 is trivial library(fpc) ## ## ## ## ## ## Loading Loading Loading Package Loading Loading required package: MASS required package: cluster required package: mclust ’mclust’version 4.0 required package: flexmix required package: lattice

sed <- dist(irisSample, method = "euclidean") result <- c(1, 1) # genero una función para calcular stat.clus <- function(k, hc) { # corto el árbol según los k grupos hc.clus <- cutree(hc, k) # calculo los estadísticos del cluster (silueta) hc.stat <- cluster.stats(sed, hc.clus, alt.clustering = NULL, silhouette = TRUE) # construyo un vector con k (el número de grupos a formar) y el valor # de silueta promedio new <- c(k, hc.stat$avg.silwidth) } # ahora uso mi función desde k=2 hasta k=5 (k<6), voy a calcular los # promedios de silueta y así ver qué k tiene mayor promedio de # silueta (el número de grupos óptimo) k <- 2 while (k < 6) { #hasta k<6, porque solo tengo 6 observaciones y por tanto solo puedo formar hasta 5 grupos result <- rbind(result, stat.clus(k, hc)) #pegar en filas los resultados print(result) #darnos el resultado k <- k + 1 } 4

## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##

[,1] 1 2 [,1] result 1 2 3 [,1] result 1 2 3 4 [,1] result 1 2 3 4 5 result

[,2] 1.000 0.689 [,2] 1.0000 0.6890 0.5428 [,2] 1.0000 0.6890 0.5428 0.4916 [,2] 1.0000 0.6890 0.5428 0.4916 0.4259

result

#la primera columna corresponde a k (el número de grupos)

## [,1] [,2] ## result 1 1.0000 ## 2 0.6890 ## 3 0.5428 ## 4 0.4916 ## 5 0.4259 # la segunda columna corresponde al valor promedio de silueta # grafico los valores promedios de silueta plot(result[-1, ], col = 2, main = "average silhouette value", type = "b", xlab = "number of clusters", ylab = "average silhouette value") # 8) El mejor número de grupos, según los gráficos de silueta, son 2 # grupos. Cortamos el dendrograma en 2 grupos o clusters plot(hc, hang = -1, labels = iris$Species[idx]) rect.hclust(hc, k = 2) groups <- cutree(hc, k = 2) # 9) Interpretación: vemos cómo quedaron formados los 3 grupos table(groups, iris$Species[idx]) ## ## groups setosa versicolor virginica ## 1 0 14 13 ## 2 13 0 0

5

Height 0 2.0 1 2 3 4 0.45 0.55 0.65 0 1 2 3 4

average silhouette value

Height

2.5 3.0

number of clusters

average silhouette value

Cluster Dendrogram

Cluster Dendrogram

dist(irisSample) hclust (*, "average")

dist(irisSample) hclust (*, "average")

6
3.5 4.0 4.5 5.0

setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica versicolor versicolor virginica versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor virginica versicolor versicolor versicolor versicolor

setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica virginica versicolor versicolor virginica versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor virginica versicolor versicolor versicolor versicolor

# para intepretar los valores de las 5 variables entre los 2 grupos # formados par(mfrow = c(2, 2)) boxplot(irisSample$Sepal.Length ~ groups, data = irisSample, main = "Sepal Length") boxplot(irisSample$Sepal.Width ~ groups, data = irisSample, main = "Sepal Width") boxplot(irisSample$Petal.Length ~ groups, data = irisSample, main = "Petal Length") boxplot(irisSample$Petal.Width ~ groups, data = irisSample, main = "Petal Width")

Sepal Length
7.5 4.0

Sepal Width

6.5

5.5

4.5

1

2

2.5

3.0

3.5

1

2

Petal Length
2.5

Petal Width

6

5

4

3

1

1

2

0.5

2

1.0

1.5

2.0

1

2

1.2.

Análisis no jerárquico: k-medias

Referencia: http://www.rdatamining.com/examples/kmeans-clustering data(iris) newiris <- iris newiris$Species <- NULL set.seed(1) (kc <- kmeans(newiris, 3))

7

## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##

K-means clustering with 3 clusters of sizes 50, 38, 62 Cluster means: Sepal.Length Sepal.Width Petal.Length Petal.Width 1 5.006 3.428 1.462 0.246 2 6.850 3.074 5.742 2.071 3 5.902 2.748 4.394 1.434 Clustering vector: [1] 1 1 1 1 1 1 1 [33] 1 1 1 1 1 1 1 [65] 3 3 3 3 3 3 3 [97] 3 3 3 3 2 3 2 [129] 2 2 2 2 2 3 2 1 1 3 2 2 1 1 3 2 2 1 1 3 2 2 1 1 3 3 3 1 1 3 2 2 1 1 3 2 2 1 1 2 2 2 1 1 3 2 3 1 1 3 2 2 1 1 3 2 2 1 1 3 3 2 1 3 3 3 3 1 3 3 2 2 1 2 3 2 2 1 3 3 2 3 1 3 3 2 1 3 3 3 1 3 3 2 1 3 3 3 1 3 3 2 1 3 3 3 1 3 3 2 1 3 3 2 1 3 3 3 1 3 3 3

Within cluster sum of squares by cluster: [1] 15.15 23.88 39.82 (between_SS / total_SS = 88.4 %) Available components: [1] "cluster" "centers" [5] "tot.withinss" "betweenss" "totss" "size" "withinss"

table(iris$Species, kc$cluster) ## ## ## ## ## 1 2 3 setosa 50 0 0 versicolor 0 2 48 virginica 0 36 14

plot(newiris[c("Sepal.Length", "Sepal.Width")], col = kc$cluster) points(kc$centers[, c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex = 2)

8

Sepal.Width

2.0

2.5

3.0

3.5

4.0

4.5

5.0

5.5

6.0

6.5

7.0

7.5

8.0

Sepal.Length

1.3.

Análisis no jerárquico: k-medoides

Referencia: https://2780fa3c-a-62cb3a1a-s-sites.googlegroups.com/site/rdatamining/ data(iris) iris2 <- iris iris2$Species <- NULL library(fpc) pamk.result <- pamk(iris2) # number of clusters pamk.result$nc ## [1] 2 # check clustering against actual species table(pamk.result$pamobject$clustering, iris$Species) ## ## ## ## setosa versicolor virginica 50 1 0 0 49 50 9

1 2

layout(matrix(c(1, 2), 1, 2)) # 2 graphs per page plot(pamk.result$pamobject) layout(matrix(1)) # change back to one graph per page pam.result <- pam(iris2, 3) table(pam.result$clustering, iris$Species) ## ## ## ## ## setosa versicolor virginica 50 0 0 0 48 14 0 2 36

1 2 3

layout(matrix(c(1, 2), 1, 2)) # 2 graphs per page plot(pam.result) layout(matrix(1)) # change back to one graph per page

10

clusplot(pam(x = sdata, k = k, diss = diss))
3

Silhouette plot of pam(x = sdata, k = k, di
n = 150 2 clusters Cj j : nj | avei∈Cj si 1 : 51 | 0.81

Component 2

0

1

2

−2

−1

2 : 99 | 0.62

−3

−1 0

1

2

3

4

0.0

0.2

0.4

0.6

0.8

1.0

Silhouette width si Component 1 These two components explain 95.81 % of the point Average variability. silhouette width : 0.69

clusplot(pam(x = iris2, k = 3))

Silhouette plot of pam(x = iris2, k = 3)
n = 150 3 clusters Cj j : nj | avei∈Cj si 1 : 50 | 0.80

Component 2

0

1

2

2 : 62 | 0.42

−3 −2 −1

3 : 38 | 0.45

−3 −2 −1

0

1

2

3

0.0

0.2

0.4

0.6

0.8

1.0

Silhouette width si Component 1 These two components explain 95.81 % of the point Average variability. silhouette width : 0.55

1.4.

Análisis no jerárquico: método de densidades

Referencia: https://2780fa3c-a-62cb3a1a-s-sites.googlegroups.com/site/rdatamining/ data(iris) newiris <- iris library(fpc) 11

iris2 <- iris[-5]

# remove class tags

ds <- dbscan(iris2, eps = 0.42, MinPts = 5) # compare clusters with original class labels table(ds$cluster, iris$Species) ## ## ## ## ## ## setosa versicolor virginica 2 10 17 48 0 0 0 37 0 0 3 33

0 1 2 3

par(mfrow = c(1, 2)) plot(ds, iris2) plot(ds, iris2[c(1, 4)]) plotcluster(iris2, ds$cluster) # create a new dataset for labeling set.seed(435) idx <- sample(1:nrow(iris), 10) newData <- iris[idx, -5] newData <- newData + matrix(runif(10 * 4, min = 0, max = 0.2), nrow = 10, ncol = 4) # label new data myPred <- predict(ds, iris2, newData) ## Loading required package: class # plot result plot(iris2[c(1, 4)], col = 1 + ds$cluster) points(newData[c(1, 4)], pch = "*", col = 1 + myPred, cex = 3) # check cluster labels table(myPred, iris$Species[idx]) ## ## myPred setosa versicolor virginica ## 0 0 0 1 ## 1 3 0 0 ## 2 0 3 0 ## 3 0 1 2

12

2.0

2.5

3.0

3.5

4.0

0.5

1.0

1.5

2.0

2.5

Sepal.Length
3.5

Sepal.Width Petal.Length
5 7

2.0

2.0

0.5

Petal.Width
4.5 5.5 6.5 7.5 1 2 3 4 5 6 7

2.5

1 1 1 0 1 11 1 1 1 1 1 111 1 1 1 1 1 11 1 11 11 1 1 1 1 1 1 11 1 1 1 1 11 11 1

0

33 0 3 0 3 3 0 33 3 3 3 3 0 3 30 3 3 3 3 33 02 2 2 3 0 22 0 3 2 2 03 3 2 23 2 2 3 2 2 2 2 0 2 0 3 2 2 2 2 0 2 22 2 3 22 0 0 2 22 30 3 0 0 2 20 00 0 0 22 0 0 0 0 0 −2 0 2

2.0

Petal.Width

1.5

1.0

dc 2

4.5

5.5

6.5

7.5

−2 −1

0.5

0

1

2

3

−8

−6

−4

Sepal.Length

dc 1

13

1

3

4.5

6.5

2.5

Petal.Width

* ** * * *
4.5 5.5 6.5

0.5

1.0

* **
7.5

1.5

2.0

Sepal.Length

14

Sign up to vote on this title
UsefulNot useful