Vectorising and loop (was Re: [R] optim "a log-likelihood function")

Zhen Pang nusbj at
Thu Sep 30 04:57:32 CEST 2004

>From: Sundar Dorai-Raj <sundar.dorai-raj at PDF.COM>
>Reply-To: sundar.dorai-raj at PDF.COM
>To: Zhen Pang <nusbj at>
>CC: r-help at
>Subject: Vectorising and loop (was Re: [R] optim "a log-likelihood 
>Date: Wed, 29 Sep 2004 18:21:17 -0700
>Zhen Pang wrote:
>>I also use optim, however, for my case, can you show some light on 
>>avoiding the loop?
>>There are around 200 sets of (i,j,k) where i<=j<=k. 3 situations exist 
>>whether "=" hold, I list one for example,
>>                      l<-i:(k-j+i)
>>                      s<-rep(0,k)
>>                      s[l]<-choose(j,i)*choose((k-j),(l-i))/choose(k,l)
>>                      ss<-sum(s*x0)
>>then sum all the log(ss) is my log-liklihood function.
>>One loop from 1 to 200 is inevitable. I have tried to use vector, however, 
>>I only can simply to this situation.  Thanks.
>   Your question doesn't really have much to do with optim, so I changed 
>the subject line.
>It's difficult to see what you're trying to accomplish without a complete 
>example. Could you post one? Also, for loops are necessarily bad.
>One thing to note is that you're better off using lchoose in the above 
>code. I.e.
>log.s <- lchoose(j, i) + lchoose(k - j, l - i) - lchoose(k, l)
>s[l] <- exp(log.s)
I have a matrix of 200 by 2, namely z, the columns are i and j. K is the 
maximum of j.

x0 is a k dimension vector.

for (m in 1:200)
    s[l]<-choose(j,i)*choose((k-j),(l-i))/choose(k,l) # we only define some 
of s to be non-zero, since dim(l) might be smaller than dim(s)
    ss[m]<-sum(s*x0)  # ss[m] is a weighted sum of x0

How to avoid the loop of m? I tried to define i<-z[,1] and j<-z[,2], but 
failed. Thanks.



More information about the R-help mailing list