0

我正在处理一个时间序列,其中需要一个简单的根搜索算法来通过迭代计算根。为了做到这一点,我使用了 package rootSolveapply但是,当我想使用整个数据集而不是一次只做一个来扩展该算法以进行多个观察时,我在尝试确定要使用该族的哪个函数时遇到了一些问题。

这是为 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函数(我假设需要一个)来更改Z1Z2、和用于每个包含 780 个观察值的向量Z3,以便我可以找到每组折扣和百分比的函数的根?这可能是直截了当的,但我无法正确弄清楚。Z4Z5

4

1 回答 1

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)
于 2014-05-14T17:46:56.193 回答