re: your last comment... why do you prefer to multiply by the reciprocal? On September 20, 2018 10:56:22 AM PDT, "MacQueen, Don via R-help" <r-help at r-project.org> wrote:>In addition to what the other said, if callM is a vector then an >expression of the form > if (callM <= call0) >is inappropriate. Objects inside the parentheses of if() should have >length one. For example, > >> if (1:5 < 3) 'a' else 'b' >[1] "a" >Warning message: >In if (1:5 < 3) "a" else "b" : > the condition has length > 1 and only the first element will be used > > >instead of what you have: > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > >Here are a couple of (untested) possibilities: > > M.gt.0 <- callM > call0 > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > sig[M.gt.0] <- (1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)))[M.gt.0] > >or > >sig <- 1/sqrt(T)*(sqrt(gamma + y) + ifelse(callM <= call0, -1, 1) * >sqrt(gamma - y)) > >incidentally, I would write > sig <- (sqrt(gamma + y) - sqrt(gamma - y))/sqrt(T) >instead of > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > >-- >Don MacQueen >Lawrence Livermore National Laboratory >7000 East Ave., L-627 >Livermore, CA 94550 >925-423-1062 >Lab cell 925-724-7509 > > > >?On 9/20/18, 8:08 AM, "R-help on behalf of Lynette Chang" ><r-help-bounces at r-project.org on behalf of momtoomax at gmail.com> wrote: > > Hello everyone, > > I?ve a function with five input argument and one output number. > impVolC <- function(callM, K, T, F, r) > >I hope this function can take five vectors as input, then return one >vector as output. My vectorization ran into problems with the nested >if-else operation. As a result, I have to write another for loop to >call this function. Can anyone suggest some methods to overcome it? I >put my code below, thanks. > > impVolC <- function(callM, K, T, F, r){ > > > if(y >= 0){ > call0 <- K*exp(-r*T)*(exp(y)*polya(sqrt(2*y)) - 0.5) > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > }else{ > call0 <- K*exp(-r*T)*(exp(y)/2 - polya(-sqrt(-2*y))) > if(callM <= call0){ > sig <- 1/sqrt(T)*(-sqrt(gamma + y) + sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > } > sig > } > > for(i in 1:length(call)){ >sigV[i] <- impVolC(callM = call[i], K = df$Strike[i], T = T, F = F, r >r_m) > } > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.-- Sent from my phone. Please excuse my brevity.
You're asking me? I prefer> 4/2[1] 2 not> 1/2*4[1] 2 (I think that's what I said) And if I did want to multiply by the reciprocal, which does happen from time to time, I'd certainly do it this way: (1/2)*4 -Don -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 Lab cell 925-724-7509 ?On 9/20/18, 12:36 PM, "Jeff Newmiller" <jdnewmil at dcn.davis.ca.us> wrote: re: your last comment... why do you prefer to multiply by the reciprocal? On September 20, 2018 10:56:22 AM PDT, "MacQueen, Don via R-help" <r-help at r-project.org> wrote: >In addition to what the other said, if callM is a vector then an >expression of the form > if (callM <= call0) >is inappropriate. Objects inside the parentheses of if() should have >length one. For example, > >> if (1:5 < 3) 'a' else 'b' >[1] "a" >Warning message: >In if (1:5 < 3) "a" else "b" : > the condition has length > 1 and only the first element will be used > > >instead of what you have: > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > >Here are a couple of (untested) possibilities: > > M.gt.0 <- callM > call0 > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > sig[M.gt.0] <- (1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)))[M.gt.0] > >or > >sig <- 1/sqrt(T)*(sqrt(gamma + y) + ifelse(callM <= call0, -1, 1) * >sqrt(gamma - y)) > >incidentally, I would write > sig <- (sqrt(gamma + y) - sqrt(gamma - y))/sqrt(T) >instead of > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > >-- >Don MacQueen >Lawrence Livermore National Laboratory >7000 East Ave., L-627 >Livermore, CA 94550 >925-423-1062 >Lab cell 925-724-7509 > > > >On 9/20/18, 8:08 AM, "R-help on behalf of Lynette Chang" ><r-help-bounces at r-project.org on behalf of momtoomax at gmail.com> wrote: > > Hello everyone, > > I?ve a function with five input argument and one output number. > impVolC <- function(callM, K, T, F, r) > >I hope this function can take five vectors as input, then return one >vector as output. My vectorization ran into problems with the nested >if-else operation. As a result, I have to write another for loop to >call this function. Can anyone suggest some methods to overcome it? I >put my code below, thanks. > > impVolC <- function(callM, K, T, F, r){ > > > if(y >= 0){ > call0 <- K*exp(-r*T)*(exp(y)*polya(sqrt(2*y)) - 0.5) > if(callM <= call0){ > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > }else{ > call0 <- K*exp(-r*T)*(exp(y)/2 - polya(-sqrt(-2*y))) > if(callM <= call0){ > sig <- 1/sqrt(T)*(-sqrt(gamma + y) + sqrt(gamma - y)) > }else{ > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > } > } > sig > } > > for(i in 1:length(call)){ >sigV[i] <- impVolC(callM = call[i], K = df$Strike[i], T = T, F = F, r >r_m) > } > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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. -- Sent from my phone. Please excuse my brevity.
Sorry, misread your comment, I agree. 4/2 has one arithmetic operation, (1/2)*4 has two to accomplish the same calculation. On September 20, 2018 1:53:03 PM PDT, "MacQueen, Don" <macqueen1 at llnl.gov> wrote:>You're asking me? > >I prefer >> 4/2 >[1] 2 > >not >> 1/2*4 >[1] 2 > >(I think that's what I said) > >And if I did want to multiply by the reciprocal, which does happen from >time to time, I'd certainly do it this way: > (1/2)*4 > >-Don > >-- >Don MacQueen >Lawrence Livermore National Laboratory >7000 East Ave., L-627 >Livermore, CA 94550 >925-423-1062 >Lab cell 925-724-7509 > > > >?On 9/20/18, 12:36 PM, "Jeff Newmiller" <jdnewmil at dcn.davis.ca.us> >wrote: > >re: your last comment... why do you prefer to multiply by the >reciprocal? > >On September 20, 2018 10:56:22 AM PDT, "MacQueen, Don via R-help" ><r-help at r-project.org> wrote: > >In addition to what the other said, if callM is a vector then an > >expression of the form > > if (callM <= call0) >>is inappropriate. Objects inside the parentheses of if() should >have > >length one. For example, > > > >> if (1:5 < 3) 'a' else 'b' > >[1] "a" > >Warning message: > >In if (1:5 < 3) "a" else "b" : >> the condition has length > 1 and only the first element will be used > > > > > >instead of what you have: > > if(callM <= call0){ > > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > > }else{ > > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > > } > > > >Here are a couple of (untested) possibilities: > > > > M.gt.0 <- callM > call0 > > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) >> sig[M.gt.0] <- (1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - >y)))[M.gt.0] > > > >or > > > >sig <- 1/sqrt(T)*(sqrt(gamma + y) + ifelse(callM <= call0, -1, 1) * > >sqrt(gamma - y)) > > > >incidentally, I would write > > sig <- (sqrt(gamma + y) - sqrt(gamma - y))/sqrt(T) > >instead of > > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > > > >-- > >Don MacQueen > >Lawrence Livermore National Laboratory > >7000 East Ave., L-627 > >Livermore, CA 94550 > >925-423-1062 > >Lab cell 925-724-7509 > > > > > > > >On 9/20/18, 8:08 AM, "R-help on behalf of Lynette Chang" >><r-help-bounces at r-project.org on behalf of momtoomax at gmail.com> wrote: > > > > Hello everyone, > > >> I?ve a function with five input argument and one output number. > > > impVolC <- function(callM, K, T, F, r) > > > >I hope this function can take five vectors as input, then return one > >vector as output. My vectorization ran into problems with the nested > >if-else operation. As a result, I have to write another for loop to > >call this function. Can anyone suggest some methods to overcome it? I > >put my code below, thanks. > > > > impVolC <- function(callM, K, T, F, r){ > > > > > > if(y >= 0){ > > call0 <- K*exp(-r*T)*(exp(y)*polya(sqrt(2*y)) - 0.5) > > if(callM <= call0){ > > sig <- 1/sqrt(T)*(sqrt(gamma + y) - sqrt(gamma - y)) > > }else{ > > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > > } > > }else{ > > call0 <- K*exp(-r*T)*(exp(y)/2 - polya(-sqrt(-2*y))) > > if(callM <= call0){ > > sig <- 1/sqrt(T)*(-sqrt(gamma + y) + sqrt(gamma - y)) > > }else{ > > sig <- 1/sqrt(T)*(sqrt(gamma + y) + sqrt(gamma - y)) > > } > > } > > sig > > } > > > > for(i in 1:length(call)){ >>sigV[i] <- impVolC(callM = call[i], K = df$Strike[i], T = T, F = F, r >> >r_m) > > } > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > 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-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >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. > > -- > Sent from my phone. Please excuse my brevity. >-- Sent from my phone. Please excuse my brevity.