####################################################################14/08/2018
############################ Algebra lineal con R ############################
### Vectores

                          #Los vectores son introducidos utilizando la función "c()"
                          #pueden se guardados dentro de una variable con "<-".
                          #Al escribir el nombre de la variable esta se muestra en la consola
    a <- c(1,2,3,4);a 
## [1] 1 2 3 4
                          #Con esta función se muestra el número de datos que 
                          #posee un vector (Largo) 
    length(a)             
## [1] 4
                          #Con esta se muestra la dimensión en matrices, en caso de que 
                          #sean un vector con una sola dimesión esta se muestra como "NULL"
    dim(a)                
## NULL
                          #Es posible calcular el módulo de un vector mediante operaciones 
                          #matemáticas escritas de forma lineal, y/o usando funciones específicas.
                          #Al escribir una variable seguida de un corchete y un número, se está 
                          #especificando el valor que se almacenó en dicha varible en la posición 
                          #del número indicado.
    modulo <- sqrt(a[1]^2+a[2]^2+a[3]^2+a[4]^2);modulo
## [1] 5.477226
                          #con este función se muestra el tipo de datos almacenados en la variable 
                          #especificada en este caso es un vector de tipo "numeric"
    class(a)             
## [1] "numeric"
                          #Vector "character"
                          #Es posible ejecutar varios comandos en una misma línea siempre y cuando 
                          #estas se encuentren separadas por un ";"   
    b <- c("enero","febrero","marzo");b;class(b) 
## [1] "enero"   "febrero" "marzo"
## [1] "character"
    d <- c(1,"a","b",4);d;class(d) # Vector alfanumérico "character"
## [1] "1" "a" "b" "4"
## [1] "character"
    e <- c(25,48,57,NA);e;class(e) # NA ,muestra el dato faltante
## [1] 25 48 57 NA
## [1] "numeric"
                          #Con el término "NA" en un vector se está definiendo como un dato faltante
    length(e)             #Aun con el dato faltante toma como un valor más del vector
## [1] 4
    f <- c(T, F, T, T, F, F, T);f;class(f) # vector del tipo "logical"
## [1]  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE
## [1] "logical"
#Transponer 
                          #Por defecto R guarda los vectores como columnas, por lo tanto al 
                          #transponerlo con la función t(), almacena el vector como una fila
    td <- t(d);td;d       
##      [,1] [,2] [,3] [,4]
## [1,] "1"  "a"  "b"  "4"
## [1] "1" "a" "b" "4"
#Multiplación escalar * vector (Producto punto)
                          #en este caso se multiplica el escalar por cada uno de los datos contenidos en el vector
    h <- 3*a;h            
## [1]  3  6  9 12
#Suma de vectores 
                          #En este caso para realizar la suma de dos vectores se tiene que tener en 
                          #cuenta que los dos vectores deben tener la misma longitud o ser múltiplo 
                          #una de la otra, realizando una suma elemento a elemento.
    aMh <- a+h;aMh        
## [1]  4  8 12 16
    hMa <- h+a;hMa        #Se puede observar que la suma es conmutativa. 
## [1]  4  8 12 16
#Resta de vectores        
                          #En este caso para realizar la suma de dos vectores se tiene que tener en 
                          #cuenta que los dos vectores deben tener la misma longitud o ser múltiplo 
                          #una de la otra, realizando una suma elemento a elemento
    a_h <- a-h;a_h        
## [1] -2 -4 -6 -8
    h_a <- h-a;h_a        #La suma es conmutativa.
## [1] 2 4 6 8
                          #Al realizar la suma de dos vectores que poseen distintas longitudes, la suma 
                          #se realiza la operación repitiendo los datos del vector de menor hasta igualar
                          #la longitud del vector más grande, mostrando un aviso de prevención mostrando 
                          #lo anteriormente mencionado.
    j <- c(1,2,4,6,8)   
    aMj <- a+j;aMj        
## Warning in a + j: longer object length is not a multiple of shorter object
## length
## [1]  2  4  7 10  9
    k <- c(1,0,1,1,0,1,0,1,0,0);k;length(k)
