0% encontró este documento útil (0 votos)
49 vistas11 páginas

Análisis de Cluster en Pancreatitis

Este documento presenta un análisis de cluster jerárquico utilizando datos de pacientes con pancreatitis. Se exploran diferentes métodos de distancia y agrupamiento jerárquico para dividir los datos en clusters. El objetivo es identificar grupos de pacientes homogéneos con base en variables clínicas y de laboratorio.

Cargado por

Rafexo Mamani
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
49 vistas11 páginas

Análisis de Cluster en Pancreatitis

Este documento presenta un análisis de cluster jerárquico utilizando datos de pacientes con pancreatitis. Se exploran diferentes métodos de distancia y agrupamiento jerárquico para dividir los datos en clusters. El objetivo es identificar grupos de pacientes homogéneos con base en variables clínicas y de laboratorio.

Cargado por

Rafexo Mamani
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

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

# ANÁLISIS CLUSTER #
# ANÁLISIS JERÁRQUICO #
# EJEMPLO Pancreatitis #
# Mg. Jesús Salinas Flores #
# [email protected] #
##############################

#--------------------------------------------------------------
# Para limpiar el workspace, por si hubiera algun dataset
# o información cargada
rm(list = ls())

dev.off()

#--------------------------------------------------------------
# Cambiar el directorio de trabajo
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
getwd()

#--------------------------------------------------------------
# Otras opciones
options(scipen=999) # Eliminar la notación científica
options(digits = 3) # Número de decimales

#--------------------------------------------------------------
# Paquetes
library(factoextra)
library(cluster)
library(StatMatch)
library(corrplot)
library(ade4)
library(fpc)
library(dplyr)
library(DataExplorer)
library(funModeling)
library(aplpack)
library(TeachingDemos)
library(DescTools)

###############################
# I. PREPARACIÓN DE LOS DATOS #
###############################

# Titulo: "UTILIDAD DE BISAP Y PCR COMO PREDICTORES DE


# PANCREATITIS GRAVE"
# Presentada por: JOSÉ MARIANO PINZÓN FERNÁNDEZ
# Tesis presentada para obtener el grado de Maestro en
# Ciencias Médicas con Especialidad en Medicina Interna
# Universidad de San Carlos de Guatemala
#
# Se incluyeron 88 pacientes durante los meses de Enero de
# 2013 a marzo de 2014 en el departamento de medicina
# interna del HR de Guatemala con pancreatitis aguda a
# quienes se les calcularon índices pronósticos de
# severidad de ingreso incluyendo BISAP APACHE II y PCR a
# las 48 hrs así como estudios bioquímicos y de imágenes
# en búsqueda de la causa etiológica y/o complicaciones.
#--------------------------------------------------------------
# Cargando los datos
datos <- read.csv("database_bisap.csv", header = TRUE)

attach(datos)
str(datos)

# Vamos a utilizar únicamente variables independientes


# numéricas.
# pcr, ldh, bun, creatinina, ph, haco3, pco2, amilasa,
# lac, sodio, calcio, potasio, globulos_blancos, sp02,
# temperatura, presión arterial sistólica, presión arterial
# diastólica y frecuencia cardiaca.

my_data <- data.frame(pcr,ldh,bun,creatitina,ph,hco3,pco2,


amilasa,lac,sodio,calcio,potasio,
globulos_blancos,spo2,temperatura,
presion_arterial_sistolica,
presion_arterial_diastolica,
plaquetas)

# Visualizando la estructura de los datos


str(my_data)

# Visualizando los primeros 5 registros


head(my_data, n = 5)

# Visualizando los últimos 5 registros


tail(my_data, n = 5)

#############################
# II. ANÁLISIS EXPLORATORIO #
#############################

summary(my_data)

#--------------------------------------------------------------
library(DataExplorer)

# Estructura de los datos


plot_str(my_data)

