library(scatterplot3d)
Este es un ejemplo de datos tomados en una zona en la que se está buscando la profundidad a la cual se encuentra agua subterránea. El primer gráfico es en $\mathbb{R}^3$ que se presenta tiene en cuenta las dos componentes de la ubicación espacial y la altura es la variable de interés. Posteriormente, se presentan dos diagramas de dispersión en $\mathbb{R}^2$ de la variable en cada una de las ubicaciones espaciales.
aquifer=read.table("aquifer.txt",dec=",",head=T)
scatterplot3d(aquifer$Este,aquifer$Norte,aquifer$Profundidad,xlab="Este",ylab="Norte",zlab="Profundidad", highlight.3d=TRUE,angle=55, scale.y=0.7, pch=16)
plot(aquifer$Este,aquifer$Profundidad,xlab="Este",ylab="Profundidad")
plot(aquifer$Norte,aquifer$Profundidad,xlab="Norte",ylab="Profundidad")
En ambas coordenadas se observa un patrón, el valor de la variable decrece a medida que el valor de las coordenadas aumenta.
cov(aquifer)
## Este Norte Profundidad
## Este 4217.1789 409.2267 -30922.11
## Norte 409.2267 3015.4414 -20816.83
## Profundidad -30922.1144 -20816.8319 373736.71
cor(aquifer)
## Este Norte Profundidad
## Este 1.0000000 0.1147565 -0.7788885
## Norte 0.1147565 1.0000000 -0.6200923
## Profundidad -0.7788885 -0.6200923 1.0000000
panel.hist <- function(x, ...)
{
usr <- par("usr")
par(usr = c(usr[1:2], 0, 1.5) )
h <- hist(x, plot = FALSE)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col = "orange")
}
pairs(aquifer,pch = 16, diag.panel = panel.hist,main = "Matriz de Dispersión - aquifer")
panel.boxplot <- function(x, ...)
{
# Obtenemos los límites del panel actual
usr <- par("usr")
# Dibujamos el boxplot horizontal
# 'add = TRUE' evita que se abra una nueva ventana gráfica
# 'at' lo centra en la mitad del eje Y del panel actual
# 'boxwex' controla el grosor del boxplot para que no ocupe todo el recuadro
boxplot(x, horizontal = TRUE, add = TRUE,
at = mean(usr[3:4]),
boxwex = (usr[4] - usr[3]) * 0.4,
col = "lightblue", ...)
}
pairs(aquifer,pch = 16, diag.panel = panel.boxplot,main = "Matriz de Dispersión - aquifer")
Dist_euc <- as.matrix(round(dist(aquifer[,1:2], method = "euclidean"),1))
Dist_max <- as.matrix(round(dist(aquifer[,1:2], method = "maximum"),1))
Dist_man <- as.matrix(round(dist(aquifer[,1:2], method = "manhattan"),1))
Dist_can <- as.matrix(round(dist(aquifer[,1:2], method = "canberra"),1))
Dist_min <- as.matrix(round(dist(aquifer[,1:2], method = "minkowski", p = 3),1)) # p=3 como ejemplo
A continuación se mencionan algunas distancias que pueden ser utilizadas para determinar cercanía entre dos individuos \(\boldsymbol x\), \(\boldsymbol y\) que han sido observados en \(P\) variables numéricas:
\[\boldsymbol x=(x_1,...,x_P)\] y \[\boldsymbol y=(y_1,...,y_P)\]
Es la longitud de la menor trayectoria entre dos puntos siempre y cuando el movimiento diagonal esté permitido y el fenómeno ocurra sobre el plano. Es muy sensible a los valores atípicos dado que eleva al cuadrado las diferencias.
\[d_{Euc}(\boldsymbol x,\boldsymbol y)=\sqrt{\sum_{i=1}^{P}(x_i-y_i)^2}\]
Dist_euc[1:5,1:5]
## 1 2 3 4 5
## 1 0.0 79.3 61.3 79.9 82.8
## 2 79.3 0.0 26.9 16.8 126.6
## 3 61.3 26.9 0.0 19.4 99.7
## 4 79.9 16.8 19.4 0.0 115.7
## 5 82.8 126.6 99.7 115.7 0.0
Completando el conjunto de las distancias geométricas fundamentales dentro del análisis de datos, se encuentra la \textbf{Distancia de la Norma del Supremo}, conocida formalmente en el ámbito de los espacios métricos como la \textbf{Distancia de } o métrica $L_\infty$ (L-infinito).
Mientras que la distancia de Manhattan suma todas las diferencias absolutas y la Euclidiana las combina mediante sus cuadrados, la norma del supremo se basa en una filosofía matemática distinta: \textbf{únicamente considera la diferencia absoluta más grande entre todas las dimensiones}, ignorando por completo el comportamiento de las demás.
para \(i=1,...,P\)
\[d_{sup}(\boldsymbol x,\boldsymbol y)=\max_{i}|x_i-y_i|\]
Dist_max[1:5,1:5]
## 1 2 3 4 5
## 1 0.0 70.2 43.9 61.4 63.0
## 2 70.2 0.0 26.2 14.3 123.9
## 3 43.9 26.2 0.0 17.5 97.6
## 4 61.4 14.3 17.5 0.0 115.1
## 5 63.0 123.9 97.6 115.1 0.0
\[d_{Manhattan}(\boldsymbol x, \boldsymbol y)=\sum_{i=1}^{P}|x_i-y_i|\]
Dist_man[1:5,1:5]
## 1 2 3 4 5
## 1 0.0 107.0 86.7 112.6 116.7
## 2 107.0 0.0 32.1 23.1 150.1
## 3 86.7 32.1 0.0 25.9 117.9
## 4 112.6 23.1 25.9 0.0 127.0
## 5 116.7 150.1 117.9 127.0 0.0
Divide la distancia por \(P-Z\) donde \(Z\) es el número de atributos que son 0 para \(\boldsymbol x\) y \(\boldsymbol y\) y \(P\) es la dimensión de los vectores.\[d_{Canberra}(\boldsymbol x,\boldsymbol y)=\sum_{i=1}^{P}\frac{|x_i-y_i|}{|x_i|+|y_i|}\]
Dist_can[1:5,1:5]
## 1 2 3 4 5
## 1 0.0 1.2 1.2 1.3 0.7
## 2 1.2 0.0 1.0 0.3 1.2
## 3 1.2 1.0 0.0 0.9 1.1
## 4 1.3 0.3 0.9 0.0 1.1
## 5 0.7 1.2 1.1 1.1 0.0
\[d(\boldsymbol x, \boldsymbol y)=\left(\sum_{i=1}^{P}|x_i-y_i|^k\right)^{\frac{1}{k}}\]
Dist_min[1:5,1:5]
## 1 2 3 4 5
## 1 0.0 73.4 54.6 71.5 74.0
## 2 73.4 0.0 26.3 15.4 124.3
## 3 54.6 26.3 0.0 18.1 97.9
## 4 71.5 15.4 18.1 0.0 115.1
## 5 74.0 124.3 97.9 115.1 0.0
\[d(\boldsymbol x, \boldsymbol y)=\frac{b+c}{a+b+c}\]
# Vectores de ejemplo con presencia (1) y ausencia (0)
x <- c(1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0)
y <- c(1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0)
# Extracción automática de las frecuencias a, b, c, d
a <- sum(x == 1 & y == 1)
b <- sum(x == 1 & y == 0)
c <- sum(x == 0 & y == 1)
d <- sum(x == 0 & y == 0)
# Mostramos los valores calculados
#cat("a (1,1) =", a, "\nb (1,0) =", b, "\nc (0,1) =", c, "\nd (0,0) =", d)
s_jaccard <-function(a,b,c,d){a/(a + b + c)}
s_smc <- function(a,b,c,d){(a + d) / (a + b + c + d)}
s_dice <- function(a,b,c,d){(2 * a) / ((2 * a) + b + c)}
s_ochiai <- function(a,b,c,d){a / sqrt((a + b) * (a + c))}
s_rr <- function(a,b,c,d){a / (a + b + c + d)}
s_jaccard(a,b,c,d)
## [1] 0.4545455
s_smc(a,b,c,d)
## [1] 0.6
s_dice(a,b,c,d)
## [1] 0.625
s_ochiai(a,b,c,d)
## [1] 0.6299408
s_rr(a,b,c,d)
## [1] 0.3333333
Para definir medidas de similaridad para datos binarios, siempre nos basamos en una tabla de contingencia entre dos vectores. Definimos primero los cuatro componentes fundamentales y el total (\(n\)):\(a\): Coincidencias positivas (\(1, 1\))\(b\): Presencia-Ausencia (\(1, 0\))\(c\): Ausencia-Presencia (\(0, 1\))\(d\): Coincidencias negativas (\(0, 0\))\(n\): Total de elementos (\(n = a + b + c + d\))Para las fórmulas complejas de Lambda y D de Anderberg, utilizaremos dos variables auxiliares intermedias para simplificar el código LaTeX y evitar que se desborde de la pantalla:
\[t_1 = \max(a,b) + \max(c,d) + \max(a,c) + \max(b,d)\]\[t_2 = \max(a+c, b+d) + \max(a+b, c+d)\]
\[S_{Russell-Rao} = \frac{a}{a + b + c + d}\]
A diferencia de Jaccard, el SMC otorga el mismo peso tanto a las presencias mutuas como a las ausencias mutuas (\(d\)), asumiendo que el cero tiene el mismo valor informativo que el uno.
\[S_{smc} = \frac{a+d}{a + b + c + d}\]
Esta medida ignora por completo las coincidencias negativas (\(d\)). Es muy útil cuando el estado \(0\) representa la ausencia de una característica común que no aporta información de similitud real.
\[S_{Jaccard} = \frac{a}{a + b + c}\] \[S_{Rogers-Tanimoto} = \frac{a + d}{a + 2(b + c) + d}\] \[S_{Sokal-Sneath1} = \frac{a}{a + 2(b + c)}\] \[S_{Sokal-Sneath2} = \frac{2(a + d)}{2(a + d) + b + c}\] \[S_{Sokal-Sneath3} = \frac{a + d}{b + c}\] \[S_{Kulczynski1} = \frac{a}{b + c}\] \[S_{Sokal-Sneath4} = \frac{1}{2} \left( \frac{a}{a + b} + \frac{a}{a + c} \right)\] \[S_{Hamann} = \frac{(a + d) - (b + c)}{a + b + c + d}\] \[S_{Lambda} = \frac{t_1 - t_2}{2n - t_2}\] \[S_{Anderberg} = \frac{t_1 - t_2}{2n}\] \[S_{Yule-Y} = \frac{\sqrt{ad} - \sqrt{bc}}{\sqrt{ad} + \sqrt{bc}}\] \[S_{Yule-Q} = \frac{ad - bc}{ad + bc}\] \[S_{Ochiai} = \frac{a}{\sqrt{(a + b)(a + c)}}\] \[S_{Sokal-Sneath5} = \frac{ad}{\sqrt{(a + b)(a + c)(b + d)(c + d)}}\] \[S_{Phi} = \frac{ad - bc}{\sqrt{(a + b)(a + c)(b + d)(c + d)}}\] \[S_{Dispersion} = \frac{ad - bc}{(a + b + c + d)^2}\]