基于同比增长率的GDP序列回溯:用purrr::accumulate替代循环
用dplyr+purrr::accumulate替代循环回溯GDP数据
我手里有个包含GDP数据和同比增长率的数据集,增长率序列的起始时间比GDP数据早。需要通过递归回溯来扩大GDP样本量,缺失的GDP值要按公式$x_t = x_{t+4} / g_{t+4}$计算——也就是用未来同季度的GDP值除以对应时期的同比增长率。我已经用循环实现了需求,但想在dplyr工作流里用purrr::accumulate来完成。
示例数据与原有循环实现
首先是模拟数据集和已有的循环代码:
library(dplyr) set.seed(123) df <- data.frame(date = seq(as.Date("2018/1/1"), by = "quarter", length.out = 20), gdp = c(rep(NA, 16), cumprod(runif(4, 0.95, 1.05)) * 1000), growth_rate = rnorm(5, mean = 3, sd = 1)) %>% mutate(growth_rate = 1 + growth_rate/100) %>% arrange(desc(date)) # 按日期降序排列,方便循环回溯 # 原有循环实现 for (i in 5:length(df$growth_rate)){ df[i, "gdp"] <- df[i-4, "gdp"] / df[i-4, "growth_rate"] }
dplyr+purrr::accumulate实现方案
核心思路是把数据按同季度分组(因为同比增长率对应同季度),然后对每个分组用accumulate递归计算缺失的GDP值。具体代码如下:
library(purrr) df_filled <- df %>% # 按行号分组,得到4个并行的同季度序列(对应4个季度) group_by(grp = (row_number() - 1) %% 4) %>% # 对每个分组递归计算GDP:从已知的最新GDP开始,依次往前回溯 mutate(gdp = accumulate(seq_along(gdp), function(prev_vals, idx) { if (idx == 1) { # 第一个元素是已知的最新GDP值 prev_vals <- gdp[idx] } else { # 后续缺失值 = 前一个计算出的GDP / 前一个时期的增长率 prev_vals <- c(prev_vals, prev_vals[idx-1] / growth_rate[idx-1]) } prev_vals })) %>% ungroup() %>% # 可选:恢复按日期升序排列 arrange(date)
逻辑说明
- 分组:通过
(row_number() - 1) %% 4把数据分成4组,每组对应同一个季度的不同年份(比如所有Q1的行在一组,Q2的在另一组)。 - 递归计算:
accumulate从每个组的第一个元素(最新的GDP值)开始,依次计算后续的缺失值——每一步用前一个时期的GDP值除以对应时期的增长率,完全匹配公式$x_t = x_{t+4} / g_{t+4}$的逻辑。 - 结果整理:取消分组后可以选择恢复日期升序,方便后续分析。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

