9 votos

¿Cómo puedo generar números aleatorios a partir de cualquier cópula dada?

Supongamos que tengo una función de cópula 2-dim C (x_1, x_2).

¿Cómo puedo generar números bivariados de esta cópula?

Para tipos específicos de cópulas, puedo usar la función 'rCopula' del paquete 'cópula' en R. Pero no tengo idea de qué hacer si tengo una función de cópula arbitraria.

8voto

AdamSane Puntos 1825

Para una cópula que corresponde a un conocido multivariante de distribución, se puede simular de que la distribución y, a continuación, hacer que los márgenes uniformes (por ejemplo, la copula Gaussiana, t-cópula).

Más generalmente, si usted puede trabajar el condicional ($C(u|v)$ o $c(u|v)$), se puede simular de un uniforme para $V$ y, a continuación, a partir de la condicional, tal vez a través del inverso del cdf (si conoces a $C(u|v)$) o tal vez a través de decir aceptar-rechazar (tal vez una adaptación de aceptar-rechazar, alguna versión de zigurat, etc, si usted sabe $c(u|v)$).

En el caso de bivariante de Arquímedes cúpulas, después de Nelsen (1999) o Embrechts et al., (2001), tenemos un mecanismo para luego generar a partir de ellos de la siguiente manera. Supongamos $(U_1,U_2)$ tiene una de dos dimensiones de Arquímedes cópula con generador de $\phi$. Entonces:

  1. Simular dos independientes $U(0,1)$ variables aleatorias, $v_1$ $v_2$

  2. Set $t=K_C^{-1}(v_2)\,$ donde $K_C(t)=t-\phi(t)/\phi'(t)$

  3. El deseado valores simulados se $u_1=\phi^{-1}(v_1\,\phi(t))$ y $u_2=\phi^{-1}((1-v_1)\phi(t))$.

Hay otros métodos; por ejemplo, en algunos casos, puede a veces ser práctico para hacer alguna versión de bivariante aceptar-rechazar, por ejemplo, o a través de la transformación de algunos conveniente bivariante de distribución en el que aceptar-rechazar podría ser aplicado.

-2voto

Antonio Puntos 1598

"

 require(mvtnorm)
S <- matrix(c(1,.8,.8,1),2,2) #Correlation matrix
AB <- rmvnorm(mean=c(0,0),sig=S,n=1000) #Our gaussian variables
U <- pnorm(AB) #Now U is uniform - check using hist(U[,1]) or hist(U[,2])
x <- qgamma(U[,1],2) #x is gamma distributed
y <- qbeta(U[,2],1,2) #y is beta distributed
plot(x,y) #They correlate!
 

"

Fuente: Copulas hechas fáciles

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