J'utilise la décomposition de Cholesky pour simuler des variables aléatoires corrélées étant donné une matrice de corrélation. Le fait est que le résultat ne reproduit jamais la structure de corrélation telle qu'elle est donnée. Voici un petit exemple en Python pour illustrer la situation.
import numpy as np
n_obs = 10000
means = [1, 2, 3]
sds = [1, 2, 3] # standard deviations
# generating random independent variables
observations = np.vstack([np.random.normal(loc=mean, scale=sd, size=n_obs)
for mean, sd in zip(means, sds)]) # observations, a row per variable
cor_matrix = np.array([[1.0, 0.6, 0.9],
[0.6, 1.0, 0.5],
[0.9, 0.5, 1.0]])
L = np.linalg.cholesky(cor_matrix)
print(np.corrcoef(L.dot(observations)))
Cela imprime:
[[ 1. 0.34450587 0.57515737]
[ 0.34450587 1. 0.1488504 ]
[ 0.57515737 0.1488504 1. ]]
Comme vous pouvez le voir, la matrice de corrélation estimée post-hoc diffère radicalement de la précédente. Y a-t-il un bogue dans mon code ou existe-t-il une alternative à l'utilisation de la décomposition Cholesky?
Éditer
Je vous demande pardon pour ce gâchis. Je ne pensais pas qu'il y avait une erreur dans le code et / ou dans la façon dont la décomposition de Cholesky était appliquée en raison d'une mauvaise compréhension du matériel que j'avais étudié auparavant. En fait, j'étais sûr que la méthode elle-même n'était pas censée être précise et j'étais d'accord avec cela jusqu'à la situation qui m'a fait poser cette question. Merci d'avoir souligné l'idée fausse que j'avais. J'ai édité le titre pour mieux refléter la situation réelle proposée par @Silverfish.