如何使用xts根据给定的增长率创建变量?

问题描述 投票:0回答:1

我想根据给定的增长率创建一个变量,该增长率在另一个变量中,从 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))

我做错了什么?无法通过小插图或其他在线帮助解决这个问题。

r xts
1个回答
0
投票

这里有两种方法。
第一个使用

for
循环,以使执行的计算更加清晰。主要问题是将
data
中的数据强制转换为数值。

suppressPackageStartupMessages({
  library(xts)
  library(tidyverse)
})

data <- as.xts(AirPassengers)
gr <- 0.1 # 10% growth
data <- cbind(data, gr)

n <- nrow(data)
data$v2 <- NA_real_
for(i in seq.int(n)[-1L]) {
  data_prev <- data$data[i - 1L] |> unclass() |> c()
  r <- (1 + data$gr[i]) |> unclass() |> c()
  data$v2[i] <- data_prev * r
}
data %>% head()
#>          data  gr    v2
#> jan 1949  112 0.1    NA
#> fev 1949  118 0.1 123.2
#> mar 1949  132 0.1 129.8
#> abr 1949  129 0.1 145.2
#> mai 1949  121 0.1 141.9
#> jun 1949  135 0.1 133.1

创建于 2023-11-28,使用 reprex v2.0.2


第二种方式使用

dplyr
管道来产生相同的向量
v2
。然后根据
v3
列变化给出的增长率计算向量
data

suppressPackageStartupMessages({
  library(xts)
  library(tidyverse)
})

data <- as.xts(AirPassengers)
gr <- 0.1 # 10% growth
data <- cbind(data, gr)

new_data <- data %>%
  as.data.frame() %>%
  mutate(gr3 = (data - dplyr::lag(data, default = NA_real_))/data) %>%
  mutate(
    v2 = dplyr::lag(data, default = NA_real_) * (1 + gr),
    v3 = dplyr::lag(data, default = NA_real_) * (1 + gr3)
  )

new_data %>% head()
#>          data  gr         gr3    v2       v3
#> jan 1949  112 0.1          NA    NA       NA
#> fev 1949  118 0.1  0.05084746 123.2 117.6949
#> mar 1949  132 0.1  0.10606061 129.8 130.5152
#> abr 1949  129 0.1 -0.02325581 145.2 128.9302
#> mai 1949  121 0.1 -0.06611570 141.9 120.4711
#> jun 1949  135 0.1  0.10370370 133.1 133.5481

创建于 2023-11-28,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.