In my last e-mails, I have asked for help regarding 1. 'defining functions inside loops' 2. 'integrating functions / vector arithmetics' 3. 'vectors out of lists?' 4. 'numerical integration' Since some of these topics seemed to be relevant (I'm guessing by the # of replies I got), I'm posting a modified section of my code. Any thoughts on improvements would be highly welcome! In the end of this code I put a little test on comparing the different functions I must integrate. I'm really interested in efficiency since I'll need to do that 'inner.product' operation 95*95*5 times on each of my B bootstrap loops, where B should be 1000 but is more likely to be 500 or 200 if I'm willing to graduate before March! # 'code0' is used for simulation and test purposes only; # The model is the same as in Bathia, Yao, Ziegelmann p.13 # The code used for estimation is 'code1' rm(list=ls(all=TRUE)) n<-100 # Number of observations d<-4 # Dimension of X a<-0 # Lower bound b<-1 # Upper bound p<-5 # [See Bathia, Yao, Ziegelmann p. 5) ####################################### # Building the error function 'epsilon' ####################################### # Building the vector process 'Z' (which is a iiN(0,I_d) vector process) # Time varies columnwise Z<-matrix(rnorm(10*n),nrow=10,ncol=n) # Defining the deterministic base functions 'zeta' zeta<-function(u,i){ sqrt(2)+sin(pi*i*u) } zeta2<-function(i){force(i); function(u){ sqrt(2)+sin(pi*outer(i,u)) } } zeta3<-function(u,i){ sqrt(2)+sin(pi*outer(i,u)) } # Building the random functional process 'epsilon' epsilon<-lapply(1:n, function(t)local({force(t); function(u){ epsilon<-0 for (j in 1:10){ epsilon<-epsilon+2^(1-j)*Z[j,t]*zeta(u,j) } epsilon<-epsilon } })) epsilon2<-lapply(1:n, function(t)local({force(t); function(u){ crossprod(2^(1-(1:10))*Z[,t],zeta2(1:10)(u)) } })) epsilon3<-lapply(1:n, function(t)local({force(t); function(u){ crossprod(2^(1-(1:10))*Z[,t],zeta3(u,1:10)) } })) ########################### # Building the function 'X' ########################### # Building the vector process 'xi'. Time varies columnwise. # Each line is a realization of an AR(1) process. xi<-matrix(0,nrow=d,ncol=n) for (i in 1:d){ theta<-(-1)^i * (.9 - .5*i/d) xi[i,]<-arima.sim(model=list(ar=theta), n, rand.gen = rnorm) } rm(i, theta) #Defining the deterministic base functions 'phi' phi<-function(u,i){ sqrt(2)*cos(pi*i*u) } phi2<-function(i){force(i); function(u){ sqrt(2)*cos(pi*outer(i,u)) } } phi3<-function(u,i){ sqrt(2)*cos(pi*outer(i,u)) } # Building the random functional process 'X' X<-lapply(1:n, function(t)local({force(t); function(u){ X<-0 for (i in 1:d){ X<-X+xi[i,t]*phi(u,i) } X<-X } })) X2<-lapply(1:n, function(t)local({force(t); function(u){ crossprod(xi[,t],phi2(1:d)(u)) } })) X3<-lapply(1:n, function(t)local({force(t); function(u){ crossprod(xi[,t],phi3(u,1:d)) } })) ##################################### # Defining the functional process 'Y' ##################################### Y<-lapply(1:n, function(t)local({force(t); function(u){ X[[t]](u)+epsilon[[t]](u) } })) Y2<-lapply(1:n, function(t)local({force(t); function(u){ X2[[t]](u)+epsilon2[[t]](u) } })) Y3<-lapply(1:n, function(t)local({force(t); function(u){ X3[[t]](u)+epsilon3[[t]](u) } })) Y4<-lapply(1:n, function(t)local({force(t); function(u){ crossprod(xi[,t],sqrt(2)*cos(pi*outer(1:d,u))) + crossprod(2^(1-(1:10))*Z[,t],sqrt(2)+sin(pi*outer(1:10,u))) } })) ###################### # remove later Ybar<-function(u){ Ybar<-0 for (t in 1:n){ Ybar<-Ybar+Y[[t]](u) } Ybar<-1/n*Ybar } Ybar2<-function(u){ Ybar2<-0 for (t in 1:n){ Ybar2<-Ybar2+Y2[[t]](u) } Ybar2<-1/n*Ybar2 } Ybar3<-function(u){ Ybar3<-0 for (t in 1:n){ Ybar3<-Ybar3+Y3[[t]](u) } Ybar3<-1/n*Ybar3 } Ybar4<-function(u){ Ybar4<-0 for (t in 1:n){ Ybar4<-Ybar4+Y4[[t]](u) } Ybar4<-1/n*Ybar4 } # Defining the inner product on L^2([a,b]) inner.product<-function(f,g){ core<-function(u){ core<-f(u)*g(u) } inner.product<-integrate(core,a,b)$value } ########################################################### # Defining the deviation functions (Y[[t]] - Ybar) used as an input # by the function inner.product below Y.dev<-lapply(1:n, function(t)local({force(t); function(u){ Y[[t]](u)-Ybar(u) } })) Y.dev2<-lapply(1:n, function(t)local({force(t); function(u){ Y2[[t]](u)-Ybar2(u) } })) Y.dev3<-lapply(1:n, function(t)local({force(t); function(u){ Y3[[t]](u)-Ybar3(u) } })) Y.dev4<-lapply(1:n, function(t)local({force(t); function(u){ Y4[[t]](u)-Ybar4(u) } })) print(inner.product(Y.dev[[n]], Y.dev[[n]])) print(inner.product(Y.dev2[[n]], Y.dev2[[n]])) print(inner.product(Y.dev3[[n]], Y.dev3[[n]])) print(inner.product(Y.dev4[[n]], Y.dev4[[n]])) system.time(for(i in 1:100)inner.product(Y.dev[[n]], Y.dev[[n]])) system.time(for(i in 1:100)inner.product(Y.dev2[[n]], Y.dev2[[n]])) system.time(for(i in 1:100)inner.product(Y.dev3[[n]], Y.dev3[[n]])) system.time(for(i in 1:100)inner.product(Y.dev4[[n]], Y.dev4[[n]])) # And this is the output I get: [1] 13.64025 [1] 13.64025 [1] 13.64025 [1] 13.64025 user system elapsed 13.09 0.00 13.19 user system elapsed 11.86 0.00 12.42 user system elapsed 11.17 0.00 11.44 user system elapsed 10.59 0.00 10.79 Thanks folks! [[alternative HTML version deleted]]