On Jun 20, 2012, at 06:17 , <nata...@orchidpharma.com> 
<nata...@orchidpharma.com> wrote:

> Dear Peter,
> 
> Thanks for your reply, as per my last post; my current problem is not on
> positive definite related but to compare the objective function narrated by 
> Kjetil for optimization of parameters Vs Objective function that I have 
> posted in my last post.
> 
> Though I appreciate the Kjetil approach that he uses only the covariance 
> matrix information to optimize the parameters of the matrix but in my case I 
> have other values to be used in the objective function to optimize my matrix 
> parameters and I can not figure out how the Kjetil approach extendable for my 
> specific problem and in this regard my inexperience in R as well as lack of 
> knowledge of linear algebra is to be blamed but I have to get out of the 
> problem earlier, is my current situation :-).

Isn't it just a composite function issue?

Got:

objective(Sigma)
makeSigma(param,...) ## param=c(Vs, Vn)

Wanted: 

objective2(param, ...)  

Solution:

objective2 <- function(param, ...) objective(makeSigma(param,...))

> 
> Regards,
> B.Nataraj
> 
> 
> 
> 
> 
> 
> -----Original Message-----
> From: peter dalgaard [mailto:pda...@gmail.com]
> Sent: Tuesday, June 19, 2012 8:07 PM
> To: Nataraj B (ORLL-Biotech)
> Cc: kjetilbrinchmannhalvor...@gmail.com; r-help@r-project.org
> Subject: Re: [R] Cholesky decomposition error
> 
> 
> On Jun 19, 2012, at 10:31 , <nata...@orchidpharma.com> 
> <nata...@orchidpharma.com> wrote:
> 
>> Dear Kjetil, thanks for your time to detail the code. Sorry, I am still not 
>> able to grasp why you are creating random normal distribution for the 
>> covariance matrix and also why I should optimize the whole matrix value 
>> while I only need to optimize the two variables ?.
>> 
>> This is my 15 x 15 covariance matrix
>>> M_cov
>> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
>> [,15]
>> [1,]    4    3    3    2    2    1    2    2    3     2     2     2     3    
>>  3     1
>> [2,]    3    5    3    2    2    1    2    2    2     2     2     2     2    
>>  2     1
>> [3,]    3    3    3    2    2    1    2    2    2     2     2     2     2    
>>  2     1
>> [4,]    2    2    2    3    2    1    2    3    2     1     1     1     1    
>>  1     1
>> [5,]    2    2    2    2    2    1    2    2    2     1     1     1     1    
>>  1     1
>> [6,]    1    1    1    1    1    1    1    1    1     1     0     1     1    
>>  0     0
>> [7,]    2    2    2    2    2    1    3    2    2     1     1     1     1    
>>  1     1
>> [8,]    2    2    2    3    2    1    2    4    2     1     1     1     1    
>>  1     1
>> [9,]    3    2    2    2    2    1    2    2    3     1     1     1     2    
>>  2     1
>> [10,]    2    2    2    1    1    1    1    1    1     2     1     2     2   
>>   1     0
>> [11,]    2    2    2    1    1    0    1    1    1     1     2     1     1   
>>   2     1
>> [12,]    2    2    2    1    1    1    1    1    1     2     1     3     2   
>>   1     0
>> [13,]    3    2    2    1    1    1    1    1    2     2     1     2     3   
>>   2     0
>> [14,]    3    2    2    1    1    0    1    1    2     1     2     1     2   
>>   3     1
>> [15,]    1    1    1    1    1    0    1    1    1     0     1     0     0   
>>   1     1
>> 
> 
> 
> Notice that that matrix has rank 9 since eigenvalues no. 10 and up are 
> effectively zero:
> 
>> eigen(M_cov)
> $values
> [1]  2.539980e+01  5.456591e+00  3.694394e+00  2.757612e+00  1.746257e+00
> [6]  1.385264e+00  6.232218e-01  5.853408e-01  3.515233e-01  1.480189e-16
> [11]  9.492860e-17 -5.918493e-17 -1.142008e-16 -2.348974e-16 -7.429798e-16
> 
> $vectors
> ...
> 
> 
>> 
>> And the function to check the posdef condition is
>> 
>>> isPosDef <- function(M)
>> { if ( all(M == t(M) ) ) {  # first test symmetric-ity
>> if (  all(eigen(M)$values > 0) ) {TRUE}
>>   else {FALSE} } #  else {FALSE}  # not symmetric
>> }
>> 
>> And my call for optimization is
>> 
>>> optim(c(rep(1,2)),obj,method="BFGS",hessian=TRUE,F1=F1,mu1=mu1,M_cov=M_cov)
>> 
>> And I pass the vector F1 and mu1 used in my objective function along with 
>> M_cov (the covariance matrix)
>> 
>> My objective function is
>> 
>> 
>>> obj<-function(theta,F1,mu1,M_cov) {
>> Vs<-theta[1]
>> Vn<-theta[2]
>> k<-length(F1)
>> for(i in 1:15) {
>> for(j in 1:15) {
>> 
>> # to make the covariance matrix with the variables to optimize
>> if(i != j)
>> {
>> M_cov[i,j]<-M_cov[i,j]*Vs
>> }
>> else
>> M_cov[i,j]<-M_cov[i,j]*Vs+Vn
>> }
>> }
>> 
> 
> ...alias
> 
> M_cov <- Vs * M_cov
> diag(M_cov) <- diag(M_cov) + Vn
> 
> Right?
> 
> Anyways, immediate observations are that
> 
> (1) Vn had better be positive
> (2) Vs could be negative but 25.993*Vs + Vn must be positive.
> 
> A little thought indicates that these are also sufficient conditions for 
> M_cov to be pos.def. So you can replace the test for positive definiteness 
> with bounds on your parameters. My instinct tells me that you might not be 
> able to interpret the Vs < 0 case, in which case, the easy way is to just 
> check that Vs and Vn are positive. People often ensure this by using a 
> log-parametrization, Vs = exp(lVs), etc.
> 
> -pd
> 
> 
>> # here I check the posdef condition of the modified covariance matrix in 
>> #earlier step
>> checkPD<-isPosDef(M_cov)
>> if(checkPD)
>> {
>> e<-t(F1-mu1)%*%solve(M_cov)%*%(F1-mu1)
>> logl<- -k/2*log(2*pi)-0.5*log(det(M_cov))-0.5*e
>> }
>> 
>> # negative value since the function is for maximization
>> return(-logl)
>> }
>> 
>> Is there anything missing in my approach of function optimization for 
>> variable estimation of a multivariate normal distribution? I looking forward 
>> your valuable comments.
>> 
>> Regards,
>> B.Nataraj
>> 
>> 
>> 
>> -----Original Message-----
>> From: Kjetil Halvorsen [mailto:kjetilbrinchmannhalvor...@gmail.com]
>> Sent: Monday, June 18, 2012 10:07 PM
>> To: Nataraj B (ORLL-Biotech)
>> Cc: r-help@r-project.org
>> Subject: Re: [R] Cholesky decomposition error
>> 
>> see inline!
>> 
>> On Mon, Jun 18, 2012 at 12:38 AM,  <nata...@orchidpharma.com> wrote:
>>> Thanks Kjetil for your detailed code for log-Cholesky but my situation is 
>>> like optimization of the variables inside the matrix.
>> 
>> But you must of course call my function makemat inside the call
>> to optim() or whatever function you use for optimization!
>> 
>> 
>> Here is an extended example, assuming the functions I have defined earlier:
>> 
>> library(MASS) # for mvrnorm
>> library(mvtnorm) # for dmvnorm
>> 
>> Let us simulate a multinorma sample with expectation zero (to simplify
>> the example)
>> and covariance matrix Sigma:
>> 
>>> Sigma
>>    [,1] [,2] [,3]
>> [1,]    3    1    1
>> [2,]    1    3    1
>> [3,]    1    1    3
>>> 
>> 
>>> testdat <- mvrnorm(n=100, rep(0, 3), Sigma)
>> 
>> We can calculate the usual maxlik estimator of Sigma:
>> 
>>> (t(testdat) %*% testdat) /100
>>         [,1]      [,2]     [,3]
>> [1,] 3.2424618 0.9670133 1.673897
>> [2,] 0.9670133 2.9447654 1.289127
>> [3,] 1.6738970 1.2891268 3.084106
>> 
>>> objective <- function(Sigma) {
>>       sum(apply(testdat, 1, FUN=function(x) dmvnorm(x, rep(0, 3),
>> Sigma, log=TRUE)))
>>   }
>>> objective(Sigma)
>> 
>>> start
>> $diag
>> [1] 0.5493061 0.4904146 0.4581454
>> 
>> $upper
>> [1] 0.5773503 0.5773503 0.4082483
>> 
>>> startSigma <- c(start$diag, start$upper)
>>> startSigma
>> [1] 0.5493061 0.4904146 0.4581454 0.5773503 0.5773503 0.4082483
>> 
>>> objective(Sigma)
>> [1] -571.5945
>>> objective(Sigma/3)
>> [1] -699.0552
>>> objective(3*Sigma)
>> [1] -638.9688
>>> 
>> 
>> 
>> Finally:
>> 
>> optim(startSigma, fn=function(parvec) {
>>       R <- makemat(parvec[1:3], parvec[4:6])
>>       S <- t(R) %*% R
>>       print(S)   # remove this when works!
>>      obj <- -objective(S)
>>      obj
>>   }, control=list(REPORT=1))
>> 
>> # with method="BFGS" dopes not work well,  because takes too long
>> # steps! default Nelder-Mead is slow,  but works.
>> 
>> 
>> Giving the following output:
>> <  much removed ...>
>> $par
>> [1] 0.5811796 0.4969062 0.3485920 0.5469560 0.9248746 0.4896758
>> 
>> $value
>> [1] 567.648
>> 
>> $counts
>> function gradient
>>    501       NA
>> 
>> $convergence
>> [1] 1
>> 
>> $message
>> NULL
>> 
>>>> res <- .Last.value
>>> res$par
>> [1] 0.5811796 0.4969062 0.3485920 0.5469560 0.9248746 0.4896758
>>> makemat(res$par[1:3], res$par[4:6])
>>        [,1]     [,2]      [,3]
>> [1,] 1.788146 0.546956 0.9248746
>> [2,] 0.000000 1.643628 0.4896758
>> [3,] 0.000000 0.000000 1.4170710
>>> R <-makemat(res$par[1:3], res$par[4:6])
>>> t(R) %*% R
>>         [,1]      [,2]     [,3]
>> [1,] 3.1974676 0.9780374 1.653811
>> [2,] 0.9780374 3.0006752 1.310711
>> [3,] 1.6538112 1.3107108 3.103266
>>> Sigma
>>    [,1] [,2] [,3]
>> [1,]    3    1    1
>> [2,]    1    3    1
>> [3,]    1    1    3
>> 
>> 
>> 
>> ¿Easy?
>> 
>> 
>>> 
>>> Let me change your own example matrix to explain the problem.
>>> 
>>> A martrix is      [,1]         [,2]            [,3]
>>>              [1,]    3*Vs+Vn    1*Vs         1*Vs
>>>              [2,]    1*Vs     3*Vs+Vn    1*Vs
>>>              [3,]    1*Vs     1*Vs       3*Vs+Vn
>> 
>> So make your own makemat function specific to this problem!
>> which you then use inside the call to optim.
>> 
>> kjetil
>>> 
>>> So I have to optimize two variables "Vs" and "Vn" using the maximum 
>>> likelihood function, which need the determinant and inverse of the matrix A 
>>> to compute the value.
>>> 
>>> Isn't it logically correct that I have to seed some initial values for the 
>>> Vs and Vn and use it for predicting the value of the matrix and check for 
>>> its positive definite condition,
>> 
>> If you construct the matrix by above method, it will automatically be
>> posdef, so no need to check!
>> (except as check on programming ... )
>> 
>> if the condition fulfill, then I have to compute the determinant value
>> and inverse of the matrix in order to use them in the maximum
>> likelihood function and the optimization iteration to be carried out
>> further until parameters converges.
>>> 
>>> I sincerely believe that you have points to implements log-Cholesky in my 
>>> situation, but I am simply not able to see where is the Choleksy 
>>> decomposition to be implemented in this my workflow.
>>> 
>>> Regards,
>>> B.Nataraj
>>> 
>>> 
>>> 
>>> 
>>> -----Original Message-----
>>> From: Kjetil Halvorsen [mailto:kjetilbrinchmannhalvor...@gmail.com]
>>> Sent: Sunday, June 17, 2012 4:10 AM
>>> To: Nataraj B (ORLL-Biotech)
>>> Cc: r-help@r-project.org
>>> Subject: Re: [R] Cholesky decomposition error
>>> 
>>> see below.
>>> 
>>> On Fri, Jun 15, 2012 at 11:53 PM,  <nata...@orchidpharma.com> wrote:
>>>> Dear Mr.Kjetil,
>>>> 
>>>> Thanks for your comment. You have already pointed me the article in reply 
>>>> to one of my earlier post to this list and I am following the paper. Now I 
>>>> am checking for condition for positive definiteness for original matrix 
>>>> using a simple script (got from earlier posting in the list) and if the 
>>>> condition passed then the optimization function perform decomposition of 
>>>> the matrix using chol() function.
>>>> 
>>>> I believe all 5 parameterization techniques listed in the paper weigh each 
>>>> other based on its performance and not on accuracy, please correct me if I 
>>>> am wrong. Since I am novice, I just want to start with the easiest method 
>>>> "Cholesky" for my purpose.
>>>> 
>>>> Are you recommending log-Cholesky function , if so could you please tell 
>>>> me the name of the function which does log-Cholesky decomposition of a 
>>>> matrix.
>>> 
>>> I dont think there is a prewritten function for log cholesy, but it is
>>> very easy to write!
>>> 
>>>> makelogchol
>>> function(A) {#A should be a square posdef matrix
>>> m <- dim(A)[1]
>>> uind <- upper.tri(A)
>>> R <- chol(A)
>>> diag <- log(diag(R))
>>> upper <- R[uind]
>>> return(list(diag=diag, upper=upper))
>>> }
>>> 
>>> and its "inverse" --- to get the cholesky factor back:
>>> 
>>>> makemat
>>> function(diag, upper) {
>>> m <- length(diag)
>>> mu <- m*(m-1)/2
>>> if (length(upper)!=mu) stop("incompatible lengths")
>>> A <- matrix(0.0, m, m)
>>> ind <- upper.tri(A)
>>> A[ind] <- upper
>>> diag(A) <- exp(diag)
>>> A
>>> }
>>> 
>>> and an example of its use:
>>> 
>>> Lets say A is the posdef matrix where you will start your
>>> optimization, so you need
>>> the log cholesy parameters to feed to optim:
>>> 
>>>> A
>>>   [,1] [,2] [,3]
>>> [1,]    3    1    1
>>> [2,]    1    3    1
>>> [3,]    1    1    3
>>>> start <- makelogchol(A)
>>>> start
>>> $diag
>>> [1] 0.5493061 0.4904146 0.4581454
>>> 
>>> $upper
>>> [1] 0.5773503 0.5773503 0.4082483
>>> 
>>> Then to get the cholesky factors back you call makemat:
>>> 
>>>> R <- makemat(start$diag,  start$upper)
>>>> R
>>>       [,1]      [,2]      [,3]
>>> [1,] 1.732051 0.5773503 0.5773503
>>> [2,] 0.000000 1.6329932 0.4082483
>>> [3,] 0.000000 0.0000000 1.5811388
>>>> t(R) %*% R
>>>   [,1] [,2] [,3]
>>> [1,]    3    1    1
>>> [2,]    1    3    1
>>> [3,]    1    1    3
>>>> 
>>> 
>>> Kjetil
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>>> 
>>>> Regards,
>>>> B.Nataraj
>>>> 
>>>> 
>>>> 
>>>> -----Original Message-----
>>>> From: Kjetil Halvorsen [mailto:kjetilbrinchmannhalvor...@gmail.com]
>>>> Sent: Friday, June 15, 2012 11:09 PM
>>>> To: Nataraj B (ORLL-Biotech)
>>>> Cc: gunter.ber...@gene.com; r-help@r-project.org
>>>> Subject: Re: [R] Cholesky decomposition error
>>>> 
>>>> see inline.
>>>> 
>>>> On Fri, Jun 15, 2012 at 4:33 AM,  <nata...@orchidpharma.com> wrote:
>>>>> Thanks for your reply. I am sorry and I am bit hurried up to say before 
>>>>> doing a proper due diligence, I have found out that during the 
>>>>> optimization the variables tend to vary the values of the matrix , the 
>>>>> function report error at some point (in particular iteration step) when 
>>>>> the matrix become non-decomposable due to not a positive definiteness.
>>>> 
>>>> ¿What are you trying to optimize? If the objective function depends on
>>>> a matrix argument
>>>> which has to be a positive definite function, you must parametrize the
>>>> matrix such that the matrix
>>>> inside the optimizer always is positive definite. So if your positive
>>>> definite matrix is A, then, for example, represent it as
>>>> its cholesky decomposition A= L L^T where L is lower triangular with
>>>> positive diagonal. Here the stricly
>>>> upper diagonal part varies freely, but the diagonal not, so represent
>>>> the diagonal as exp( l_i)
>>>> where now the l_i varies freely. This is called the log-Cholesky
>>>> parametrization. For other ideas along this lines, see the paper by
>>>> Douglas Bates:  "Unconstrained Parameterizations for
>>>> Variance-Covariance Matrices  "
>>>> which you can find by googling.
>>>> 
>>>> Kjetil
>>>> 
>>>> 
>>>> This I observed when I change the maximum iteration of the optim
>>>> function set to 1 and upto iteration no. 3 it runs , it stuck at
>>>> iteration 4 and above.
>>>>> 
>>>>> Now, I am trying to find ways to escalate such a condition inside the 
>>>>> function during the iteration process and if possible please help me to 
>>>>> do that.
>>>>> 
>>>>> Regards,
>>>>> B.Nataraj
>>>>> 
>>>>> 
>>>>> -----Original Message-----
>>>>> From: Bert Gunter [mailto:gunter.ber...@gene.com]
>>>>> Sent: Friday, June 15, 2012 1:51 PM
>>>>> To: Nataraj B (ORLL-Biotech)
>>>>> Cc: r-help@r-project.org
>>>>> Subject: Re: [R] Cholesky decomposition error
>>>>> 
>>>>> Follow the posting guide,please: I believe at this point we need
>>>>> reproducible code and your data to provide you help. See ?dput to post
>>>>> your matrix.
>>>>> 
>>>>> -- Bert
>>>>> 
>>>>> On Thu, Jun 14, 2012 at 11:30 PM,  <nata...@orchidpharma.com> wrote:
>>>>>> 
>>>>>> Thanks for your reply. To my surprise I can find one more strange 
>>>>>> behavior of  my 15X15 matrix "A", that is if I call the function  
>>>>>> chol(A) in the terminal it decompose the matrix fine without any errors 
>>>>>> or warnings.
>>>>>> But if I call the function chol() within a function, which I have 
>>>>>> written in order to call the function (contains formula) for 
>>>>>> optimization routine "optim()" and also supplied with the same matrix 
>>>>>> "A" as argument, the error mentioned
>>>>>> 
>>>>>>> Error in chol.default(M_cov) :
>>>>>>> the leading minor of order 10 is not positive definite
>>>>>> 
>>>>>> is surfaced during the function call by optim.
>>>>>> 
>>>>>> Why the matrix fulfill the symmetric and positive definite for chol() in 
>>>>>> one case but fails in other case when the function chol() is called in 
>>>>>> other function ?
>>>>>> 
>>>>>> I played around parameters of "optim" function but nothing seems to be 
>>>>>> working and I am confused and I am looking for some hints to introspect 
>>>>>> the problem further.
>>>>>> 
>>>>>> Regards,
>>>>>> B.Nataraj
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -----Original Message-----
>>>>>> From: Bert Gunter [mailto:gunter.ber...@gene.com]
>>>>>> Sent: Thursday, June 14, 2012 6:18 PM
>>>>>> To: Nataraj B (ORLL-Biotech)
>>>>>> Cc: r-help@r-project.org
>>>>>> Subject: Re: [R] Cholesky decomposition error
>>>>>> 
>>>>>> Your matrix is not symmetric, positive definite. If you don't know
>>>>>> what this means, you shouldn't be using chol()
>>>>>> 
>>>>>> This may be because it isn't to begin with, or due to numerical error,
>>>>>> it doesn't behave as one in the decomposition. My relative ignorance
>>>>>> of numeric methods for linear algebra prevents me from saying more
>>>>>> than that.
>>>>>> 
>>>>>> -- Bert
>>>>>> 
>>>>>> On Thu, Jun 14, 2012 at 4:23 AM,  <nata...@orchidpharma.com> wrote:
>>>>>>> Dear friends,
>>>>>>> 
>>>>>>> When I do Cholesky decomposition for a 15x15 matrix using the function 
>>>>>>> chol(), I get the following error for which I do not understand the 
>>>>>>> meaning of the error
>>>>>>> 
>>>>>>> Error in chol.default(M_cov) :
>>>>>>> the leading minor of order 10 is not positive definite
>>>>>>> 
>>>>>>> When I searched online for similar error reported earlier I could get 
>>>>>>> few hits but not of much help to resolve my error and one post 
>>>>>>> suggested to use different function called sechol() from accuracy 
>>>>>>> package but that did not work and it leads to different errors. So I 
>>>>>>> want to stick to function chol() itself.
>>>>>>> 
>>>>>>> Could you please help me to find where things are going wrong in my 
>>>>>>> matrix?
>>>>>>> 
>>>>>>> 
>>>>>>> Thanks and regards,
>>>>>>> B.Natarj
>>>>>>> 
>>>>>>> ______________________________________________
>>>>>>> R-help@r-project.org 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.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> --
>>>>>> 
>>>>>> Bert Gunter
>>>>>> Genentech Nonclinical Biostatistics
>>>>>> 
>>>>>> Internal Contact Info:
>>>>>> Phone: 467-7374
>>>>>> Website:
>>>>>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> 
>>>>> Bert Gunter
>>>>> Genentech Nonclinical Biostatistics
>>>>> 
>>>>> Internal Contact Info:
>>>>> Phone: 467-7374
>>>>> Website:
>>>>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>>>> 
>>>>> ______________________________________________
>>>>> R-help@r-project.org 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.
>>>> 
>>>> 
>>> 
>>> 
>> 
>> 
>>      [[alternative HTML version deleted]]
>> 
>> ______________________________________________
>> R-help@r-project.org 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.
> 
> --
> Peter Dalgaard, Professor
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Email: pd....@cbs.dk  Priv: pda...@gmail.com
> 
> 

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

______________________________________________
R-help@r-project.org 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.

Reply via email to