You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于同比增长率的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)

逻辑说明

  1. 分组:通过(row_number() - 1) %% 4把数据分成4组,每组对应同一个季度的不同年份(比如所有Q1的行在一组,Q2的在另一组)。
  2. 递归计算:accumulate从每个组的第一个元素(最新的GDP值)开始,依次计算后续的缺失值——每一步用前一个时期的GDP值除以对应时期的增长率,完全匹配公式$x_t = x_{t+4} / g_{t+4}$的逻辑。
  3. 结果整理:取消分组后可以选择恢复日期升序,方便后续分析。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:33:12