##  [1] 1 0 1 1 0 1 0 1 0 0
## [1] 10
                          #En este caso el vector k es del doble del vector j la operación se realiza
                          #sin problemas al duplicar el vector j
    kMj <- k+j;kMj        
##  [1] 2 2 5 7 8 2 2 5 6 8
#Multiplación de vectores Producto punto.
    l <- c(1,5,9);l;m <- c(7,5,3);m 
## [1] 1 5 9
## [1] 7 5 3
                          #Para realizar el producto punto de dos vectores el número de columnas
                          #debe ser igual número de filas dando como resultado un escalar
    lm <- l*m;lm          
## [1]  7 25 27
                          #Al no poseer columnas=filas, hace multiplicación elemento a elemento
    tlm <- t(l)*m; tlm    
##      [,1] [,2] [,3]
## [1,]    7   25   27
                          #El operador para producto punto no es "*" realizando un producto elemento a elemento
    tlm2 <- t(l)%*%m; tlm2 
##      [,1]
## [1,]   59
                          #El producto punto da como resultado un escalar y el operado es "%*%"  
    tlm3 <- l%*%m;tlm3    
##      [,1]
## [1,]   59
                          #R automáticamente transpone uno de los vectores
    tlm4 <- m%*%l;tlm4    #El producto punto es conmutativo
##      [,1]
## [1,]   59
#Vector Nulo
                         #Este es un vector que posee como valores solamente 0
    nulo10=c(0,0,0,0,0,0,0,0,0,0);nulo10 
##  [1] 0 0 0 0 0 0 0 0 0 0
                        #En esta es otra forma de realizar un vector nulo usando rep()
    nulo10b <- c(rep(0,10));nulo10b 
##  [1] 0 0 0 0 0 0 0 0 0 0
#Vector unitario 
                        #Este es un vector que posee como valores solamente 1
    unit <- rep(1,10);unit 
##  [1] 1 1 1 1 1 1 1 1 1 1
#Funcion rep()
                        #La función rep() permite la repetición de datos de cualquier clase tantas 
                        #veces como se requiera, además automáticamente lo almacena como un vector.
    Letras <- rep("pi",20);Letras
##  [1] "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi" "pi"
## [15] "pi" "pi" "pi" "pi" "pi" "pi"
    pi                  #R posee ciertas constantes alamacenadas como el caso de ?? 
## [1] 3.141593
#Perpendicularidad entre vectores
    pH <- c(7,3.2,6.5,5.8,4);Mo <- c(1.1,2.3,3.5,4,5);pH;Mo
## [1] 7.0 3.2 6.5 5.8 4.0
## [1] 1.1 2.3 3.5 4.0 5.0
#Correlación de Pearson 
                        #La correlación de Person permite observar que tan perpendiculares están los vectores
                        #entre más cercano este a 0 muestra una mayor perpendicularidad entre los vectores
                        #puede ser una relación negativa o positiva dependiendo en de la relación entre los datos
    rp <- cor(pH,Mo);rp 
## [1] -0.3290951
#Ángulo entre vectores 
    uv=pH%*%Mo          #Primero se requiere el producto punto de los dos vectores 
    Modu <- pH[1]^2+pH[2]^2+pH[3]^2+pH[4]^2+pH[5]^2;Modu #Modulo del vector pH
## [1] 151.13
    Modv <- Mo[1]^2+Mo[2]^2+Mo[3]^2+Mo[4]^2+Mo[5]^2;Modv #Modulo del vector Materia Orgánica
## [1] 59.75
    Cosphi <- uv/(Modu*Modv);Cosphi #Posteriormente se calcula el coseno del ángulo entre los vectores
##            [,1]
## [1,] 0.00897119
    Angulo <- acos(Cosphi);Angulo #Para encontrar el ángulo se calcula el arcoseno del coseno del ángulo entre los vectores
##          [,1]
## [1,] 1.561825
    Angulo*180/pi       #El resultado es arojado en radianes por lo tanto es posible calcular el resultado en grados
