如何用xts基于给定增长率创建衍生变量?
问题描述
我需要基于另一个变量中的给定增长率,从基数1开始创建新变量。为简化示例,增长率设为恒定10%,但实际数据中增长率并非恒定(例如可使用diff(data)/lag(data)计算数据中变量的增长率)。我尝试了两种方法均无效,已添加目标结果变量,代码如下:
library(xts) data <- as.xts(AirPassengers) gr <- 0.1 # 10% growth data <- cbind(data,gr) # Method 1, based on lag data$v2 <- 1 data$v2 <- lag(data$v2)*(1+data$gr) # Method 2, based on compound growth formula data$v3 <- 1 data$v3 <- first(data$v3)*(1+data$gr)^(index(data$gr)) data$target <- 1*1.1^(1:144) # vector growing 10%, starting at 1
请问我哪里出错了?
错误原因
- 方法1失效原因:你先把
data$v2全设为1,随后用lag(data$v2)*(1+data$gr)覆盖整列。lag(data$v2)生成的序列首项为NA,其余都是前一行的1,所以计算后只有第二行开始是1.1,第一行是NA,且无法实现逐期复利的累积——这是一次性赋值,没有迭代更新每一行的数值。 - 方法2失效原因:
index(data$gr)是xts的时间索引(比如1949-01-01这类日期格式),不是从1开始的期数序列。用日期数值作为指数计算,逻辑完全错误,结果自然和目标不符。
正确解法
恒定增长率场景
直接基于期数序列计算复利,适配xts结构:
library(xts) data <- as.xts(AirPassengers) gr <- 0.1 data$gr <- gr # 生成从1开始的期数 periods <- seq_along(data$gr) # 计算复利:首项为1,第n期是1*(1+gr)^(n-1) data$v_correct <- 1 * (1 + gr)^(periods - 1) # 验证与target一致 all.equal(data$v_correct, data$target) # 返回TRUE
可变增长率场景(实际业务场景)
当增长率逐期变化时,核心是计算(1+增长率)的累积乘积:
# 模拟可变增长率(实际可替换为你的计算结果,比如diff(data)/lag(data)) set.seed(123) data$gr_var <- runif(nrow(data), 0.05, 0.15) # 累积乘积实现逐期复利:首项为1,后续每一期乘(1+当期增长率) data$v_var_correct <- cumprod(c(1, 1 + data$gr_var[-1]))
内容的提问来源于stack exchange,提问作者luchonacho
相关产品推荐
相关产品推荐

