Eu gosto de ter controle sobre os objetos que eu crio, mesmo quando eles podem ser arbitrários.
Considere-se, então, que todos os possíveis matrizes de covariâncian×n pode ser expressa na formaΣ
Σ=P′ Diagonal(σ1,σ2,…,σn) P
onde é uma matriz ortogonal e σ 1 ≥ σ 2 ≥ ⋯ ≥ σ nP .σ1≥σ2≥⋯≥σn≥0
Geometricamente, isso descreve uma estrutura de covariância com uma variedade de componentes principais de tamanhos . Estes componentes apontam em direcções das linhas de P . Veja as figuras em Compreendendo a análise de componentes principais, vetores próprios e valores próprios para exemplos com n = 3 . Configurando o σ iσiPn=3σi definirá as magnitudes das covariâncias e seus tamanhos relativos, determinando assim qualquer forma elipsoidal desejada. As linhas de orientam os eixos da forma como você preferir.P
Um benefício algébrico e computacional dessa abordagem é que, quando , Σσn>0Σ é prontamente invertido (que é uma operação comum em matrizes de covariância):
Σ−1=P′ Diagonal(1/σ1,1/σ2,…,1/σn) P.
Não se preocupe com as direções, mas apenas com os intervalos de tamanhos dos ? Tudo bem: você pode gerar facilmente uma matriz ortogonal aleatória. Apenas envolva n 2 iid valores normais padrão em uma matriz quadrada e ortogonalize-a. Certamente funcionará (desde que nσin2n não seja enorme). A decomposição QR fará isso, como neste código
n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))
Isso funciona porque o n distribuição multinormal variável assim gerada é "elíptica": é invariável sob todas as rotações e reflexões (através da origem). Assim, todas as matrizes ortogonais são geradas uniformemente, conforme discutido em Como gerar pontos uniformemente distribuídos na superfície da esfera unitária 3-d? .
Uma maneira rápida de obter de P eo σ i , uma vez que você tenha especificado ou criou, usos e exploits 's re-uso de matrizes em operações aritméticas, como neste exemplo, com σ = ( σ 1 , ... , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσicrossprod
R
σ=(σ1,…,σ5)=(5,4,3,2,1)
Sigma <- crossprod(p, p*(5:1))
Como verificação, a decomposição do Valor Singular deve retornar e P ′ . Você pode inspecioná-lo com o comandoσP′
svd(Sigma)
O inverso Sigma
, é claro, é obtido apenas mudando a multiplicação por σ em uma divisão:
Tau <- crossprod(p, p/(5:1))
Você pode verificar isso através da visualização zapsmall(Sigma %*% Tau)
, que deve ser o matriz identidade. Um inverso generalizado (essencial para os cálculos de regressão) é obtida pela substituição de qualquer σ i ≠ 0 por 1 / σ i , exactamente como acima, mas mantendo os zeros entre o σ i como eram.n×nσi≠01/σiσi