EJEMPLO 1

# Ejercicio 1
# A (2,1,1,3)
# B (1,4,2,5,0,3)
# Calcular: (1) B'.A' (2) (A.B)' (3) Demostrar que B'.A' = (A.B)'

# R./
A = matrix(c(2,1,1,3),2,2,byrow=T)      # Estructura de comandos para las matrices 
A                       # 2,2: dos filas y dos columnas.
##      [,1] [,2]
## [1,]    2    1
## [2,]    1    3
B = matrix(c(1,4,2,5,0,3),2,3,byrow=T)  # byrow: ordenar valores por filas de la matriz.
B                       # 2,3: dos filas y tres columnas
##      [,1] [,2] [,3]
## [1,]    1    4    2
## [2,]    5    0    3
tA= t(A)        # t(A): Transpuesta de la matriz A
tA
##      [,1] [,2]
## [1,]    2    1
## [2,]    1    3
tB= t(B)        # t(B): Transpuesta de la matriz B
tB
##      [,1] [,2]
## [1,]    1    5
## [2,]    4    0
## [3,]    2    3
tB%*%tA == t(A%*%B)   # %*%: para multiplicar matrices. 
##      [,1] [,2]
## [1,] TRUE TRUE
## [2,] TRUE TRUE
## [3,] TRUE TRUE
                      #==: demostrar una igualdad.

#-------------
# Ejercicio 2
# A (2,3,3,2)
# B (1,4,2,5,0,3)
# Calcular: Determinante de A y de B

#R./
A = matrix(c(2,3,3,2),2,2,byrow=T)        # Matriz A
A
##      [,1] [,2]
## [1,]    2    3
## [2,]    3    2
B = matrix(c(1,4,2,5,0,3),3,3,byrow=T)  # Matriz B
B
##      [,1] [,2] [,3]
## [1,]    1    4    2
## [2,]    5    0    3
## [3,]    1    4    2
det(A)      # det(A): Determinante de la matriz A
## [1] -5
det(B)      # det(b): Determinante de la matriz B
## [1] 0
#------------
# Ejercicio 3
# A (5,2,2,2)
# Calcular inversa de A

# R./
A = matrix(c(5,2,2,2),2,2,byrow=T)        # Matriz A
A
##      [,1] [,2]
## [1,]    5    2
## [2,]    2    2
solve(A)        # solve(A): Determinante de la matriz A
##            [,1]       [,2]
## [1,]  0.3333333 -0.3333333
## [2,] -0.3333333  0.8333333
#------------
# Ejercicio 4
# A (5,2,2,2)
# Calcular valores y vectores propios de A

# R./
A = matrix(c(5,2,2,2),2,2,byrow=T) # Matriz A
A
##      [,1] [,2]
## [1,]    5    2
## [2,]    2    2
eigen(A)    # Valores y vectores propios
## eigen() decomposition
## $values
## [1] 6 1
## 
## $vectors
##            [,1]       [,2]
## [1,] -0.8944272  0.4472136
## [2,] -0.4472136 -0.8944272
# Ejercicios:
# 1. Extraer los valores y vectores propios por separado.
# 2. Extraer el primer vector fila y el primer vector columna, por separado del resto de insumos.


# R./ ***
eigen(A)$vectors
##            [,1]       [,2]
## [1,] -0.8944272  0.4472136
## [2,] -0.4472136 -0.8944272
eigen(A)$vectors[,1] 
## [1] -0.8944272 -0.4472136
eigen(A)$vectors[1,] 
## [1] -0.8944272  0.4472136
#------------
# Ejercicio 5
# Fila (observaciĂłn) 1: 5,2
# Fila (observaciĂłn) 2: 2,2
# Calcular la matriz de distancia euclidea entre las filas

# R./
A = matrix(c(5,2,2,2),2,2,byrow=T)  # Matriz A
A
##      [,1] [,2]
## [1,]    5    2
## [2,]    2    2
dist(A)   # dist(A): Matriz de distancia euclĂ­dea
##   1
## 2 3
#------------
# Ejercicio 6
# Fila (observaciĂłn) 1: 5,2
# Fila (observaciĂłn) 2: 2,2
# Fila (observaciĂłn) 3: 2,5
# Calcular la matriz de distancia euclĂ­dea entre las filas

# R./
A = matrix(c(5,2,2,2,2,5),3,2,byrow=T)   # Matriz A
A
##      [,1] [,2]
## [1,]    5    2
## [2,]    2    2
## [3,]    2    5
dist(A)           # dist(A): Matriz de distancia euclĂ­dea
##          1        2
## 2 3.000000         
## 3 4.242641 3.000000
round(dist(A),1)  # dound(): Disminuye decimales del resultado
##     1   2
## 2 3.0    
## 3 4.2 3.0
#------------
# Ejercicio 7
# Variable 1: 2,1,2
# Variable 2: 4,3,5
# Calcular las matrices de Covarianza y de CorrelaciĂłn

