Introducción al álgebra lineal

Autor/a

Universidad Nacional de Colombia, Sede Medellín

Fecha de publicación

23 de febrero de 2024

Lectura de base de datos

# Lectura de base de datos

baseAbun1 <- read.table("ejemplo1.txt", header = TRUE, row.names = 1)
matrizAbun <- as.matrix(baseAbun1)
matrizAbun
        sp1 sp2
sitio1   10  10
sitio2   19  32
sitio3    5   3
sitio4   10  20
sitio5    3  19
sitio6    4  18
sitio7    7   7
sitio8    5  46
sitio9   25  26
sitio10  11  11
sitio11   5  30

\[ A = \left[ \begin{array}{cc} 10 & 10 \\ 19 & 32 \\ 5 & 3 \\ 10 & 20 \\ 3 & 19 \\ 4 & 18 \\ 7 & 7 \\ 5 & 46 \\ 25 & 26 \\ 11 & 11 \\ 5 & 30 \\ \end{array} \right] \]

Gráfica de dispersión de las abundancias de las dos especies

plot(matrizAbun, xlim = c(-1, 50), ylim = c(-1, 50), asp = 1, pch = 19)
text(matrizAbun, labels = row.names(matrizAbun), pos = 2)
abline(v = 0, col = "red")
abline(h = 0, col = "red")

Hallar las abundancias totales de cada sitio.

sumas <- rowSums(matrizAbun)
sumas
 sitio1  sitio2  sitio3  sitio4  sitio5  sitio6  sitio7  sitio8  sitio9 sitio10 
     20      51       8      30      22      22      14      51      51      22 
sitio11 
     35 

Hallar la distancia magnitud de la abundancia por algunos sitios

nsitio1 <- sqrt(sum(matrizAbun[1, ] ^ 2))
nsitio1
[1] 14.14214
nsitio2 <- sqrt(sum(matrizAbun[2, ] ^ 2))
nsitio2
[1] 37.21559
nsitio9 <- sqrt(sum(matrizAbun[9, ] ^ 2))
nsitio9
[1] 36.06938

La magnitud de un vector \(\boldsymbol{u} = [x \quad y]\) se define como:

\[ |\boldsymbol{u}| = \sqrt{x^2 + y^2} \]

Hallar la abundancias “conjunta” de todos los sitios.

Cálculo de la norma de cada vector fila.

normas <- sqrt(rowSums(matrizAbun ^ 2))
normas
   sitio1    sitio2    sitio3    sitio4    sitio5    sitio6    sitio7    sitio8 
14.142136 37.215588  5.830952 22.360680 19.235384 18.439089  9.899495 46.270941 
   sitio9   sitio10   sitio11 
36.069378 15.556349 30.413813 

Llevar a una base de datos todas las medidas.

base_total <- cbind(matrizAbun, sumas, normas)
base_total
        sp1 sp2 sumas    normas
sitio1   10  10    20 14.142136
sitio2   19  32    51 37.215588
sitio3    5   3     8  5.830952
sitio4   10  20    30 22.360680
sitio5    3  19    22 19.235384
sitio6    4  18    22 18.439089
sitio7    7   7    14  9.899495
sitio8    5  46    51 46.270941
sitio9   25  26    51 36.069378
sitio10  11  11    22 15.556349
sitio11   5  30    35 30.413813

Gráfica de las distancias “conjuntas”.

plot(matrizAbun, xlim = c(-1, 50), ylim = c(-1, 50), asp = 1, pch = 19)
text(matrizAbun, labels = row.names(matrizAbun), pos = 2)
arrows(0, 0, matrizAbun[, 1], matrizAbun[, 2], col = "blue", length = 0.2)
abline(v = 0, col = "red")
abline(h = 0, col = "red")
abline(a = 51, b = -1, col = "chartreuse4")
abline(a = 22, b = -1, col = "chartreuse4")

Gráfica de comparación de las dos distancias o magnitudes de cada sitio como vector.

plot(sumas, normas,
     asp = 1, xlim = c(0, 55), ylim = c(0, 55), pch =19,
     las = 1)
text(sumas, normas, labels = names(sumas), pos = 2, col = "blue")

Cálculo de los vectores unitarios para cada vector (sitio).

El vector unitario asociado a cualquier vector \(\boldsymbol{v}\) se define como:

\[ \boldsymbol{u} = \frac{\boldsymbol{v}}{|\boldsymbol{v}|} \]

matrizAbun
        sp1 sp2
sitio1   10  10
sitio2   19  32
sitio3    5   3
sitio4   10  20
sitio5    3  19
sitio6    4  18
sitio7    7   7
sitio8    5  46
sitio9   25  26
sitio10  11  11
sitio11   5  30
normas
   sitio1    sitio2    sitio3    sitio4    sitio5    sitio6    sitio7    sitio8 
14.142136 37.215588  5.830952 22.360680 19.235384 18.439089  9.899495 46.270941 
   sitio9   sitio10   sitio11 
36.069378 15.556349 30.413813 
matrizNormalizadas <- matrizAbun/normas
matrizNormalizadas
              sp1       sp2
