UN EJERCICIO RESUELTO DE ANALISIS FACTORIAL EN R Y PYTHON

La matriz

\[ \mathbf{R}=\left(\begin{array}{rrrr} 1 & 0.69 & 0.28 & 0.35 \\ & 1 & 0.255 & 0.195 \\ & & 1 & 0.61 \\ & & & 1 \end{array}\right) \]

exhibe las correlaciones muestrales entre cuatro variables que caracterizan el estado financiero de una empresa.
(a) Calcúlense los autovalores y autovectores de \(\mathbf{R}\).
(b) Plantéese el modelo factorial ortogonal con \(m\) factores para el vector X que generó estos datos.
(c) Mediante el método de la componente principal, en los modelos factoriales con \(m=2\) y \(m=3\) factores, calcúlense las matrices de cargas, las comunalidades \(y\) el porcentaje que supone la comunalidad respecto a la varianza de cada variable.
(d) Decídase razonadamente entre el modelo con dos o tres factores.
(e) Para el modelo seleccionado en el apartado (d), calcúlense las correlaciones entre \(Z_2\) (la variable \(X_2\) estandarizada) y todos los factores. Estímese la varianza específica para \(Z_2\).

a) Calcúlense los autovalores y autovectores de \(\mathbf{R}\).

# Definir la matriz de correlaciones R
R <- matrix(c(
  1,    0.69, 0.28, 0.35,
  0.69, 1,    0.255, 0.195,
  0.28, 0.255, 1,    0.61,
  0.35, 0.195, 0.61, 1
), nrow = 4, byrow = TRUE)

# Calcular autovalores y autovectores
eigen_result <- eigen(R)
eigenvalues <- eigen_result$values
eigenvectors <- eigen_result$vectors

# Mostrar resultados
cat("Autovalores:\n")
Autovalores:
print(eigenvalues)
[1] 2.1934936 1.1139122 0.4245337 0.2680605
cat("\nAutovectores:\n")

Autovectores:
print(eigenvectors)
           [,1]       [,2]       [,3]       [,4]
[1,] -0.5400146  0.4242617  0.3410593  0.6419227
[2,] -0.4938005  0.5396858 -0.3205753 -0.6017739
[3,] -0.4796755 -0.5123135 -0.6539348  0.2825165
[4,] -0.4842073 -0.5160195  0.5943730 -0.3820836
import numpy as np

# Definir la matriz de correlaciones R
R = np.array([
    [1,    0.69, 0.28, 0.35],
    [0.69, 1,    0.255, 0.195],
    [0.28, 0.255, 1,    0.61],
    [0.35, 0.195, 0.61, 1]
])

# Calcular autovalores y autovectores
eigenvalues, eigenvectors = np.linalg.eig(R)

# Mostrar resultados
print("Autovalores:")
Autovalores:
print(eigenvalues)
[2.19349363 1.11391221 0.26806047 0.42453368]
print("\nAutovectores:")

Autovectores:
print(eigenvectors)
[[ 0.54001464  0.42426167  0.64192272  0.34105931]
 [ 0.49380051  0.5396858  -0.60177386 -0.3205753 ]
 [ 0.4796755  -0.51231351  0.28251648 -0.6539348 ]
 [ 0.48420725 -0.51601952 -0.38208361  0.59437303]]

c) Mediante el método de la componente principal, en los modelos factoriales con \(m=2\) y \(m=3\) factores, calcúlense las matrices de cargas, las comunalidades \(y\) el porcentaje que supone la comunalidad respecto a la varianza de cada variable.

# Extraer los dos primeros autovalores y autovectores
lambda_1 <- eigenvalues[1]
lambda_2 <- eigenvalues[2]
e1 <- eigenvectors[, 1]
e2 <- eigenvectors[, 2]

# Calcular la matriz de cargas L
L <- cbind(sqrt(lambda_1) * e1, sqrt(lambda_2) * e2)

# Calcular las comunalidades
communalities <- rowSums(L^2)

# Mostrar resultados
cat("Matriz de cargas (m = 2):\n")
Matriz de cargas (m = 2):
print(L)
           [,1]       [,2]
[1,] -0.7997859  0.4477744
[2,] -0.7313407  0.5695954
[3,] -0.7104209 -0.5407061
[4,] -0.7171326 -0.5446175
cat("\nComunalidades:\n")

Comunalidades:
print(communalities)
[1] 0.8401593 0.8592981 0.7970610 0.8108875
# Extraer los dos primeros autovalores y autovectores
lambda_1, lambda_2 = eigenvalues[:2]
e1, e2 = eigenvectors[:, 0], eigenvectors[:, 1]

