Una matrice di varianze/covarianze

Si consideri la seguente matrice di varianze/covarianze \(\underset{2\times 2}{S} = \left[\begin{array}{cc} 2.2 & 0.4 \\ 0.4 & 2.8 \end{array} \right]\).

  1. Si calcoli la varianza totale, la varianza generalizzata e l’indice relativo di variabilità.
S <- matrix(c(2.2, 0.4, 0.4, 2.8),nrow=2,ncol=2)
S
     [,1] [,2]
[1,]  2.2  0.4
[2,]  0.4  2.8
# varianza totale
sum(diag(S)) 
[1] 5
# varianza generalizzata
det(S)
[1] 6
# indice relativo di variabilità
det(S) / prod(diag(S)) 
[1] 0.974026
R = diag(diag(S)^(-1/2)) %*% S %*% diag(diag(S)^(-1/2))
det(R)
[1] 0.974026
  1. Si calcolino gli autovalori \(\lambda_1\) e \(\lambda_2\) e gli autovettori normalizzati \(\underset{2\times 1}{v_1}\) e \(\underset{2\times 1}{v_2}\) di \(\underset{2\times 2}{S}\), verificando che gli autovettori normalizzati hanno lunghezza unitaria e sono ortogonali
eigenS <- eigen(S)

# autovalori
lambda1 <- eigenS$values[1]
lambda1
[1] 3
lambda2 <- eigenS$values[2]
lambda2
[1] 2
# autovettori (normalizzati)
v1 <- eigenS$vectors[,1, drop=F]
v1
          [,1]
[1,] 0.4472136
[2,] 0.8944272
v2 <- eigenS$vectors[,2, drop=F]
v2
           [,1]
[1,] -0.8944272
[2,]  0.4472136
# verifico che gli autovettori sono di lunghezza unitaria
t(v1) %*% v1
     [,1]
[1,]    1
# t(v2) %*% v2

# verifico che gli autovettori sono ortogonali
crossprod(v1,v2) # equivalente a t(v1) %*% v2
     [,1]
[1,]    0

Dati Animals

  1. Caricare il data set Animals, presente nella libreria MASS. Calcolare la matrice di varianze/covarianze \(S\) considerandi le variabili trasformate al logaritmo log(brain) e log(body), la varianza totale di \(S\), la varianza generalizzata di \(S\) e l’indice relativo di variabilità.
rm(list=ls())
library(MASS)
data(Animals)
X = log(Animals)
n = nrow(X)
S = var(X) * (n-1)/n
S
           body    brain
body  13.710061 6.800118
brain  6.800118 5.550965
# varianza totale
sum(diag(S))
[1] 19.26103
# varianza generalizzata
det(S)
[1] 29.86247
# indice relativo di variabilità
det(S) / prod(diag(S))
[1] 0.3923899
  1. Calcolare gli autovalori \(\lambda_1\) e \(\lambda_2\) e gli autovettori \(v_1\) e \(v_2\) di \(S\). Costruire il diagramma di dispersione per log(brain) e log(body). Aggiungere al grafico il baricentro \(\bar{x}'\) con il comando points specificando pch=19.

Utilizzando la libreria ellipse, aggiungere al diagramma di dispersione l’ellisse (comando ellipse()) specificando l’argomento x pari a \(S\), centre pari al baricentro e l’argomento t pari a 2.

Aggiungere gli assi dell’ellisse centrata sul baricentro con il comando arrows(), la cui direzione è determinata dai due autovettori e la cui lunghezza è proporzionale alla radice quadrata dei due autovalori.

eigenS <- eigen(S)

# autovalori
lambda1 <- eigenS$values[1]
lambda2 <- eigenS$values[2]

# autovettori (normalizzati)
v1 <- eigenS$vectors[,1, drop=F]
v2 <- eigenS$vectors[,2, drop=F]

# diagramma dispersione
plot(X)
# baricentro
bc = colMeans(X)
points(bc[1],bc[2], pch=19)

# ellisse
library(ellipse)
lines(ellipse(x=S,centre = bc, t = 1))
arrows(x0 = bc[1], y0 = bc[2], x1 = sqrt(lambda1)*v1[1] + bc[1], y1=sqrt(lambda1)*v1[2] + bc[2], length = 0.1, col=2)
arrows(x0 = bc[1], y0 = bc[2], x1 = sqrt(lambda2)*v2[1] + bc[1], y1=sqrt(lambda2)*v2[2] + bc[2], length = 0.1, col=2)