2011-04-15 10 views
5

actualmente estoy usando Python y RPY utilizar la funcionalidad dentro R.con R en honor correlaciones para ensayos LatinHypercube/Monte Carlo

¿Cómo se utiliza la biblioteca R para generar muestras de Monte Carlo que hacen honor a la correlación entre 2 variables .. por ejemplo si la variable a y B tienen una correlación de 85% (0,85), i necesita para generar todas las muestras de Monte Carlo en honor a que la correlación entre a & B.

agradecería si alguien puede compartir ideas/Fragmentos

Gracias

+0

Estoy muy contento de que haya hecho esta pregunta, ya que tengo que hacer un análisis de sensibilidad para un proyecto y había estado investigando la teoría, pero aún no había buscado las opciones R para implementar los métodos que estaba aprendiendo. –

Respuesta

5

Esa es una pregunta frecuente. Aquí es una respuesta usando un paquete recomendado:

R> library(MASS) 
R> example(mvrnorm) 

mvrnrmR> Sigma <- matrix(c(10,3,3,2),2,2) 

mvrnrmR> Sigma 
    [,1] [,2] 
[1,] 10 3 
[2,] 3 2 

mvrnrmR> var(mvrnorm(n=1000, rep(0, 2), Sigma)) 
     [,1] [,2] 
[1,] 8.82287 2.63987 
[2,] 2.63987 1.93637 

mvrnrmR> var(mvrnorm(n=1000, rep(0, 2), Sigma, empirical = TRUE)) 
    [,1] [,2] 
[1,] 10 3 
[2,] 3 2 
R> 

El cambio entre la correlación y covarianza se sencillo (pista: producto exterior del vector de desviaciones estándar).

7

El método de correlación de rangos de Iman and Conover parece ser un enfoque ampliamente utilizado y general para producir muestras correlacionadas de monte carlo para experimentos basados ​​en computadora, análisis de sensibilidad, etc. Desafortunadamente, acabo de enterarme de esto y no tengo acceso al PDF por lo que no sé cómo los autores en realidad implementan su método, pero puede seguir esto.

Su método es más general porque cada variable puede provenir de una distribución diferente a diferencia de la respuesta normal multivariada de @ Dirk.

Actualización: me encontré con una aplicación R del enfoque anterior en el paquete mc2d, en particular, desea que la función cornode().

Aquí es un ejemplo tomado de ?cornode

> require(mc2d) 
> x1 <- rnorm(1000) 
> x2 <- rnorm(1000) 
> x3 <- rnorm(1000) 
> mat <- cbind(x1, x2, x3) 
> ## Target 
> (corr <- matrix(c(1, 0.5, 0.2, 0.5, 1, 0.2, 0.2, 0.2, 1), ncol=3)) 
    [,1] [,2] [,3] 
[1,] 1.0 0.5 0.2 
[2,] 0.5 1.0 0.2 
[3,] 0.2 0.2 1.0 
> ## Before 
> cor(mat, method="spearman") 
      x1   x2   x3 
x1 1.00000000 0.01218894 -0.02203357 
x2 0.01218894 1.00000000 0.02298695 
x3 -0.02203357 0.02298695 1.00000000 
> matc <- cornode(mat, target=corr, result=TRUE) 
Spearman Rank Correlation Post Function 
      x1  x2  x3 
x1 1.0000000 0.4515535 0.1739153 
x2 0.4515535 1.0000000 0.1646381 
x3 0.1739153 0.1646381 1.0000000 

Las correlaciones de rangos en matc son ahora muy cerca de las correlaciones diana de corr.

La idea con esto es dibujar las muestras por separado de la distribución para cada variable, y luego usar el enfoque de Iman & Connover para hacer las muestras (tan cerca) de las correlaciones objetivo como sea posible.

+0

Buena respuesta, Gavin, a una pregunta sub-especificada, ya que nunca nos dijeron si esto era solo normal multivariante (o t o ...), o, como supones, algo un poco más inteligente. –

+0

@Dirk Gracias - mi inclinación inicial fue responder como lo hiciste con el 'mvrnorm()' pero me derrotaste con eso y luego me pregunté acerca de este método de correlación de rango sobre el que había estado leyendo. –

+0

Muchas gracias ... ¡La función cornode hace el truco! Estaba intentando realmente encontrar una función similar en python –

2

Esta pregunta no está etiquetada como python, pero según su comentario, parece que también está buscando una solución de Python. La aplicación más básica de Python de Iman Convover, que puedo inventar tiene el siguiente en Python (en realidad numpy):

def makeCorrelated(y, corMatrix): 
    c = multivariate_normal(zeros(size(y, 0)) , corMatrix, size(y, 1)) 
    key = argsort(argsort(c, axis=0), axis=0).T 
    out = map(take, map(sort, y), key) 
    out = array(out) 
    return out 

donde y es una serie de muestras de las distribuciones marginales y CorMatrix es un semi definida positiva, matriz de correlación simétrica. Dado que esta función usa multivariate_normal() para la matriz c, puedes decir que usa una cópula gaussiana implícita. Para usar diferentes estructuras de cópula necesitarás usar diferentes controladores para la matriz c.

+0

¿Podría dar un ejemplo del uso de 'makeCorrelated'? ¿Cómo debería ser 'corMatrix'? ¿Debo llamar esto dos veces en diferentes matrices 'y' para hacer la correlación? – Snorfalorpagus

+1

Intenté hacer esto como un comentario, pero el formateo no dejaba de funcionar. Así que aquí hay una esencia. Tenga en cuenta que modifiqué ligeramente la función para que funcione con Pandas DataFrames: https://gist.github.com/CerebralMastication/8039120 –

Cuestiones relacionadas