# Calcular la matriz de cargas L
L = np.column_stack((np.sqrt(lambda_1) * e1, np.sqrt(lambda_2) * e2))

# Calcular las comunalidades
communalities = np.sum(L**2, axis=1)

# Mostrar resultados
print("Matriz de cargas (m = 2):")
Matriz de cargas (m = 2):
print(L)
[[ 0.79978586  0.44777442]
 [ 0.73134067  0.5695954 ]
 [ 0.71042089 -0.54070612]
 [ 0.71713263 -0.54461753]]
print("\nComunalidades:")

Comunalidades:
print(communalities)
[0.84015935 0.85929809 0.79706095 0.81088746]
# Extraer los tres primeros autovalores y autovectores
lambda_3 <- eigenvalues[3]
e3 <- eigenvectors[, 3]

# Actualizar la matriz de cargas L
L <- cbind(L, sqrt(lambda_3) * e3)

# Recalcular las comunalidades
communalities <- rowSums(L^2)

# Mostrar resultados
cat("Matriz de cargas (m = 3):\n")
Matriz de cargas (m = 3):
print(L)
           [,1]       [,2]       [,3]
[1,] -0.7997859  0.4477744  0.2222215
[2,] -0.7313407  0.5695954 -0.2088748
[3,] -0.7104209 -0.5407061 -0.4260794
[4,] -0.7171326 -0.5446175  0.3872712
cat("\nComunalidades:\n")

Comunalidades:
print(communalities)
[1] 0.8895417 0.9029268 0.9786046 0.9608664
# Extraer el tercer autovalor y autovector
lambda_3 = eigenvalues[2]
e3 = eigenvectors[:, 2]

# Actualizar la matriz de cargas L
L = np.column_stack((L, np.sqrt(lambda_3) * e3))

# Recalcular las comunalidades
communalities = np.sum(L**2, axis=1)

# Mostrar resultados
print("Matriz de cargas (m = 3):")
Matriz de cargas (m = 3):
print(L)
[[ 0.79978586  0.44777442  0.33235264]
 [ 0.73134067  0.5695954  -0.31156575]
 [ 0.71042089 -0.54070612  0.14627165]
 [ 0.71713263 -0.54461753 -0.1978221 ]]
print("\nComunalidades:")

Comunalidades:
print(communalities)
[0.95061763 0.9563713  0.81845635 0.85002104]

d)

# Calcular el porcentaje de varianza explicada
total_variance <- sum(eigenvalues)
explained_variance_m2 <- sum(eigenvalues[1:2]) / total_variance * 100
explained_variance_m3 <- sum(eigenvalues[1:3]) / total_variance * 100

# Mostrar resultados
cat("Porcentaje de varianza explicada (m = 2):", explained_variance_m2, "%\n")
Porcentaje de varianza explicada (m = 2): 82.68515 %
cat("Porcentaje de varianza explicada (m = 3):", explained_variance_m3, "%\n")
Porcentaje de varianza explicada (m = 3): 93.29849 %
# Calcular el porcentaje de varianza explicada
total_variance = np.sum(eigenvalues)
explained_variance_m2 = np.sum(eigenvalues[:2]) / total_variance * 100
explained_variance_m3 = np.sum(eigenvalues[:3]) / total_variance * 100

# Mostrar resultados
print("Porcentaje de varianza explicada (m = 2):", explained_variance_m2, "%")
Porcentaje de varianza explicada (m = 2): 82.68514609447011 %
print("Porcentaje de varianza explicada (m = 3):", explained_variance_m3, "%")
Porcentaje de varianza explicada (m = 3): 89.38665787715759 %

e)

# Correlaciones entre Z2 y los factores
correlations_Z2 <- L[2, ]

# Varianza específica para Z2
psi_2 <- 1 - communalities[2]

# Mostrar resultados
cat("Correlaciones entre Z2 y los factores:\n")
Correlaciones entre Z2 y los factores:
print(correlations_Z2)
[1] -0.7313407  0.5695954 -0.2088748
cat("\nVarianza específica para Z2:", psi_2, "\n")

Varianza específica para Z2: 0.09707321 
# Correlaciones entre Z2 y los factores
correlations_Z2 = L[1, :]

# Varianza específica para Z2
psi_2 = 1 - communalities[1]

# Mostrar resultados
print("Correlaciones entre Z2 y los factores:")
Correlaciones entre Z2 y los factores:
print(correlations_Z2)
[ 0.73134067  0.5695954  -0.31156575]
print("Varianza específica para Z2:", psi_2)
Varianza específica para Z2: 0.04362869979254769