sitio1  0.7071068 0.7071068
sitio2  0.5105388 0.8598547
sitio3  0.8574929 0.5144958
sitio4  0.4472136 0.8944272
sitio5  0.1559626 0.9877630
sitio6  0.2169305 0.9761871
sitio7  0.7071068 0.7071068
sitio8  0.1080592 0.9941445
sitio9  0.6931087 0.7208331
sitio10 0.7071068 0.7071068
sitio11 0.1643990 0.9863939

Gráfica de los vectores unitarios.

plot(matrizNormalizadas, asp = 1, pch = 19,
     xlim = c(0, 1), ylim = c(0, 1))
text(matrizNormalizadas, labels = 1:nrow(matrizAbun), pos = 1)

Cálculo de proporción de abundancias.

(matrizProporciones <- matrizAbun/sumas)
               sp1       sp2
sitio1  0.50000000 0.5000000
sitio2  0.37254902 0.6274510
sitio3  0.62500000 0.3750000
sitio4  0.33333333 0.6666667
sitio5  0.13636364 0.8636364
sitio6  0.18181818 0.8181818
sitio7  0.50000000 0.5000000
sitio8  0.09803922 0.9019608
sitio9  0.49019608 0.5098039
sitio10 0.50000000 0.5000000
sitio11 0.14285714 0.8571429
plot(matrizProporciones, asp = 1, pch = 19,
     xlim = c(0, 1), ylim = c(0, 1))
text(matrizProporciones, labels = 1:nrow(matrizAbun), pos = 2)

Comparación gráfica entre “abundancia conjunta” y “proporciones”.

plot(matrizProporciones, asp = 1, pch = 19,
     xlim = c(0, 1), ylim = c(0, 1), col = "red")
text(matrizProporciones, labels = 1:nrow(matrizAbun), pos = 1)
points(matrizNormalizadas, pch = 19,
     col = "blue")
text(matrizNormalizadas, labels = 1:nrow(matrizAbun), pos = 1)

Cálculo de la matriz centrada de abundancias.

promedios <- colMeans(matrizAbun)
promedios
      sp1       sp2 
 9.454545 20.181818 
matrizCentrada <- t(t(matrizAbun) - promedios)
matrizCentrada
               sp1         sp2
sitio1   0.5454545 -10.1818182
sitio2   9.5454545  11.8181818
sitio3  -4.4545455 -17.1818182
sitio4   0.5454545  -0.1818182
sitio5  -6.4545455  -1.1818182
sitio6  -5.4545455  -2.1818182
sitio7  -2.4545455 -13.1818182
sitio8  -4.4545455  25.8181818
sitio9  15.5454545   5.8181818
sitio10  1.5454545  -9.1818182
sitio11 -4.4545455   9.8181818

Gráfica de los sitios con respecto al centroide o centro de masa de abundancias

plot(matrizCentrada,xlim = c(-20, 30), ylim = c(-20, 30), asp = 1, pch = 19)
text(matrizCentrada, labels = row.names(matrizAbun), pos = 2)
grid()
abline(h = 0, col = "red", lty = 4)
abline(v = 0, col = "red", lty = 4)

Matriz de varianza y covarianza de matrices de abundancias y de abundacias centradas

matrizAbun
        sp1 sp2
sitio1   10  10
sitio2   19  32
sitio3    5   3
sitio4   10  20
sitio5    3  19
sitio6    4  18
sitio7    7   7
sitio8    5  46
sitio9   25  26
sitio10  11  11
sitio11   5  30
var(matrizAbun)
         sp1       sp2
sp1 47.27273  15.30909
sp2 15.30909 159.96364
matrizCentrada
               sp1         sp2
sitio1   0.5454545 -10.1818182
sitio2   9.5454545  11.8181818
sitio3  -4.4545455 -17.1818182
sitio4   0.5454545  -0.1818182
sitio5  -6.4545455  -1.1818182
sitio6  -5.4545455  -2.1818182
sitio7  -2.4545455 -13.1818182
sitio8  -4.4545455  25.8181818
sitio9  15.5454545   5.8181818
sitio10  1.5454545  -9.1818182
sitio11 -4.4545455   9.8181818
var(matrizCentrada)
         sp1       sp2
sp1 47.27273  15.30909
sp2 15.30909 159.96364

Composición de referencia

composicion1 <- c(1, 9) 
composicion2 <- c(-9, 1) 
composicion1
[1] 1 9
promedios
      sp1       sp2 
 9.454545 20.181818 
promedios + composicion1
     sp1      sp2 
10.45455 29.18182 
promedios + composicion2
       sp1        sp2 
 0.4545455 21.1818182 

Producto escalar entre dos vectores.

El producto escalar entre dos vectores \(\boldsymbol{v}\), \(\boldsymbol{w}\) se define como:

\[ \boldsymbol{v} \cdot \boldsymbol{w} \]

Y es equivalente a:

\[ \boldsymbol{v} \cdot \boldsymbol{w} = |\boldsymbol{v}| |\boldsymbol{w}| \cos \theta \]

Donde \(\theta\) es el ángulo entre los vectores \(\boldsymbol{v}\) y \(\boldsymbol{w}\).