# R./
A = matrix(c(2,1,2,4,3,5),3,2,byrow=F) 
A
##      [,1] [,2]
## [1,]    2    4
## [2,]    1    3
## [3,]    2    5
cov(A)
##           [,1] [,2]
## [1,] 0.3333333  0.5
## [2,] 0.5000000  1.0
var(A)
##           [,1] [,2]
## [1,] 0.3333333  0.5
## [2,] 0.5000000  1.0
cor(A)
##           [,1]      [,2]
## [1,] 1.0000000 0.8660254
## [2,] 0.8660254 1.0000000
round(cov(A),1)
##      [,1] [,2]
## [1,]  0.3  0.5
## [2,]  0.5  1.0
round(cor(A),1)
##      [,1] [,2]
## [1,]  1.0  0.9
## [2,]  0.9  1.0
# Calcular la matriz de distancia y analizar el resultado.
dist(A)
##          1        2
## 2 1.414214         
## 3 1.000000 2.236068
round(dist(A),1)
##     1   2
## 2 1.4    
## 3 1.0 2.2

EJEMPLO 2

#------------
# LibrerĂ­as o paquetes requeridos
library(MASS)
library(ellipse)
library(lattice)


#------------
# 1) Crear la base de datos "datos"
datos2= read.csv2("datos1.csv",row.names = 1)  # Base de datos original
head(datos2)    # Falta un dato al estudiante 13
##          Sexo Longitud.total Cintura Longitud.espalda Long.brazo
## Alumno 1    F            170      85               43         57
## Alumno 2    F            160      80               41         54
## Alumno 3    F            156      88               35         48
## Alumno 4    F            173      63               53         59
## Alumno 5    M            170      86               47         56
## Alumno 6    M            165      89               45         61
datos2=na.omit(datos2)      # na.omit, para eliminar al estudiante 13

colnames(datos2) <- c("Sexo","LTot","Cint","LEsp","LBra")       # RĂłtulos de la base de datos
head(datos2)          # Base de datos abreviada
##          Sexo LTot Cint LEsp LBra
## Alumno 1    F  170   85   43   57
## Alumno 2    F  160   80   41   54
## Alumno 3    F  156   88   35   48
## Alumno 4    F  173   63   53   59
## Alumno 5    M  170   86   47   56
## Alumno 6    M  165   89   45   61
datos2$Sexo = as.factor(datos2$Sexo)  # convertir columna Sexo a factor
summary(datos2$Sexo)    # 14 mujeres y 10 hombres
##  F  M 
## 14 10
#------------
# 2) Matrices por sexo 
str(datos2)
## 'data.frame':    24 obs. of  5 variables:
##  $ Sexo: Factor w/ 2 levels "F","M": 1 1 1 1 2 2 2 2 2 2 ...
##  $ LTot: int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cint: num  85 80 88 63 86 89 88 80 76 45 ...
##  $ LEsp: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ LBra: int  57 54 48 59 56 61 59 55 54 86 ...
##  - attr(*, "na.action")= 'omit' Named int 13
##   ..- attr(*, "names")= chr "Alumno 13"
hombres = datos2[datos2$Sexo == "M",]   # Matriz de hombres
hombres [1:4, 1:5]      # cuatro filas y 5 columnas de esta base de datos
##          Sexo LTot Cint LEsp LBra
## Alumno 5    M  170   86   47   56
## Alumno 6    M  165   89   45   61
## Alumno 7    M  170   88   56   59
## Alumno 8    M  181   80   60   55
mujeres = datos2[datos2$Sexo == "F",]   # Matriz de mujeres
mujeres [1:4, 1:5]      # cuatro filas y 5 columnas de esta base de datos
##          Sexo LTot Cint LEsp LBra
## Alumno 1    F  170   85   43   57
## Alumno 2    F  160   80   41   54
## Alumno 3    F  156   88   35   48
## Alumno 4    F  173   63   53   59
#------------
# 3) Matrices centradas por sexos
var.h = hombres[,c(2:5)]        # Variables morfométricas de hombres
promedio.h = colMeans(var.h)    # Promedios de las variables
head(promedio.h)
##  LTot  Cint  LEsp  LBra 
## 173.3  83.4  52.0  62.5
var.m = mujeres[,c(2:5)]        # Variables morfométricas de mujeres
promedio.m = colMeans(var.m)    # Promedios de las variables
head(promedio.m)
##      LTot      Cint      LEsp      LBra 
## 161.92857  72.14286  40.64286  59.57143
# *Opcional - matriz centrada
m.centrada.h <- t(t(var.h) - promedio.h) # Restar cada dato a los promedios
head(m.centrada.h) 
##           LTot  Cint LEsp LBra
## Alumno 5  -3.3   2.6   -5 -6.5
## Alumno 6  -8.3   5.6   -7 -1.5
## Alumno 7  -3.3   4.6    4 -3.5
## Alumno 8   7.7  -3.4    8 -7.5
## Alumno 9   1.7  -7.4    3 -8.5
## Alumno 10 12.7 -38.4    8 23.5
m.centrada.m <- t(t(var.m) - promedio.m) # Restar cada dato a los promedios
head(m.centrada.m)
##                LTot      Cint       LEsp        LBra
## Alumno 1   8.071429 12.857143  2.3571429  -2.5714286
## Alumno 2  -1.928571  7.857143  0.3571429  -5.5714286
## Alumno 3  -5.928571 15.857143 -5.6428571 -11.5714286
## Alumno 4  11.071429 -9.142857 12.3571429  -0.5714286
## Alumno 11  6.071429 -7.142857  8.3571429  -4.5714286
## Alumno 12 -6.928571 -2.142857 -4.6428571  -9.5714286
#------------
# 4) Operaciones vectoriales
dif = promedio.h - promedio.m      # Diferencia de medias (m1-m2)
dif
##      LTot      Cint      LEsp      LBra 
## 11.371429 11.257143 11.357143  2.928571
t.dif = t(dif)    # Transpuesta de la diferencia (m1-m2)'
t.dif
##          LTot     Cint     LEsp     LBra
## [1,] 11.37143 11.25714 11.35714 2.928571
sum = promedio.h + promedio.m      # Suma de medias (m1+m2)
sum
##      LTot      Cint      LEsp      LBra 
## 335.22857 155.54286  92.64286 122.07143
#------------
# 5) Matriz de covarianza generalizada o compuesta (S-1)

