Supongamos que tenemos
X 2 ∼ unif ( n , 0 , 1 ) ,
donde es una muestra aleatoria uniforme de tamaño n, y
Entonces la correlación entre y es .Z 0.4
¿Cómo puedo extender esto a tres variables: , , ?X 2 X 3
Supongamos que tenemos
X 2 ∼ unif ( n , 0 , 1 ) ,
donde es una muestra aleatoria uniforme de tamaño n, y
Entonces la correlación entre y es .Z 0.4
¿Cómo puedo extender esto a tres variables: , , ?X 2 X 3
Respuestas:
La pregunta contiene varios errores como se señala en los comentarios: como se define en la pregunta, Z no es uniforme ni tiene la correlación especificada.
cardinal menciona cópulas, y esa es la forma más general de hacerlo. Sin embargo, hay varias formas bastante fáciles de obtener uniformes correlacionados (que pueden verse como simples accesos directos a diferentes tipos de cópulas).
Entonces, comencemos con algunas formas de obtener un par de uniformes correlacionados.
1) Si agrega dos uniformes, el resultado es triangular, no uniforme. Pero puede usar el cdf de la variable resultante como una transformación para llevar el resultado a un uniforme. El resultado ya no está correlacionado linealmente, por supuesto.
Aquí hay una función R para transformar un triangular simétrico en (0,2) a uniforme estándar
t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2
Vamos a ver si da un uniforme
u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)
Y está correlacionado con u1 y u2:
> cor(cbind(u1,u2,v1))
u1 u2 v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000
pero no linealmente, debido a la transformación monotónica a la uniformidad
Con esto como herramienta podemos generar algunas variables adicionales para obtener tres uniformes equicorrelacionados:
u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)
cor(cbind(v1,v2,v3))
v1 v2 v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000
La relación entre las variables v se ve así:
-
Una segunda alternativa es generar tomando una mezcla . En lugar de sumar uniformes, tómalos con probabilidades fijas.
p.ej
z = ifelse(rbinom(30000,1,.7),u1,u2)
cor(cbind(u1,z))
u1 z
u1 1.0000000 0.7081533
z 0.7081533 1.0000000
Que nuevamente se puede utilizar para generar múltiples uniformes correlacionados.
-
Un tercer enfoque simple es generar normales correlacionadas y transformarlas en uniformidad.
n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))
x y z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000
Entonces ahora convertimos a uniforme:
w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
w1 w2 w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000
Una cosa buena acerca de los métodos 2 y 3 es que obtienes mucha variedad en tu elección de cuán correlacionadas podrían estar las cosas (y no tienen que estar equicorrelacionadas como los ejemplos aquí).
Hay una gran variedad de otros enfoques, por supuesto, pero todos estos son rápidos y fáciles.
La parte difícil es obtener exactamente la correlación de población deseada; no es tan simple como cuando solo quieres gaussianos correlacionados. La respuesta de Quantibex en Generar pares de números aleatorios distribuidos y correlacionados uniformemente proporciona un enfoque que modifica mi tercer método aquí, que debería proporcionar la correlación de población deseada.
Esto debería comenzar a descomponer una serie en sus componentes de la misma manera que descompondría un vector en sus componentes ortogonales.