如何计算特定季度的几何平均值

时间:2019-03-29 16:00:59

标签: r

我很难计算特定年份每一栏的几何日期。我不得不为多列计算。这是在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 :(得分:0)

我们可以根据需要调整implementation,以显示%

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")