##          [,1]
## [1,] 89.48598
### Matrices.    
#Uso de rnorm para la creación de datos aleatorios con distribución normal
    CIC <- rnorm(n=50,mean=3.5,sd=0.5);CIC #Esta función define la aleatorización de n número de datos, con una media y dsviacion determinada 
##  [1] 4.027941 3.560578 4.019805 3.648346 3.258704 3.948629 3.729115
##  [8] 3.469658 3.742115 3.234559 2.791011 3.958828 3.343379 3.547602
## [15] 3.216375 3.549801 4.557185 3.322694 3.374802 3.640525 3.164933
## [22] 3.276367 3.780108 3.352699 3.521659 4.045324 3.244034 3.569219
## [29] 3.261110 2.864735 3.322933 3.897268 3.343541 3.565178 3.541459
## [36] 4.051039 3.054951 3.070422 3.391756 3.504331 4.414486 3.540396
## [43] 3.940520 3.471773 3.317425 3.014537 3.326772 3.026281 3.605968
## [50] 3.098355
    modulo.CIC <- norm(CIC, type = "2");modulo.CIC #esta función encuentra el módulo de un vector determinado 
## [1] 24.95817
    round(CIC,3)        #Establece un número de decimales determinado para todos los datos de un vector determinado 
##  [1] 4.028 3.561 4.020 3.648 3.259 3.949 3.729 3.470 3.742 3.235 2.791
## [12] 3.959 3.343 3.548 3.216 3.550 4.557 3.323 3.375 3.641 3.165 3.276
## [23] 3.780 3.353 3.522 4.045 3.244 3.569 3.261 2.865 3.323 3.897 3.344
## [34] 3.565 3.541 4.051 3.055 3.070 3.392 3.504 4.414 3.540 3.941 3.472
## [45] 3.317 3.015 3.327 3.026 3.606 3.098
    floor(CIC)          #Aproxima el valor de un vector o matriz al entero inferior
##  [1] 4 3 4 3 3 3 3 3 3 3 2 3 3 3 3 3 4 3 3 3 3 3 3 3 3 4 3 3 3 2 3 3 3 3 3
## [36] 4 3 3 3 3 4 3 3 3 3 3 3 3 3 3
    ceiling(CIC)        #Aproxima el valor de un vector o matriz al entero superior
##  [1] 5 4 5 4 4 4 4 4 4 4 3 4 4 4 4 4 5 4 4 4 4 4 4 4 4 5 4 4 4 3 4 4 4 4 4
## [36] 5 4 4 4 4 5 4 4 4 4 4 4 4 4 4
#Matrices 
    #En R con la función matrix() se puede generar una matriz a partir de un vector al definir el número de columnas y filas. 
    A <- matrix(c(1,2,3,4,5,6,7,8,9),nrow = 3,ncol = 3);A #Por defecto R organiza los datos por columnas 
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
    A1 <- matrix(c(1,2,3,4,5,6,7,8,9),nrow = 3,ncol = 3,byrow = f);A1 #Con el comando byrow = f los datos son organizados por filas
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
    B <- matrix(seq(1:16),nrow=4);B
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
    C <- matrix(seq(1:16),nrow=4);C
##      [,1] [,2] [,3] [,4]
## [1,]    1    5    9   13
## [2,]    2    6   10   14
## [3,]    3    7   11   15
## [4,]    4    8   12   16
    D <- matrix(c(2*(c(1:12))),nrow = 3,ncol = 4,byrow = F);D
##      [,1] [,2] [,3] [,4]
## [1,]    2    8   14   20
## [2,]    4   10   16   22
## [3,]    6   12   18   24
    D1 <- matrix(seq(2,24,by = 2),nrow = 3,ncol = 4,byrow = F);D1
