我有一个包含GDP数据和同比增长率的数据集。增长率系列比 GDP 数据开始得早,所以我想用它们递归地回溯 GDP 系列以扩大其样本量。
每个缺失值(例如 2021:Q4)应等于未来一年同一季度的值(2022:Q4)除以该未来时期的同比增长率(
i.e. x_t = x_{t+4} / g_{t+4}
)。由于每个新值都取决于“未来”值,因此我需要一种递归计算方法。
我已经使用循环创建了所需的输出,但更喜欢在 dplyr 工作流程中使用 purrr::accumulate 函数的解决方案。
library(dplyr)
# Dummy data set
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)) # Sorting the data descending to make the loop work
# for loop which gets a solution
for (i in 5:length(df$growth_rate)){
df[i, "gdp"] <- df[i-4, "gdp"] / df[i-4, "growth_rate"]
}
我认为使用
accumulate()
而不是你的循环有点麻烦,因为你基本上每个季度都有一个单独的系列(至少你的措辞方式)。这意味着您需要拆分数据框,为每个季度指定不同的初始值 (.init
),然后按日期合并 GDP 值。
# single quarter
df1 <- df |> filter(lubridate::month(date) == 10)
accumulate(df1$growth_rate,
`/`,
.init = df1$gdp[1])
#> [1] 1036.0279 1001.3713 957.7120 929.1814 900.9869 860.4177
创建于 2023-03-21 与 reprex v2.0.2
具有嵌套数据框而不是合并单独数据框的整个工作流程可能如下所示:
library(lubridate)
library(tidyverse)
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)) # Sorting the data descending to make the loop work
df |>
as_tibble() |>
mutate(month = month(date)) |>
nest(.by = month) |>
mutate(extrapolated = map(data, \(x) mutate(x, new = accumulate(
head(growth_rate, -1), `/`, .init = nth(gdp, 1)
))), .keep = "none") |>
unnest(extrapolated)
#> # A tibble: 20 × 4
#> date gdp growth_rate new
#> <date> <dbl> <dbl> <dbl>
#> 1 2022-10-01 1036. 1.03 1036.
#> 2 2021-10-01 NA 1.05 1001.
#> 3 2020-10-01 NA 1.03 958.
#> 4 2019-10-01 NA 1.03 929.
#> 5 2018-10-01 NA 1.05 901.
#> 6 2022-07-01 998. 1.05 998.
#> 7 2021-07-01 NA 1.03 953.
#> 8 2020-07-01 NA 1.05 921.
#> 9 2019-07-01 NA 1.03 881.
#> 10 2018-07-01 NA 1.03 855.
#> 11 2022-04-01 1007. 1.03 1007.
#> 12 2021-04-01 NA 1.05 976.
#> 13 2020-04-01 NA 1.03 932.
#> 14 2019-04-01 NA 1.05 901.
#> 15 2018-04-01 NA 1.03 862.
#> 16 2022-01-01 979. 1.03 979.
#> 17 2021-01-01 NA 1.03 950.
#> 18 2020-01-01 NA 1.05 921.
#> 19 2019-01-01 NA 1.03 879.
#> 20 2018-01-01 NA 1.05 850.
创建于 2023-03-21 与 reprex v2.0.2