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))
}
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))
}
comb3<-comb2
comb3$cmhz=0
comb3<-comb3[order(comb3$ID, comb3$TIME), ]
for (q in 1:length(comb3$ID))
{
comb3$cmhz[q]<-integrate(func1, lower=0, upper=comb3$TIME[q],
cov1=0.001,beta1=0.02,
change=comb3$score[q], other=comb3$frac[q])$value
}
head(comb3)
[[alternative HTML version deleted]]
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