Por exemplo, em R
, a MASS::mvrnorm()
função é útil para gerar dados para demonstrar várias coisas nas estatísticas. É necessário um Sigma
argumento obrigatório, que é uma matriz simétrica que especifica a matriz de covariância das variáveis. Como eu criaria uma matriz n × simétrica com entradas arbitrárias?
21
Respostas:
Criar um matriz A com valores arbitráriosn×n A
e então use como sua matriz de covariância.Σ=ATA
Por exemplo
fonte
Sigma <- A + t(A)
,.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Σ
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σi P n=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):
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σi n2 n não seja enorme). A decomposição QR fará isso, como neste código
Isso funciona porque on 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 σi σ=(σ1,…,σ5)=(5,4,3,2,1)
crossprod
R
Como verificação, a decomposição do Valor Singular deve retornar e P ′ . Você pode inspecioná-lo com o comandoσ P′
O inversoσ em uma divisão:
Sigma
, é claro, é obtido apenas mudando a multiplicação porVocê pode verificar isso através da visualizaçãon×n σi≠0 1/σi σi
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.fonte
svd(Sigma)
serão reordenados - isso me confundiu por um minuto.Você pode simular matrizes definidas positivas aleatórias a partir da distribuição Wishart usando a função "rWishart" do pacote amplamente utilizado "stats".
fonte
Existe um pacote especificamente para isso,
clusterGeneration
(escrito entre outros por Harry Joe, um grande nome nesse campo).Existem duas funções principais:
genPositiveDefMat
gerar uma matriz de covariância, 4 métodos diferentesrcorrmatrix
: gerar uma matriz de correlaçãoExemplo rápido:
Criado em 2019-10-27 pelo pacote reprex (v0.3.0)
Por fim, observe que uma abordagem alternativa é fazer uma primeira tentativa do zero e depois usar
Matrix::nearPD()
para tornar sua matriz positiva.fonte