# Datos proporcionados
datos <- "
22.72|69.13|1010.81|92.43|438.01
10.12|40|1021.33|95.29|476.03
10.05|41.17|1018.98|83.71|481.38
6.86|38.08|1019.62|77.37|486.92
19.36|39.54|1008.97|58.92|458.75
12.35|44.2|1017.81|82.49|471.65
6.77|40.78|1024.86|96.58|478.24
24.03|58.46|1015.71|70.15|442.03
17.85|45.64|1020.11|82.94|459.59
17.95|59.15|1012.73|84.27|449.14
10.02|39.82|1012.86|89.47|482.47
29.04|62.26|1010.63|56.6|433.97
20.78|60.84|1018.66|80.4|445.82
33.43|69.88|1006.86|44.84|435.59
27.34|70.98|1008.82|71.42|438.73
14.31|40.78|1024.3|76.41|463.54
5.33|39.33|1009.61|94.97|491.17
25.38|74.67|1016.61|81.34|435.41
21.04|69.48|1011.07|89.92|439.53
17.18|63.09|1020.67|93.58|451.37
33.82|73.03|1013.49|42.17|439.3
19.1|56.53|1020.18|76.38|455.52
21.49|61.27|1019.81|63.21|450.07
21.8|65.94|1012.02|63.52|448.66
8.13|39.99|1011.71|87.89|486.19
5.4|39.4|1011.45|91.84|485.86
24.96|70.47|1007.73|76.48|438.23
18.75|44.9|1007.99|75.76|452.77
18.17|66.86|1011.29|78.48|452.77
17.73|43.72|1009.33|76.68|453.94
9.83|41.17|1019.34|72.29|477.39
9.83|41.17|1019.34|72.29|477.91
9.83|41.17|1019.34|72.29|478.95
6.06|41.17|1019.67|84.7|490.6
6.06|41.17|1019.67|84.7|489.84
25.53|59.57|1010.65|82.04|444.63
25.53|59.57|1010.65|82.04|446.36
25.53|59.57|1010.65|82.04|445.51
25.53|59.57|1010.65|82.04|445.12
25.53|59.57|1010.65|82.04|445.17
24.63|59.57|1010.45|85.36|440.1
24.63|59.57|1010.45|85.36|441.04
24.63|59.57|1010.45|85.36|439.86
25.42|75.6|1017.39|77.63|436.81
25.42|75.6|1017.39|77.63|438.39
"

# Convertir los datos en una matriz
matriz_datos <- as.matrix(read.table(text = datos, sep = "|"))

# Construir la matriz de diseño X
X <- cbind(1, matriz_datos[, -ncol(matriz_datos)])  # Agregar una columna de unos para el término de intercepción

# Calcular X^TX
XTX <- t(X) %*% X

# Calcular el rango de X^TX
rango_XTX <- qr(XTX)$rank

print(paste("El rango de la matriz producto X^TX es:", rango_XTX))
## [1] "El rango de la matriz producto X^TX es: 5"