[R] R: Re: chol( neg.def.matrix ) WAS: Re: Choleski and Choleski with pivoting of matrix fails

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Mon Nov 23 14:09:20 CET 2009


simona.racioppi at libero.it wrote:
> It works! But Once I have the square root of this matrix, how do I convert it 
> to a real (not imaginary) matrix which has the same property? Is that 
> possible?

No. That is theoretically impossible.

If A = B'B, then x'Ax = ||Bx||^2 >= 0

for any x, which implies in particular that all eigenvalues of A should
be nonnegative.

> 
> Best,
> Simon
> 
>> ----Messaggio originale----
>> Da: p.dalgaard at biostat.ku.dk
>> Data: 21-nov-2009 18.56
>> A: "Charles C. Berry"<cberry at tajo.ucsd.edu>
>> Cc: "simona.racioppi at libero.it"<simona.racioppi at libero.it>, <r-help at r-
> project.org>
>> Ogg: Re: [R] chol( neg.def.matrix ) WAS: Re: Choleski and Choleski with 
> pivoting of matrix fails
>> Charles C. Berry wrote:
>>> On Sat, 21 Nov 2009, simona.racioppi at libero.it wrote:
>>>
>>>> Hi Everyone,
>>>>
>>>> I need to take the square root of the following matrix:
>>>>
>>>>                [,1]               [,2]                [,3]
>>>> [1,]  0.5401984 -0.3998675 -1.3785897
>>>> [2,] -0.3998675  1.0561872  0.8158639
>>>> [3,] -1.3785897  0.8158639  1.6073119
>>>>
>>>> I tried Choleski which fails. I then tried Choleski with pivoting, but
>>>> unfortunately the square root I get is not valid. I also tried eigen
>>>> decomposition but i did no get far.
>>>>
>>>> Any clue on how to do it?!
>>>
>>> If you want to take the square root of a negative definite matrix, you 
>>> could use
>>>
>>>     sqrtm( neg.def.mat )
>>>
>>> from the expm package on rforge:
>>>
>>>     http://r-forge.r-project.org/projects/expm/
>> But that matrix is not negative definite! It has 2 positive and one 
>> negative eigenvalue. It is non-positive definite.
>>
>> It is fairly easy in any case to get a matrix square root from the eigen 
>> decomposition:
>>
>>> v%*%diag(sqrt(d+0i))%*%t(v)
>>                       [,1]                  [,2]                  [,3]
>> [1,]  0.5164499+0.4152591i -0.1247682-0.0562317i -0.7257079+0.3051868i
>> [2,] -0.1247682-0.0562317i  0.9618445+0.0076145i  0.3469916-0.0413264i
>> [3,] -0.7257079+0.3051868i  0.3469916-0.0413264i  1.0513849+0.2242912i
>>> ch <- v%*%diag(sqrt(d+0i))%*%t(v)
>>> t(ch)%*% ch
>>               [,1]          [,2]          [,3]
>> [1,]  0.5401984+0i -0.3998675-0i -1.3785897-0i
>> [2,] -0.3998675-0i  1.0561872+0i  0.8158639-0i
>> [3,] -1.3785897-0i  0.8158639-0i  1.6073119-0i
>>
>> A triangular square root is, er, more difficult, but hardly impossible.
>>
>> -- 
>>    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
>>
> 
> 


-- 
   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




More information about the R-help mailing list