####################################################################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