我想根据给定的增长率创建一个变量,该增长率在另一个变量中,从 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))
我做错了什么?无法通过小插图或其他在线帮助解决这个问题。
这里有两种方法。
第一个使用
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