##      [,1] [,2] [,3] [,4]
## [1,]    2    8   14   20
## [2,]    4   10   16   22
## [3,]    6   12   18   24
#Matriz nula    
    E <- matrix(rep(0,100),nrow = 10);E #Es una matriz que posee todos los valores iguales a 0
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    0    0    0    0    0    0    0    0    0     0
##  [2,]    0    0    0    0    0    0    0    0    0     0
##  [3,]    0    0    0    0    0    0    0    0    0     0
##  [4,]    0    0    0    0    0    0    0    0    0     0
##  [5,]    0    0    0    0    0    0    0    0    0     0
##  [6,]    0    0    0    0    0    0    0    0    0     0
##  [7,]    0    0    0    0    0    0    0    0    0     0
##  [8,]    0    0    0    0    0    0    0    0    0     0
##  [9,]    0    0    0    0    0    0    0    0    0     0
## [10,]    0    0    0    0    0    0    0    0    0     0
#Matriz de identidad 
    G = diag(1,nrow = 6);G #Esta función permite la formación de una matriz de identidad con un número de filas determinada.
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    0    0    0    0    0
## [2,]    0    1    0    0    0    0
## [3,]    0    0    1    0    0    0
## [4,]    0    0    0    1    0    0
## [5,]    0    0    0    0    1    0
## [6,]    0    0    0    0    0    1
    diag(G)             #Extrae los valores que están puestos en la diagonal
## [1] 1 1 1 1 1 1
#Formación de tablas y matrices    
    options(digits = 3) #Esta función permite la determinación de ciertas características, dentro de ellas el número de dígitos que se maneja en una matriz
    N <- rnorm(30,mean = 5,sd = 1)
    P <- rnorm(30,1.5,0.2)
    K <- rnorm(30,4,.8)
#Combianción de vectores
    NPKc <- cbind(N,P,K);NPKc #Combina los vectores por columna 
##          N    P    K
##  [1,] 5.54 1.24 4.38
##  [2,] 6.42 1.67 5.53
##  [3,] 5.84 1.75 3.49
##  [4,] 5.91 1.39 4.40
##  [5,] 3.86 1.49 2.23
##  [6,] 6.36 1.62 3.25
##  [7,] 6.06 1.21 5.17
##  [8,] 3.36 1.95 3.15
##  [9,] 4.47 1.66 4.00
## [10,] 4.20 1.36 2.92
## [11,] 4.47 1.39 3.38
## [12,] 5.31 1.65 3.34
## [13,] 5.30 1.59 5.32
## [14,] 4.83 1.47 3.78
## [15,] 3.39 1.60 2.76
## [16,] 6.96 1.50 4.04
## [17,] 5.66 1.80 4.91
## [18,] 6.86 1.83 2.76
## [19,] 4.83 1.30 4.97
## [20,] 3.21 1.29 4.22
## [21,] 4.44 1.63 3.31
## [22,] 4.07 1.72 4.76
## [23,] 6.35 1.52 3.55
## [24,] 4.89 1.50 3.86
## [25,] 4.33 1.74 4.96
## [26,] 5.20 1.53 4.10
## [27,] 6.20 1.34 3.72
## [28,] 5.03 1.62 3.77
## [29,] 5.23 1.87 4.35
## [30,] 5.00 1.47 4.31
    dim(NPKc)           #Muestra las dimensiones de la matriz (Filas,columnas)
## [1] 30  3
    class(NPKc)         #datos de tipo "matrix"
## [1] "matrix"
    NPKf <- rbind(N,P,K);NPKf #En este caso se unen los vectores por filas, es considerada como la matriz transpuesta de NPKc
##   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## N 5.54 6.42 5.84 5.91 3.86 6.36 6.06 3.36 4.47  4.20  4.47  5.31  5.30
## P 1.24 1.67 1.75 1.39 1.49 1.62 1.21 1.95 1.66  1.36  1.39  1.65  1.59
## K 4.38 5.53 3.49 4.40 2.23 3.25 5.17 3.15 4.00  2.92  3.38  3.34  5.32
##   [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
## N  4.83  3.39  6.96  5.66  6.86  4.83  3.21  4.44  4.07  6.35  4.89  4.33
## P  1.47  1.60  1.50  1.80  1.83  1.30  1.29  1.63  1.72  1.52  1.50  1.74
## K  3.78  2.76  4.04  4.91  2.76  4.97  4.22  3.31  4.76  3.55  3.86  4.96
##   [,26] [,27] [,28] [,29] [,30]
## N  5.20  6.20  5.03  5.23  5.00
## P  1.53  1.34  1.62  1.87  1.47
## K  4.10  3.72  3.77  4.35  4.31
    dim(NPKf)
