我正在尝试执行以下变体:计算时间序列的每个时间段的百分比变化,然后将这些百分比变化应用于单独的时间序列。
这就像将AAPL的每日价格变化应用于某些特定股票的当前价格并显示它的外观。
我有一个时间序列,其中包含适当的百分比变化:
index change price
2007-07-01 136.47 NA 136.3
2007-08-01 136.44 -0.0002198285 0.0
2007-09-01 135.55 -0.0065230138 0.0
2007-10-01 133.86 -0.0124677241 0.0
2007-11-01 131.34 -0.0188256387 0.0
2007-12-01 129.61 -0.0131719202 0.0
我可以使用mapply和lag来计算每个未来的价格值:
ts$price[-1,] <- mapply(function(x, y) x + (x*y), lag(ts$price, 1)[-1,], ts$change[-1,])
但是它一次只计算一行,它不会递归地工作。我看了rollapply并且遇到了同样的问题:一次只有一条记录得到更新:
ts[-1,]$price <- rollapply(as.zoo(ts), 2,
function(x) x[1, "price"] + (x[2, "change"] * x[1, "price"]), by.column = F)
计算是正确的,我可以让它与循环一起工作,但我想了解我做错了什么。必须有办法让它以递归方式工作。
或者我可能比这更困难了?
答案 0 :(得分:0)
这是一个我希望有帮助的解决方案。
以下几行只是数据
data<-matrix(data=c(2007-07-01, 136.47,NA, 136.3,2007-08-01, 136.44, -0.0002198285,0.0,2007-09-01, 135.55,-0.0065230138,0.0,2007-10-01, 133.86,-0.0124677241,0.0,2007-11-01,131.34,-0.0188256387,0.0,2007-12-01,129.61, -0.0131719202,0.0), nrow=6, ncol=4,byrow=TRUE)
data<-data[,-1]
ts<-ts(ts,frequency=12,start=c(2007,7))
colnames(ts)<-c("index", "change", "price")
您可以应用它来获得所需的输出:
for(i in 2:nrow(ts)){
ts[i,3]<-ts[1,3]*(1+ts[i,2])
}
输出如下:
> ts
index change price
Jul 2007 136.47 NA 136.3000
Aug 2007 136.44 -0.0002198285 136.2700
Sep 2007 135.55 -0.0065230138 135.4109
Oct 2007 133.86 -0.0124677241 134.6006
Nov 2007 131.34 -0.0188256387 133.7341
Dec 2007 129.61 -0.0131719202 134.5047