Как рассчитать среднее геометрическое для определенных кварталов - PullRequest
0 голосов
/ 29 марта 2019

Мне сложно вычислить геометрическую дату для каждого столбца для определенных лет.Я должен был рассчитать это для нескольких столбцов.Это было сделано в Excel, и теперь мы хотим перейти к r для более широкой аудитории. Ниже приведены формулы, используемые в Excel

(GEOMEAN(1+DK45:DK48)^4)^(1/4)-1

. Я попытался применить формулу mean.geometric из библиотеки производительности, которая дает именно тот результат, но не уверенкак применить это по разным кварталам к целому столбцу

  TotalReturn %>% 
  mutate(mpgGM = rollapply(l12420, 3, geometric.mean, fill=NA, 
  align="left"))

Мой выборочный набор данных:

structure(list(Quarter = structure(c(18717, 18808, 18900, 18992, 
19082, 19173, 19265, 19357, 19447, 19538, 19630, 19722), class = "Date"), 
    A = c(0.043, 0.044, 0.044, 0.044, 0.044, 0.046, 0.048, 0.049, 
    0.05, 0.05, 0.05, 0.051), B = c(-0.002, -0.001, 0.002, 0.008, 
    0.015, 0.02, 0.024, 0.025, 0.025, 0.023, 0.022, 0.022)), row.names = c(NA, 
-12L), class = "data.frame")

Это ожидаемый результат

2021 Q4 4.06%
2022 Q4 4.68%
2023 Q4 5.04%

1 Ответ

0 голосов
/ 29 марта 2019

Мы могли бы адаптировать функцию для среднего геометрического для наших целей, чтобы получить % дисплей.

gmMean <- function(x, na.rm=TRUE) {
  paste0(sprintf("%.1f", exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))*100), "%")
}

Затем эту функцию можно применить при создании фрейма данных.

res <- data.frame(Year=strftime(dat$Quarter, format="%Y"),
                  Quarter=factor(substr(dat$Quarter, 6, 7), labels=paste0("Q", 1:4)),
                  Geom.Mean=apply(dat[-1], 1, gmMean))
res
#    Year Quarter Geom.Mean
# 1  2021      Q1     20.7%
# 2  2021      Q2     21.0%
# 3  2021      Q3      0.9%
# 4  2021      Q4      1.9%
# 5  2022      Q1      2.6%
# 6  2022      Q2      3.0%
# 7  2022      Q3      3.4%
# 8  2022      Q4      3.5%
# 9  2023      Q1      3.5%
# 10 2023      Q2      3.4%
# 11 2023      Q3      3.3%
# 12 2023      Q4      3.3%

Чтобы получить среднее геометрическое значение для целых лет, мы можем сначала создать переменную года

dat$year <- strftime(dat$Quarter, format="%Y")

, а затем сделать

res <- aggregate(. ~ year, dat, gmMean)[-2]
res
#   year    A    B
# 1 2021 4.4% 6.3%
# 2 2022 4.7% 2.1%
# 3 2023 5.0% 2.3%

Данные

dat <- structure(list(Quarter = structure(c(18717, 18808, 18900, 18992, 
19082, 19173, 19265, 19357, 19447, 19538, 19630, 19722), class = "Date"), 
    A = c(0.043, 0.044, 0.044, 0.044, 0.044, 0.046, 0.048, 0.049, 
    0.05, 0.05, 0.05, 0.051), B = c(-0.002, -0.001, 0.002, 0.008, 
    0.015, 0.02, 0.024, 0.025, 0.025, 0.023, 0.022, 0.022)), row.names = c(NA, 
-12L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...