## [1]  3 30
    class(NPKf)
## [1] "matrix"
#Calculos de medias en matrices
    Medias <- colMeans(NPKc);Medias #Calcula las medias por columnas 
##    N    P    K 
## 5.12 1.56 3.96
    Medias2 <- rowMeans(NPKf);Medias2#Calcula las medias por Filas 
##    N    P    K 
## 5.12 1.56 3.96
#Nombres en las columnas  o filas 
    colnames(NPKc)<-c("Nitrogeno", "Fosforo","Potasio");NPKc #Se establecen los nombres para las columnas 
##       Nitrogeno Fosforo Potasio
##  [1,]      5.54    1.24    4.38
##  [2,]      6.42    1.67    5.53
##  [3,]      5.84    1.75    3.49
##  [4,]      5.91    1.39    4.40
##  [5,]      3.86    1.49    2.23
##  [6,]      6.36    1.62    3.25
##  [7,]      6.06    1.21    5.17
##  [8,]      3.36    1.95    3.15
##  [9,]      4.47    1.66    4.00
## [10,]      4.20    1.36    2.92
## [11,]      4.47    1.39    3.38
## [12,]      5.31    1.65    3.34
## [13,]      5.30    1.59    5.32
## [14,]      4.83    1.47    3.78
## [15,]      3.39    1.60    2.76
## [16,]      6.96    1.50    4.04
## [17,]      5.66    1.80    4.91
## [18,]      6.86    1.83    2.76
## [19,]      4.83    1.30    4.97
## [20,]      3.21    1.29    4.22
## [21,]      4.44    1.63    3.31
## [22,]      4.07    1.72    4.76
## [23,]      6.35    1.52    3.55
## [24,]      4.89    1.50    3.86
## [25,]      4.33    1.74    4.96
## [26,]      5.20    1.53    4.10
## [27,]      6.20    1.34    3.72
## [28,]      5.03    1.62    3.77
## [29,]      5.23    1.87    4.35
## [30,]      5.00    1.47    4.31
    row.names(NPKf) <-c("Nitrogeno", "Fosforo","Potasio");NPKf #Se establecen los nombres para las filas 
##           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
## Nitrogeno 5.54 6.42 5.84 5.91 3.86 6.36 6.06 3.36 4.47  4.20  4.47  5.31
## Fosforo   1.24 1.67 1.75 1.39 1.49 1.62 1.21 1.95 1.66  1.36  1.39  1.65
## Potasio   4.38 5.53 3.49 4.40 2.23 3.25 5.17 3.15 4.00  2.92  3.38  3.34
##           [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22]
## Nitrogeno  5.30  4.83  3.39  6.96  5.66  6.86  4.83  3.21  4.44  4.07
## Fosforo    1.59  1.47  1.60  1.50  1.80  1.83  1.30  1.29  1.63  1.72
## Potasio    5.32  3.78  2.76  4.04  4.91  2.76  4.97  4.22  3.31  4.76
##           [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30]
## Nitrogeno  6.35  4.89  4.33  5.20  6.20  5.03  5.23  5.00
## Fosforo    1.52  1.50  1.74  1.53  1.34  1.62  1.87  1.47
## Potasio    3.55  3.86  4.96  4.10  3.72  3.77  4.35  4.31
#Vector vacío
    vv <- c();vv
## NULL
#Matriz vacía 
    VV <- matrix(nrow = 3,ncol = 3);VV
##      [,1] [,2] [,3]
## [1,]   NA   NA   NA
## [2,]   NA   NA   NA
## [3,]   NA   NA   NA
#Matriz de correlaciones de Pearson
    COR <- cor(NPKc)  
    t(COR)              #Se puede observar que esta matriz es simétrica debido a que al transponerla es la misma matriz
