Desde que a pergunta é
"como usar a distribuição Uniform para gerar números aleatórios correlacionados a partir de diferentes distribuições marginais em "R
e não apenas variáveis aleatórias normais, a resposta acima não produz simulações com a correlação pretendida para um par arbitrário de distribuições marginais em .R
O motivo é que, para a maioria das cdfs e , quando onde indica o cdf normal padrão.G Y cor ( X , Y ) ≠ cor ( G - 1 X ( Φ ( X ) , G - 1 Y ( Φ ( Y ) ) , ( X , Y ) ∼ N 2 ( 0 , Σ ) , ΦGXGY
cor(X,Y)≠cor(G−1X(Φ(X),G−1Y(Φ(Y)),
(X,Y)∼N2(0,Σ),
Φ
A saber, aqui está um contra-exemplo com um Exp (1) e um Gamma (.2,1) como meu par de distribuições marginais em .R
library(mvtnorm)
#correlated normals with correlation 0.7
x=rmvnorm(1e4,mean=c(0,0),sigma=matrix(c(1,.7,.7,1),ncol=2),meth="chol")
cor(x[,1],x[,2])
[1] 0.704503
y=pnorm(x) #correlated uniforms
cor(y[,1],y[,2])
[1] 0.6860069
#correlated Exp(1) and Ga(.2,1)
cor(-log(1-y[,1]),qgamma(y[,2],shape=.2))
[1] 0.5840085
Outro contra-exemplo óbvio é quando é o cdf de Cauchy, caso em que a correlação não é definida.GX
Para dar uma imagem mais ampla, aqui está um código R onde e são arbitrários:G YGXGY
etacor=function(rho=0,nsim=1e4,fx=qnorm,fy=qnorm){
#generate a bivariate correlated normal sample
x1=rnorm(nsim);x2=rnorm(nsim)
if (length(rho)==1){
y=pnorm(cbind(x1,rho*x1+sqrt((1-rho^2))*x2))
return(cor(fx(y[,1]),fy(y[,2])))
}
coeur=rho
rho2=sqrt(1-rho^2)
for (t in 1:length(rho)){
y=pnorm(cbind(x1,rho[t]*x1+rho2[t]*x2))
coeur[t]=cor(fx(y[,1]),fy(y[,2]))}
return(coeur)
}
Brincar com cdfs diferentes me levou a destacar esse caso especial de uma para e uma distribuição log-Normal para : G X G Yχ23GXGY
rhos=seq(-1,1,by=.01)
trancor=etacor(rho=rhos,fx=function(x){qchisq(x,df=3)},fy=qlnorm)
plot(rhos,trancor,ty="l",ylim=c(-1,1))
abline(a=0,b=1,lty=2)
que mostra a que distância da diagonal a correlação pode estar.
Um aviso final Dadas duas distribuições arbitrárias e , o intervalo de valores possíveis de não é necessariamente
. O problema pode, portanto, não ter solução.G Y cor ( X , Y ) ( - 1 , 1 )GXGYcor(X,Y)(−1,1)