R mapply() 在具有递归形式的特定函数上(用于)
R mapply() on specific function with recursive form (using for)
我正在使用一些 R 代码,我确信这些代码必须能够使用 apply 系列函数之一编写,但我不知道如何编写。我有一个包含多列的数据框,我想调用一个函数,函数的输入使用数据框中的多列。假设我有这个数据和一个函数 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
我很确定问题在于:"steps" 是向量。非常感谢一个优雅的解决方案。
我希望这有某种意义,任何建议将不胜感激。
两件事:
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
的第一行就是这种情况),因此您可能需要修改示例数据集才能 运行这个代码。
我正在使用一些 R 代码,我确信这些代码必须能够使用 apply 系列函数之一编写,但我不知道如何编写。我有一个包含多列的数据框,我想调用一个函数,函数的输入使用数据框中的多列。假设我有这个数据和一个函数 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
我很确定问题在于:"steps" 是向量。非常感谢一个优雅的解决方案。 我希望这有某种意义,任何建议将不胜感激。
两件事:
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
的第一行就是这种情况),因此您可能需要修改示例数据集才能 运行这个代码。