Generando datos con una matriz de covarianza de muestra dada

22

Dada una matriz de covarianza , ¿cómo generar datos de manera que tenga la matriz de covarianza de muestra \ hat {\ boldsymbol \ Sigma} = \ boldsymbol \ Sigma_s ?Σ = Σ sΣsΣ^=Σs


En términos más generales: a menudo estamos interesados ​​en generar datos a partir de una densidad , con datos dado algún parámetro vector . Esto da como resultado una muestra, a partir de la cual podemos estimar nuevamente un valor . Lo que me interesa es el problema inverso: ¿qué pasa si se nos da un conjunto de parámetros , y nos gustaría generar una muestra tal que .x θ θ θ s x θ = θ sf(x|θ)xθθ^θsxθ^=θs

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

Kees Mulder
fuente
Attilio Meucci proporciona una solución escalable. Ver este artículo sobre riesgos y código matlab
Peter Cotton

Respuestas:

16

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

i) desea generar una muestra a partir de una distribución dada cuyas características de población coincidan con las especificadas (pero debido a la variación del muestreo, no tiene las características de la muestra que coincidan exactamente).

ii) desea generar una muestra cuyas características de muestra coincidan con las especificadas (pero, debido a las restricciones de hacer coincidir exactamente las cantidades de muestra con un conjunto de valores previamente especificado, en realidad no provienen de la distribución que desea).

Desea el segundo caso, pero lo obtiene siguiendo el mismo enfoque que el primer caso, con un paso de estandarización adicional.

Entonces, para las normales multivariadas, cualquiera de las dos puede hacerse de una manera bastante directa:

Con el primer caso, podría usar normales aleatorias sin la estructura de la población (como iid normal normal que tiene una expectativa 0 y una matriz de covarianza de identidad) y luego imponerla: transformar para obtener la matriz de covarianza y significar lo que desee. Si y son la media de la población y la covarianza que necesita son iid normal normal, calcule , para algunas donde (por ejemplo, se podría obtener una adecuada mediante la descomposición de Cholesky) . Entonces tiene las características de población deseadas.Σ z y = L z + μ L L L = Σ L yμΣzy=Lz+μLLL=ΣLy

Con el segundo, primero debe transformar sus normales aleatorias para eliminar incluso la variación aleatoria de la media cero y la covarianza de identidad (haciendo que la muestra signifique cero y la covarianza muestra ), luego proceda como antes. Pero ese paso inicial de eliminar la desviación de la muestra de la media exacta , la varianza interfiere con la distribución. (En muestras pequeñas puede ser bastante grave). 0 IIn0I

Esto se puede hacer restando la media muestral de ( ) y calculando la descomposición de Cholesky de . Si es el factor Cholesky izquierdo, entonces debe tener una media muestral 0 y una covarianza muestral de identidad. Luego puede calcular y obtener una muestra con los momentos de muestra deseados. (Dependiendo de cómo se definan las cantidades de muestra, puede haber un pequeño violín adicional involucrado con la multiplicación / división por factores como , pero es bastante fácil identificar esa necesidad).z = z - ˉ z z L z ( 0 ) = ( L ) - 1 z y = L z ( 0 ) + μ zz=zz¯zLz(0)=(L)1zy=Lz(0)+μn1n

Glen_b -Reinstate a Monica
fuente
1
+1. El otro día, necesitaba generar algunos datos con una matriz de covarianza de muestra dada, no sabía cómo hacerlo y, por alguna razón, me llevó mucho tiempo encontrar su respuesta. Para aumentar la visibilidad de este hilo e ilustrar sus sugerencias, publiqué otra respuesta aquí con un código de Matlab.
ameba dice Reinstate Monica
@amoeba Me pregunto si existe la posibilidad de poner uno de los términos de búsqueda que usó que aún no están presentes aquí en las etiquetas de las preguntas (o posiblemente insertar varios en una pequeña edición del texto de la pregunta, lo que aún debería ayudarlo a encontrarlo) ) Ahora me pregunto si debería hacer lo mismo en R ... ¿pero entonces va mejor en mi respuesta o como una adición a la suya?
Glen_b -Reinstala a Monica
1
Ya me he tomado la libertad de editar la pregunta, y también traté de formular mi respuesta de modo que incluya tantas palabras clave como sea posible. Espero que esto ayude. Me sorprendió, por cierto, que este simple consejo (blanquear los datos generados antes de transformarlo en la covarianza requerida) fuera tan difícil de googlear; No pude encontrar nada (en CV o en otro lugar), hasta que finalmente encontré su respuesta.
ameba dice Reinstate Monica
1
@amoeba Oh, está bien, gracias. Sí, en realidad, no puedo decir que recuerde haberlo visto alguna vez mencionado en el caso multivariante (sin duda lo ha sido, ya que es una idea bastante obvia, especialmente si ya lo ha pensado para el caso univariante, o si tiene ya lo vi en el caso univariante).
Glen_b -Reinstale a Monica
@Glen_b Como usted dice, la distribución resultante de estas muestras "limpiadas" no puede ser normal. ¿Tienes alguna idea de cuál podría ser la distribución resultante? O tal vez si es igual / no igual a la distribución condicional Zz¯=μ,Cov(z)=Σ
gg
17

@Glen_b dio una buena respuesta (+1), que quiero ilustrar con algún código.

¿Cómo generar muestras a partir de una distribución gaussiana multivariada d- dimensional con una matriz de covarianza dada Σ ? Esto es fácil de hacer generando muestras a partir de una Gauss estándar y multiplicándolas por una raíz cuadrada de la matriz de covarianza, por ejemplo, por c h o l ( Σ ) . Esto está cubierto en muchos hilos en CV, por ejemplo aquí: ¿Cómo puedo generar datos con una matriz de correlación preespecificada? Aquí hay una implementación simple de Matlab:nortereΣdohol(Σ)

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

La matriz de covarianza de muestra de los datos resultantes, por supuesto, no será exactamente ; Por ejemplo, en el ejemplo anterior devuelveΣcov(X)

1.0690    0.7296
0.7296    1.0720

¿Cómo generar datos con una correlación de muestra o matriz de covarianza previamente especificada ?

yodohol(Σ)

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, vuelve

1.0000    0.7000
0.7000    1.0000
ameba dice Reinstate Monica
fuente
+1. De alguna manera esta pregunta tiene varias formas en varios lugares en CV. ¿Hay alguna forma de proceder si somos conscientes de que la distribución multivariada no es gaussiana?
rgk
Si conoce la forma de la distribución multivariada, desea que se vea, tal vez en algunos casos.
Glen_b -Reinstala Monica