## Producto punto de dos vectores
composicion1%*%composicion2
     [,1]
[1,]    0
## Matriz con los vectores de referencia
composicion <- rbind(composicion1, composicion2)
composicion
             [,1] [,2]
composicion1    1    9
composicion2   -9    1

Gráfica de los sitios centrados y las abundancias de referencia

plot(matrizCentrada,xlim = c(-20, 30), ylim = c(-20, 30), asp = 1, pch = 19)
text(matrizCentrada, labels = row.names(matrizAbun), pos = 2)
abline(h = 0, col = "red")
abline(v = 0, col = "red")
arrows(0, 0, composicion1[1], composicion1[2], col = "blue", length = 0.2, lwd = 2)
arrows(0, 0, composicion2[1], composicion2[2], col = "blue", length = 0.2, lwd = 2)
grid()

Proyección de un vector sobre otro.

La magnitud de la proyección del vector \(\boldsymbol{v}\) sobre \(\boldsymbol{w}\) se define como:

\[ Proy_{\boldsymbol{w}}{\boldsymbol{v}} = \frac{\boldsymbol{v} \cdot \boldsymbol{w}}{|\boldsymbol{w}|} \] Donde \(|\cdot|\) es la norma de un vector, \(Proy_{\boldsymbol{w}}{\boldsymbol{v}}\) es la magnitud de la proyección de \(\boldsymbol{v}\) sobre \(\boldsymbol{w}\) y el producto \(\cdot\) es el producto escalar entre dos vectores.

compoUnidad <- composicion / sqrt(rowSums(composicion ^ 2))
compoUnidad
                   [,1]      [,2]
composicion1  0.1104315 0.9938837
composicion2 -0.9938837 0.1104315
matrizProyectada <- matrizCentrada %*% t(compoUnidad)
matrizProyectada
        composicion1 composicion2
sitio1   -10.0593081   -1.6665121
sitio2    12.8000178   -8.1819722
sitio3   -17.5686519    2.5298859
sitio4    -0.1204708   -0.5621969
sitio5    -1.8873752    6.2845578
sitio6    -2.7708274    5.1802425
sitio7   -13.3722539    0.9838445
sitio8    25.1683487    7.2784415
sitio9     7.4993045  -14.8078637
sitio10   -8.9549928   -2.5499643
sitio11    9.2662090    5.5115371
plot(matrizProyectada, asp = 1, pch = 19, ylim = c(-20, 20))
text(matrizProyectada, labels = row.names(matrizAbun), pos = 1)
grid()
abline(h = 0, col = "red")
abline(v = 0, col = "red")

var(matrizProyectada)
             composicion1 composicion2
composicion1   161.949889    -2.567184
composicion2    -2.567184    45.286475

Interpretación

matrizCentrada
               sp1         sp2
sitio1   0.5454545 -10.1818182
sitio2   9.5454545  11.8181818
sitio3  -4.4545455 -17.1818182
sitio4   0.5454545  -0.1818182
sitio5  -6.4545455  -1.1818182
sitio6  -5.4545455  -2.1818182
sitio7  -2.4545455 -13.1818182
sitio8  -4.4545455  25.8181818
sitio9  15.5454545   5.8181818
sitio10  1.5454545  -9.1818182
sitio11 -4.4545455   9.8181818
matrizProyectada
        composicion1 composicion2
sitio1   -10.0593081   -1.6665121
sitio2    12.8000178   -8.1819722
sitio3   -17.5686519    2.5298859
sitio4    -0.1204708   -0.5621969
sitio5    -1.8873752    6.2845578
sitio6    -2.7708274    5.1802425
sitio7   -13.3722539    0.9838445
sitio8    25.1683487    7.2784415
sitio9     7.4993045  -14.8078637
sitio10   -8.9549928   -2.5499643
sitio11    9.2662090    5.5115371

Vectores propios

m_vc <- var(matrizCentrada)
vp1 <- eigen(m_vc)
vp1
eigen() decomposition
$values
[1] 162.00635  45.23001

$vectors
          [,1]       [,2]
[1,] 0.1322594 -0.9912151
[2,] 0.9912151  0.1322594
(matrizRotada_vp <- matrizCentrada%*%vp1$vectors)
               [,1]       [,2]
sitio1  -10.0202308  -1.887304
sitio2   12.9768370  -7.898533
sitio3  -17.6200338   2.142956
sitio4   -0.1080794  -0.564710
sitio5   -2.0251105   6.241537
sitio6   -2.8840662   5.118062
sitio7  -13.3906545   0.689563
sitio8   25.0022170   7.830111
sitio9    7.8231027 -14.639380
sitio10  -8.8967562  -2.746260
sitio11   9.1427748   5.713960
plot(matrizRotada_vp, asp = 1, pch = 19, ylim = c(-16, 16))
text(matrizRotada_vp, labels = row.names(matrizAbun), pos = 3)
abline(h=0, col = "red")
abline(v=0, col = "red")
grid()

round(var(matrizRotada_vp), 3)
        [,1]  [,2]
[1,] 162.006  0.00
[2,]   0.000 45.23