Gerando dados com uma determinada matriz de covariância de amostra

22

Dada uma matriz de covariância , como gerar dados de modo a ter a matriz de covariância de amostra ?ΣsΣ^=Σs


De maneira mais geral: geralmente estamos interessados ​​em gerar dados a partir de uma densidade f(x|θ) , com os dados x com algum vetor de parâmetro θ . Isso resulta em uma amostra, da qual podemos estimar novamente um valor θ^ . O que me interessa é o problema inverso: e se recebermos um conjunto de parâmetros \ boldsymbol \ theta_ {s}θs , e gostaríamos de gerar uma amostra x tal, que θ^=θs .

É um problema conhecido? Esse método é útil? Existem algoritmos disponíveis?

Kees Mulder
fonte
Uma solução escalável é fornecida por Attilio Meucci. Consulte este artigo sobre risco e o código do matlab
Peter Cotton

Respostas:

16

Existem duas situações típicas diferentes para esse tipo de problemas:

i) você deseja gerar uma amostra a partir de uma determinada distribuição cujas características da população correspondem às especificadas (mas devido à variação da amostra, você não tem as características da amostra exatamente correspondentes).

ii) você deseja gerar uma amostra cujas características correspondam às especificadas (mas, devido às restrições de corresponder exatamente as quantidades da amostra a um conjunto de valores pré-especificado, na verdade não provém da distribuição desejada).

Você deseja o segundo caso - mas obtém-o seguindo a mesma abordagem do primeiro caso, com uma etapa extra de padronização.

Portanto, para normais multivariados, isso pode ser feito de uma maneira bastante direta:

No primeiro caso, você poderia usar normais aleatórios sem a estrutura da população (como o padrão normal iid, que tem expectativa 0 e matriz de covariância de identidade) e depois impor - transformar para obter a matriz de covariância e o que você deseja. Se e são a média da população e a covariância de que você precisa e são o seu padrão normal, você calcula , para alguns que (por exemplo, um adequado pode ser obtido por meio da decomposição de Cholesky) . Então tem as características desejadas da população.μΣzy=euz+μeueueu=Σeuy

Com o segundo, você deve primeiro transformar suas normais aleatórias para remover até mesmo a variação aleatória da média de zero e covariância de identidade (tornando a amostra média zero e covariância amostral ) e, em seguida, proceder como antes. Mas essa etapa inicial de remover o desvio da amostra da média exata , a variação interfere na distribuição. (Em amostras pequenas, pode ser bastante grave.)Eun0 0Eu

Isso pode ser feito subtraindo a média da amostra de ( ) e calculando a decomposição de Cholesky de . Se é o fator de Cholesky à esquerda, então deve ter média de amostra 0 e covariância de amostra de identidade. Você pode então calcular e ter uma amostra com os momentos desejados. (Dependendo de como suas quantidades de amostra são definidas, pode haver um pequeno violino envolvido na multiplicação / divisão por fatores como , mas é fácil identificar essa necessidade.)zz=z-z¯zeuz(0 0)=(eu)-1zy=euz(0 0)+μn-1n

Glen_b -Reinstate Monica
fonte
1
+1. No outro dia, eu precisava gerar alguns dados com uma determinada matriz de covariância de amostra, não sabia como fazê-lo e, por algum motivo, demorei muito tempo para encontrar sua resposta. Para aumentar a visibilidade deste tópico e ilustrar suas sugestões, postei outra resposta aqui com algum código do Matlab.
Ameba diz Reinstate Monica
@amoeba Gostaria de saber se existe a possibilidade de colocar um dos termos de pesquisa que você usou que ainda não estão presentes aqui nas tags de pergunta (ou possivelmente inserir vários em uma pequena edição no texto da pergunta, o que ainda deve ajudar a ser encontrado) ) Agora estou me perguntando se devo fazer a mesma coisa no R ... mas isso vai melhor na minha resposta ou como um complemento à sua?
Glen_b -Reinstala Monica
1
Eu já tomei a liberdade de editar a pergunta e também tentei formular minha resposta de modo a incluir o maior número possível de palavras-chave. Espero que isso ajude. A propósito, fiquei surpreso que essa dica simples (branquear os dados gerados antes de se transformar na covariância necessária) fosse tão difícil de pesquisar no Google; não consegui encontrar nada (no CV ou em outro lugar), até que finalmente encontrei sua resposta.
Ameba diz Reinstate Monica
1
@amoeba Oh, ok, obrigado. Sim, na verdade, não posso dizer que me lembro de tê-lo mencionado em algum lugar do caso multivariado (sem dúvida, uma vez que é uma ideia bastante óbvia, especialmente se você já pensou nisso no caso univariado ou já o vi no caso univariado).
Glen_b -Reinstala Monica
@Glen_b Como você disse, a distribuição resultante dessas amostras "limpas" não pode ser normal. Você tem alguma idéia de qual poderia ser a distribuição resultante? Ou talvez seja igual / diferente da distribuição condicionalZz¯=μ,Cov(z)=Σ
gg
17

@Glen_b deu uma boa resposta (+1), que eu quero ilustrar com algum código.

Como gerar amostras a partir de uma distribuição Gaussiana multivariada dimensional com uma dada matriz de covariância ? Isso é fácil, gerando amostras de um gaussiano padrão e multiplicando-as por uma raiz quadrada da matriz de covariância, por exemplo, por . Isso é abordado em muitos tópicos no CV, por exemplo, aqui: Como posso gerar dados com uma matriz de correlação pré-especificada? Aqui está uma implementação simples do Matlab:ndΣchoeu(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

A matriz de covariância de amostra dos dados resultantes obviamente não será exatamente ; por exemplo, no exemplo acima retornaΣcov(X)

1.0690    0.7296
0.7296    1.0720

Como gerar dados com uma matriz de correlação ou covariância de amostra pré-especificada ?

Como o @Glen_b escreveu, depois de gerar dados de um Gaussiano padrão, centralize, branqueie e padronize-os, para que ele tenha uma matriz de covariância de amostra ; somente então multiplique-o com .Euchoeu(Σ)

Aqui está a continuação do meu exemplo do Matlab:

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

Agora cov(X), conforme necessário, retorna

1.0000    0.7000
0.7000    1.0000
ameba diz Restabelecer Monica
fonte
+1. De alguma forma, essa questão está sob várias formas e em vários locais no CV. Existe uma maneira de proceder se tivermos consciência de que a distribuição multivariada é não gaussiana?
rgk 12/04
Se você conhece a forma da distribuição multivariada, deseja que ela se pareça, talvez em alguns casos.
Glen_b -Reinstate Monica