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

Gabor Grothendieck ggrothendieck at myway.com
Thu Sep 30 06:18:27 CEST 2004

```Zhen Pang <nusbj <at> hotmail.com> writes:

:
: >From: Sundar Dorai-Raj <sundar.dorai-raj <at> PDF.COM>
: >Reply-To: sundar.dorai-raj <at> PDF.COM
: >To: Zhen Pang <nusbj <at> hotmail.com>
: >CC: r-help <at> stat.math.ethz.ch
: >Subject: Vectorising and loop (was Re: [R] optim "a log-likelihood
: >function")
: >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.
: >>
: >>Regards,
: >>
: >>Zhen
: >>
: >
: >Zhen,
: >   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)
: >
: >--sundar
: >
: >
: 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.
:
: ss<-rep(0,200)
: for (m in 1:200)
:    {i<-z[m,1]
:     j<-z[m,2]
:     l<-i:(k-j+i)
:     s<-rep(0,k)
:     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
:     }
: sum(log(ss))
:
: How to avoid the loop of m? I tried to define i<-z[,1] and j<-z[,2], but
: failed. Thanks.

When Sundar was referring to a *complete* example he was referring to
both code and data -- something that someone else could simply copy
from your post, paste it into an R session and get the answer as per
the posting guide.

At any rate, if f(x) is the function which takes z[m,] as its single
argument and returns ss[m] then the above is equivalent to:

sum(log(apply(z, 1, f)))

Not sure if that really qualifies as getting rid of the loop but it
does get rid of the for and the initialization of ss.

```