This question is about sapply accessing the row number, of the row it's working on. I'm trying to use sapply (or whatever apply is applicable) instead of a loop. However, I need knowledge of which row I am working on during the apply. I can rewrite this, but I would like to do it with an apply function.

Finance: In a recombining binomial tree u >1, and d=1/u are multipliers to a stock price. To find the price at time n, you multiply: time zero price, u^#movements up, d^#of movements down. #down+#up=n

s_t = function(s_tm, tree_path, move_ratio, u_or_d ='u'){
    u.z = move_ratio
    if (u_or_d == 'd') { u.z = 1/move_ratio }
    ud_coeff = u.z ^ (tree_path[1]-tree_path[2])
    s_tm * ud_coeff }

This s_t will be the FUN function fed to sapply. the variable tree_path is a tuple/vector (#up,#down). For any time t, they always sum to the same number. However, I need #up and #down to change for each node in the tree.

Example: S0 = 100, u=1.25 d=1/u=0.8, t=3. Return the 4by1 matrix representing possible stock prices at time 3 (i.e. return S3)

S0 = 100; S1 = [125, 80]; S2=[156.25, 100, 64]; S3 = [195.3125, 125, 80, 51.2]

I would like to get S3, by calling sapply on an empty matrix, using s_T as the function to apply

prices = matrix(data=0, nrow =4, ncol=1)
stock_at_time_n = sapply(X = prices, 
    FUN = s_t, tree_path= (ROW#, LENGTH(prices) - ROW#), 
    move_ratio=1.25)

Result should be

[195.3125, 125, 80, 51.2]

Not concerned if it's a matrix, vector, etc at the moments, as I can just morph it with as.Whatever_I_want()

What is the correct notation for tree_path= (ROW#, LENGTH(prices) - ROW#) such that I can get the S3 output?

1 Answers

0
Jason Johnson On Best Solutions

In general to access the index of an R object in an sapply loop you would use seq_along. Something like:

sapply(X = seq_along(prices),
       FUN = function(i) {
               s_t(s_tm=100, 
                   tree_path= c (i,length(prices)-i),
                   move_ratio = 1.25)
              })

Or really the way you are using sapply you could just use 1:n, where n = 4 in your case. Thanks and good luck!