[R] Creating 3 vectors that sum to 1

Greg Snow Greg.Snow at imail.org
Wed Mar 30 21:27:17 CEST 2011


Here is one comparison:

library(TeachingDemos)
library(gtools)

dirfun1 <- function(n, pch='.',...,orig=TRUE) {
	if(orig) {
		tmp <- matrix( runif(n*2), n, 2 )
		rtmp <- cbind( pmin( tmp[,1], tmp[,2] ), abs( tmp[,1]-tmp[,2] ), 1-pmax( tmp[,1], tmp[,2] ) )
		triplot(rtmp, pch=pch, ...)
	} else {
		triplot( rdirichlet(n, rep(1,3)), pch=pch, ... )
	}
}

vis.test( 1000, FUN=dirfun1 )


Now on each set of plots click (or have an independent person click) on the one that looks most different from the others (singing/humming the song from Sesame Street is purely optional).

I did it twice and got a p-value of 1 each time. 


-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111


> -----Original Message-----
> From: Ravi Varadhan [mailto:rvaradhan at jhmi.edu]
> Sent: Tuesday, March 29, 2011 4:41 PM
> To: Greg Snow
> Cc: r-help at r-project.org
> Subject: Re: RE: [R] Creating 3 vectors that sum to 1
> 
> Hi Greg,
> 
> Thanks.
> 
> Here is one approach to speeding up the 1st method that I had
> suggested:
> 
> n <- 10000
> set.seed(123)
> rtrg <- matrix(NA, n, 3)
> system.time(for (i in 1:n) rtrg[i,] <- diff(c(0, sort(runif(2)), 1)))
> 
> set.seed(123)
> system.time({
> tmp <- matrix(runif(n*2), n, 2, byrow=TRUE)
> rtrg.1 <- cbind(pmin(tmp[,1], tmp[,2]), abs(tmp[,1] - tmp[,2]),1 -
> pmax(tmp[,1], tmp[,2]))
> })
> 
> all.equal(rtrg, rtrg.1)
> 
> Now, how can we use vis.test to test differences between these?
> 
> Best,
> Ravi.
> ____________________________________________________________________
> 
> Ravi Varadhan, Ph.D.
> Assistant Professor,
> Division of Geriatric Medicine and Gerontology
> School of Medicine
> Johns Hopkins University
> 
> Ph. (410) 502-2619
> email: rvaradhan at jhmi.edu
> 
> 
> ----- Original Message -----
> From: Greg Snow <Greg.Snow at imail.org>
> Date: Tuesday, March 29, 2011 3:42 pm
> Subject: RE: [R] Creating 3 vectors that sum to 1
> To: Ravi Varadhan <rvaradhan at jhmi.edu>
> Cc: "r-help at r-project.org" <r-help at r-project.org>
> 
> 
> > Or we could expand a bit more:
> >
> > require(TeachingDemos)
> > require(gtools)
> >
> > n <- 1000
> > rtrg <- matrix(NA, n, 3)
> > for (i in 1:n) rtrg[i,] <- diff(c(0, sort(runif(2)), 1))
> >
> > rtrg2 <- matrix(NA, n, 3)
> > for (i in 1:n) {
> > tmp <- runif(3)
> > rtrg2[i, ] <- tmp/sum(tmp)
> > }
> >
> > rtrg3 <- matrix( rexp(n*3), ncol=3 )
> > rtrg3 <- rtrg3/rowSums(rtrg3)
> >
> > rtrg4 <- rdirichlet(n, rep(1,3))
> >
> > par(mfrow=c(2,2))
> > triplot(rtrg, pch='.')  # Looks more uniformly distributed
> > triplot(rtrg2, col=2, pch='.')  # Corners are sparsely populated
> > triplot(rtrg3, col=3, pch='.')
> > triplot(rtrg4, col=4, pch='.')
> >
> >
> >
> >
> > What could also be interesting in using vis.test (also TeachingDemos)
> > to see which can be told apart from each other.  My guess is that
> > rtrg2 method will be visible different from the other 3, but the
> other
> > 3 will be indistinguishable from each other.
> >
> > The last 2 have the advantage (the 2nd could be rewritten to have the
> > same advantage) of being much quicker, not sure how to speed up the
> > 1st noticibly.
> >
> >
> >
> > --
> > Gregory (Greg) L. Snow Ph.D.
> > Statistical Data Center
> > Intermountain Healthcare
> > greg.snow at imail.org
> > 801.408.8111
> >
> >
> > > -----Original Message-----
> > > From: Ravi Varadhan [
> > > Sent: Tuesday, March 29, 2011 12:59 PM
> > > To: Ravi Varadhan
> > > Cc: Greg Snow; r-help at r-project.org
> > > Subject: Re: [R] Creating 3 vectors that sum to 1
> > >
> > >
> > > Here is an exploration of two different 3-tuple generators (that
> sum
> > to
> > > 1) based on Greg's triplot function:
> > >
> > > require(TeachingDemos)
> > >
> > > n <- 1000
> > > rtrg <- matrix(NA, n, 3)
> > > for (i in 1:n) rtrg[i,] <- diff(c(0, sort(runif(2)), 1))
> > >
> > > rtrg2 <- matrix(NA, n, 3)
> > > for (i in 1:n) {
> > > tmp <- runif(3)
> > > rtrg2[i, ] <- tmp/sum(tmp)
> > > }
> > >
> > > par(mfrow=c(2,1))
> > > triplot(rtrg)  # Looks more uniformly distributed
> > > triplot(rtrg2, col=2)  # Corners are sparsely populated
> > >
> > > Ravi.
> > >
> ____________________________________________________________________
> > >
> > > Ravi Varadhan, Ph.D.
> > > Assistant Professor,
> > > Division of Geriatric Medicine and Gerontology
> > > School of Medicine
> > > Johns Hopkins University
> > >
> > > Ph. (410) 502-2619
> > > email: rvaradhan at jhmi.edu
> > >
> > >
> > > ----- Original Message -----
> > > From: Ravi Varadhan <rvaradhan at jhmi.edu>
> > > Date: Tuesday, March 29, 2011 2:33 pm
> > > Subject: Re: [R] Creating 3 vectors that sum to 1
> > > To: Greg Snow <Greg.Snow at imail.org>
> > > Cc: "r-help at r-project.org" <r-help at r-project.org>
> > >
> > >
> > > > The following one-liner generates uniformly distributed 3-tuples
> that
> > > > sum to 1:
> > > >
> > > > diff(c(0, sort(runif(2)), 1))
> > > >
> > > > More, generally you can generate n-tuples that sum to unity as:
> > > >
> > > > diff(c(0, sort(runif(n-1)), 1))
> > > >
> > > >
> > > > Ravi.
> > > >
> > > >
> ____________________________________________________________________
> > > >
> > > > Ravi Varadhan, Ph.D.
> > > > Assistant Professor,
> > > > Division of Geriatric Medicine and Gerontology
> > > > School of Medicine
> > > > Johns Hopkins University
> > > >
> > > > Ph. (410) 502-2619
> > > > email: rvaradhan at jhmi.edu
> > > >
> > > >
> > > > ----- Original Message -----
> > > > From: Greg Snow <Greg.Snow at imail.org>
> > > > Date: Tuesday, March 29, 2011 1:02 pm
> > > > Subject: Re: [R] Creating 3 vectors that sum to 1
> > > > To: Christopher Desjardins <cddesjardins at gmail.com>,
> > > > "r-help at r-project.org" <r-help at r-project.org>
> > > >
> > > >
> > > > > Do a search for Dirichlet, that may give you the tools you
> need.
> > > > Also
> > > > > for plotting 3 vectors that sum to 1, instead of a 3d scatter
> plot
> > > > you
> > > > > should look into a triangle or trilinear plot, see ?triplot in
> the
> > > > > TeachingDemos package (the see also for that help page lists
> > > several
> > > >
> > > > > other implementations in other packages as well).
> > > > >
> > > > > --
> > > > > Gregory (Greg) L. Snow Ph.D.
> > > > > Statistical Data Center
> > > > > Intermountain Healthcare
> > > > > greg.snow at imail.org
> > > > > 801.408.8111
> > > > >
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: r-help-bounces at r-project.org [
> > > > > > project.org] On Behalf Of Christopher Desjardins
> > > > > > Sent: Tuesday, March 29, 2011 10:20 AM
> > > > > > To: r-help at r-project.org
> > > > > > Subject: [R] Creating 3 vectors that sum to 1
> > > > > >
> > > > > > I have 3 vectors: p1, p2, and p3. I would like each vector to
> > be
> > > any
> > > > > > possible value between 0 and 1 and p1 + p2 + p3 = 1. I want
> to
> > > graph
> > > > > > these
> > > > > > and I've thought about using scatterplot3d(). Here's what I
> have
> > > so
> > > > > > far.
> > > > > >
> > > > > > library(scatterplot3d)
> > > > > > p1 <-
> c(1,0,0,.5,.5,0,.5,.25,.25,.34,.33,.33,.8,.1,.1,.9,.05,.05)
> > > > > > p2 <-
> c(0,1,0,.5,0,.5,.25,.5,.25,.33,.34,.33,.1,.8,.1,.05,.9,.05)
> > > > > > p3 <-
> c(0,0,1,0,.5,.5,.25,.25,.5,.33,.33,.34,.1,.1,.8,.05,.05,.9)
> > > > > > scatterplot3d(p1,p2,p3)
> > > > > >
> > > > > >
> > > > > > However, I wonder if there is an easy way to create vectors
> p1,
> > > > p2,
> > > > > and
> > > > > > p3.
> > > > > >
> > > > > > 	[[alternative HTML version deleted]]
> > > > > >
> > > > > > ______________________________________________
> > > > > > R-help at r-project.org mailing list
> > > > > >
> > > > > > PLEASE do read the posting guide
> > > > > > guide.html
> > > > > > and provide commented, minimal, self-contained, reproducible
> > > code.
> > > > >
> > > > > ______________________________________________
> > > > > R-help at r-project.org mailing list
> > > > >
> > > > > PLEASE do read the posting guide
> > > > > and provide commented, minimal, self-contained, reproducible
> code.
> > > >
> > > > ______________________________________________
> > > > R-help at r-project.org mailing list
> > > >
> > > > PLEASE do read the posting guide
> > > > and provide commented, minimal, self-contained, reproducible
> code.



More information about the R-help mailing list