Genere pares de números aleatorios uniformemente distribuidos y correlacionados

14

Me gustaría generar pares de números aleatorios con cierta correlación. Sin embargo, el enfoque habitual de usar una combinación lineal de dos variables normales no es válido aquí, porque una combinación lineal de variables uniformes ya no es una variable distribuida uniformemente. Necesito que las dos variables sean uniformes.

¿Alguna idea sobre cómo generar pares de variables uniformes con una correlación dada?

Onturenio
fuente
66
Muy relacionado: stats.stackexchange.com/questions/30526 . También desea revisar la etiqueta de cópula , simplemente haga clic en el enlace aquí. Una técnica rápida y sucia es dejar que sea ​​uniforme [ 0 , 1 ] e Y = X cuando X α e Y = 1 + α - X de lo contrario. La correlación es ρ = 2 ( α - 1 ) 3 + 1 , de donde α = 1 -X[0,1]Y=XXαY=1+αXρ=2(α1)3+1 hace el truco. Pero las cópulas te darán más control ... α=1((1ρ)/2)1/3
Whuber
Gracias por el comentario, pero sí, creo que este método es realmente "sucio"
Onturenio
1
Esperaba que al ver este enfoque reconociera que puede (y debe) proporcionar criterios adicionales con respecto a las propiedades de sus pares de números aleatorios. Si esto es "sucio", entonces, ¿qué tiene de malo la solución? Díganos para que podamos proporcionar respuestas más apropiadas para su situación.
Whuber
Esta pregunta se respondió incidentalmente en la respuesta a una pregunta estrechamente relacionada: cómo generar pares de RV con una relación de regresión lineal. Debido a que la pendiente de la regresión lineal está relacionada de manera fácil con el coeficiente de correlación, y se pueden producir todas las pendientes posibles, ofrece una forma de producir exactamente lo que desea. Ver stats.stackexchange.com/questions/257779/… .
whuber
1
Consulte también stats.stackexchange.com/questions/31771 , que responde a la generalización de tres uniformes aleatorios.
whuber

Respuestas:

16

No conozco un método universal para generar variables aleatorias correlacionadas con cualquier distribución marginal dada. Por lo tanto, propondré un método ad hoc para generar pares de variables aleatorias distribuidas uniformemente con una correlación dada (Pearson). Sin pérdida de generalidad, supongo que la distribución marginal deseada es uniforme estándar (es decir, el soporte es ).[0,1]

El enfoque propuesto se basa en lo siguiente:
a) Para las variables aleatorias uniformes estándar y U 2 con las funciones de distribución respectivas F 1 y F 2 , tenemos F i ( U i ) = U i , para i = 1 , 2 . Por lo tanto, por definición , rho de Spearman es ρ S ( U 1 , U 2 ) = c o r r ( FU1U2F1F2Fi(Ui)=Uii=1,2 Entonces, el coeficiente de correlación de Spearman rho y Pearson son iguales (las versiones de muestra pueden, sin embargo, diferir).

ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).

b) Si son variables aleatorias con márgenes continuos y cópula gaussiana con coeficiente de correlación (Pearson) ρ , entonces rho de Spearman es ρ S ( X 1 , X 2 ) = 6X1,X2ρ Esto facilita la generación de variables aleatorias que tienen un valor deseado de rho de Spearman.

ρS(X1,X2)=6πarcsin(ρ2).

El enfoque consiste en generar datos de la cópula gaussiana con un coeficiente de correlación apropiado tal que el rho de Spearman corresponda a la correlación deseada para las variables aleatorias uniformes.ρ

Algoritmo de simulación
Deje denotar el nivel deseado de correlación, yn el número de pares que se generarán. El algoritmo es:rn

  1. Calcule .ρ=2sin(rπ/6)
  2. Genere un par de variables aleatorias a partir de la cópula gaussiana (por ejemplo, con este enfoque )
  3. Repita el paso 2 veces.n

Ejemplo
El siguiente código es un ejemplo de implementación de este algoritmo usando R con una correlación objetivo y n = 500r=0.6n=500 parejas.

## Initialization and parameters 
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples

## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}

## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})

En la figura siguiente, las gráficas diagonales muestran histogramas de las variables y U 2 , y las gráficas fuera de la diagonal muestran gráficas de dispersión de U 1 yU1U2U1 . U2ingrese la descripción de la imagen aquí

Por construcción, las variables aleatorias tienen márgenes uniformes y un coeficiente de correlación (cercano a) . Pero debido al efecto del muestreo, el coeficiente de correlación de los datos simulados no es exactamente igual a rrr .

cor(U)[1, 2]
# [1] 0.5337697

Tenga en cuenta que la gen.gauss.copfunción debería funcionar con más de dos variables simplemente especificando una matriz de correlación más grande.


r=0.5,0.1,0.6n

## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations

res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

QuantIbex
fuente
3
El método general para generar distribuciones multivariadas correlacionadas con distribuciones marginales dadas se llama cópula .
whuber
@whuber, el uso de cópula permite especificar una estructura de dependencia entre variables aleatorias. El problema es que la correlación (Persona) está influenciada tanto por la estructura de dependencia como por los márgenes. Por lo tanto, cada elección de márgenes requerirá una elección correspondiente de parámetros de cópula, sin mencionar que algunos niveles de correlación simplemente no se pueden lograr para márgenes dados (por ejemplo, ver aquí ). Si conoce un método que permita "controlar" el nivel de correlación para cualquier elección de márgenes, me encantaría saberlo.
QuantIbex
Gracias @QuantIbex. Pero no entiendo por qué "a) implica que el coeficiente de correlación de Spearman rho y (Pearson) para variables aleatorias con márgenes uniformes estándar son aproximadamente iguales en una muestra grande"
Onturenio
2
[1,1]
1
@Quantibex Me tomé la libertad de agregar una oración que señala que su gen.gauss.copfunción funcionará para más de dos variables con un ajuste (trivial). Si no le gusta la adición o desea expresarla de manera diferente, revierta o cambie según sea necesario.
Glen_b -Reinstale a Monica
0

u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

I(I1)=0I2=I(1I)2=(1I)I01Iw

E(u1u2)=E(I)E(w12)+E(1I)E(w2)E(w3) =pE(w12)+(1p)/4

From the fact that V(w1)=1/12, we get E(w12)=1/3, so E(u1u2)=p/12+1/4, that is: cov(u1u2)=p/12. Since V(u1)=V(u2)=1/12, we get finally that cor(u1,u2)=p.

Neal Oden
fuente
0

Here is one easy method for positive correlation: Let (u1,u2)=Iw1+(1I)(w2,w3), where w1,w2, and w3 are independent U(0,1) and I is Bernoulli(p). u1 and u2 will then have U(0,1) distributions with correlation p. This extends immediately to k-tuples of uniforms with compound symmetric variance matrix.

If you want pairs with negative correlation, use (u1,u2)=I(w1,1w1)+(1I)(w2,w3), and the correlation will be p.

Neal Oden
fuente
Can you add a short proof of why this works?
The Laconic
if your want to be computationally efficient, u1=w1 also produces the same correlation (both positive and negative cases)
Anvit