##           Nitrogeno Fosforo Potasio
## Nitrogeno    1.0000 -0.0228   0.224
## Fosforo     -0.0228  1.0000  -0.119
## Potasio      0.2245 -0.1189   1.000
#Matriz de Varianza y covarianzas 
    Var <- cov(NPKc);Var  #Lo que se encuentra dentro de la diagonal son las varianzas y lo que esta por fuera son las covarianzas
##           Nitrogeno  Fosforo Potasio
## Nitrogeno   1.04557 -0.00444  0.1901
## Fosforo    -0.00444  0.03622 -0.0187
## Potasio     0.19007 -0.01874  0.6858
    var(N);var(P);var(k)
## [1] 1.05
## [1] 0.0362
## [1] 0.278
    diag(Var)           #extrae las varianzas de la matriz
## Nitrogeno   Fosforo   Potasio 
##    1.0456    0.0362    0.6858
    diag(diag(Var))     #forma una matriz con solo los valores de la diagonal
##      [,1]   [,2]  [,3]
## [1,] 1.05 0.0000 0.000
## [2,] 0.00 0.0362 0.000
## [3,] 0.00 0.0000 0.686
    CoVar <- Var-diag(diag(Var));CoVar
##           Nitrogeno  Fosforo Potasio
## Nitrogeno   0.00000 -0.00444  0.1901
## Fosforo    -0.00444  0.00000 -0.0187
## Potasio     0.19007 -0.01874  0.0000
    lower.tri(CoVar)    # Muestra los valores lógicos que muestran como verdadero los valores seleccionados 
##       [,1]  [,2]  [,3]
## [1,] FALSE FALSE FALSE
## [2,]  TRUE FALSE FALSE
## [3,]  TRUE  TRUE FALSE
    CC <- COR[lower.tri(COR)];CC #se extraen los valores de correlación
## [1] -0.0228  0.2245 -0.1189
    CV <- Var[lower.tri(Var)];CV #Se extraen los valores de Covarianza
## [1] -0.00444  0.19007 -0.01874
    Nombres <- c("CovNP","CovNk","CovPK")
    CVt <- rbind(Nombres,CV);CVt #en este caso se organizan los datos de las varianzas 
##         [,1]                   [,2]               [,3]                 
## Nombres "CovNP"                "CovNk"            "CovPK"              
## CV      "-0.00443770324987929" "0.19006578342368" "-0.0187413116369241"
#Suma de matrices
    M1 <- matrix(c(1:4),nrow = 2,ncol = 2);M1
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
    M2 <- matrix(c(4:1),nrow = 2,ncol = 2);M2
##      [,1] [,2]
## [1,]    4    2
## [2,]    3    1
    M1+M2               #En este caso se realiza la suma de la matriz elemento a elemento
##      [,1] [,2]
## [1,]    5    5
## [2,]    5    5
    M2+M1               #La suma de matrices es conmutativa
##      [,1] [,2]
## [1,]    5    5
## [2,]    5    5
    M1+3*M2             #Suma de matrices con una matriz multiplicada por un escalar
##      [,1] [,2]
## [1,]   13    9
## [2,]   11    7
#Multiplicación de matrices elemento por elemento    
    M1*M2                 
##      [,1] [,2]
## [1,]    4    6
## [2,]    6    4
    M2*M1               # la multiplicación de matrices elemento por elemento (conmutativa)
##      [,1] [,2]
## [1,]    4    6
## [2,]    6    4
#Producto punto    
    M1%*%M2 
##      [,1] [,2]
## [1,]   13    5
## [2,]   20    8
    M2%*%M1             #Producto punto (no conmutativa)
##      [,1] [,2]
## [1,]    8   20
## [2,]    5   13
    #M3 <- matrix(c(1:16),4,4);M3
    #M2+M3
    # se realiza la coerción de la operación, debido a que las matrices no son conformables 
    
    #Multiplicación de una Matriz por un vector
    b1 <- c(2,3)
    M2*b1               #Se realiza la operacion, duplicando el vector y realizando una operación elemento a elemento
