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
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 θ = θ s
¿Es este un problema conocido? ¿Es útil este método? ¿Hay algoritmos disponibles?
correlation
sampling
random-generation
covariance-matrix
Kees Mulder
fuente
fuente
Respuestas:
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μ Σ z y= L z+ μ L L L′= Σ L y
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 Iyonorte 0 0 yo
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 ) + μ √z z∗= z- z¯ z∗ L∗ z( 0 )= ( L∗)- 1z∗ y= L z( 0 )+ μ n - 1norte---√
fuente
@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:norte re Σ c h o l (Σ)
La matriz de covarianza de muestra de los datos resultantes, por supuesto, no será exactamente ; Por ejemplo, en el ejemplo anterior devuelveΣ
cov(X)
¿Cómo generar datos con una correlación de muestra o matriz de covarianza previamente especificada ?
Aquí está la continuación de mi ejemplo de Matlab:
Ahora
cov(X)
, según sea necesario, vuelvefuente