# Detectando y graficando los % de datos perdidos


plot_missing(my_data)

# Histograma para las variables numéricas


plot_histogram(my_data)

create_report(my_data)

#--------------------------------------------------------------
library(funModeling)

# Descripción de los datos


df_status(my_data)

# Gráfico de variables numéricas


plot_num(my_data)
# Descripción de las variables numéricas
profiling_num(my_data)

####################################
# III. USANDO MEDIDAS DE DISTANCIA #
####################################

# Principales funciones: dist(), get_dist() y daisy()


# Paquetes stats, factoextra y cluster

# Para estandarizar los datos (center y scale)


datos.e <- as.data.frame(scale(my_data))

str(datos.e)

#--------------------------------------------------------------
# 1.a Calculando la matriz de distancia euclidiana
# con la funcion dist()
dist.eucl <- dist(datos.e, method = "euclidean")

# Visualizando un subconjunto de la matriz de distancia


round(as.matrix(dist.eucl)[1:6, 1:6], 1)

# Otras distancias: "maximum", "manhattan", "minkowski"

#--------------------------------------------------------------
# 1.b Calculando la matriz de distancia euclidiana
# con la funcion daisy()

library(cluster)
dist.eucl2 <- daisy(datos.e, metric= "euclidean")

# Visualizando un subconjunto de la matriz de distancia


round(as.matrix(dist.eucl2)[1:6, 1:6], 1)

# Otras distancias: "gower", "manhattan"

# 1.c Calculando la matriz de distancia euclidiana con la


# funcion get_dist()
library(factoextra)
res.dist <- get_dist(my_data, stand = TRUE,
method = "euclidean")

# Visualizando un subconjunto de la matriz de distancia


round(as.matrix(res.dist)[1:6, 1:6], 1)

# Otras distancias: "pearson", "kendall", "spearman"

#--------------------------------------------------------------
# 2.a Visualizando la matriz de distancia con fviz_dist()
fviz_dist(res.dist)

