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 <b...@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 <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 > > > > -- Navin Goyal [[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.