Menghui Chen
2005-Jul-01 20:48 UTC
[R] Generating correlated data from uniform distribution
Dear R users, I want to generate two random variables (X1, X2) from uniform distribution (-0.5, 0.5) with a specified correlation coefficient r. Does anyone know how to do it in R? Many thanks! Menghui
Jim Brennan
2005-Jul-01 21:46 UTC
[R] Generating correlated data from uniform distribution
> dat<-matrix(runif(2000),2,1000) > rho<-.77 > R<-matrix(c(1,rho,rho,1),2,2) > dat2<-t(ch)%*%dat > cor(dat2[1,],dat2[2,])[1] 0.7513892> dat<-matrix(runif(20000),2,10000) > rho<-.28 > R<-matrix(c(1,rho,rho,1),2,2) > ch<-chol(R) > dat2<-t(ch)%*%dat > cor(dat2[1,],dat2[2,])[1] 0.2681669> dat<-matrix(runif(200000),2,100000) > rho<-.28 > R<-matrix(c(1,rho,rho,1),2,2) > ch<-chol(R) > dat2<-t(ch)%*%dat > cor(dat2[1,],dat2[2,])[1] 0.2814035>See ?choleski -----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Menghui Chen Sent: July 1, 2005 4:49 PM To: r-help at stat.math.ethz.ch Subject: [R] Generating correlated data from uniform distribution Dear R users, I want to generate two random variables (X1, X2) from uniform distribution (-0.5, 0.5) with a specified correlation coefficient r. Does anyone know how to do it in R? Many thanks! Menghui ______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
alejandro munoz
2005-Jul-02 00:11 UTC
[R] Generating correlated data from uniform distribution
Dear Menghui, You may consider looking in Luc Devroye's "Non-uniform Random Number Generation". Despite its title, section XI.3.2 describes how to generate bivariate uniforms. The book is out of print but Devroye himself urges you to print it from his scanned PDFs(!): http://cgm.cs.mcgill.ca/~luc/rnbookindex.html Hope this helps, alejandro On 7/1/05, Menghui Chen <menghui at gmail.com> wrote:> Dear R users, > > I want to generate two random variables (X1, X2) from uniform > distribution (-0.5, 0.5) with a specified correlation coefficient r. > Does anyone know how to do it in R? > > Many thanks! > > Menghui > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
Ken Knoblauch
2005-Jul-02 07:06 UTC
[R] Generating correlated data from uniform distribution
While you are looking at weird distributions, here is one that we have used in experiments on noise masking to explore the bandwidth of visual mechanisms D'Zmura, M., & Knoblauch, K. (1998). Spectral bandwidths for the detection of color. Vision Research, 20, 3117-28 and G. Monaci, G. Menegaz, S. Susstrunk and K. Knoblauch Chromatic Contrast Detection in Spatial Chromatic Noise Visual Neuroscience, Vol. 21, No 3, pp. 291-294, 2004 N <- 10000 x <- runif(N, -.5,.5) y <- runif(N, -abs(x), abs(x)) plot(x,y) y is not uniform but it is conditional on x. The plot reveals why we called this "sectored noise". HTH ken -------------------------------------------------------- "Jim Brennan" <jfbrennan at rogers.com> writes:> Yes you are right I guess this works only for normal data. Free advice > sometimes comes with too little consideration :-)Worth every cent...> Sorry about that and thanks to Spencer for the correct way.Hmm, but is it? Or rather, what is the relation between the correlation of the normals and that of the transformed variables? Looks nontrivial to me. Incidentally, here's a way that satisfies the criteria, but in a rather weird way: N <- 10000 rho <- .6 x <- runif(N, -.5,.5) y <- x * sample(c(1,-1), N, replace=T, prob=c((1+rho)/2,(1-rho)/2)) -- O__ ---- Peter Dalgaard ??ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907 ____________________ Ken Knoblauch Inserm U371, Cerveau et Vision Department of Cognitive Neurosciences 18 avenue du Doyen Lepine 69500 Bron France tel: +33 (0)4 72 91 34 77 fax: +33 (0)4 72 91 34 61 portable: 06 84 10 64 10 http://www.lyon.inserm.fr/371/
Peter Dalgaard
2005-Jul-02 08:52 UTC
[R] Generating correlated data from uniform distribution
"Jim Brennan" <jfbrennan at rogers.com> writes:> OK now I am skeptical especially when you say in a weird way:-) > This may be OK but look at plot(x,y) and I am suspicious. Is it still > alright with this kind of relationship?...> N <- 10000 > rho <- .6 > x <- runif(N, -.5,.5) > y <- x * sample(c(1,-1), N, replace=T, prob=c((1+rho)/2,(1-rho)/2))Well, the covariance is (everything has mean zero, of course) E(XY) = (1+rho)/2*EX^2 + (1-rho)/2*E(X*-X) = rho*EX^2 The marginal distribution of Y is a mixture of two identical uniforms (X and -X) so is uniform and in particular has the same variance as X. In summary, EXY/sqrt(EX^2EY^2) == rho So as I said, it satisfies the formal requirements. X and Y are uniformly distributed and their correlation is rho. If for nothing else, I suppose that this example is good for demonstrating that independence and uncorrelatedness is not the same thing. -- O__ ---- Peter Dalgaard ??ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
Here is an approach using 'optim' and simulated annealing: x <- sort(runif(1000)) y <- sort(runif(1000)) ord <- 1:1000 target <- function(ord){ ( cor(x, y[ord]) - 0.6 ) ^2 } new.point <- function(ord){ tmp <- sample(length(ord), 2) ord[tmp] <- ord[rev(tmp)] ord } new.point2 <- function(ord){ tmp <- sample(length(ord) -100, 1) tmp2 <- sample(100, 1) ord[ c(tmp, tmp+tmp2) ] <- ord[ c(tmp+tmp2, tmp) ] ord } res <- optim(ord, target, new.point, method="SANN", control = list(maxit=6000, temp=2000, trace=TRUE)) res2 <- optim(ord, target, new.point2, method="SANN", control = list(maxit=60000, temp=200, trace=TRUE)) y <- y[res$par] par(mfrow=c(2,2)) hist(x) hist(y) plot(x,y) cor(x,y) y <- sort(y)[res2$par] par(mfrow=c(2,2)) hist(x) hist(y) plot(x,y) cor(x,y) Hope this helps, Greg Snow, Ph.D. Statistical Data Center, LDS Hospital Intermountain Health Care greg.snow at ihc.com (801) 408-8111>>> "Jim Brennan" <jfbrennan at rogers.com> 07/01/05 05:25PM >>>OK now I am skeptical especially when you say in a weird way:-) This may be OK but look at plot(x,y) and I am suspicious. Is it still alright with this kind of relationship? For large N it appears Spencer's method is returning slightly lower correlation for the uniforms as compared to the normals so maybe there is a problem!?! Hope we are all learning something and Menghui gets/has what he wants . :-) -----Original Message----- From: pd at pubhealth.ku.dk [mailto:pd at pubhealth.ku.dk] On Behalf Of Peter Dalgaard Sent: July 1, 2005 6:59 PM To: Jim Brennan Cc: 'Tony Plate'; 'Menghui Chen'; r-help at stat.math.ethz.ch Subject: Re: [R] Generating correlated data from uniform distribution "Jim Brennan" <jfbrennan at rogers.com> writes:> Yes you are right I guess this works only for normal data. Free advice > sometimes comes with too little consideration :-)Worth every cent...> Sorry about that and thanks to Spencer for the correct way.Hmm, but is it? Or rather, what is the relation between the correlation of the normals and that of the transformed variables? Looks nontrivial to me. Incidentally, here's a way that satisfies the criteria, but in a rather weird way: N <- 10000 rho <- .6 x <- runif(N, -.5,.5) y <- x * sample(c(1,-1), N, replace=T, prob=c((1+rho)/2,(1-rho)/2)) -- O__ ---- Peter Dalgaard ??ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907 ______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html