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]\).
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
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
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
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)