Gere pares de números aleatórios uniformemente distribuídos e correlacionados

14

Eu gostaria de gerar pares de números aleatórios com certa correlação. No entanto, a abordagem usual de usar uma combinação linear de duas variáveis ​​normais não é válida aqui, porque uma combinação linear de variáveis ​​uniformes não é mais uma variável distribuída uniformemente. Eu preciso que as duas variáveis ​​sejam uniformes.

Alguma idéia de como gerar pares de variáveis ​​uniformes com uma determinada correlação?

Onturenio
fonte
6
Intimamente relacionado: stats.stackexchange.com/questions/30526 . Você também deseja conferir a tag copula - basta clicar no link aqui. Uma técnica rápida e suja é permitir que X seja uniforme e quando e caso contrário. A correlação é , de onde faz o truque. Mas cópulas lhe dará mais controle .... [0,1]Y=XXαY=1+αXρ=2(α1)3+1α=1((1ρ)/2)1/3
whuber
Obrigado pelo comentário, mas sim, eu acho que este método é realmente "sujo"
Onturenio
1
Minha esperança era que, ao ver essa abordagem, você reconhecesse que pode (e deve) fornecer critérios adicionais relativos às propriedades de seus pares de números aleatórios. Se isso estiver "sujo", exatamente o que há de errado com a solução? Diga-nos para que possamos fornecer respostas mais adequadas à sua situação.
whuber
Esta questão foi respondida incidentalmente na resposta a uma questão intimamente relacionada: como gerar pares de RVs com uma relação de regressão linear. Como a inclinação da regressão linear está relacionada de maneira prontamente calculada ao coeficiente de correlação, e todas as inclinações possíveis podem ser produzidas, é possível produzir exatamente o que você deseja. Consulte stats.stackexchange.com/questions/257779/… .
whuber
1
Consulte também stats.stackexchange.com/questions/31771 , que responde à generalização de três uniformes aleatórios.
whuber

Respostas:

16

Não conheço um método universal para gerar variáveis ​​aleatórias correlacionadas com qualquer distribuição marginal. Então, proponho um método ad hoc para gerar pares de variáveis ​​aleatórias distribuídas uniformemente com uma dada correlação (Pearson). Sem perda de generalidade, presumo que a distribuição marginal desejada seja uniforme padrão (ou seja, o suporte é ).[0,1]

A abordagem proposta baseia-se no seguinte:
a) Para as variáveis aleatórias uniformes padrão e L 2 com as respectivas funções de distribuição de F 1 e F 2 , temos F i ( L i ) = L i , para i = 1 , 2 . Assim, por definição Rho de Spearman é ρ S ( L 1 , L 2 ) = c o r r ( FU1U2F1F2Fi(Ui)=Uii=1,2 Portanto, o rho de Spearman e o coeficiente de correlação de Pearson são iguais (versões amostrais podem, no entanto, diferir).

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

b) Se são variáveis aleatórias com margens contínuas e Gaussiana cópula com (Pearson) correlação coeficiente ρ , em seguida, Rho de Spearman é ρ S ( X 1 , X 2 ) = 6X1,X2ρ Isso facilita a geração de variáveis ​​aleatórias com o valor desejado do rho de Spearman.

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

A abordagem é gerar dados da cópula gaussiana com um coeficiente de correlação adequado modo que o rho de Spearman corresponda à correlação desejada para as variáveis ​​aleatórias uniformes.ρ

Algoritmo de simulação
Deixe denotar o nível de correlação desejado e n o número de pares a serem gerados. O algoritmo é:rn

  1. Calcule .ρ=2sin(rπ/6)
  2. Gere um par de variáveis ​​aleatórias da cópula gaussiana (por exemplo, com esta abordagem )
  3. Repita o passo 2 vezes.n

Exemplo
O seguinte código é um exemplo de execução deste algoritmo com R com um alvo de correlação e n = 500 pares.r=0.6n=500

## 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))})

Na figura abaixo, os gráficos diagonais mostram histogramas das variáveis e U 2 e os gráficos fora da diagonal mostram gráficos de dispersão de U 1 e U 2 . U1U2U1U2insira a descrição da imagem aqui

Por construção, as variáveis ​​aleatórias têm margens uniformes e um coeficiente de correlação (próximo a) . Porém, devido ao efeito da amostragem, o coeficiente de correlação dos dados simulados não é exatamente igual a r .rr

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

Observe que a gen.gauss.copfunção deve funcionar com mais de duas variáveis ​​simplesmente especificando uma matriz de correlação maior.

Estudo de simulação
O estudo de simulação a seguir repetido para a correlação alvo sugere que a distribuição do coeficiente de correlação converge para a correlação desejada conforme o tamanho da amostra n aumenta.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")

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

QuantIbex
fonte
3
O método geral para gerar distribuições multivariadas correlacionadas com determinadas distribuições marginais é chamado de cópula .
whuber
@whuber, o uso de cópula permite especificar uma estrutura de dependência entre variáveis ​​aleatórias. O problema é que a correlação (Pessoa) é influenciada pela estrutura de dependência e pelas margens. Portanto, cada escolha de margens exigirá uma escolha correspondente de parâmetros de cópula, sem mencionar que alguns níveis de correlação simplesmente não podem ser atingidos para determinadas margens (por exemplo, veja aqui ). Se você conhece um método que permite 'controlar' o nível de correlação para qualquer escolha de margens, eu gostaria de saber sobre ele.
precisa saber é o seguinte
Obrigado @QuantIbex. Mas eu não entendo por que "a) implica que rho de Spearman e () coeficiente de correlação de Pearson para variáveis aleatórias com margens uniforme padrão são aproximadamente iguais em grande amostra"
Onturenio
2
[1,1]
1
@Quantibex Tomei a liberdade de adicionar uma frase que indique que sua gen.gauss.copfunção funcionará para mais de duas variáveis ​​com um ajuste (trivial). Se você não gostar da adição ou deseja colocá-la de maneira diferente, reverta ou altere conforme necessário.
Glen_b -Reinstate 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

V(w1)=1/12E(w12)=1/3E(u1u2)=p/12+1/4cov(u1u2)=p/12V(u1)=V(u2)=1/12cor(u1,u2)=p

Neal Oden
fonte
0

(u1,u2)=Iw1+(1I)(w2,w3)w1,w2,w3U(0,1)Ipu1u2U(0,1)pk

(u1,u2)=I(w1,1w1)+(1I)(w2,w3)p

Neal Oden
fonte
Você pode adicionar uma prova curta de por que isso funciona?
The Laconic
se você deseja ser computacionalmente eficiente, você1=W1também produz a mesma correlação (ambos os casos positivos e negativos)
Anvit