##      [,1] [,2]
## [1,]    8    4
## [2,]    9    3
    M2%*%b1             #En este caso se obtiene un vector, de la operación producto punto
##      [,1]
## [1,]   14
## [2,]    9
#Trazas de una matriz
    library(psych)      #Para calcular la traza se debe llamar la librería psych
    tr(M2)              #La traza de una matriz es la suma de los valores que se encuentran en la diagonal
## [1] 5
#Matrices Inversas 
    Mxy <- matrix(c(-1,3,5,-2),2,2);Mxy
##      [,1] [,2]
## [1,]   -1    5
## [2,]    3   -2
    Sol <- solve(Mxy)%*%c(4,1);Sol
##      [,1]
## [1,]    1
## [2,]    1
    Solxy <- list(x=Sol[1],y=Sol[2]);Solxy #Solve es la función que se encarga de encontrar la inversa de una matriz
## $x
## [1] 1
## 
## $y
## [1] 1
    mm <- matrix(c(1,1,1,1),2,2)  #pueden existir matrices que no tienen solución debido a que una fila es múltiplo de la otra
    #solve(mm)
    #Error in solve.default(mm) : 
    # Lapack routine dgesv: system is exactly singular: U[2,2] = 0
#Cosas en los que una matriz no tiene inversa
  #Ejemplo 1  
    set.seed(123)       #Con esta función se establece una forma determinada de aleatorización
    Mo2 <- rnorm(10,.25,.04);Mo2
##  [1] 0.228 0.241 0.312 0.253 0.255 0.319 0.268 0.199 0.223 0.232
    Co <- 0.58*Mo2;Co
##  [1] 0.132 0.140 0.181 0.147 0.148 0.185 0.156 0.116 0.129 0.135
    X1 <- cbind(Mo2,Co)
    var(X1)
##          Mo2       Co
## Mo2 0.001456 0.000844
## Co  0.000844 0.000490
    #solve(var(X1))     #No se puede solucionar debido a que Co se calcula a partir de Mo,debido a que una matriz es el resultado de otra
    #Error in solve.default(var(X1)) : 
    #  system is computationally singular: reciprocal condition number = 2.17523e-17
  #Ejemplo2
    Arena <- rnorm(10,.5,.1);Arena
##  [1] 0.622 0.536 0.540 0.511 0.444 0.679 0.550 0.303 0.570 0.453
    Arcilla <- rnorm(10,.02,.05);Arcilla
##  [1] -0.0334  0.0091 -0.0313 -0.0164 -0.0113 -0.0643  0.0619  0.0277
##  [9] -0.0369  0.0827
    Limo <- 1-(Arena+Arcilla);Limo
##  [1] 0.411 0.455 0.491 0.505 0.567 0.386 0.388 0.669 0.467 0.465
    NNN <- cbind(Arena,Arcilla,Limo);NNN 
##       Arena Arcilla  Limo
##  [1,] 0.622 -0.0334 0.411
##  [2,] 0.536  0.0091 0.455
##  [3,] 0.540 -0.0313 0.491
##  [4,] 0.511 -0.0164 0.505
##  [5,] 0.444 -0.0113 0.567
##  [6,] 0.679 -0.0643 0.386
##  [7,] 0.550  0.0619 0.388
##  [8,] 0.303  0.0277 0.669
##  [9,] 0.570 -0.0369 0.467
## [10,] 0.453  0.0827 0.465
    rowSums(NNN)        #Los datos compocicionales, al sumarse dan una constante, igual en todas las columnas 
##  [1] 1 1 1 1 1 1 1 1 1 1
    S <- var(NNN);S
##            Arena   Arcilla      Limo
## Arena    0.01078 -0.002741 -0.008035
## Arcilla -0.00274  0.002166  0.000575
## Limo    -0.00803  0.000575  0.007460
    dim(S)
## [1] 3 3
    #solve(S)           #Con datos composicionales, tampoco es posible encontrara la inversa
    #Error in solve.default(S) : 
    #  system is computationally singular: reciprocal condition number = 1.32062e-17