Dear R-users

I am trying to "vectorize" a function so that it can handle two vectors of
inputs. I want the function to use phi (a function), k[1] and t[1] for the
first price, and so on for the second, third and fourth price. I tried to do
the mapply, but I dont know how to specify to R what input I want to be
vectors (k and t)(see in the bottom what I tried). I have read the help
file, but I still dont understand how to do it properly. Also, I've tried to
use sapply (which seems totally wrong). However, the function uses k[1] for
t 1 to 4, and thereby returns 16 different values instead of just 4. 
Can anyone tell me how to do this - I know the answer is simple, but I dont
understand how

Thank you for your time
Kinds Rikke

#------ Characteristic function of the Heston model -----#
phiHeston <- function(parameters)
{
        lambda <- parameters[1];
        rho <- parameters[2];
        eta <- parameters[3];
        theta <- parameters[4];
        v0 <- parameters[5];
    
        function(u, t)
        {
        alpha <- -u*u/2 - 1i*u/2;
        beta <- lambda - rho*eta*1i*u;
        gamma <- eta^2/2;
        d <- sqrt(beta*beta - 4*alpha*gamma);
        rplus <- (beta + d)/(2*gamma);
        rminus <- (beta - d)/(2*gamma);
        g <- rminus / rplus;
        D <- rminus * (1 - exp(-d*t))/ (1 - g*exp(-d*t));
        C <- lambda * (rminus * t - 2/eta^2 * log( (1 - g*exp(-(d*t)))/(1 - g)
) );
        return(exp(C*theta + D*v0));
        }
}


Price_call <- function(phi, k, t)
{
        integrand <-  function(u){Re(exp(-1i*u*k)*phi(u - 1i/2, t)/(u^2 + 
1/4))};
        res <- 1 - exp(k/2)/pi*integrate(integrand,lower=0,upper=Inf)$value;
        return(res);
}

subHeston <- c(0.6067,-0.7571,0.2928,0.0707,0.0654);
kV <- c(0.9,1,1.2,1.3)
tV <- c(0.1,0.4,0.5, 1)

HestonCallVec <- function(phi, kVec, t)
{
sapply(kVec, function(k){Price_call(phi, k, t)})
}
HestonCallVec(phiHeston(subHeston), kV, 1)

subHeston <- c(0.6067,-0.7571,0.2928,0.0707,0.0654);
kV <- c(0.9,1,1.2,1.3)
tV <- c(0.1,0.4,0.5, 1)

HestonCallVec2 <- function(phi, kVec, tVec)
{
sapply(tVec, function(t){HestonCallVec(phi, kVec, t)})
}
HestonCallVec2(phiHeston(subHeston), kV, tV)
# This should give 4 values

This is what I tried for the mapply function, which returns a list, instead
of values.

HestonCallVec <- function(phi, kVec, t)
{
mapply(function(k, t){Price_call(phi, k, t)})
}
HestonCallVec(phiHeston(subHeston), kV, tV)
# This should give 4 values

--
View this message in context: 
http://r.789695.n4.nabble.com/How-to-vectorize-a-function-to-handle-two-vectors-tp3771705p3771705.html
Sent from the R help mailing list archive at Nabble.com.

______________________________________________
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