R mapply() для конкретной функции с рекурсивной формой (используя для)

Я работаю с некоторым кодом R, который, я уверен, должен быть написан с использованием одной из функций применения, но я не могу понять, как это сделать. У меня есть кадр данных с несколькими столбцами, и я хочу вызвать функцию, а ввод функции использует несколько столбцов из кадра данных. Допустим, у меня есть эти данные и функция f:

data<- data.frame(T=c(1,2,3,4), S=c(3,7,8,4), K=c(5,6,11,9))
data
V<-c(0.1,0.2,0.3,0.4,0.5,0.6)

f<-function(para_h,S,T,a,t,b){
  r<- V
  steps<-T
  # Recursive form: Terminal condition for the A and B at time T
  A_T=0
  B_T=0
  A=c()
  B=c()
  #  A and B a time T-1
  A[1]= r[steps]*a 
  B[1]= a*para_h[5]+ ((para_h[4])^(-2))         
  # Recursion back to time t      
  for (i in 2:steps){
    A[i]= A[i-1]+ r[steps-i+1]*a + para_h[1]*B[i-1]
    B[i]= para_h[2]*B[i-1]+a*para_h[5]+ (para_h[4]^(-2))
}
  f = exp(log(S)*a + A[t] + B[t]*b )

  return(f)
}

Эта функция хорошо работает для некоторых конкретных значений:

> para_h<-c(0.1,0.2,0.3,0.4,0.5,0.7)
> f(para_h,S=3,T=2,a=0.4,t=1,b=0.1)
[1] 3.204144

Я хочу применить функцию к каждому столбцу S и T во фрейме данных. Итак, мой код выглядит так:

mapply(function(para_h,S,T,a,t,b) f(para_h,S,T,a,t,b) ,para_h,S=data$S,T=data$T,a=0.4,t=1,b=0.1)

Это дает ошибку:

> mapply(function(para_h,S,T,a,t,b) f(para_h,S,T,a,t,b) ,para_h,S=data$S,T=data$T,a=0.4,t=1,b=0.1)
Error in A[i] = A[i - 1] + r[steps - i + 1] * a + para_h[1] * B[i - 1] : 
  replacement has length zero

Я почти уверен, что проблема в том, что «шаги» - это вектор. Очень оценит элегантное решение. Я надеюсь, что это имело какой-то смысл, любой совет будет принят с благодарностью.


person Laura Esly    schedule 19.02.2015    source источник


Ответы (1)


Пара вещей:

1) каждый вызов вашей функции ожидает полный вектор para_h, но в вашем коде mapply он будет получать только одно значение за раз, поэтому вы, вероятно, хотите что-то вроде этого:

 mapply(function(S,T) f(para_h,S,T,a=0.4,t=1,b=0.1), data$S, data$T)

или это:

 apply(data,1,function(d) f(para_h,d['S'],d['T'],a=0.4,t=1,b=0.1))

2) Ваша функция выдает ошибку, когда T==1 (что имеет место в первой строке data), поэтому вам может потребоваться изменить свой пример набора данных, чтобы иметь возможность запускать этот код.

person Marat Talipov    schedule 19.02.2015