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 <b...@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
> 

______________________________________________
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