1. Se cargan los datos
D=read.table("Dados.txt",head=TRUE)
D$Trat=as.factor(D$Trat)
D$Bloco=as.factor(D$Bloco)
print(D)
##    Trat Bloco   X1   X2  X3    X4
## 1    T1     1 50.2 20.5 3.9 104.9
## 2    T2     1 41.8 19.5 3.7  88.0
## 3    T3     1 39.2 19.0 4.5  80.0
## 4    T4     1 33.8 20.0 4.3  80.8
## 5    T5     1 35.6 20.0 4.1  60.0
## 6    T6     1 53.4 19.2 4.2  96.4
## 7    T7     1 43.8 19.5 4.3  91.5
## 8    T8     1 50.6 19.7 4.2  91.8
## 9    T1     2 41.4 20.6 4.0  84.3
## 10   T2     2 47.2 20.1 3.6 106.5
## 11   T3     2 37.6 18.5 4.6  71.3
## 12   T4     2 49.6 20.3 4.4 106.5
## 13   T5     2 31.4 20.8 4.0  52.5
## 14   T6     2 50.2 19.5 4.5  98.8
## 15   T7     2 46.8 20.4 4.3  99.7
## 16   T8     2 57.8 19.8 4.0  84.8
## 17   T1     3 36.2 20.5 3.8  77.0
## 18   T2     3 39.6 19.3 3.6  89.8
## 19   T3     3 38.8 18.1 4.6  77.5
## 20   T4     3 35.4 20.6 4.2  83.3
## 21   T5     3 33.2 20.3 4.2  53.0
## 22   T6     3 49.6 20.3 4.3  99.1
## 23   T7     3 41.4 20.7 4.2  83.3
## 24   T8     3 41.8 20.1 4.3  70.6
## 25   T1     4 39.8 19.6 3.9  76.5
## 26   T2     4 46.6 20.1 3.7 108.7
## 27   T3     4 33.6 19.3 4.7  69.5
## 28   T4     4 41.8 20.3 4.3  95.9
## 29   T5     4 29.8 19.9 4.1  51.0
## 30   T6     4 57.8 19.9 4.5 107.2
## 31   T7     4 43.6 20.3 4.3  89.5
## 32   T8     4 46.8 20.5 4.1  81.5
  1. Se corre el MANOVA
m=aov(cbind(X1,X2,X3,X4)~Trat+Bloco,data=D)
anova(m)
## Analysis of Variance Table
## 
##             Df  Pillai approx F num Df den Df Pr(>F)    
## (Intercept)  1 0.99988    38097      4     18 <2e-16 ***
## Trat         7 3.12170       11     28     84 <2e-16 ***
## Bloco        3 0.54976        1     12     60 0.3602    
## Residuals   21                                          
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  1. Obtención de la matriz de covarianza
SQP=crossprod(m$residuals)
CRE=SQP/m$df.residual
CRE
##             X1           X2           X3          X4
## X1 18.74505952  0.016428571 -0.014702381 30.68357143
## X2  0.01642857  0.187976190 -0.003690476  0.85071429
## X3 -0.01470238 -0.003690476  0.009583333  0.09083333
## X4 30.68357143  0.850714286  0.090833333 71.79547619
  1. Obtención de matriz de medias
Med=aggregate(D[,3:6],by=list(D$Trat),mean)[,-1]
Med2=as.matrix(Med)
Med2
##         X1     X2    X3      X4
## [1,] 41.90 20.300 3.900  85.675
## [2,] 43.80 19.750 3.650  98.250
## [3,] 37.30 18.725 4.600  74.575
## [4,] 40.15 20.300 4.300  91.625
## [5,] 32.50 20.250 4.100  54.125
## [6,] 52.75 19.725 4.375 100.375
## [7,] 43.90 20.225 4.275  91.000
## [8,] 49.25 20.025 4.150  82.175
  1. Obtención de las distancias entre tratamientos.
V=Med2[1,]-Med2[2,]
t(V)%*%solve(CRE)%*%V
##          [,1]
## [1,] 23.68515
  1. Existe una libreria para realizar todo de forma más rápida
library(biotools)
## Loading required package: MASS
## ---
## biotools version 4.2
library(MASS)
Dist=D2.dist(Med2,CRE)
Dist
##            1          2          3          4          5          6          7
## 2  23.685155                                                                  
## 3  63.031223 125.993410                                                       
## 4  17.571079  57.047785  26.304830                                            
## 5  30.073588 101.542843  47.385974  37.424790                                 
## 6  34.597979  91.840067  21.936933  17.456090  40.065822                      
## 7  15.533134  64.168870  23.678284   3.141215  26.009345   7.645087           
## 8  29.399815  97.579518  43.372241  34.617702  15.680076  13.462747  17.252613
  1. A partir de la información se pueden construir dendogramas.
dendo=hclust(Dist)
plot(dendo)

# Datos de ejemplo en forma de data frame
data <- data.frame(
  x1 = c(2, 3, 5, 7, 1),
  x2 = c(9, 4, 6, 8, 10),
  x3 = c(3, 6, 8, 1, 5)
)

# Punto de referencia (puede ser cualquier punto en el espacio)
reference_point <- c(3, 6, 8)

# Calcular la matriz de covarianza
cov_matrix <- cov(data)

# Calcular la matriz de covarianza inversa
inv_cov_matrix <- solve(cov_matrix)

# Calcular la diferencia entre cada punto y el punto de referencia
diff <- t(t(data) - reference_point)

# Calcular la distancia de Mahalanobis para cada punto
mahalanobis_distances <- sqrt(rowSums((diff %*% inv_cov_matrix) * diff))

# Mostrar las distancias de Mahalanobis
print(mahalanobis_distances)
## [1] 2.078113 1.937022 1.016288 2.784251 1.783430