[R] How to extract diagonals

Gavin Simpson gavin.simpson at ucl.ac.uk
Wed Jun 20 18:44:38 CEST 2007


On Wed, 2007-06-20 at 18:24 +0200, Birgit Lemcke wrote:
> Hello Gavin!
> 
> 
> I thank you so much that you help me here.
> Only to answer your questions there are 452 samples (species) in A and
> the same number in B.

If your matrices are both 452x452 then distance() is going to take a
while to crunch through the numbers. 24 seconds or there abouts on my
work desktop. distance() (and analogue for that matter) is still very
much in development, and these dissimilarities should really be coded in
C for speed. It is on the todo list but I need to learn some C first...

HTH

G

> Unfortunately I will get the book from Legendre & Legendre only in 2
> days (small library) but I think for the moment I am busy to try and
> learn with the codes you gave me here.
> For me it seems that this will solve all the problems I have at the
> moment.
> Now it is my turn to learn about it.
> 
> 
> Once again: thanks
> 
> 
> Greetings 
> 
> 
> Birgit
> 
> 
> 
> Am 20.06.2007 um 18:02 schrieb Gavin Simpson:
> 
> > On Wed, 2007-06-20 at 15:09 +0200, Birgit Lemcke wrote:
> > > Hello Gavin and thanks for your answer.
> > > 
> > > 
> > > Your completely right I dont need the diagonal that is the
> > > bisecting  
> > > line of the angle.
> > > 
> > > 
> > > I need another diagonal of the (now) matrix.
> > > 
> > > 
> > >          A1 A2 A3 A4 B1 B2 B3 B4
> > >     A1
> > >     A2
> > >     A3
> > >     A4
> > >     B1 X
> > >     B2       X
> > >     B3            X
> > >     B4                 X
> > > 
> > > 
> > 
> > 
> > Not easily, especially without knowing how many samples are in A or
> > B,
> > although all that is really needed is some careful subsetting of the
> > dist object and a minor amount of programming - unfortunately after
> > close to two weeks intensive teaching my brain isn't up to doing
> > that
> > just now.
> > 
> > 
> > One simple way to do this is to use the distance() function in my
> > analogue package (on CRAN). distance() can calculate the
> > dissimilarities
> > between one group of samples and another. Here is a simple example
> > using
> > some dummy data, from ?distance:
> > 
> > 
> >      ## simple example using dummy data
> >      train <- data.frame(matrix(abs(runif(200)), ncol = 10))
> >      rownames(train) <- LETTERS[1:20]
> >      colnames(train) <- as.character(1:10)
> >      fossil <- data.frame(matrix(abs(runif(100)), ncol = 10))
> >      colnames(fossil) <- as.character(1:10)
> >      rownames(fossil) <- letters[1:10]
> > 
> > 
> >      ## calculate distances/dissimilarities between train and fossil
> >      ## samples
> >      test <- distance(train, fossil)
> > 
> > 
> > test is now a matrix, the diagonal elements of which are the values
> > that
> > you appear to want:
> > 
> > 
> >      diag(test)
> > 
> > 
> > if I'm reading your diagram correctly. Note that for this, you need
> > to
> > be comparing row 1 from matrix A with row 1 from matrix B - if they
> > are
> > in some other order, then this won't work.
> > 
> > 
> > distance() has a version of Gower's coefficient for mixed that
> > allows
> > you to specify weights. The function is just about clever enough to
> > allow missing values if you use method = "mixed" in distance(). Be
> > sure
> > to read up about Gower's mixed coefficient in his 1971 paper (Gower,
> > 1971, Biometrics 23; 623--637) and the use that weights and the
> > range
> > parameter Rj are put to, or see the relevant section in Legendre &
> > Legendre (1998).
> > 
> > 
> > > I need for example the diagonal that compares A1 with B1.
> > > Do you have an idea how I can handle this?
> > > 
> > > 
> > > What is the effect of this code?
> > > 
> > > 
> > > all.equal(diags, diag(as.matrix(dis.bc)))
> > 
> > 
> > This was showing you that the diagonals of the dissimilarity matrix
> > are
> > just a vector of zeroes. all.equal tests equality of its arguments.
> > 
> > 
> > > 
> > > 
> > > Thanks a lot and sorry for my inability to solve my problems on my
> > > own.
> > 
> > 
> > You're welcome. Using R is a learning experience. You only need to
> > grovel and apologise if you have not done your homework before
> > posting
> > and not read the FAQ, the documentation or searched the archives, or
> > followed the posting guide. Which is not the case here.
> > 
> > 
> > HTH
> > 
> > 
> > G
> > 
> > 
> > > 
> > > 
> > > Am 20.06.2007 um 14:11 schrieb Gavin Simpson:
> > > 
> > > 
> > > > On Wed, 2007-06-20 at 13:26 +0200, Birgit Lemcke wrote:
> > > > > Hello,
> > > > > 
> > > > > 
> > > > > I am using Mac OS X on a power book and R 2.5.0
> > > > > 
> > > > > 
> > > > > I try to extract a diagonal from a dissimilarity matrix made
> > > > > with
> > > > > dsvdis, with this code:
> > > > > 
> > > > > 
> > > > > diag(DiTestRR)
> > > > > 
> > > > > 
> > > > > But I get this error message:
> > > > > 
> > > > > 
> > > > > Fehler in array(0, c(n, p)) : 'dim' spezifiziert ein zu groes
> > > > > Array
> > > > > 
> > > > > 
> > > > > english:
> > > > > 
> > > > > 
> > > > > Error in array(0, c(n, p)) : 'dim' specifies a too big array.
> > > > > 
> > > > > 
> > > > > Is there a limit to extract diagonals?
> > > > 
> > > > 
> > > > The returned object is not a matrix, but an object of class
> > > > "dist"  
> > > > which
> > > > doesn't store the diagonals or the upper triangle of the
> > > > dissimilarity
> > > > matrix to save memory. You need to convert the dist object to a
> > > > matrix
> > > > first, then extract the diagonal. But, as this shows:
> > > > 
> > > > 
> > > > > require(labdsv)
> > > > > ?dsvdis
> > > > > data(bryceveg)
> > > > > ?dsvdis
> > > > > dis.bc <- dsvdis(bryceveg,index="bray/curtis")
> > > > Warning in symbol.For("dsvdis") : 'symbol.For' is not needed:
> > > > please
> > > > remove it
> > > > > diag(as.matrix(dis.bc))
> > > > 
> > > > 
> > > > This is meaningless as the diagonals are all zero, as they
> > > > should be;
> > > > this is the distance between a site and itself.
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > I hope somebody will help me!
> > > > 
> > > > 
> > > > So perhaps you could explain why you want the diagonal. It would
> > > > be
> > > > easier to just do:
> > > > 
> > > > 
> > > > diags <- rep(0, length = nrow(bryceveg))
> > > > 
> > > > 
> > > > That will be without the sample labels, but that is easily
> > > > rectified
> > > > 
> > > > 
> > > > > names(diags) <- rownames(bryceveg)
> > > > > all.equal(diags, diag(as.matrix(dis.bc)))
> > > > [1] TRUE
> > > > 
> > > > 
> > > > So you'll have to reformulate your question if this is not what
> > > > you
> > > > wanted.
> > > > 
> > > > 
> > > > A word of warning, do not do diag(dis.bc)) on the above as it  
> > > > brought my
> > > > Linux box to it's knees trying to do something silly - easily
> > > > recoverable, but beware.
> > > > 
> > > > 
> > > > HTH
> > > > 
> > > > 
> > > > G
> > > > 
> > > > 
> > > > > 
> > > > > 
> > > > > Greetings
> > > > > 
> > > > > 
> > > > > Birgit Lemcke
> > > > 
> > > > 
> > > > -- 
> > > > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
> > > > %~%~%
> > > >  Gavin Simpson                 [t] +44 (0)20 7679 0522
> > > >  ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
> > > >  Pearson Building,             [e]
> > > > gavin.simpsonATNOSPAMucl.ac.uk
> > > >  Gower Street, London          [w]
> > > > http://www.ucl.ac.uk/~ucfagls/
> > > >  UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
> > > > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
> > > > %~%~%
> > > > 
> > > > 
> > > 
> > > 
> > > Birgit Lemcke
> > > Institut fr Systematische Botanik
> > > Zollikerstrasse 107
> > > CH-8008 Zrich
> > > Switzerland
> > > Ph: +41 (0)44 634 8351
> > > birgit.lemcke at systbot.uzh.ch
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > 
> > > [[alternative HTML version deleted]]
> > > 
> > > 
> > > ______________________________________________
> > > 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
> > > and provide commented, minimal, self-contained, reproducible code.
> > -- 
> > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
> > %
> >  Gavin Simpson                 [t] +44 (0)20 7679 0522
> >  ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
> >  Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
> >  Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
> >  UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
> > %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~
> > %
> > 
> > 
> 
> Birgit Lemcke
> Institut für Systematische Botanik
> Zollikerstrasse 107
> CH-8008 Zürich
> Switzerland
> Ph: +41 (0)44 634 8351
> birgit.lemcke at systbot.uzh.ch
>  
> 
> 
> 
> 
> 
> 
> 
> 
-- 
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
 Gavin Simpson                 [t] +44 (0)20 7679 0522
 ECRC, UCL Geography,          [f] +44 (0)20 7679 0565
 Pearson Building,             [e] gavin.simpsonATNOSPAMucl.ac.uk
 Gower Street, London          [w] http://www.ucl.ac.uk/~ucfagls/
 UK. WC1E 6BT.                 [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%



More information about the R-help mailing list