Pytanie dotyczy sposobu generowania przypadkowych zmiennymi z wielowymiarowym rozkładu normalnego z (ewentualnie) pojedynczej macierzy kowariancji . Ta odpowiedź wyjaśnia jeden ze sposobów, który będzie działał dla dowolnej macierzy kowariancji. Zapewnia implementację, która sprawdza jej dokładność.CR
Analiza algebraiczna macierzy kowariancji
Ponieważ jest macierzą kowariancji, z konieczności jest symetryczna i dodatnio-pół-skończona. Aby uzupełnić informacje podstawowe, niech μ będzie wektorem pożądanych środków.Cμ
Ponieważ jest symetryczny, jego rozkład wartości osobliwej (SVD) i jego składnia elektronowa będą miały automatycznie postaćC
C=VD2V′
dla niektórych macierzy ortogonalnej i macierzy diagonalnej D 2 . Zasadniczo diagonalne elementy D 2 są nieujemne (co oznacza, że wszystkie mają rzeczywiste pierwiastki kwadratowe: wybierz te dodatnie, aby utworzyć macierz diagonalną D ). Informacje, które posiadamy o C, mówią, że jeden lub więcej z tych elementów ukośnych ma wartość zero - ale nie wpłynie to na żadną z późniejszych operacji ani nie zapobiegnie obliczeniu SVD.VD2D2DC
Generowanie losowych wartości na wielu odmianach
Niech mają standardową wielowymiarowego rozkładu normalnego: każdy składnik ma zerową średnią jednostkową, wariancji, kowariancji i wszystkie są zerowe: jego macierz kowariancji jest tożsamość ja . Zatem zmienna losowa Y = V D X ma macierz kowariancjiXIY=VDX
Cov(Y)=E(YY′)=E(VDXX′D′V′)=VDE(XX′)DV′=VDIDV′=VD2V′=C.
W związku z tym zmienną losową ma wielowymiarowego rozkładu normalnego o średniej ľ i macierzy kowariancji C .μ+YμC
Obliczenia i przykładowy kod
Poniższy R
kod generuje macierz kowariancji danych wymiarów i rangi, analizuje ją za pomocą SVD (lub, w skomentowanym kodzie, z kompozycją elektronową), wykorzystuje tę analizę do wygenerowania określonej liczby realizacji (ze średnim wektorem 0 ) , a następnie porównuje macierz kowariancji tych danych z zamierzoną macierzą kowariancji zarówno numerycznie, jak i graficznie. Jak pokazano, generuje 10 , 000 realizacje, w których wymiar Y jest 100 i jest pozycja C to 50 . Dane wyjściowe toY010,000Y100C50
rank L2
5.000000e+01 8.846689e-05
Oznacza to, że pozycja danych jest również i macierz kowariancji oszacowana na podstawie danych w odległości 8 x 10 - 5 o C --which znajduje się w pobliżu. W ramach bardziej szczegółowej kontroli współczynniki C są wykreślane względem współczynników jego oszacowania. Wszystkie leżą blisko linii równości:508×10−5CC
R
D2D
n <- 100 # Dimension
rank <- 50
n.values <- 1e4 # Number of random vectors to generate
set.seed(17)
#
# Create an indefinite covariance matrix.
#
r <- min(rank, n)+1
X <- matrix(rnorm(r*n), r)
C <- cov(X)
#
# Analyze C preparatory to generating random values.
# `zapsmall` removes zeros that, due to floating point imprecision, might
# have been rendered as tiny negative values.
#
s <- svd(C)
V <- s$v
D <- sqrt(zapsmall(diag(s$d)))
# s <- eigen(C)
# V <- s$vectors
# D <- sqrt(zapsmall(diag(s$values)))
#
# Generate random values.
#
X <- (V %*% D) %*% matrix(rnorm(n*n.values), n)
#
# Verify their covariance has the desired rank and is close to `C`.
#
s <- svd(Sigma <- cov(t(X)))
(c(rank=sum(zapsmall(s$d) > 0), L2=sqrt(mean(Sigma - C)^2)))
plot(as.vector(C), as.vector(Sigma), col="#00000040",
xlab="Intended Covariances",
ylab="Estimated Covariances")
abline(c(0,1), col="Gray")