[Rd] Unexpected behaviour of base::qr()$rank

Iñaki Úcar i.ucar86 at gmail.com
Thu Jun 22 20:41:56 CEST 2017


2017-06-22 20:31 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>:
>
>
> On 22.06.2017 20:09, Iñaki Úcar wrote:
>>
>> 2017-06-22 19:49 GMT+02:00 Uwe Ligges <ligges at statistik.tu-dortmund.de>:
>>>
>>> On 22.06.2017 17:11, Bernd Funovits wrote:
>>>>
>>>>
>>>> Hello,
>>>>
>>>> I experienced some unexpected behaviour while determining the rank of
>>>> matrices (sometimes 1x1 matrices):
>>>> base::qr(matrix(1e-20))$rank returns 1 (incorrect)
>>>> base::qr(diag(c(1, 1e-20)))$rank returns 2 (incorrect)
>>>
>>>
>>>
>>> Why do you believe this is incorrect?
>>>
>>> 0 != 1e-20
>>>
>>> and 1e-20 is well representable without significant rounding errors given
>>>
>>>> .Machine$double.xmin
>>>
>>> [1] 2.225074e-308
>>>
>>>
>>> Best,
>>> Uwe Ligges
>>
>>
>> qr() has a tolerance argument which by default is tol=1e-07.
>
>
> But the tolerance is not about the size of the values! It is about the
> reduction of the norm during the householder transformation. From the
> sources <https://svn.r-project.org/R/trunk/src/appl/dqrdc2.f>
>
>
> c     cycle the columns from l to p left-to-right until one
> c     with non-negligible norm is located.  a column is considered
> c     to have become negligible if its norm has fallen below
> c     tol times its original norm....
>
> Best,
> Uwe Ligges

Oh, I apologise, I read the arguments section in the help page, but
not the asterisk down below. Then the result is ok. Sorry for the
noise.

Regards,
Iñaki



More information about the R-devel mailing list