36 votos

Generación de datos con una matriz de covarianza muestral dada

Dada una matriz de covarianza $\boldsymbol \Sigma_s$ cómo generar los datos de forma que tengan la matriz de covarianza muestral $\hat{\boldsymbol \Sigma} = \boldsymbol \Sigma_s$ ?


En términos más generales: a menudo nos interesa generar datos a partir de una densidad $ f(x \vert \boldsymbol\theta) $ con datos $x$ dado algún vector de parámetros $\boldsymbol\theta$ . El resultado es una muestra, a partir de la cual podemos estimar de nuevo un valor $\boldsymbol{\hat\theta}$ . Lo que me interesa es el problema inverso: ¿Qué pasa si nos dan un conjunto de parámetros $\boldsymbol\theta_{s}$ y nos gustaría generar una muestra $x$ tal, que $ \boldsymbol{\hat\theta} = \boldsymbol\theta_{s}$ .

¿Es un problema conocido? ¿Es útil este método? ¿Hay algoritmos disponibles?

0 votos

Attilio Meucci ofrece una solución escalable. Ver esto Artículo de riesgo y código matlab

28voto

AdamSane Puntos 1825

Hay dos situaciones típicas diferentes para este tipo de problemas:

i) se desea generar una muestra a partir de una distribución determinada cuyas características poblacionales coincidan con las especificadas (pero, debido a la variación del muestreo, las características de la muestra no coinciden exactamente).

ii) desea generar una muestra cuyas características muestrales coincidan con las especificadas (pero que, debido a las restricciones de hacer coincidir exactamente las cantidades de la muestra con un conjunto de valores preestablecidos, no procedan realmente de la distribución que desea).

Quieres el segundo caso, pero lo consigues siguiendo el mismo enfoque que en el primer caso, con un paso extra de estandarización.

Por lo tanto, para las normales multivariantes, cualquiera de las dos cosas puede hacerse de forma bastante sencilla:

En el primer caso podrías utilizar normales aleatorias sin la estructura de la población (como la normal estándar iid que tiene expectativa 0 y matriz de covarianza identidad) y luego imponerla - transformar para obtener la matriz de covarianza y la media que quieres. Si $\mu$ y $\Sigma$ son la media y la covarianza de la población que necesita y $z$ son normales estándar iid, se calcula $y=Lz+\mu$ para algunos $L$ donde $LL'=\Sigma$ (por ejemplo, un $L$ podría obtenerse mediante la descomposición de Cholesky). Entonces $y$ tiene las características poblacionales deseadas.

Con la segunda, tienes que transformar primero tus normales aleatorias para eliminar incluso la variación aleatoria lejos de la media cero y la covarianza de identidad (haciendo la media de la muestra cero y la covarianza de la muestra $I_n$ ), entonces proceda como antes. Pero ese paso inicial de eliminar la desviación muestral de la media exacta $0$ , varianza $I$ interfiere en la distribución. (En muestras pequeñas puede ser bastante grave).

Esto puede hacerse restando la media muestral de $z$ ( $z^*=z-\bar z$ ) y calculando la descomposición de Cholesky de $z^*$ . Si $L^*$ es el factor de Cholesky izquierdo, entonces $z^{(0)}=(L^*)^{-1}z^*$ debe tener media muestral 0 y covarianza muestral de identidad. Entonces se puede calcular $y=Lz^{(0)}+\mu$ y tener una muestra con los momentos de muestra deseados. (Dependiendo de cómo se definan las cantidades de la muestra, puede haber una pequeña manipulación adicional al multiplicar/dividir por factores como $\sqrt{\frac{n-1}{n}}$ pero es bastante fácil identificar esa necesidad).

1 votos

+1. El otro día, necesitaba generar unos datos con una matriz de covarianza muestral dada, no sabía cómo hacerlo, y por alguna razón me costó mucho tiempo encontrar tu respuesta. Para aumentar la visibilidad de este hilo y para ilustrar tus sugerencias, publiqué aquí otra respuesta con algo de código de Matlab.

0 votos

@amoeba Me pregunto si existe la posibilidad de poner en las etiquetas de la pregunta alguno de los términos de búsqueda que has utilizado y que no están ya presentes aquí (o posiblemente insertar varios en una pequeña edición del texto de la pregunta, lo que debería seguir ayudando a encontrarla). Ahora me estoy preguntando si debería hacer lo mismo en R... ¿pero entonces va mejor en mi respuesta, o como un añadido a la tuya?

1 votos

Ya me he tomado la libertad de editar la pregunta, y también he intentado formular mi respuesta de manera que incluya el mayor número posible de palabras clave. Espero que esto ayude. Por cierto, me sorprendió que este sencillo consejo (blanquear los datos generados antes de transformarlos a la covarianza requerida) fuera tan difícil de buscar en Google; no pude encontrar nada (ni en CV ni en ningún otro sitio), hasta que finalmente encontré tu respuesta.

28voto

zowens Puntos 1417

@Glen_b ha dado una buena respuesta (+1), que quiero ilustrar con algo de código.

Cómo generar $n$ muestras de un $d$ -distribución gaussiana multivariante con una matriz de covarianza dada $\boldsymbol \Sigma$ ? Esto es fácil de hacer generando muestras de una gaussiana estándar y multiplicándolas por una raíz cuadrada de la matriz de covarianza, por ejemplo $\mathrm{chol}(\boldsymbol \Sigma)$ . Esto se trata en muchos hilos sobre CV, por ejemplo, aquí: ¿Cómo puedo generar datos con una matriz de correlación preestablecida? He aquí una sencilla implementación en Matlab:

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

La matriz de covarianza muestral de los datos resultantes no será, por supuesto, exactamente $\boldsymbol \Sigma$ Por ejemplo, en el ejemplo anterior cov(X) devuelve

1.0690    0.7296
0.7296    1.0720

Cómo generar datos con un muestra ¿matriz de correlación o de covarianza?

Como escribió @Glen_b, después de generar los datos a partir de una gaussiana estándar, hay que centrarlos, blanquearlos y estandarizarlos, para que tengan una matriz de covarianza muestral $\mathbf I$ sólo entonces multiplícalo por $\mathrm{chol}(\boldsymbol \Sigma)$ .

Aquí está la continuación de mi ejemplo de Matlab:

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

Ahora cov(X) , según sea necesario, devuelve

1.0000    0.7000
0.7000    1.0000

1 votos

+1. De alguna manera, esta pregunta se encuentra en varias formas en varios lugares en CV. ¿Hay alguna forma de proceder si somos conscientes de que la distribución multivariante no es gaussiana?

1 votos

Si conoces la forma de la distribución multivariante que quieres que tenga, quizás en algunos casos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X