Re: [R] How to vectorize a function to handle two vectors
Isn't a vector of vectors usually considered a matrix? So if you want to vectorize a vector function you would normally rewrite it to operate on matrices. --- Jeff Newmiller The . . Go Live... DCN: Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --- Sent from my phone. Please excuse my brevity. 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? -- 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@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. [[alternative HTML version deleted]] __ 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.
Re: [R] How to vectorize a function to handle two vectors
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.1877372 -0.00632320728 0.00626031829 [4] 0.00058381615 -- 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@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 __ 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.
Re: [R] How to vectorize a function to handle two vectors
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. __ 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.
Re: [R] How to vectorize a function to handle two vectors
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 H, 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 __ 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.
[R] How to vectorize a function to handle two vectors
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.