Hi Berend,
I now understand what you were explaining. It works great.
Thanks a lot for your time and help. I really appreciate it.

Navin Goyal



On Mon, Apr 9, 2012 at 1:26 AM, Berend Hasselman <bhh@xs4all.nl> wrote:

>
> On 09-04-2012, at 01:26, Navin Goyal wrote:
>
> > Hi,
> > I am not sure I follow the scalar part of the suggestion. Could you
> please elaborate it a bit more?  Each row has a different value of score
> for each subject at each time point.
>
> That last remark has nothing to do with it.
> The point is that in your function func1 the returned value doesn't depend
> on the argument t.
> So func1 is returning a vector of length==length(t) of identical values
> except for the first entry which is zero.
>
> Do this after the loop for comb3
>
>
> # No integral since expression in func1 doesn't depend on t
> comb4<-comb2
> comb4$cmhz=0
> comb4<-comb4[order(comb4$ID, comb4$TIME), ]
> for (q in 1:length(comb4$ID))
> {
>    comb4$cmhz[q]<-comb4$TIME[q]*func1(comb4$TIME[q],
>                            cov1=0.001,beta1=0.02,
>                            change=comb4$score[q], other=comb4$frac[q])
> }
> head(comb4)
>
> all.equal(comb3$cmhz, comb4$cmhz)
>
> You don't need integrate to get what you seem to be wanting.
>
> Berend
>
> > Also I simplified the example but there are other terms that  change
> over each row for each subject.
> > Does this mean that loops is the only way to go ?
> >
> > Thanks again for your help and time.
> >
> > Navin Goyal
> >
> >
> > On Sun, Apr 8, 2012 at 4:03 AM, Berend Hasselman <bhh@xs4all.nl> wrote:
> >
> > On 08-04-2012, at 08:28, Navin Goyal wrote:
> >
> > > Dear R users,
> > > I am running a loop with the integrate function. I have pasted the code
> > > below. I am integrating a function from time=0 to the time value in
> every
> > > row.
> > > I have to perform this integration over thousands of rows with
> different
> > > parameters in each row. Could someone please suggest if there is an
> > > efficient/faster/easier way to do this by avoiding the loops ?
> > >
> > > Thank you so much for your help and time.
> > > --
> > > Navin Goyal
> > >
> > > #####################
> > > dose<-10
> > > time<-0:5
> > > id<-1:5
> > > data1<-expand.grid(id,time,dose)
> > > names(data1)<-c("ID","TIME", "DOSE")
> > > data1<-data1[order(data1$ID,data1$TIME),]
> > >
> > > ed<-data1[!duplicated(data1$ID) , c("ID","DOSE")]
> > > set.seed(5324123)
> > >
> > > for (k in 1:length(ed$ID))
> > > {
> > > ed$base[k]<-100*exp(rnorm(1,0,0.05))
> > > ed$drop[k]<-0.2*exp(rnorm(1,0,0.01))
> > > ed$frac[k]<-0.5*exp(rnorm(1,0,0.1))
> > > }
> >
> > Why not
> >
> > ed$base <- 100*exp(rnorm(length(ed$ID), 0, 0.05))
> >
> > etc.
> >
> > > comb1<-merge(data1[, c("ID","TIME")], ed)
> > > comb2<-comb1
> > > comb2$score<-comb2$base*exp(-comb2$drop*comb2$TIME)
> > >
> > > func1<-function(t,cov1,beta1, change,other)
> > > {
> > > ifelse(t==0,cov1, cov1*exp(beta1*change+other))
> > > }
> >
> > AFAICS, cov1, beta1, change and other are scalars.
> > So when an item of t is == 0 then the function value is cov1 and in all
> other cases it is the same scalar and does not depend on t. So func1 is a
> step function. You could calculate the integral directly.
> >
> > Berend
> >
> >
> >
> >
> > --
> > Navin Goyal
> >
>
>


-- 
Navin Goyal

	[[alternative HTML version deleted]]

