From keith.ohara at nyu.edu  Mon Jan 22 23:32:26 2018
From: keith.ohara at nyu.edu (Keith O'Hara)
Date: Mon, 22 Jan 2018 17:32:26 -0500
Subject: [Rd] Inconsistent rank in qr()
In-Reply-To: <dce19c1c-d8e7-c315-7db2-15f3a279373d@insa-toulouse.fr>
References: <25bfaeec-31e8-c2db-812e-cb0759342a15@insa-toulouse.fr>
 <DCF48AFB-EE93-4048-99E1-56613BB43872@nyu.edu>
 <dce19c1c-d8e7-c315-7db2-15f3a279373d@insa-toulouse.fr>
Message-ID: <6AAEB2A4-D0D8-41F6-AD9E-A53A8E11E569@nyu.edu>

I agree the result is a little confusing, but the behavior is in line with the documentation and so not ?unexpected? as such...

I don?t think this is a matter of semantics, more of a ?return the rank when we have it for free? situation?when A is real-valued, qr(A,LAPACK=false) calls a modified version of Linpack?s dqrdc which computes the rank internally; see dqrdc2.f, output ?k?. Lapack?s dqeqp3 doesn?t return the rank as is.

Just my 2 cents on a potential fix: Matrix::rankMatrix follows the logic of your code, and I think this would be simpler to implement than modifying Lapack.c in two places (around lines 657 and 1175).

Keith


> On Jan 22, 2018, at 11:57 AM, Serguei Sokol <sokol at insa-toulouse.fr> wrote:
> 
> Le 22/01/2018 ? 17:40, Keith O'Hara a ?crit :
>> This behavior is noted in the qr documentation, no?
>> 
>> rank - the rank of x as computed by the decomposition(*): always full rank in the LAPACK case.
> For a me a "full rank matrix" is a matrix the rank of which is indeed min(nrow(A), ncol(A))
> but here the meaning of "always is full rank" is somewhat confusing. Does it mean
> that only full rank matrices must be submitted to qr() when LAPACK=TRUE?
> May be there is a jargon where "full rank" is a synonym of min(nrow(A), ncol(A)) for any matrix
> but the fix to stick with commonly admitted rank definition (i.e. the number of linearly independent
> columns in A) is so easy. Why to discard lapack case from it (even properly documented)?
> 
>> 
>> 
>> 
>>> On Jan 22, 2018, at 11:21 AM, Serguei Sokol <sokol at insa-toulouse.fr> wrote:
>>> 
>>> Hi,
>>> 
>>> I have noticed different rank values calculated by qr() depending on
>>> LAPACK parameter. When it is FALSE (default) a true rank is estimated and returned.
>>> Unfortunately, when LAPACK is set to TRUE, the min(nrow(A), ncol(A)) is returned
>>> which is only occasionally a true rank.
>>> 
>>> Would not it be more consistent to replace the rank in the latter case by something
>>> based on the following pseudo code ?
>>> 
>>> d=abs(diag(qr))
>>> rank=sum(d >= d[1]*tol)
>>> 
>>> Here, we rely on the fact column pivoting is activated in the called lapack routine (dgeqp3)
>>> and diagonal term in qr matrix are put in decreasing order (according to their absolute values).
>>> 
>>> Serguei.
>>> 
>>> How to reproduce:
>>> 
>>> a=diag(2)
>>> a[2,2]=0
>>> qaf=qr(a, LAPACK=FALSE)
>>> qaf$rank # shows 1. OK it's the true rank value
>>> qat=qr(a, LAPACK=TRUE)
>>> qat$rank #shows 2. Bad, it's not the expected value.
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
> 
> -- 
> Serguei Sokol
> Ingenieur de recherche INRA
> 
> Cellule math?matique
> LISBP, INSA/INRA UMR 792, INSA/CNRS UMR 5504
> 135 Avenue de Rangueil
> 31077 Toulouse Cedex 04
> 
> tel: +33 5 6155 9849
> email: sokol at insa-toulouse.fr <mailto:sokol at insa-toulouse.fr>
> http://www.lisbp.fr <http://www.lisbp.fr/>

	[[alternative HTML version deleted]]



[Rd] Inconsistent rank in qr()
Keith O'Hara