【问题标题】:Applying rollapply to a writen function or using a loop将 rollapply 应用于 writen 函数或使用循环
【发布时间】:2014-08-08 17:48:06
【问题描述】:

这可能是一个基本的 rollapply 或循环问题,但是我找不到指示 rollapply 函数或为循环计算创建表达式的方法

我有一个初始值为 100 的增长率向量。我想计算增长序列每个点的值并获得该值的向量。鉴于实际的增长序列比下面的例子长得多,下面的例子是不可能的。

x<-c(0.02,0.01,0.4,0.09,-0.3,0.1)

100*(1+x[1])*(1+x[2])*(1+x[3])*(1+x[4])*(1+x[5])*(1+x[6])#End Value 

a1<-100*(1+x[1])#1st value
a2<-a1*(1+x[2])#2nd value
a3<-a2*(1+x[3])#3rd value
a4<-a3*(1+x[4])#4th value
a5<-a4*(1+x[5])#5th value
a6<-a5*(1+x[6])#6th value

s<-c(a1,a,2,a,3,a4,a,5,a6) #vector of values 

我相信 rollapply 可以在这里使用,但是我不能编写函数来获取先前值和下一个顺序来创建函数,而且我不确定是否以及如何将 100 的初始值合并到函数或在 x 的开头添加它。此外,也许这可以作为一个循环来完成。 (在伪代码中查找函数)

x<-c(0.02,0.01,0.4,0.09,-0.3,0.1)

require(zoo);   
fn<- function(y) {(1+prior x)*(1+next x)}
rollapply(x, 1, fun= fn, fill=NA, align='right')

欢迎任何帮助

【问题讨论】:

  • exp(cumsum(log(1+x)))
  • 谢谢你,我相信我把事情复杂化了。不知道 cumsum 函数,我猜你 log as 添加然后 exp 使值恢复到算术增长。
  • 或者更简单:cumprod(1+x)

标签: r


【解决方案1】:
 x<-c(0.02,0.01,0.4,0.09,-0.3,0.1)

desired <- 100*(1+x[1])*(1+x[2])*(1+x[3])*(1+x[4])*(1+x[5])*(1+x[6])#End Value 
desired
100*tail( cumprod (1+x) , 1)

哦,该死的。我应该先阅读 cmets。 @G.Grothendieck 已经在这里了。我想展示如何使用 Reduce 来做到这一点可能很有用:

> 100*Reduce("*", 1+x)
[1] 121.0506

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多