【发布时间】:2021-06-05 16:13:19
【问题描述】:
我有一个 data.table,我想在其上按月查找列 performance 的加权平均值。
dat <- structure(list(year = c(2014, 2015, 2016, 2017, 2018, 2019, 2020,
2021, 2014, 2015, 2016, 2017, 2018, 2019, 2020),
month = c(2,
2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10),
performance = c(0.826973794097158,
0.61975709469356, 0.924350659523548, -0.183133219063708, -0.529913189565746,
-0.148531188902535, -0.0773058814083695, 1.42862504650241, 0.465498268732376,
0.148719963224136, 0.205614191281359, 0.560651497949418, -0.484408605607923,
0.875353374774486, 0.351469397380814)),
row.names = c(NA, -15L), class = c("data.table", "data.frame"))
这个 data.table 如下所示 -
year month performance
1: 2014 2 0.82697379
2: 2015 2 0.61975709
3: 2016 2 0.92435066
4: 2017 2 -0.18313322
5: 2018 2 -0.52991319
6: 2019 2 -0.14853119
7: 2020 2 -0.07730588
8: 2021 2 1.42862505
9: 2014 10 0.46549827
10: 2015 10 0.14871996
11: 2016 10 0.20561419
12: 2017 10 0.56065150
13: 2018 10 -0.48440861
14: 2019 10 0.87535337
15: 2020 10 0.35146940
为了按月计算加权平均值,我使用了以下代码 -
setDT(dat)[, lapply(.SD, function(x) weighted.mean(x, na.rm = TRUE)), by = .(month), .SDcols = c("performance")]
我得到的结果是 -
month performance
1: 2 0.3576029
2: 10 0.3032712
但是,月份 10 的加权平均表现应该大于月份 2,因为它具有更多的正值。
似乎只有 2021 年的 2 月份对其表现造成了严重影响,使其表现优于 10 月份的表现。
实际上,上面的代码只找到mean 而不是weighted.mean。如果我使用mean 而不是weighted.mean,结果是一样的。
setDT(dat)[, lapply(.SD, function(x) mean(x, na.rm = TRUE)), by = .(month), .SDcols = c("performance")]
使用简单均值后的结果如下,与weighted.mean的结果相同。
month performance
1: 2 0.3576029
2: 10 0.3032712
期望的结果应该对每一年的表现给予同等重视,以便某一特定年份的出色表现不会错误地表明该产品每年在该月销售得很好。
有人能指出我的加权平均计算有什么问题吗?
【问题讨论】:
-
什么叫加权平均?在 R 中,这意味着
?weighted.mean,并且由于您没有给出任何权重,因此您得到的是正常平均值。 -
在 package stats 的参考部分中,
weighted.mean提到了它——“如果 w 缺失,那么 x 的所有元素都被赋予相同的权重。”我想保持每年的权重相等。 -
所以你得到一个正常的意思:那么问题是什么?
-
如果每一年的权重相同,那么月份
10的表现应该优于月份2。查看月份2中的所有负值。我试图更好地解释它。如果我们找到performance列的符号均值,那么月份10是明显的赢家。setDT(dat)[, lapply(.SD, function(x) mean(sign(x), na.rm = TRUE)), by = .(month), .SDcols = c("performance")] -
不,因为
mean=sum/n和您指出的第 8 行补偿了所有负值。您在寻找中位数吗?
标签: r data.table weighted-average