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.
How to vectorize a function to handle two vectors
5 messages · Newbie, David Winsemius, Jeff Newmiller
On Aug 26, 2011, at 2:43 PM, Newbie wrote:
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.
? mapply
I tried to do the mapply,
Oh, you thought of that.
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.
Huh?
Can anyone tell me how to do this - I know the answer is simple, but I dont understand how
I think the problem is (at least) slightly more complex than you first described. You should spend more time describing in unambiguous language the conditions and operations. Keep reading.
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
Hmmmm, I get 16 values. Maybe you should put some more time into understanding why it does not return the structure you expect. phiHubHeston returns a function. Was that what you designed?
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
This is what I get with the mapply call I would have expected for use of a function which is what phiHeston(subHeston) returns: > # This should give 4 values > mapply(phiHeston(subHeston), kV, tV) [1] 0.9973156-0.0029158i 0.9862950-0.0124475i 0.9752339-0.0178313i [4] 0.9406358-0.0336025i Whether these are the "right" 4 values is for you to determine.
David Winsemius, MD West Hartford, CT
Thank you for the quick response! I think you are on the right track - but is
there any way of "calling" (is that the word for it) the function price_call
in the mapply, so that this price_call function is changed to handle
vectors. I believe that this should, in theory if it is correct, make the
result be values.
I have part of a code that works for only one vector. So maybe some where in
the line of:
callOptionkVec <- function(phi, kVec, t)
{
sapply(kVec,function(k) {callOption(phi,k,t)})
}
is what I need to do. Do you have any ideas on how to do this?
--
View this message in context: http://r.789695.n4.nabble.com/How-to-vectorize-a-function-to-handle-two-vectors-tp3771705p3771902.html
Sent from the R help mailing list archive at Nabble.com.
On Aug 26, 2011, at 4:52 PM, Newbie wrote:
Thank you for the quick response! I think you are on the right track
- but is
there any way of "calling" (is that the word for it) the function
price_call
in the mapply, so that this price_call function is changed to handle
vectors. I believe that this should, in theory if it is correct,
make the
result be values.
I have part of a code that works for only one vector. So maybe some
where in
the line of:
callOptionkVec <- function(phi, kVec, t)
{
sapply(kVec,function(k) {callOption(phi,k,t)})
}
is what I need to do. Do you have any ideas on how to do this?
What about this: > mapply(Price_call, kV, tV, MoreArgs=list(phi=phiHeston(subHeston))) [1] 0.000000001877372 -0.000000632320728 0.000000626031829 [4] 0.000000058381615
-- View this message in context: http://r.789695.n4.nabble.com/How-to-vectorize-a-function-to-handle-two-vectors-tp3771705p3771902.html Sent from the R help mailing list archive at Nabble.com.
______________________________________________ R-help at 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.
David Winsemius, MD West Hartford, CT
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110826/7f2df4b9/attachment.pl>