cov.h = var(hombres[,c(2:5)])     # Matriz de varianza y covarianzas de hombres
round(cov.h,1)
##       LTot   Cint  LEsp   LBra
## LTot  37.6  -79.0  27.1   30.2
## Cint -79.0  347.2 -57.0 -116.9
## LEsp  27.1  -57.0  37.1   -5.2
## LBra  30.2 -116.9  -5.2  134.3
cov.m = var(mujeres[,c(2:5)])     # Matriz de varianza y covarianzas de mujeres
round(cov.m,1)
##      LTot  Cint  LEsp  LBra
## LTot 37.0   5.0  23.0  22.1
## Cint  5.0  94.1 -24.4 -15.2
## LEsp 23.0 -24.4  35.3   8.6
## LBra 22.1 -15.2   8.6  96.0
summary(datos2$Sexo)    # 14 mujeres y 10 hombres
##  F  M 
## 14 10
cov.g = (10*cov.h + 14*cov.m)/24  # Covarianza genealizada o compuesta
round(cov.g,2)
##        LTot   Cint   LEsp   LBra
## LTot  37.23 -30.00  24.70  25.47
## Cint -30.00 199.56 -37.99 -57.59
## LEsp  24.70 -37.99  36.07   2.84
## LBra  25.47 -57.59   2.84 111.92
cov.g.i = solve(cov.g) # Cov. generalizada invertida
round(cov.g.i,3)
##        LTot   Cint   LEsp   LBra
## LTot  0.067 -0.004 -0.049 -0.016
## Cint -0.004  0.008  0.010  0.005
## LEsp -0.049  0.010  0.071  0.015
## LBra -0.016  0.005  0.015  0.015
#------------
# 3) FunciĂłn discriminante de Wlad y Anderson (Wx)
# W(x) = [(m1-m2)'.S-1.x]-[1/2.(m1-m2)'.S-1 .(m1+m2)]

head(datos2)      # Base de datos
##          Sexo LTot Cint LEsp LBra
## Alumno 1    F  170   85   43   57
## Alumno 2    F  160   80   41   54
## Alumno 3    F  156   88   35   48
## Alumno 4    F  173   63   53   59
## Alumno 5    M  170   86   47   56
## Alumno 6    M  165   89   45   61
datos3 = as.matrix (datos2[2:5])
head(datos3) 
##          LTot Cint LEsp LBra
## Alumno 1  170   85   43   57
## Alumno 2  160   80   41   54
## Alumno 3  156   88   35   48
## Alumno 4  173   63   53   59
## Alumno 5  170   86   47   56
## Alumno 6  165   89   45   61
# 10 primeros alumnos como vectores

x1 = as.vector(datos3[1, 1:4])   # Datos del alumno 1
x2 = as.vector(datos3[2, 1:4])   # datos3[2, 1:4]: fila 2, columnas 1 a 4. alumno 1
x3 = as.vector(datos3[3, 1:4])
x4 = as.vector(datos3[4, 1:4])
x5 = as.vector(datos3[5, 1:4])
x6 = as.vector(datos3[6, 1:4])
x7 = as.vector(datos3[7, 1:4])
x8 = as.vector(datos3[8, 1:4])
x9 = as.vector(datos3[9, 1:4])
x10 = as.vector(datos3[10, 1:4])  # Datos del alumno 10


# Discriminantes de los 10 primeros alumnos
# Si da negativo discrimina en mujer y positivo en hombre
# W(x) = [(m1-m2)'.S-1.x]-[1/2.(m1-m2)'.S-1 .(m1+m2)]

