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]]