Librerias requeridas

setwd("C:/Users/Alumnos/Desktop")

#fastcluster requerido para TDAmapper
install.packages("fastcluster")

#TDAmapper para mapper1D, mapper2D
install.packages("TDAmapper") 

#TDA para homologia persistente y sampleo uniforme circulo,esfera, toro
install.packages("TDA")

Librerias requeridas

#igraph para mostrar grafos
install.packages("igraph")                  

#Para visualizacion 3D
install.packages("ggplot2")
install.packages("rgl")

#Para grabar grafos en formato GEFX
install.packages("rgexf")
install.packages("plyr")

#paquete para hacer PCA
install.packages("FactoMineR")

Librerias requeridas

#paquete para algoritmo TDAmapper
require(fastcluster) 
library("TDAmapper")

#paquete para pers.hom, muestreo S1,S2,S1xS1
library("TDA")

#para manejo de grafos (y grabar GEXF)
library("igraph")
library("rgexf")
library("plyr")

#para visualizaciones de PCA y 3D
library("ggplot2")
library("rgl")

#para PCA
library("FactoMineR")

Funcion extra requerida

mapper1D Input

m_XXX <- mapper1D(
  distance_matrix = dist(d_XXX),
  filter_values =filtro,
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

dist() calcula la distancia (euclideana) de un conjunto de puntos en R^n
filtro es un vector de valores (funcion en el conjunto de puntos)

mapper1D Input

mapper1d retorna una lista de 6 con:

adjacency : matriz de adjacency del grafo
num_vertices : numero de vertices
level_of_vertex : rango de la funcion en cada vertice
points_in_vertex : datos en cada vertices()
points_in_level : datos en cada rango
vertices_in_level : vertices en cada rango

mapper1D Output

mapper1d retorna una lista de 6 con:

adjacency : matriz de adjacency del grafo
num_vertices : numero de vertices
level_of_vertex : rango de la funcion en cada vertice
points_in_vertex : datos en cada vertices()
points_in_level : datos en cada rango
vertices_in_level : vertices en cada rango

mapper1D Circulo

numpoints<-1000
epsilon<-0.1
r<-1

#generar datos uniformes en el circulo

datos_circulo_uniforme<-as.data.frame(circleUnif(numpoints))

mapper1D Circulo

plot(datos_circulo_uniforme)

plot of chunk unnamed-chunk-9

mapper1D Circulo

mapper_circulo_uniforme <- mapper1D(
  distance_matrix = dist(datos_circulo_uniforme),
  filter_values =datos_circulo_uniforme[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

mapper1D Circulo

grafo_circulo_uniforme <- graph.adjacency(mapper_circulo_uniforme$adjacency, mode="undirected")

mapper1D Circulo

plot(grafo_circulo_uniforme, layout = layout.auto(grafo_circulo_uniforme) )

plot of chunk unnamed-chunk-12

mapper1D Circulo

#generar datos circulo
numpoints<-100
t<-runif(numpoints)

datos_circulo<-data.frame(x=cos(2*pi*t),y=sin(2*pi*t))

mapper1D Circulo

plot(datos_circulo)

plot of chunk unnamed-chunk-14

mapper1D Circulo

mapper_circulo <- mapper1D(
  distance_matrix = dist(datos_circulo),
  filter_values =datos_circulo[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

grafo_circulo <- graph.adjacency(mapper_circulo$adjacency, mode="undirected")

mapper1D Circulo

plot(grafo_circulo, layout = layout.auto(grafo_circulo) )

plot of chunk unnamed-chunk-16

mapper1D Circulo con ruido

numpoints<-1000
#generar datos circulo con ruido
datos_circulo_con_ruido<-datos_circulo_uniforme+epsilon*matrix(rnorm(2*numpoints,mean=0,sd=0.1),ncol=2)

mapper1D Circulo con ruido

plot(datos_circulo_con_ruido)

plot of chunk unnamed-chunk-18

mapper1D Circulo con ruido

mapper_circulo_con_ruido <- mapper1D(
  distance_matrix = dist(datos_circulo_con_ruido),
  filter_values =datos_circulo_con_ruido[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

grafo_circulo_con_ruido <- graph.adjacency(mapper_circulo_con_ruido$adjacency, mode="undirected")

mapper1D Circulo con ruido

plot(grafo_circulo_con_ruido, layout = layout.auto(grafo_circulo_con_ruido) )

plot of chunk unnamed-chunk-20

mapper1D Ocho

numpoints<-100
datos_ocho=data.frame( x=2*r*cos(0.5*(1:numpoints)), y=r*sin(1:numpoints) )

mapper1D Ocho

plot(datos_ocho)

plot of chunk unnamed-chunk-22

mapper1D Ocho

mapper_ocho<- mapper1D(
  distance_matrix = dist(datos_ocho),
  filter_values =datos_ocho[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)



grafo_ocho <- graph.adjacency(mapper_ocho$adjacency, mode="undirected")

mapper1D Ocho

plot(grafo_ocho, layout = layout.auto(grafo_ocho) )

plot of chunk unnamed-chunk-24

mapper1D Elipse

#elipse
datos_elipse=data.frame( x=2*r*cos(1:numpoints), y=sin(1:numpoints) )

mapper1D Elipse

plot(datos_elipse)

plot of chunk unnamed-chunk-26

mapper1D Elipse

mapper_elipse<- mapper1D(
  distance_matrix = dist(datos_elipse),
  filter_values =datos_elipse[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)




grafo_elipse <- graph.adjacency(mapper_elipse$adjacency, mode="undirected")

mapper1D Elipse

plot(grafo_elipse, layout = layout.auto(grafo_elipse) )

plot of chunk unnamed-chunk-28

mapper1D Dos Espirales

#dos espirales
set.seed("1")
t <- runif(numpoints, min=1, max=6.3) # theta

datos_espirales <- data.frame( x = c( t*cos(t), -t*cos(t) ), y = c( t*sin(t), -t*sin(t) ) )

mapper1D Dos Espirales

plot(datos_espirales)

plot of chunk unnamed-chunk-30

mapper1D Dos espirales

mapper_espirales<- mapper1D(
  distance_matrix = dist(datos_espirales),
  filter_values =datos_espirales[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)



grafo_espirales <- graph.adjacency(mapper_espirales$adjacency, mode="undirected")

mapper1D Dos Espirales

plot(grafo_espirales, layout = layout.auto(grafo_espirales) )

plot of chunk unnamed-chunk-32

mapper1D Transformaciones lineales

#transforma datos en R^2
theta<-60/180*pi

Rotation_Matrix<-matrix(c(cos(theta), sin(theta), -sin(theta), cos(theta)), nrow=2, ncol=2)

Otra_Matrix <- matrix(c(1, 0, 0, 1), nrow=2, ncol=2) 

transformacion_elipse <- (Rotation_Matrix %*% ( Otra_Matrix   %*%  t(datos_elipse)))   

mapper1D Transformaciones lineales

datos_transformados_elipse<-as.data.frame(t(transformacion_elipse))

mapper1D Transformaciones lineales

plot(datos_transformados_elipse, asp=1)  # note M is the image of circle C under map A

plot of chunk unnamed-chunk-35

mapper1D Transformaciones lineales

mapper_elipse_transformada<- mapper1D(
  distance_matrix = dist(datos_transformados_elipse),
  filter_values =datos_transformados_elipse[,1],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)


grafo_elipse_transformada <- graph.adjacency(mapper_elipse_transformada$adjacency, mode="undirected")

mapper1D Transformaciones lineales

plot(grafo_elipse_transformada, layout = layout.auto(grafo_elipse_transformada) )

plot of chunk unnamed-chunk-37

mapper1D Reality check

maxdimension <- 1
maxscale <- 5
Diag <- ripsDiag(X = datos_transformados_elipse, maxdimension, maxscale,library = "GUDHI", printProgress = FALSE)

mapper1D Reality check

plot(Diag[["diagram"]],barcode=TRUE)

plot of chunk unnamed-chunk-39

mapper1D Curva momento (trig)

#generar datos curva de momento trigonometrica en R4
datos_curva_momento<-data.frame(x1=cos((1:numpoints)),y1=sin((1:numpoints)),x2=cos(2*(1:numpoints)),y2=sin(2*(1:numpoints)))

mapper1D Curva momento (trig)

plot(datos_curva_momento)

plot of chunk unnamed-chunk-41

mapper1D Curva momento (trig)

X<-(datos_curva_momento$x1+2)*datos_curva_momento$x2
Y<-(datos_curva_momento$x1+2)*datos_curva_momento$y2
Z<-datos_curva_momento$y1

plot3d(X,Y,Z)

mapper1D Curva momento (trig)

mapper_curva_momento<- mapper1D(
  distance_matrix = dist(datos_curva_momento),
  filter_values =X,
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

grafo_curva_momento <- graph.adjacency(mapper_curva_momento$adjacency, mode="undirected")

mapper1D Curva momento (trig)

plot(grafo_curva_momento, layout = layout.auto(grafo_curva_momento) )

plot of chunk unnamed-chunk-44

mapper1D Curva momento (trig) de nuevo

#generar datos curva de momento trigonometrica en R4 de nuevo
numpoints<-1000

datos_curva_momento<-data.frame(x1=cos((1:numpoints)),y1=sin((1:numpoints)),x2=cos(2*(1:numpoints)),y2=sin(2*(1:numpoints)))

mapper1D Curva momento (trig) de nuevo

plot(datos_curva_momento)

plot of chunk unnamed-chunk-46

mapper1D Curva momento (trig) de nuevo

X<-(datos_curva_momento$x1+2)*datos_curva_momento$x2
Y<-(datos_curva_momento$x1+2)*datos_curva_momento$y2
Z<-datos_curva_momento$y1
plot3d(X,Y,Z)

mapper1D Curva momento (trig) de nuevo

mapper_curva_momento<- mapper1D(
  distance_matrix = dist(datos_curva_momento),
  filter_values =X,
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

grafo_curva_momento <- graph.adjacency(mapper_curva_momento$adjacency, mode="undirected")

mapper1D Curva momento (trig) de nuevo

plot(grafo_curva_momento, layout = layout.auto(grafo_curva_momento) )

plot of chunk unnamed-chunk-49

mapper1D Curva momento (trig) de nuevo nuevo

#generar datos curva de momento trigonometrica en R6
datos_curva_momento2<-data.frame(x1=cos((1:numpoints)),y1=sin((1:numpoints)),x2=cos(2*(1:numpoints)),y2=sin(2*(1:numpoints)),x3=cos(3*(1:numpoints)),y3=sin(3*(1:numpoints)))

mapper_curva_momento2<- mapper1D(
  distance_matrix = dist(datos_curva_momento2),
  filter_values =X,
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

mapper1D Curva momento (trig) de nuevo nuevo

grafo_curva_momento2 <- graph.adjacency(mapper_curva_momento2$adjacency, mode="undirected")

plot(grafo_curva_momento2, layout = layout.auto(grafo_curva_momento2) )

plot of chunk unnamed-chunk-51

mapper2D Input

mapper_XXX<-mapper2D(
  distance_matrix=dist(datos_XXX), 
  filter_values = list(filtro1,filtro2),    
  c(num_intervals,num_intervals), # use default
  percent_overlap = 50,
  num_bins_when_clustering = 10
)

mapper Esfera

numpoints<-1000
num_intervals = 10
percent_overlap = 50
num_bins_when_clustering = 10

r<-1

#esfera en R^3 uniforme

datos_esfera_uniforme=as.data.frame(sphereUnif(numpoints, 2, r))

mapper Esfera

plot3d(datos_esfera_uniforme$V1, datos_esfera_uniforme$V2, datos_esfera_uniforme$V3)

mapper_esfera_uniforme <- mapper1D(
  distance_matrix = dist(datos_esfera_uniforme),
  filter_values =datos_esfera_uniforme[,3],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10
  )

grafo_esfera_uniforme <- graph.adjacency(mapper_esfera_uniforme$adjacency, mode="undirected")

mapper Esfera

plot(grafo_esfera_uniforme, layout = layout.auto(grafo_esfera_uniforme) )

plot of chunk unnamed-chunk-55

mapper Esfera

mapper_esfera2d<-mapper2D(
  distance_matrix=dist(datos_esfera_uniforme), 
  filter_values = list(datos_esfera_uniforme[,1],datos_esfera_uniforme[,2]),    
  c(num_intervals,num_intervals), # use default
  percent_overlap = 50,
  num_bins_when_clustering = 10
)

grafo_esfera2d <- graph.adjacency(mapper_esfera2d$adjacency, mode="undirected")

mapper Esfera

plot(grafo_esfera2d, layout = layout.auto(grafo_esfera2d) )

plot of chunk unnamed-chunk-57

mapper Esfera

#necesita librerias rxgef,plyr
saveAsGEXF(grafo_esfera2d)

#Miremos como luce los datos del grafo con MDS
distMatrixgrafoEsfera2D <- shortest.paths(grafo_esfera2d, v=V(grafo_esfera2d), to=V(grafo_esfera2d))
fit<-cmdscale(distMatrixgrafoEsfera2D,3)
plot3d(fit)

mapper Esfera

#Homologia persistente del grafo???
#maxdimension <- 1
#maxscale <- 5
#Diag <- ripsDiag(distMatrixgrafoEsfera2D, maxdimension, maxscale,dist="arbitrary",library = "GUDHI", printProgress = FALSE)
#plot(Diag[["diagram"]],barcode=TRUE)

#persistence homology de la esfera se queda...
#maxdimension <- 1
#maxscale <- 2
#Diag <- ripsDiag(X = datos_esfera_uniforme, maxdimension, maxscale,library = "GUDHI", printProgress = FALSE)
#plot(Diag[["diagram"]],barcode=TRUE)

mapper toro uniforme

#toro uniforme
R<-2

datos_toro_uniforme=as.data.frame(torusUnif(numpoints, r, R))

plot3d(datos_toro_uniforme$x, datos_toro_uniforme$y, datos_toro_uniforme$z)

mapper toro uniforme

#necesita librerias FactoMineR
toro_uniforme_pca <- PCA(datos_toro_uniforme,graph = FALSE)

qplot(toro_uniforme_pca$ind$coord[,1],toro_uniforme_pca$ind$coord[,2])

plot of chunk unnamed-chunk-61

plot3d(toro_uniforme_pca$ind$coord[,1],toro_uniforme_pca$ind$coord[,2],toro_uniforme_pca$ind$coord[,3])

mapper toro uniforme

mapper_toro_uniforme <- mapper1D(
  distance_matrix = dist(datos_toro_uniforme),
  filter_values =datos_toro_uniforme[,3],
  num_intervals = 10,
  percent_overlap = 50,
  num_bins_when_clustering = 10)

grafo_toro_uniforme <- graph.adjacency(mapper_toro_uniforme$adjacency, mode="undirected")

mapper toro uniforme

plot(grafo_toro_uniforme, layout = layout.auto(grafo_toro_uniforme),main ="Reeb Graph del Toro con altura" )

plot of chunk unnamed-chunk-63

mapper toro uniforme

mapper_toro_uniforme_2d <- mapper2D(
  distance_matrix=dist(datos_toro_uniforme),
  filter_values = list(datos_toro_uniforme[,1],datos_toro_uniforme[,2]),    
  num_intervals =c(num_intervals,num_intervals), # use default
  percent_overlap=50, # use default
  num_bins_when_clustering=10  # use default
)
[1] "Level set has only one point"
grafo_toro_uniforme2d <- graph.adjacency(mapper_toro_uniforme_2d$adjacency, mode="undirected")

mapper toro uniforme

plot(grafo_toro_uniforme2d, layout = layout.auto(grafo_toro_uniforme2d),main ="Reeb Graph del Toro con altura" )

plot of chunk unnamed-chunk-65

mapper toro uniforme

#necesita librerias rxgef,plyr
saveAsGEXF(grafo_toro_uniforme2d)

#Miremos como luce los datos del grafo con MDS
distMatrix_grafo_torouniforme2D <- shortest.paths(grafo_toro_uniforme2d, v=V(grafo_toro_uniforme2d), to=V(grafo_toro_uniforme2d))
fit<-cmdscale(distMatrix_grafo_torouniforme2D,3)
plot3d(fit)

mapper toro uniforme

#Homologia persistente del grafo???
#maxdimension <- 1
#maxscale <- 5
#Diag <- ripsDiag(distMatrix_grafo_torouniforme2D, maxdimension, #maxscale,dist="arbitrary",library = "GUDHI", printProgress = FALSE)
#plot(Diag[["diagram"]],barcode=TRUE)


#Homologia persitente se queda
#maxdimension <- 1
#maxscale <- 5
#Diag <- ripsDiag(X = datos_toro_uniforme, maxdimension, maxscale,library = "GUDHI", printProgress = FALSE)
#plot(Diag[["diagram"]],barcode=TRUE)

mapper toro plano

#puntos en el toro plano
set.seed("1")
U <- runif(numpoints, min=0, max=1) 
V <- runif(numpoints, min=0, max=1) 

X<-(r*cos(2*pi*U)+R)*cos(2*pi*V)
Y<-(r*cos(2*pi*U)+R)*sin(2*pi*V)
Z<-r*sin(2*pi*U)

datos_toro_plano=as.data.frame(cbind(X,Y,Z))

mapper toro no plano

plot3d(X,Y,Z)

mapper toro plano

#distancia toro plano
distance_matrix1<-matrix(0,nrow=numpoints,ncol=numpoints)
for (i in 1:numpoints){
  for (j in i:numpoints){
    distance_matrix1[i,j]<-sqrt((min(abs(U[i]-U[j]),1-abs(U[i]-U[j])))^2+(min(abs(V[i]-V[j]),1-abs(V[i]-V[j])))^2)
    distance_matrix1[j,i]<-distance_matrix1[i,j]
  }
}

mapper toro plano

fit<-cmdscale(distance_matrix1,3)
plot3d(fit)

mapper toro plano

mapper_toro_plano <- mapper1D(
  distance_matrix=dist(distance_matrix1),
  filter_values = cos(U),   
  num_intervals =10, # use default
  percent_overlap=50, # use default
  num_bins_when_clustering=10  # use default
)

grafo_toro_plano <- graph.adjacency(mapper_toro_plano$adjacency, mode="undirected")

mapper toro plano

plot(grafo_toro_plano, layout = layout.auto(grafo_toro_plano),main ="Reeb Graph del Toro con altura" )

plot of chunk unnamed-chunk-73

mapper toro plano

mapper_toro_plano2d <- mapper2D(
  distance_matrix=dist(distance_matrix1),
  filter_values = list(cos(U),sin(U)),  
  num_intervals = c(10,10), # use default
  percent_overlap=50, # use default
  num_bins_when_clustering=10  # use default
)
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set has only one point"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
[1] "Level set is empty"
grafo_toro_plano2d <- graph.adjacency(mapper_toro_plano2d$adjacency, mode="undirected")

mapper toro plano

plot(grafo_toro_plano2d, layout = layout.auto(grafo_toro_plano2d),main ="Reeb Graph del Toro con altura" )

plot of chunk unnamed-chunk-75

#necesita librerias rxgef,plyr
saveAsGEXF(grafo_toro_plano2d)

mapper diabetes

install.packages("locfit")
library(locfit)

#OJO!!!!!! el paquete ks y el paquete TDA tienen ambos funciones llamadas kde con distintos parametros!!!!
install.packages("ks")
library(ks)

data(chemdiab)

summary(chemdiab)

mapper diabetes

normdiab <- chemdiab
normdiab[,1:5] <- scale(normdiab[,1:5],center=FALSE)
normdiab.dist = dist(normdiab[,1:5])

filter.kde <- ks::kde(normdiab[,1:5],H=diag(1,nrow = 5),eval.points = normdiab[,1:5])$estimate

mapper diabetes

diabetes_pca <- PCA(normdiab,graph = FALSE)
qplot(diabetes_pca$ind$coord[,1],diabetes_pca$ind$coord[,2])
plot3d(diabetes_pca$ind$coord[,1],diabetes_pca$ind$coord[,2],diabetes_pca$ind$coord[,3])

mapper diabetes

diab.mapper <- mapper1D(
  normdiab.dist,
  filter.kde,
  num_intervals = 4,
  percent_overlap = 50,
  num_bins_when_clustering = 20)

diab.graph <- graph.adjacency(diab.mapper$adjacency, mode="undirected")

mapper diabetes

plot(diab.graph )