W1 = ((t.dif%*%cov.g.i%*%x1)-(1/2*(t.dif%*%cov.g.i%*%sum)))   # Datos del alumno 1, 
W2 = ((t.dif%*%cov.g.i%*%x2)-(1/2*(t.dif%*%cov.g.i%*%sum)))   
W3 = ((t.dif%*%cov.g.i%*%x3)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W4 = ((t.dif%*%cov.g.i%*%x4)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W5 = ((t.dif%*%cov.g.i%*%x5)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W6 = ((t.dif%*%cov.g.i%*%x6)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W7 = ((t.dif%*%cov.g.i%*%x7)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W8 = ((t.dif%*%cov.g.i%*%x8)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W9 = ((t.dif%*%cov.g.i%*%x9)-(1/2*(t.dif%*%cov.g.i%*%sum)))
W10 = ((t.dif%*%cov.g.i%*%x10)-(1/2*(t.dif%*%cov.g.i%*%sum))) # Discriminante alumno 10

ad = data.frame (W1,W2,W3,W4,W5,W6,W7,W8,W9,W10)  # Discriminantes compilados
ad
##           W1        W2        W3        W4       W5       W6       W7       W8
## 1 -0.1271618 -3.265828 -5.281626 0.6418749 1.613796 1.109279 5.899785 7.149955
##         W9      W10
## 1 3.592283 4.048357
t(ad)   # Transpuesto
##           [,1]
## W1  -0.1271618
## W2  -3.2658277
## W3  -5.2816257
## W4   0.6418749
## W5   1.6137960
## W6   1.1092793
## W7   5.8997846
## W8   7.1499551
## W9   3.5922827
## W10  4.0483574
clase1 <- sample("F", size = 3, replace = TRUE)   # vector de las 3 mujeres
clase2 <- sample("M", size = 7, replace = TRUE)   # vector de los 7 hombres
clase <- c(clase1, clase2)      # FusiĂłn de vectores
clase
##  [1] "F" "F" "F" "M" "M" "M" "M" "M" "M" "M"
ad = data.frame(LD1 = t(ad),clase)
ad
##            LD1 clase
## W1  -0.1271618     F
## W2  -3.2658277     F
## W3  -5.2816257     F
## W4   0.6418749     M
## W5   1.6137960     M
## W6   1.1092793     M
## W7   5.8997846     M
## W8   7.1499551     M
## W9   3.5922827     M
## W10  4.0483574     M
#------------
# 4) ComparaciĂłn del discriminante manual con el automatizado
# *Nota: Los detalles de este análisis de presentarán en el capítulo de discriminantes lineales.
library(MASS)
ad1<-lda(Sexo~LTot+Cint+LEsp+LBra,data=datos2)    # Discriminante lineal de Fisher
ad1
## Call:
## lda(Sexo ~ LTot + Cint + LEsp + LBra, data = datos2)
## 
## Prior probabilities of groups:
##         F         M 
## 0.5833333 0.4166667 
## 
## Group means:
##       LTot     Cint     LEsp     LBra
## F 161.9286 72.14286 40.64286 59.57143
## M 173.3000 83.40000 52.00000 62.50000
## 
## Coefficients of linear discriminants:
##             LD1
## LTot 0.04120765
## Cint 0.06119582
## LEsp 0.14351940
## LBra 0.02713046
names(ad1)  # Insumos del discriminante
##  [1] "prior"   "counts"  "means"   "scaling" "lev"     "svd"     "N"      
##  [8] "call"    "terms"   "xlevels"
group<-predict(ad1,method="plug-in")$class  # Desempeño del discriminante
(tabla<-table(datos2$Sexo,group))
##    group
##      F  M
##   F 13  1
##   M  0 10
result = predict(ad1,method="plug-in")  # Otros insumos del discriminante

result$class     # Discriminante realizado
##  [1] F F F M M M M M M M F F F M F F M F F M F M F F
## Levels: F M
head(result$x)   # FunciĂłn discriminante en cada alumno
##                 LD1
## Alumno 1  0.1933965
## Alumno 2 -0.8930893
## Alumno 3 -1.5922524
## Alumno 4  0.4601662
## Alumno 5  0.8015395
## Alumno 6  0.6277022
result = data.frame(result$x, clase=result$class)   # Data frame
ad2 = result[1:10,]   # Data frame de los 10 primeros alumnos
ad2
##                  LD1 clase
## Alumno 1   0.1933965     F
## Alumno 2  -0.8930893     F
## Alumno 3  -1.5922524     F
## Alumno 4   0.4601662     M
## Alumno 5   0.8015395     M
## Alumno 6   0.6277022     M
## Alumno 7   2.2969970     M
## Alumno 8   2.7262704     M
## Alumno 9   1.4895138     M
## Alumno 10  1.6314990     M
ad == ad2  # Igualdad ente el discriminante manual (ad) y el automatizado (ad2)
##       LD1 clase
## W1  FALSE  TRUE
## W2  FALSE  TRUE
## W3  FALSE  TRUE
## W4  FALSE  TRUE
## W5  FALSE  TRUE
## W6  FALSE  TRUE
## W7  FALSE  TRUE
## W8  FALSE  TRUE
## W9  FALSE  TRUE
## W10 FALSE  TRUE
#------------
# 5) Figuras

# LibrerĂ­as
library(ellipse)
library(lattice)

str(datos2)
## 'data.frame':    24 obs. of  5 variables:
##  $ Sexo: Factor w/ 2 levels "F","M": 1 1 1 1 2 2 2 2 2 2 ...
##  $ LTot: int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cint: num  85 80 88 63 86 89 88 80 76 45 ...
##  $ LEsp: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ LBra: int  57 54 48 59 56 61 59 55 54 86 ...
##  - attr(*, "na.action")= 'omit' Named int 13
##   ..- attr(*, "names")= chr "Alumno 13"
x11()
boxplot(LTot~Sexo, data = datos2, ylab ="Altura (cm)",    # Cajas grises
        cex.lab=1.3)

boxplot(LTot~Sexo, data = datos2, ylab ="Altura (cm)",    # Cajas amarillas con muescas 
        cex.lab=1.3,notch=T,col="bisque")

boxplot(LTot~Sexo, data = datos2, ylab ="Altura (cm)",    # Cajas azules con muescas
        cex.lab=1.3,notch=T,col="lightblue")

x11()
boxplot(LD1~clase, data = ad, ylab ="Eje 1",
        cex.lab=1.3)

x11()
boxplot(LD1~clase, data = ad2, ylab ="Eje 1",
        cex.lab=1.3)

EJEMPLO 3

#---------------
# Cargar la base de datos de Excel *.csv
datos= read.csv2("datos1.csv")  
str(datos)      # Estructura de la base de datos
## 'data.frame':    25 obs. of  6 variables:
##  $ Nombre          : chr  "Alumno 1" "Alumno 2" "Alumno 3" "Alumno 4" ...
##  $ Sexo            : chr  "F" "F" "F" "F" ...
##  $ Longitud.total  : int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cintura         : num  85 80 88 63 86 89 88 80 76 45 ...
##  $ Longitud.espalda: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ Long.brazo      : int  57 54 48 59 56 61 59 55 54 86 ...
# LibrerĂ­as
library(ggplot2)
library(vegan)

#---------------
# 1) Ajuste de la base de datos para el trabajo matricial
datos = datos[-13,] # Eliminar el alumno 13 por faltarle un dato
head(datos)     # Encabezado de la base datos
##     Nombre Sexo Longitud.total Cintura Longitud.espalda Long.brazo
## 1 Alumno 1    F            170      85               43         57
## 2 Alumno 2    F            160      80               41         54
## 3 Alumno 3    F            156      88               35         48
## 4 Alumno 4    F            173      63               53         59
## 5 Alumno 5    M            170      86               47         56
## 6 Alumno 6    M            165      89               45         61
str(datos)      # Estructura de la base de datos
## 'data.frame':    24 obs. of  6 variables:
##  $ Nombre          : chr  "Alumno 1" "Alumno 2" "Alumno 3" "Alumno 4" ...
##  $ Sexo            : chr  "F" "F" "F" "F" ...
##  $ Longitud.total  : int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cintura         : num  85 80 88 63 86 89 88 80 76 45 ...
##  $ Longitud.espalda: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ Long.brazo      : int  57 54 48 59 56 61 59 55 54 86 ...
# Abreviaturas de los estudiantes (filas de la matriz)
str(datos)      # Estructura de la base
## 'data.frame':    24 obs. of  6 variables:
##  $ Nombre          : chr  "Alumno 1" "Alumno 2" "Alumno 3" "Alumno 4" ...
##  $ Sexo            : chr  "F" "F" "F" "F" ...
##  $ Longitud.total  : int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cintura         : num  85 80 88 63 86 89 88 80 76 45 ...
##  $ Longitud.espalda: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ Long.brazo      : int  57 54 48 59 56 61 59 55 54 86 ...
datos1 <- datos[,c(3:6)]  # Variables morfométricas
head(datos1)
##   Longitud.total Cintura Longitud.espalda Long.brazo
## 1            170      85               43         57
## 2            160      80               41         54
## 3            156      88               35         48
## 4            173      63               53         59
## 5            170      86               47         56
## 6            165      89               45         61
1:nrow(datos1)  # Generar datos de 1 a n: 25 estudiantes
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
LETTERS[1:nrow(datos1)]  # Letras para los nombres de los estudiantes
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X"
nombres <- LETTERS[1:nrow(datos1)]  # Asignar como "nombres" al comando anterior

# Abreviaturas de las variables (Columnas de la matriz).
colnames(datos1) <- c("LTot","Cint","LEsp","LBra")
head(datos1)
##   LTot Cint LEsp LBra
## 1  170   85   43   57
## 2  160   80   41   54
## 3  156   88   35   48
## 4  173   63   53   59
## 5  170   86   47   56
## 6  165   89   45   61
# Base de datos con nombres abreviados (filas y columnas)
dimnames(datos1)=(list(nombres,colnames(datos1)))
head(datos1)
##   LTot Cint LEsp LBra
## A  170   85   43   57
## B  160   80   41   54
## C  156   88   35   48
## D  173   63   53   59
## E  170   86   47   56
## F  165   89   45   61
str(datos1)     # Estructura de la base abreviada
## 'data.frame':    24 obs. of  4 variables:
##  $ LTot: int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cint: num  85 80 88 63 86 89 88 80 76 45 ...
##  $ LEsp: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ LBra: int  57 54 48 59 56 61 59 55 54 86 ...
datos1$Estud <- rownames(datos1) # Insertar columna de observaciones
head(datos1)    # Encabezado de la base de datos
##   LTot Cint LEsp LBra Estud
## A  170   85   43   57     A
## B  160   80   41   54     B
## C  156   88   35   48     C
## D  173   63   53   59     D
## E  170   86   47   56     E
## F  165   89   45   61     F
# Guardar una base datos en el directorio de trabajo
write.csv2(datos1, "datos.csv")

datos = datos1  # Cambiar "datos1" a "datos"
datos[,5]       # Siglas de los estudiantes
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X"
rownames(datos)= datos[,5]    # Siglas para las operaciones

#---------------
# 2) Análisis de mediciones de los estudiantes
str(datos)
## 'data.frame':    24 obs. of  5 variables:
##  $ LTot : int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cint : num  85 80 88 63 86 89 88 80 76 45 ...
##  $ LEsp : int  43 41 35 53 47 45 56 60 55 60 ...
##  $ LBra : int  57 54 48 59 56 61 59 55 54 86 ...
##  $ Estud: chr  "A" "B" "C" "D" ...
# 2.1) Sumas y norma de los vectores (variables)
datos = datos[,1:4]             # asignar "datos" solo a las variables morfométricas
sumas <- rowSums(datos)     # Suma de las variables por cada estudiante (rowSums)
sumas
##   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T 
## 355 335 327 348 359 360 373 376 360 377 337 311 325 376 312 339 400 322 348 363 
##   U   V   W   X 
## 328 368 373 320
sumas1 <- colSums(datos)    # Suma los estudiantes por cada variable (colSums)
sumas1
## LTot Cint LEsp LBra 
## 4000 1844 1089 1459
normas <- sqrt(rowSums(datos ^ 2))  # Norma de cada estudiante (vector fila)
round(normas,2)     # Resumen de resultados a dos decimales 
##      A      B      C      D      E      F      G      H      I      J      K 
## 203.03 191.30 188.70 200.47 204.06 202.22 207.99 213.98 205.77 218.21 194.62 
##      L      M      N      O      P      Q      R      S      T      U      V 
## 180.89 186.48 210.71 180.75 193.74 222.91 185.22 195.24 204.41 188.19 208.76 
##      W      X 
## 209.99 187.21
# Base (datos.t) que integra a las sumas y las normas
datos.t = data.frame(datos,sumas,norma= round(normas,2))
head(datos.t)
##   LTot Cint LEsp LBra sumas  norma
## A  170   85   43   57   355 203.03
## B  160   80   41   54   335 191.30
## C  156   88   35   48   327 188.70
## D  173   63   53   59   348 200.47
## E  170   86   47   56   359 204.06
## F  165   89   45   61   360 202.22
# 2.2) Figura de proyecciĂłn vectorial de los estudiantes  
x11()   # Figura de cada estudiante como un vector 
plot(datos.t[,c(1,3)]) # figura de las variables 1 y 3

# Figuras de distancias de cada estudiante como vectores
plot(sumas, normas)
text(sumas, normas, labels = names(sumas), 
     cex = 0.8, pos = 2, col = "red")                   # RĂłtulos de los puntos
abline (lm(normas~sumas),lty=2, lwd=2, col="lightblue") # Ajuste lineal (lĂ­nea sĂłlida)
lines(lowess(sumas, normas),lty=1,lwd=1,col=2)  # Ajuste suavizado  (lĂ­nea punteada)

# Figura de relaciĂłn con ggplot2
library(ggplot2)
ggplot(data=datos.t,                            
       aes(x=datos.t$sumas, y=datos.t$norma)) +
        geom_point(na.rm=T) +                    # Nube de puntos      
        geom_smooth(method='loess',na.rm=T) +    # curva tipo loess
        labs(x='Sumas', y='Normas') +
        theme_bw()                               # Fondo blanco

ggplot(data=datos.t,                            
       aes(x=datos.t$sumas, y=datos.t$norma)) +
        geom_point() +
        labs(x='Sumas', y='Normas') +
        geom_smooth(method = lm, se = FALSE)

#---------------
# 3) Cálculo de la matriz centrada de las variables morfométricas

var = datos.t[,c(1:4)]        # Variables morfométricas
promedio = colMeans(var)      # Promedios de las variables
promedio
##      LTot      Cint      LEsp      LBra 
## 166.66667  76.83333  45.37500  60.79167
m.centrada <- t(t(var) - promedio) # Restar cada dato a los promedios
head(m.centrada)  
##         LTot       Cint    LEsp        LBra
## A   3.333333   8.166667  -2.375  -3.7916667
## B  -6.666667   3.166667  -4.375  -6.7916667
## C -10.666667  11.166667 -10.375 -12.7916667
## D   6.333333 -13.833333   7.625  -1.7916667
## E   3.333333   9.166667   1.625  -4.7916667
## F  -1.666667  12.166667  -0.375   0.2083333
# Figura de las observaciones centradas
plot(m.centrada[,c(1,3)])                       # Figura general

plot(m.centrada[,c(1,3)],xlim = c(-20, 20),     # Figura editada
     ylim = c(-15, 20), asp = 1, pch = 19)
text(m.centrada[,c(1,3)],                       # Rotulos de los puntos
     labels = row.names(m.centrada[,c(1,3)]), 
     pos = 3, cex=0.7)
grid()          # Grilla en la figura
abline(h = 0, col = "red", lty = 4)             # Plano Cartesiano
abline(v = 0, col = "red", lty = 4)  

#---------------
# 4) Operaciones matriciales - OrdenaciĂłn multivariada

# 1. Cálculo de valores y vectores propios
cov = var(datos.t[,c(1:4)])     # Matriz de varianza y covarianzas
cov = var(var)                  # OpciĂłn 2
round(cov,1)
##      LTot  Cint LEsp  LBra
## LTot 68.4   4.4 56.3  32.8
## Cint  4.4 221.2 -3.7 -46.0
## LEsp 56.3  -3.7 67.2  11.3
## LBra 32.8 -46.0 11.3 109.0
promedio = colMeans(var)        # Promedios de las variables
promedio
##      LTot      Cint      LEsp      LBra 
## 166.66667  76.83333  45.37500  60.79167
m.centrada <- t(t(var) - promedio) # Variables centradas
head(m.centrada)
##         LTot       Cint    LEsp        LBra
## A   3.333333   8.166667  -2.375  -3.7916667
## B  -6.666667   3.166667  -4.375  -6.7916667
## C -10.666667  11.166667 -10.375 -12.7916667
## D   6.333333 -13.833333   7.625  -1.7916667
## E   3.333333   9.166667   1.625  -4.7916667
## F  -1.666667  12.166667  -0.375   0.2083333
vc.centrada = var(m.centrada)   # Matriz de varianza y covarianzas centrada
vc.centrada
##           LTot       Cint      LEsp      LBra
## LTot 68.405797   4.376812 56.347826  32.75362
## Cint  4.376812 221.188406 -3.673913 -45.99275
## LEsp 56.347826  -3.673913 67.201087  11.25543
## LBra 32.753623 -45.992754 11.255435 108.95471
v.propios= eigen(vc.centrada)   # Vectores y valores propios de m.centrada
v.propios
## eigen() decomposition
## $values
## [1] 238.551229 141.646198  77.460019   8.092554
## 
## $vectors
##             [,1]       [,2]       [,3]        [,4]
## [1,] -0.06532082 -0.6446607 -0.2348736  0.72455510
## [2,]  0.93124818 -0.2601970  0.2459119 -0.06783569
## [3,] -0.06460934 -0.5458245 -0.5144348 -0.65822342
## [4,] -0.35261262 -0.4677453  0.7872220 -0.19276967
v.propios$vectors               # Extraer vectores propios
##             [,1]       [,2]       [,3]        [,4]
## [1,] -0.06532082 -0.6446607 -0.2348736  0.72455510
## [2,]  0.93124818 -0.2601970  0.2459119 -0.06783569
## [3,] -0.06460934 -0.5458245 -0.5144348 -0.65822342
## [4,] -0.35261262 -0.4677453  0.7872220 -0.19276967
# 2. ProyecciĂłn matricial (matriz rotada), usando a los vectores propios
m.centrada=as.matrix(m.centrada)        # Variables centradas como matriz
head(m.centrada)
##         LTot       Cint    LEsp        LBra
## A   3.333333   8.166667  -2.375  -3.7916667
## B  -6.666667   3.166667  -4.375  -6.7916667
## C -10.666667  11.166667 -10.375 -12.7916667
## D   6.333333 -13.833333   7.625  -1.7916667
## E   3.333333   9.166667   1.625  -4.7916667
## F  -1.666667  12.166667  -0.375   0.2083333
# Matriz rotada
head(m.Rotada <- m.centrada %*% v.propios$vectors)
##         [,1]      [,2]        [,3]       [,4]
## A   8.877894 -1.203944  -0.5377327  4.1553911
## B   6.061918  9.038533  -0.7513522 -0.8562256
## C  16.276518 15.617019   0.5187139  0.8088270
## D -13.156847 -3.807327 -10.2223190  0.8536681
## E   9.903318 -3.179694  -3.1367821  1.6474314
## F  11.389822 -1.984059   3.7403017 -1.8262527
#---------------
# 5) Figuras de la matriz proyectada "m.Rotada"

# Figura sin editar
plot(m.Rotada)  # m.Rotada es la matriz rotada

# Figura editada 
plot(m.Rotada, asp = 2, pch = 19,           # asp=2 son los cĂ­rculos, pch= 19 es el relleno de los cĂ­rculos
     xlab="Eje 1",ylab="Eje 2")         # RĂłtulos de los ejes
text(m.Rotada,              # RĂłtulos de los datos (estudiantes)
     labels = row.names(datos.t[,c(1:4)]), 
     pos = 3, cex=0.7)              # cex() relaciona el tamaño del texto
abline(h=0, col = "red")            # abline (h=0) lĂ­nea horizontal del plano cartesiano
abline(v=0, col = "red")            # abline (v=0) lĂ­nea vertical del plano cartesiano
grid()                      # Grilla en la figura

# Comparar con el Análisis de Componentes Principales - pca

library(vegan)          # LibrerĂ­a requerida

# Datos del procedimiento 2.1) Sumas y norma de los vectores
head(datos)             # Variables y observaciones (estudiantes)
##   LTot Cint LEsp LBra
## A  170   85   43   57
## B  160   80   41   54
## C  156   88   35   48
## D  173   63   53   59
## E  170   86   47   56
## F  165   89   45   61
pca <- rda(datos)       # RealizaciĂłn del pca
x11()
biplot(pca)             # Figura del pca
abline(h=0, col = "blue")           # abline (h=0) lĂ­nea horizontal del plano cartesiano
abline(v=0, col = "blue")           # abline (v=0) lĂ­nea vertical del plano cartesiano
grid()          

#-----------------------
# 6) * Avanzados
# Figura con nombres de los estudiantes
datos2= read.csv2("datos1.csv")         # Base de datos original
datos2=na.omit(datos2)          # na.omit, para eliminar al estudiante 13
str(datos2)
## 'data.frame':    24 obs. of  6 variables:
##  $ Nombre          : chr  "Alumno 1" "Alumno 2" "Alumno 3" "Alumno 4" ...
##  $ Sexo            : chr  "F" "F" "F" "F" ...
##  $ Longitud.total  : int  170 160 156 173 170 165 170 181 175 186 ...
##  $ Cintura         : num  85 80 88 63 86 89 88 80 76 45 ...
##  $ Longitud.espalda: int  43 41 35 53 47 45 56 60 55 60 ...
##  $ Long.brazo      : int  57 54 48 59 56 61 59 55 54 86 ...
##  - attr(*, "na.action")= 'omit' Named int 13
##   ..- attr(*, "names")= chr "13"
head(datos2)    # Encabezado de la la base "datos2"
##     Nombre Sexo Longitud.total Cintura Longitud.espalda Long.brazo
## 1 Alumno 1    F            170      85               43         57
## 2 Alumno 2    F            160      80               41         54
## 3 Alumno 3    F            156      88               35         48
## 4 Alumno 4    F            173      63               53         59
## 5 Alumno 5    M            170      86               47         56
## 6 Alumno 6    M            165      89               45         61
datos2$Nombre   # Valores de la columna "nombres"
##  [1] "Alumno 1"  "Alumno 2"  "Alumno 3"  "Alumno 4"  "Alumno 5"  "Alumno 6" 
##  [7] "Alumno 7"  "Alumno 8"  "Alumno 9"  "Alumno 10" "Alumno 11" "Alumno 12"
## [13] "Alumno 14" "Alumno 15" "Alumno 16" "Alumno 17" "Alumno 18" "Alumno 19"
## [19] "Alumno 20" "Alumno 21" "Alumno 22" "Alumno 23" "Alumno 24" "Alumno 25"
head(m.Rotada)        # Matriz rotada original
##         [,1]      [,2]        [,3]       [,4]
## A   8.877894 -1.203944  -0.5377327  4.1553911
## B   6.061918  9.038533  -0.7513522 -0.8562256
## C  16.276518 15.617019   0.5187139  0.8088270
## D -13.156847 -3.807327 -10.2223190  0.8536681
## E   9.903318 -3.179694  -3.1367821  1.6474314
## F  11.389822 -1.984059   3.7403017 -1.8262527
m.Rotada1 = as.data.frame (m.Rotada)    # Matriz rotada como data frame
m.Rotada1$nombres <-  datos2$Nombre     # Insertar nombres de los estudiantes
m.Rotada1 = as.matrix(m.Rotada1)        # M. rotada como matriz
rownames(m.Rotada1)= datos2[,1]      # Siglas para las operaciones

x11()
plot(m.Rotada1[,1:4], asp = 2, pch = 19,        # EdiciĂłn de la figura
     xlab="Eje 1", ylab="Eje 2")
text(m.Rotada1, labels = row.names(m.Rotada1[,1:4]), 
     pos = 3, cex=0.7, col = "blue")
abline(h=0, col = "red")
abline(v=0, col = "red")
grid()

#---------------
# 7) Análisis de Componentes Principales - pca
library(vegan)
datos2= read.csv2("datos1.csv")  # Base de datos original
datos2=na.omit(datos2)           # na.omit, para eliminar al estudiante 13
colnames(datos2) <- c("Nombre","Sexo","LTot","Cint","LEsp","LBra")
head(datos2)            # Base de datos abreviada
##     Nombre Sexo LTot Cint LEsp LBra
## 1 Alumno 1    F  170   85   43   57
## 2 Alumno 2    F  160   80   41   54
## 3 Alumno 3    F  156   88   35   48
## 4 Alumno 4    F  173   63   53   59
## 5 Alumno 5    M  170   86   47   56
## 6 Alumno 6    M  165   89   45   61
pca <- rda(datos2[3:6])   # eEalizaciĂłn del pca
rownames(datos2)= datos2[,1]      # Siglas para las operaciones

# Figura del pca
x11()
biplot(pca, type = c("text", "n"),scaling =2,     # Figura solo con variables morfométricas
       main="PCA - Scaling 2",cex=2)
text(pca, display="sites", cex=0.7,               # Graficas a los estudiantes
     col="blue", lwd=1.5, pos=3,
     labels = as.character(datos2$Nombre))        # Nombres de los estudiantes

#---------------
# 8) Figura en 3D de la matriz proyectada "m.Rotada"
library(plot3D)
m.Rotada1 = as.data.frame (m.Rotada)    # Matriz rotada como data frame
m.Rotada1$nombres <-  datos2$Nombre     # Insertar nombres de los estudiantes
colnames(m.Rotada1) <- c("Eje1","Eje2","Eje3","Eje4","Nombre")

plot(m.Rotada1[, c(1, 2)], pch = 19, asp = 1)   # Figura con ejes 1 y 2

plot(m.Rotada1[, c(1, 3)], pch = 19, asp = 1)   # Figura con ejes 1 y 3

plot(m.Rotada1[, c(2, 3)], pch = 19, asp = 1)   # Figura con ejes 2 y 3

x11()
str(m.Rotada1)
## 'data.frame':    24 obs. of  5 variables:
##  $ Eje1  : num  8.88 6.06 16.28 -13.16 9.9 ...
##  $ Eje2  : num  -1.2 9.04 15.62 -3.81 -3.18 ...
##  $ Eje3  : num  -0.538 -0.751 0.519 -10.222 -3.137 ...
##  $ Eje4  : num  4.155 -0.856 0.809 0.854 1.647 ...
##  $ Nombre: chr  "Alumno 1" "Alumno 2" "Alumno 3" "Alumno 4" ...
scatter3D (m.Rotada1[, 1], m.Rotada1[, 2],      # Figura con ejes 1, 2 y 3
           m.Rotada1[, 3], pch = 19, asp = 2)