2015-02-19 3 views
0

Я работаю с некоторым R-кодом, который, я уверен, должен быть способен записать одну из применяемых серий функций, но я не могу работать как. У меня есть dataframe с несколькими столбцами, и я хочу вызвать функцию, а вход функции использует несколько столбцов из фрейма данных. Скажем, у меня есть эти данные и функцию F:R mapply() для конкретной функции с рекурсивной формой (для использования)

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 

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

ответ

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 (что имеет место в первом ро w от data), поэтому вам, возможно, потребуется изменить набор данных образцов, чтобы иметь возможность запускать этот код.

+0

Большое спасибо за ваше замечание, это правильно. –

Смежные вопросы