Un espacio vectorial \(V\) de dimension \(n\) se identifica naturalmente con \(\real^n\) o sea con el conjunto de su coordenadas sobre una base \(B\). De hecho podemos pensar a \(B\) como la base canonica de \(\real^n\), compuesta por vectores con componentes nulas sino solo una con 1 en la \(i\)-esima posición, \(i = 1,\dots,n\). En el caso \(n=3\) se tiene:
b_1 <- c(1,0,0)
cat("b_1 =", b_1,"\n")
## b_1 = 1 0 0
b_2 <- c(0,1,0)
cat("b_2 =", b_2,"\n")
## b_2 = 0 1 0
b_3 <- c(0,0,1)
cat("b_3 =", b_3,"\n")
## b_3 = 0 0 1
B_V <- cbind(b_1,b_2,b_3)
cat("B_V =\n", fmti(B_V),"\n")
## B_V =
## 1 0 0
## 0 1 0
## 0 0 1
##
Observen que los tres vectores, escritos uno a la vez, aún por fila, se entiende que sean vectores-columna, ya que un vector-fila se escribe como traspuesto:
t(b_1)
## [,1] [,2] [,3]
## [1,] 1 0 0
como si fuera una matriz \(1 \times 3\). Se puede también definir un vector como una matriz, y en este caso como \(3 \times 1\) con:
as.matrix(b_1)
## [,1]
## [1,] 1
## [2,] 0
## [3,] 0
Nótese la diferencia con el mismo comando aplicado al vector transpuesto:
as.matrix(t(b_1))
## [,1] [,2] [,3]
## [1,] 1 0 0
que se resulta una matriz \(1 \times 3\).
Suponemos ahora de definir una nueva base, y sea \(C_V\):
c_1 <- c(1,2,3)
cat("c_1 = ", c_1,"\n")
## c_1 = 1 2 3
c_2 <- c(2,3,1)
cat("c_2 = ",c_2,"\n")
## c_2 = 2 3 1
c_3 <- c(3,1,2)
cat("c_3 = ",c_3,"\n")
## c_3 = 3 1 2
C_V <- cbind(c_1,c_2,c_3)
cat("C_V = \n", fmti(C_V),"\n")
## C_V =
## 1 2 3
## 2 3 1
## 3 1 2
##
M_BC <- C_V
cat("M_BC = \n", fmti(M_BC),"\n")
## M_BC =
## 1 2 3
## 2 3 1
## 3 1 2
##
La matriz de cambio de base \(M_{BC}\) tal que \(C_V = B_V M_{BC}\) en este caso coincide con \(C_V\), ya que \(B_V\) es la matriz idéntica.
Por otro lado, la matriz \(M_{CB}\) que pasa de la base \(C_V\) a \(B_V\) resulta ser su inversa: \(M_{CB} = M_{BC}^{-1}\):
M_CB <- solve(M_BC)
cat("M_CB = \n", fmtr(M_CB),"\n")
## M_CB =
## -0.2778 0.0556 0.3889
## 0.0556 0.3889 -0.2778
## 0.3889 -0.2778 0.0556
##
cat("C_V M_CB = \n", fmtr(C_V%*%M_CB),"\n")
## C_V M_CB =
## 1.0000 -0.0000 0.0000
## 0.0000 1.0000 0.0000
## 0.0000 0.0000 1.0000
##
De hecho, el comando solve() calcula la matriz inversa.
Definimos otra matriz de cambio de base $M_{CD} y empleamo esta para construir una nueva base \(D_V\):
M_CD <- matrix(c(1,2,3,5,4,-1,2,3,-5),nrow=3,ncol=3)
cat("M_CD = \n", fmti(M_CD),"\n")
## M_CD =
## 1 5 2
## 2 4 3
## 3 -1 -5
##
M_CD1 <- solve(M_CD)
cat("M_CD1 = M_DC = \n", fmtr(M_CD1),"\n")
## M_CD1 = M_DC =
## -0.3400 0.4600 0.1400
## 0.3800 -0.2200 0.0200
## -0.2800 0.3200 -0.1200
##
M_DC <- M_CD1
El hecho que \(M_{CD}1 = M_{CD}^{-1}\) exista nos segura que \(M_{CD}\), en cuanto invertible, es un cambio de base. Entonces se resulta la nueva base \(D_V\):
D_V <- C_V%*%M_CD
cat("D_V = \n", fmti(D_V),"\n")
## D_V =
## 14 10 -7
## 11 21 8
## 11 17 -1
##
cat("d_1 = ",D_V[,1],"\n")
## d_1 = 14 11 11
cat("d_2 = ",D_V[,2],"\n")
## d_2 = 10 21 17
cat("d_3 = ",D_V[,3],"\n")
## d_3 = -7 8 -1
Claro que se resulta
cat("D_V M_DC = C_V = \n", fmtr(D_V%*%M_DC),"\n")
## D_V M_DC = C_V =
## 1.0000 2.0000 3.0000
## 2.0000 3.0000 1.0000
## 3.0000 1.0000 2.0000
##
correspondiente a la base \(C_V\).
Si tenemos un vector \(w\) con coordenadas \(w_D\) con respecto a \(D_V\), la misma matriz \(M_{CD}\) que cambia la base de \(C_V\) a \(D_V\) proporciona las coordenadas \(w_C\) de \(w\) con respecto a \(C_V\), ya que \(w = D_V w_D = C_V M_{CD} w_D = C_V w_C\), así que \(w_C = M_{CD} w_D\). Al revés, se resulta \(v = C v_C = D_V M_{DC} v_C = D_V v_D\), así que \(v_D = M_{DC} v_C\).
v_C <- c(2,1,2)
cat("v_C = ", v_C,"\n")
## v_C = 2 1 2
cat("M_DC = \n", fmtr(M_DC),"\n")
## M_DC =
## -0.3400 0.4600 0.1400
## 0.3800 -0.2200 0.0200
## -0.2800 0.3200 -0.1200
##
v_D <- as.vector(M_DC%*%v_C)
cat("v_D = ", v_D,"\n")
## v_D = 0.06 0.58 -0.48
w_D <- c(5,6,7)
cat("w_D = ", w_D,"\n")
## w_D = 5 6 7
w_C <- as.vector(M_CD%*%w_D)
cat("w_C = ", w_C,"\n")
## w_C = 49 55 -26
w_Dn <- as.vector(M_DC%*%w_C)
cat("w_D = ", w_Dn,"\n")
## w_D = 5 6 7
Se exprime este resultado diciendo que la coordenadas de un vector son contravariantes con respecto a la matriz de cambio de base, ya que, si \(C_V = B_V M_{BC}\) \(v_C = M_{CB} v_B\), con \(M_{BC} = M_{CB}^{-1}\).
Nótese que el comando as.vector() se ha usado para que el vector no se imprimía como matriz columna.
Una forma lineal es una función \(f: V \longrightarrow \real\) que respecta las combinaciones lineales. Esta se exprime por un vector-fila, ya que así su aplicación a cualquier vector se resulta en la forma vector-fila por vector-columna.
f_C <- t(c(1,2,3))
cat("f_C = ", f_C,"\n")
## f_C = 1 2 3
cat("f_C v_C = ", f_C%*%v_C,"\n")
## f_C v_C = 10
¿Que sucede si de \(C_V\) se pasa a \(D_V\)? Claro que, como tiene que ser \(f v = f_C v_C = f_D v_D\) y por lo tanto, si \(v_D = M_{DC} v_C\) tiene que ser \(f_D = f_C M_{CD}\), de modo que resulte \(f v = f_D v_D = f_C M_{CD} M_{DC} v_C = f_C v_C\) ya que \(M_{CD} M_{DC} = I\).
Se resulta por tanto que las componentes de una forma cambian por respecto a un cambio de base en modo covariante. Efectivamente, se consigue:
#v_C
#v_D = M_DC%*%v_C
cat("f_C v_C = ", f_C%*%v_C,"\n")
## f_C v_C = 10
f_D <- f_C %*% M_CD
cat("f_D = ", f_D,"\n")
## f_D = 14 10 -7
cat("v_D = ", v_D,"\n")
## v_D = 0.06 0.58 -0.48
cat("f_D v_D = ", f_D%*%v_D,"\n")
## f_D v_D = 10
Analogamente a una forma lineal, una forma bilineal \(Q: V\times V\longrightarrow \real\) se encuentra definida una vez que se define su valor por cualquier pareja de vectores de una base. Por consequencia, data una base \(C_V\) una forma bilineal corresponde a una matriz cuadrada \(Q_C = \{q_ij\} = \{q(b_i,b_j\}\). Su aplicación se resulta ser data para el producto matricial \(Q(v,w)=v_C' Q_C w_C\).
Q_C <- matrix(c(3,2,3,-1,4,2,6,4,6),nrow=3,ncol=3,byrow=TRUE)
cat("Q_C = \n", fmti(Q_C),"\n")
## Q_C =
## 3 2 3
## -1 4 2
## 6 4 6
##
vw <- t(v_C)%*%Q_C%*%w_C
cat("vw = Q_C(v_C,w_C) = ", vw,"\n")
## vw = Q_C(v_C,w_C) = 1193
Si se quiere calcular la matriz para otra base, por ejemplo \(B_V\), se resulta \(Q_B = M_{CB}' Q_C M_{CB}\), o sea hay que multiplicar a la derecha para la matriz del cambio de base y a la izquierda por su traspuesta:
Q_B <- t(M_CB) %*%Q_C%*% M_CB
cat("Q_B = \n", fmtr(Q_B),"\n")
## Q_B =
## 0.2932 0.1080 0.3117
## 0.2747 0.3117 -0.9290
## -0.1327 -0.2068 0.7747
##
y efectivamente, si se toman los mismos vectores, pero con coordenadas con respecto a \(B_V\), se resulta:
v_B <- as.vector(M_BC%*%v_C)
w_B <- as.vector(M_BC%*%w_C)
vwn <- t(v_B)%*%Q_B%*%w_B
cat("vw = Q_B(v_B,w_B) = ", vwn)
## vw = Q_B(v_B,w_B) = 1193
Sabemos que una transformación lineal es una función \(T: V \longrightarrow W\), que a cada vector \(v\) asocia uno y un solo vector \(w\) conservando las combinaciones lineales. Por tanto, \(T\) está definida a penas se ha definido sobre los vectores de una base.
Sea \(T_{CD}\) representada con respecto a la base \(C_V\) de \(V\) y \(D_W\) de \(W\) para:
T_CD <- matrix(c(1,1,2,3,1,2,-1,-1,3),nrow=3,ncol=3)
cat("T_CD = \n", fmti(T_CD),"\n")
## T_CD =
## 1 3 -1
## 1 1 -1
## 2 2 3
##
T_CD1 <- solve(T_CD)
cat("T_CD1 = \n", fmtr(T_CD1),"\n")
## T_CD1 =
## -0.5000 1.1000 0.2000
## 0.5000 -0.5000 0.0000
## -0.0000 -0.4000 0.2000
##
En este caso la transformación es invertible y por lo tanto los vectores de \(W\) correspondientes a las columnas de \(T_{CD}\) constituyen una base \(T_{CD_W} = D_W T_{CD}\). Claro que, en esta base \(T_{CD_W}\), las coordenadas del transformado \(T(v_C)\) del vector \(C_V v_C\) siguen ser \(v_C\). Por otro lado, con respecto a \(D_W\) las coordenadas serán \(v_D = M_{DT_{CD}} v_C = T_{CD} v_C\), \(M_{DT_{CD}}\) sendo la matriz de cambio de base de \(D_W\) a \(T_{CD_W}\).
Sea \(D_W\) la base de \(W\)
D_W <- matrix(c(-1,1,1,2,0,-2,2,1,3),nrow=3,ncol=3)
cat("D_W = \n", fmti(D_W),"\n")
## D_W =
## -1 2 2
## 1 0 1
## 1 -2 3
##
D_W1 <- solve(D_W)
cat("D_W1 = \n", fmtr(D_W1),"\n")
## D_W1 =
## -0.2000 1.0000 -0.2000
## 0.2000 0.5000 -0.3000
## 0.2000 0.0000 0.2000
##
\(D_W\) es una base de \(W\) ya que, con respecto a la base canónica está representada para una matriz invertible.
Sea \(v_V\) un vector de \(V\) definido para su coordenadas \(v_C\) con respecto a \(C_V\). Las coordenadas con respecto a \(D_W\) de su transformado \(w_W = T_{CD}(v_V)\) serán entonces:
cat("v_C = ", v_C)
## v_C = 2 1 2
w_D <- T_CD%*%v_C
cat("w_D = ", as.vector(w_D),"\n")
## w_D = 3 1 12
Ya que \(T_{CD}\) es invertible, ¿que tal si aplicamos su inversa \(T_{CD}^{-1}\) a \(D_W\)? Es evidente que aplicando \(T_{CD}^{-1}\) a la base \(T_{CD_W}\) se debe recoger \(C_V\), o sea \(T_{CD} T_{CD}^{-1} = I\). Pero, aplicando \(T_{CD}^{-1}\) a \(D_W\) se resulta otra base de \(V\). De hecho, se resulta:
T_DC <- T_CD1
T_DC_V <- D_W %*% T_DC
cat("T_DC_V = \n", fmtr(T_DC_V),"\n")
## T_DC_V =
## 1.5000 -2.9000 0.2000
## -0.5000 0.7000 0.4000
## -1.5000 0.9000 0.8000
##
que no es \(C_V\), ya que estas son su coordenadas con respecto a \(V_C\).
lin <- read.csv("Linnerud.csv",header=TRUE,row.names=1)
n <- dim(lin)[1]
p <- dim(lin)[2]
cat(paste0("Tabla de Linnerud: ", n, " units, ",p, " variables. \n"), fmti(lin),"\n")
## Tabla de Linnerud: 20 units, 6 variables.
## 191 36 50 5 162 60
## 189 37 52 2 110 60
## 193 38 58 12 101 101
## 162 35 62 12 105 37
## 189 35 46 13 155 58
## 182 36 56 4 101 42
## 211 38 56 8 101 38
## 167 34 60 6 125 40
## 176 31 74 15 200 40
## 154 33 56 17 251 250
## 169 34 50 17 120 38
## 166 33 52 13 210 115
## 154 34 64 14 215 105
## 247 46 50 1 50 50
## 193 36 46 6 70 31
## 202 37 62 12 210 120
## 176 37 54 4 60 25
## 157 32 52 11 230 80
## 156 33 54 15 225 73
## 138 33 68 2 110 43
##
m <- apply(lin,2,mean);
s <- sqrt((n-1)/n)*apply(lin,2,sd)
stat <- cbind(m,s^2,s)
rownames(stat) <- colnames(lin)
colnames(stat) <- c("mean","variance","standard deviation")
cat("Univariate statistics \n")
## Univariate statistics
stat
## mean variance standard deviation
## Weight 178.60 579.1400 24.065328
## Waist 35.40 9.7400 3.120897
## Pulse 56.10 49.3900 7.027802
## Pulls 9.45 26.5475 5.152427
## Squats 145.55 3718.8475 60.982354
## Jumps 70.30 2497.9100 49.979096