Sie können das Invertieren der Matrix vermeiden, indem Sie mit der Eigendekompositionsmethode Zeichnungen zeichnen. Nach dieser Methode werden die Ziehungen mit diesem Produkt generiert:
( V.D.)⊤X.⊤,
Dabei ist die Eigenvektoren der Matrix, eine Diagonalmatrix mit den Quadratwurzeln der Eigenwerte und
eine Matrix mit Zeichnungen aus der univariaten Standardverteilung
.V.D.X.N.( 0 , 1 )
Es ist einfach, diese Methode anzupassen und zu vermeiden, die ursprüngliche Kovarianzmatrix wiederherzustellen, indem folgende Ergebnisse verwendet werden: 1) Die Eigenwerte einer Matrix sind der Kehrwert der Eigenwerte ihrer inversen ; 2) Die Eigenvektoren einer Matrix A sind auch Eigenvektoren ihrer inversen .EINEIN- 1EIN- 1
Beispiel:
Angenommen, die ursprüngliche Kovarianzmatrix lautet wie folgt:
A =⎡⎣⎢10,8- 0,40,820,3- 0,40,33⎤⎦⎥.
Aber Sie haben die Umkehrung dieser Matrix, :
B =EIN- 1EIN- 1= B =⎡⎣⎢1,699- 0,7250,299- 0,7250,817- 0,1780,299- 0,1780,391⎤⎦⎥.
Die auf der ursprünglichen Matrix basierende Eigendekompositionsmethode
ergibt die folgende Kovarianzmatrix für eine Stichprobe von Zeichnungen:EIN
A <- rbind(c(1,0.8,-0.4), c(0.8,2,0.3), c(-0.4,0.3,3))
e1 <- eigen(A, symmetric=TRUE)
set.seed(1)
X <- matrix(rnorm(5000*ncol(A)), ncol=ncol(A))
draws1 <- t(e1$vectors %*% sqrt(diag(e1$values)) %*% t(X))
draws1.cov <- cov(draws1)
draws1.cov
# [,1] [,2] [,3]
#[1,] 0.9765023 0.8030752 -0.3970233
#[2,] 0.8030752 1.9941052 0.3229827
#[3,] -0.3970233 0.3229827 3.1689348
Mit der Matrix, die Sie haben (die Umkehrung von A
), müssen Sie nur die Eigenwerte invertieren:
B <- solve(A)
e2 <- eigen(B, symmetric=TRUE)
e2$values <- 1/e2$values
draws2 <- t(e2$vectors %*% sqrt(diag(e2$values)) %*% t(X))
draws2.cov <- cov(draws2)
draws2.cov
# [,1] [,2] [,3]
#[1,] 0.9765023 0.8030752 -0.3970233
#[2,] 0.8030752 1.9941052 0.3229827
#[3,] -0.3970233 0.3229827 3.1689348
Man erhält eine Kovarianzmatrix, die eng mit der ursprünglichen übereinstimmt, und wir mussten nicht invertieren B
, um die ursprüngliche Kovarianzmatrix wiederherzustellen A
.
Eine kleine Simulation zur Überprüfung der Gültigkeit dieses Ansatzes:
set.seed(3)
niter <- 1000
m <- matrix(0, nrow=ncol(A), ncol=ncol(A))
for (i in seq_len(niter))
{
X <- matrix(rnorm(5000*ncol(A)), ncol=ncol(A))
draws2 <- t(e2$vectors %*% sqrt(diag(e2$values)) %*% t(X))
m <- m + cov(draws2)
}
m/niter
# average covariance matrix
# [,1] [,2] [,3]
#[1,] 1.0005129 0.7995872 -0.4005644
#[2,] 0.7995872 1.9993231 0.2990850
#[3,] -0.4005644 0.2990850 2.9957277
# original covariance matrix 'A'
# [,1] [,2] [,3]
#[1,] 1.0 0.8 -0.4
#[2,] 0.8 2.0 0.3
#[3,] -0.4 0.3 3.0
Wir können sehen, dass die Kovarianzmatrix der Draws im Durchschnitt sehr nahe an der ursprünglichen Kovarianzmatrix liegt A
.