Gerando valores de uma distribuição gaussiana multivariada

14

Atualmente, estou tentando valores simulados de um -dimensional variável aleatória que tem uma distribuição normal com média multivariada vetor e matriz de covariância .X μ = ( μ 1 , . . . , Μ N ) t SNXμ=(μ1,...,μN)TS

Eu estou esperando para utilizar um procedimento similar ao método inverso CDF, o que significa que Quero primeiro gerar um -dimensional uniforme variável aleatória e, em seguida, ligar em que o CDF inversa desta distribuição, de modo a gerar o valor .U XNUX

Estou tendo problemas porque o procedimento não está bem documentado e há pequenas diferenças entre a função mvnrnd no MATLAB e uma descrição que encontrei na Wikipedia .

No meu caso, também estou escolhendo os parâmetros da distribuição aleatoriamente. Em particular, eu cada um dos meios, , a partir de uma distribuição uniforme . Em seguida, construo a matriz de covariância usando o seguinte procedimento: L ( 20 , 40 ) SμiU(20,40)S

  1. Crie uma matriz triangular inferior onde para e para L ( i , i ) = 1 i = 1 .. N L ( i , j ) = U ( - 1 , 1 ) i < jLeu(Eu,Eu)=1Eu=1 ..NL(i,j)=U(1,1)i<j

  2. Deixe em que indica a transposição de .L T LS=LLTLTL

Este procedimento me permite garantir que seja simétrico e positivo positivo. Ele também fornece uma matriz triangular inferior modo que , que acredito ser necessária para gerar valores a partir da distribuição.L S = L L TSLS=eueuT

Usando as diretrizes da Wikipedia, eu poderia gerar valores de usando um uniforme dimensional da seguinte maneira:NXN

  • X=μ+euΦ-1(você)

De acordo com a função MATLAB, no entanto, isso geralmente é feito como:

  • X=μ+euTΦ-1(você)

Onde é o inverso de uma CDF -dimensional distribuição, separável, normal, e a única diferença entre os dois métodos é simplesmente se a utilização ou . N L L TΦ-1NeueuT

MATLAB ou Wikipedia são o caminho a percorrer? Ou ambos estão errados?

Berk U.
fonte
2
Como afirmado, ambos estão errados porque é um vetor de linha enquanto deve ser um vetor de coluna. Quando você ajusta suas linhas e colunas, essa pergunta deve responder-se simplesmente identificando qual versão de ou fornece uma matriz e qual versão dá apenas um número: cheque que você pode calcular a expectativa da versão matriz e que dá . t * i n v n o r m ( L ) ( X - μ ) ' ( X - μ ) ( X - μ ) ( X - μ ) ' SμTinvnorm(U) (Xμ)(Xμ)(Xμ)(Xμ)S
whuber
@whuber Yeap. Fez as alterações na formatação da pergunta. Obrigado pela dica - definitivamente a maneira mais fácil de verificar.
Berk U.

Respostas:

14

Se é um vector de coluna de padrão normal de RV, em seguida, se definir , a covariância dos é . Y = L X Y L L TXN(0,I)Y=LXYLLT

Eu acho que o problema que você está tendo pode surgir do fato de que a função mvnrnd do matlab retorna vetores de linha como amostras, mesmo se você especificar a média como um vetor de coluna. por exemplo,

 > size(mvnrnd(ones(10,1),eye(10))  
 > ans =
 >      1    10

E observe que a transformação de um vetor de linha fornece a fórmula oposta. se é um vetor de linha, também é um vetor de linha, então é um vetor de coluna e a covariância de pode ser escrita . XZ=XLTZT=LXTZTE[ZTZ]=LLT

Baseado no que você escreveu, porém, a fórmula Wikipedia está correto: se foram um vetor linha devolvida pelo Matlab, você não pode deixou-multiplicá-lo por . (Mas multiplicar à direita por forneceria uma amostra com a mesma covariância de ).Φ1(U)LTLTLLT

jpillow
fonte
Observe que a ajuda para mvnrnd no matlab usa como o número de amostras; o número de dimensões é . Portanto, se você pedir amostras de um normal multivariado dimensional, ele as retornará como uma matrizNDNDN×D
jpillow