fviz_dist(res.dist,
gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

# 2.b Visualizando la matriz de distancia con corrplot()


library(corrplot)
corrplot(as.matrix(dist.eucl),
is.corr = FALSE,
method = "color")

# 2.c Visualizando solo el triangulo superior


corrplot(as.matrix(dist.eucl), is.corr = FALSE,
method = "color",
order="hclust", type = "upper")

#--------------------------------------------------------------
# * Calculando distancias con datos mixtos con la distancia
# de Gower
library(cluster)

data(flower)
View(flower)
str(flower)

head(flower,3)
str(flower)

dd <- daisy(flower)
round(as.matrix(dd)[1:3, 1:3], 2)

# Ejemplo de distancia Gower


library(StatMatch)
datos.go <- read.csv("Ejemplo-Gower.csv",sep=";")

str(datos.go)

variables <- c("X3","X4","X5","X6")


datos.go[,variables] <- lapply(datos.go[,variables] , factor)
str(datos.go)

gower.dist(datos.go)

gower.dist(datos.go)[2,7]

##############################################
# IV. CLUSTER JERÁRQUICO AGLOMERATIVO: AGNES #
##############################################

#--------------------------------------------------------------
# Calculando la matriz de disimilaridad
# usando la distancia euclidiana
d <- dist(datos.e, method = "euclidean")

# method = euclidean, maximum, manhattan, canberra,


# binary, minkowski

as.matrix(d)[1:6, 1:6]

#--------------------------------------------------------------
# Cluster Jerarquico usando el método de enlace Ward
res.hc <- hclust(d, method = "ward.D2" )

# method = ward.D, ward.D2, single, complete, average, median


print(res.hc)

#--------------------------------------------------------------
# Visualizar el dendrograma
plot(res.hc, cex = 0.6, hang=-1)

rect.hclust(res.hc, k = 3, border = 2:5)

# Dendograma con el paquete factoextra


library(factoextra)

fviz_dend(res.hc, cex = 0.5)

# Dendrograma sin etiquetas


hcd <- as.dendrogram(res.hc)

nodePar <- list(lab.cex = 0.6, pch = c(NA, 19),


cex = 0.7, col = "blue")

plot(hcd, ylab = "Height",


nodePar = nodePar,
leaflab = "none")

# Dendrograma Horizontal
plot(hcd, xlab = "Height",
nodePar = nodePar, horiz = TRUE)

# Cambiando los colores


plot(hcd, xlab = "Height", nodePar = nodePar,
edgePar = list(col = 2:3, lwd = 2:1))

# Dendrograma Triangular
plot(hcd, type = "triangle", ylab = "Height")

#--------------------------------------------------------------
# Cophenetic Correlation Coefficient

names <- c("A","B","C","D","E","F")


x1 <- c(1,1.5,5,3,4,3)
x2 <- c(1,1.5,5,4,4,3.5)

data.cc <- data.frame(names,x1,x2)


rownames(data.cc) <- data.cc$names
data.cc$names <- NULL

dist.orig <- dist(data.cc, method = "euclidean")


dist.orig

as.matrix(dist.orig)[1:6, 1:6]

hc.single <- hclust(dist.orig, method = "single" )

plot(hc.single, cex = 0.6, hang=-1)

dist.coph <- cophenetic(hc.single)

dist.coph

# Correlacion entre la distancia cophenetic


# y la distancia original
cor(dist.orig, dist.coph)

#--------------------------------------------------------------
# Verificando el cluster tree

# Calcular la distancia cophentic


res.coph <- cophenetic(res.hc)

# Correlacion entre la distancia cophenetic distance


# y la distancia original
cor(d, res.coph)

res.hc2 <- hclust(d, method = "average")


cor(d, cophenetic(res.hc2))

#--------------------------------------------------------------
# Dividir en 3 clusters
grp <- cutree(res.hc, k = 3)

library(factoextra)
fviz_dend(res.hc, k=3, cex = 0.5,
k_colors = rainbow(3),
color_labels_by_k = TRUE,
rect=TRUE)

fviz_cluster(list(data = datos.e, cluster = grp),


palette = c("#2E9FDF", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = F, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

# Junta el archivo de datos con la columna de cluster


datos.j <- cbind(datos.e,grp)
str(datos.j)

datos.j$grp <- factor(datos.j$grp)


str(datos.j)

# write.csv(datos.j,"Pancreatitis con Jerarquico Aglomerativo.csv")

#--------------------------------------------------------------
# Cluster jerarquico aglomerativo con el paquete cluster

library(cluster)

res.agnes <- agnes(x = my_data, # matriz de datos


stand = TRUE, # estandariza los datos
metric = "euclidean", # métrica de distancia
method = "ward" # método de enlace
)

fviz_dend(res.agnes, cex = 0.6, k = 3)

grp <- cutree(res.agnes, k = 3)

fviz_cluster(list(data = datos.e, cluster = grp),


palette = c("#2E9FDF", "#E7B800", "#FC4E07"),
ellipse.type = "convex", # Concentration ellipse
repel = F, # Avoid label overplotting (slow)
show.clust.cent = FALSE, ggtheme = theme_minimal())

##########################################
# V. CLUSTER JERARQUICO DIVISIVO : DIANA #
##########################################

#--------------------------------------------------------------
# Cluster jerárquico divisivo con el paquete cluster

library(cluster)
res.diana <- diana(x = my_data, # matriz de datos
stand = TRUE, # estandariza los datos
metric = "euclidean") # métrica de distancia

#--------------------------------------------------------------
# Visualizar el Dendograma
pltree(res.diana, cex = 0.6,
hang = -1,
main = "Dendrograma de Diana")

# Coeficiente divisivos
res.diana$dc

# Dendograma con la funcion plot.hclust()


plot(as.hclust(res.diana), cex = 0.6, hang = -1)

# Dendograma Horizontal con plot.dendrogram()


plot(as.dendrogram(res.diana), cex = 0.6, horiz = TRUE)

# Dendograma con factoextra


library(factoextra)
fviz_dend(res.diana, cex = 0.6, k = 3)

grp <- cutree(res.agnes, k = 3)

#####################################
# VI. CARACTERIZANDO A LOS CLUSTERS #
#####################################

# Caracterizando al cluster k-means


str(datos.j)

library(compareGroups)
group <- compareGroups(grp ~.,data=datos.j)
clustab <- createTable(group,
digits=3,
show.p.overall=FALSE)
clustab

table(datos.j$grp)

# Parallel coordinates plot using GGally


library(GGally)
#--------------------------------------------------------------
# Diagrama de lineas de promedios por cluster
library(dplyr)
datos.j %>%
group_by(grp) %>%
summarise_all(list(mean)) -> medias
medias

datos.j %>% summarise_if(is.numeric,mean) %>% round(4) -> general


general
general <- cbind(grp="general",general)
general

medias <- as.data.frame(rbind(medias,general))


medias

# Convirtiendo la data formato tidy


library(tidyr)
gathered_datos.j <- gather(data = medias,
-grp,
key = variable,
value = valor)

gathered_datos.j

# Otra forma con pivot_longer


gathered_datos.j <- pivot_longer(data = medias,
-grp,
names_to = "variable",
values_to = "valor")

#install.packages("gganimate")
library(gganimate)
ggplot(gathered_datos.j,aes(x=variable,y=valor,color=grp)) +
geom_point() + geom_line(aes(group = grp)) +
theme_bw() +
theme(legend.position = "bottom",legend.title=element_blank()) +
labs(title="Diagrama de líneas de Cluster por Variable",
x="Variable",y="") +
coord_flip() + facet_grid(grp ~.)
#+ transition_reveal(as.numeric(grp))+ enter_fade() + exit_fade()

###################################
# VII. COMPARANDO DOS DENDOGRAMAS #
###################################

library(dendextend)

#--------------------------------------------------------------
# Calculando la matriz de distancia
res.dist <- dist(datos.e, method = "euclidean")

#--------------------------------------------------------------
# Calculando 2 clusters jerárquicos aglomerativos
hc1 <- hclust(res.dist, method = "average")
hc2 <- hclust(res.dist, method = "ward.D2")
#--------------------------------------------------------------
# Creando dos Dendrogramas
dend1 <- as.dendrogram (hc1)
plot(dend1)

dend2 <- as.dendrogram (hc2)


plot(dend2)

#--------------------------------------------------------------
# Creando una lista de Dendrogramas
dend_list <- dendlist(dend1, dend2)

tanglegram(dend1, dend2)

tanglegram(dend1, dend2,
highlight_distinct_edges = FALSE, # Turn-off dashed lines
common_subtrees_color_lines = FALSE, # Turn-off line colors
common_subtrees_color_branches = TRUE, # Color common branches
main = paste("entanglement =", round(entanglement(dend_list), 2))
)

# Entanglement es una medida entre 1 (full entanglement)


# y 0 (no entanglement).
# Un bajo coeficiente de entanglement corresponde a
# un buen alineamiento

#--------------------------------------------------------------
# Verificando el cluster

# Calcular la distancia cophentic


res.coph <- cophenetic(hc1)

# Correlación entre la distancia cophenetic


# y la distancia original
cor(res.dist, res.coph) # Enlace average

cor(res.dist, cophenetic(hc2)) # Enlace ward

#--------------------------------------------------------------
# Matriz de Correlación entre una lista de dendogramas

# La función cor.denlist() es usada para calcular la matriz de


# correlación entre una lista de gráficos "Baker" o "Cophenetic".
# El valor puede caer entre -1 o 1
# Un valor cercano a 0 indica que los dos gráficos no son
# estadísticamente similares

#--------------------------------------------------------------
# Matriz de Correlación Cophenetic
cor.dendlist(dend_list, method = "cophenetic")

# Coeficiente de Correlación Cophenetic


cor_cophenetic(dend1, dend2)

#--------------------------------------------------------------
# Matriz de Correlación Baker
cor.dendlist(dend_list, method = "baker")

# Coeficiente de Correlación Baker


cor_bakers_gamma(dend1, dend2)

#--------------------------------------------------------------
# Creando múltiples dendogramas por encadenamiento

dend1 <- datos.e %>% dist("euclidean") %>% hclust("complete") %>% as.dendrogram


dend2 <- datos.e %>% dist("euclidean") %>% hclust("single") %>% as.dendrogram
dend3 <- datos.e %>% dist("euclidean") %>% hclust("average") %>% as.dendrogram
dend4 <- datos.e %>% dist("euclidean") %>% hclust("centroid") %>% as.dendrogram

#--------------------------------------------------------------
# Calcular la Matriz de Correlación
dend_list <- dendlist("Complete" = dend1, "Single" = dend2,
"Average" = dend3, "Centroid" = dend4)
cors <- cor.dendlist(dend_list)

# Imprimir la Matriz de Correlacion


round(cors, 2)

# Visualizar la Matriz de Correlacion usando el


# paquete corrplot
library(corrplot)
corrplot(cors, method="circle", type= "lower")

# method = c("circle", "square", "ellipse", "number", "shade",


# "color", "pie")
# type = c("full", "lower", "upper")

#############################
# VIII. PHYLOGENETICS TREES #
#############################

# La libreria ape (Analyses of Phylogenetics and Evolution)


# puede ser usada para producir un dendrograma más
# sofisticado.

# La función plot.phylo() puede ser usada para graficar un


# dendrograma

#--------------------------------------------------------------
# Cladogram

library(ape)
d <- dist(datos.e, method = "euclidean")
hc <- hclust(d, method = "ward.D2")

plot(as.phylo(hc), type = "cladogram", cex = 0.6,


label.offset = 0.5)

#--------------------------------------------------------------
# Unrooted
plot(as.phylo(hc), type = "unrooted", cex = 0.6,
no.margin = TRUE)

library(igraph)
fviz_dend(hc,k=3,k_colors="jco",
type="phylogenic", repel=TRUE)
#--------------------------------------------------------------
# Fan
plot(as.phylo(hc), type = "fan")

fviz_dend(hc, cex= 0.5, k=3, k_colors="jco",


type="circular")

#--------------------------------------------------------------
# Radial
plot(as.phylo(hc), type = "radial")

# Dividir el dendrograma en 3 clusters


colors = c("red", "blue", "green", "black")
clus4 = cutree(hc, 3)
plot(as.phylo(hc), type = "fan", tip.color = colors[clus4],
label.offset = 1, cex = 0.7)

# Cambiando la apariencia
plot(as.phylo(hc), type = "cladogram", cex = 0.6,
edge.color = "steelblue", edge.width = 2, edge.lty = 2,
tip.color = "steelblue")

#####################################
# IX. CLUSTER CON MÉTODOS GRÁFICOS #
# Caras de Chernoff #
#####################################

# The Use of Faces to Represent Points in K-Dimensional


# Space Graphically Herman Chernoff. Journal of the
# American Statistical Association, Vol. 68, No. 342.
# (Jun., 1973), pp. 361-368.

library(aplpack)
aplpack::faces(my_data)
aplpack::faces(my_data,face.type=0)
aplpack::faces(my_data,face.type=1)
aplpack::faces(my_data,face.type=2)

library(TeachingDemos)
TeachingDemos::faces(my_data)

library(DescTools)
DescTools::PlotFaces(my_data,scale=T)

También podría gustarte