我正在使用一个时间序列,其中需要一个简单的根搜索算法来迭代计算根。为此,我使用包rootSolve
。但是,当我想使用整个数据集扩展此算法以进行多次观察而不是一次执行时,我在尝试确定要使用哪个函数apply
时遇到了一些问题。
这是为1次观察编写的代码的简化:
Z1, Z2, Z3,Z4 and are discount factors between 0 and 1
Z5 a percentage
f<- function(x) (z1*(1-exp(-.25*x))
+z2*(exp(-.25*x)-exp(-.5*x))
+z3*(exp(-.5*x)-exp(-.75*x))
+z4*(exp(-.75*x)-exp(-x)))/
(z1*exp(-.25*x)+z2*exp(-.5*x)+z3*exp(-.75*x)+z4*exp(-x))-z5
then I find a root using
uni<-uniroot(f, c(0,1))
如何编写apply
函数(我假设需要一个)来更改Z1
,Z2
,Z3
,Z4
和{{1对于每个包含780个观测值的向量,我可以为每组折扣和百分比找到函数的根?这可能是直截了当的,但我无法正确判断出来。
答案 0 :(得分:0)
这是一种矢量化方法:
## zi should passed a additional parameter to f
f<-
function(x,z1,z2,z3,z4,z5)
(z1*(1-exp(-.25*x))
+z2*(exp(-.25*x)-exp(-.5*x))
+z3*(exp(-.5*x)-exp(-.75*x))
+z4*(exp(-.75*x)-exp(-x)))/
(z1*exp(-.25*x)+z2*exp(-.5*x)+z3*exp(-.75*x)+z4*exp(-x))-z5
## wrap the unitroot function to make it function of only zi
root_f <-
function(z1,z2,z3,z4,z5)
uniroot(f, c(0,1),z1,z2,z3,z4,z5)
## use mapply to vectorize
mapply(root_f,Z1,Z2,Z3,Z4,Z5)