【问题标题】:R using dplyr to compute weighed statistics by groupR使用dplyr按组计算加权统计
【发布时间】:2021-10-01 00:13:16
【问题描述】:

多年来,我一直在使用 Hmisc 包和 base R 来计算加权统计摘要。通常,我使用双重权重,一个是空间影响权重,另一个是数据支持值,例如长度、体积、物理密度等。以“mtcars”数据集为例,其中 mpg 是感兴趣的变量,并且由汽车“wt”和“hp”设计的双重权重,Hmisc + base R 工作流程通常如下所示。

require(Hmisc)

mtcars$Wt2 <- mtcars$wt * mtcars$hp               # double weight
mtcars$Acc <- mtcars$Wt2 * mtcars$mpg             # accumulation

min(mtcars$mpg)                                   # min
sqrt(wtd.var(mtcars$mpg, mtcars$mpg))             # wtd sd
wtd.quantile(mtcars$mpg, mtcars$mpg,0.05)         # wtd 5th 
wtd.quantile(mtcars$mpg, mtcars$mpg,0.50)         # wtd median
wtd.quantile(mtcars$mpg, mtcars$mpg,0.95)         # wtd 95th
max(mtcar$mpg)                                    # max

然后可以使用循环为更大数据帧中的每个感兴趣区域过滤和计算这些加权统计信息。但是,当我尝试学习如何使用 dplyr 时,我想知道如何计算这些加权统计信息。可以使用加权平均选项,但其他选项需要更多工作。下面是我研究出如何从第一原理计算加权平均值的代码(并对照 dplyr 内置函数检查了这一点)。但是,我很困惑如何使用 dplyr 按组计算加权 SD 和分位数,因为我需要以某种方式将平方加权平均差(对于每个组)放入管道链中。

mtcars %>% 
  mutate(Car = row.names(mtcars)) %>%  # variable for car name
  mutate(Wt2 = wt * hp) %>%            # double weight
  mutate(Acc = Wt2 * mpg) %>%          # weighted consumption
  group_by(Car) %>%                    # group by car type
  summarise(n = n(),
            SmWt2 = sum(Wt2),                    # Sum of double weight
            SmAcc = sum(Acc),                    # Sum of accumulations
            WtMn = SmAcc/SmWt2,                  # Weighted mean
            WtMnChk = weighted.mean(mpg, Wt2)    # Check weighted mean
            )

【问题讨论】:

  • this question 是否为您指明了正确的方向?
  • 第一部分Acc是Wt2 * Wt2,第二部分是Wt2 * mpg,这是什么意思?
  • 当组都是单车时,我不清楚你所说的加权平均是什么意思。我认为您希望在一组中获得加权平均值,例如所有 4 缸汽车......
  • Jon - 感谢您发现该错误 - 我已将示例更正为 mpg。您对单车加权平均值的评论也是明智的——我应该按照您的建议举一个例子,因为这样会更有意义。然而,问题的症结在于 plyr 的加权计算,目前仅限于加权均值和加权残差。

标签: r dplyr


【解决方案1】:

我不确定我是否完全理解您正在使用的方法,但这里有一个使用gear 求加权平均值和加权标准差的示例,使用wt 作为权重:

library(dplyr)
datasets::mtcars %>% 
  group_by(gear) %>%
  summarize(n = n(),
            mpg_weighted_by_weight = sum(mpg*wt) / sum(wt),
            mpg_weighted_by_weight_check = weighted.mean(mpg, wt),
            
            mpg_sd = sqrt(sum(wt * ((mpg - mpg_weighted_by_weight)^2))/(sum(wt)-1)),
            mpg_sd_check = sqrt(Hmisc::wtd.var(mpg, wt)))


# A tibble: 3 x 6
   gear     n mpg_weighted_by_weight mpg_weighted_by_weight_check mpg_sd mpg_sd_check
* <dbl> <int>                  <dbl>                        <dbl>  <dbl>        <dbl>
1     3    15                   15.6                         15.6   3.32         3.32
2     4    12                   23.6                         23.6   4.81         4.81
3     5     5                   19.7                         19.7   5.63         5.63

我不熟悉加权标准差的公式,而是欺骗并依赖 Hmisc::wtd.var 的公式。如果在 RStudio 中按住 Control 键单击公式名称,它会显示函数的底层代码。大部分都是错误处理,直到底部:

#Hmisc::wtd.var
function (x, weights = NULL, normwt = FALSE, na.rm = TRUE, method = c("unbiased", 
  "ML")) 
{
  # ...  skipping error handling
  sw <- sum(weights)
  # ...
  xbar <- sum(weights * x)/sw
  sum(weights * ((x - xbar)^2))/(sw - 1)
}

【讨论】:

  • 不错的解决方案 - 我没有意识到我可以在 dplyr 中调用 Hsmic 函数 - 也许这是避免从第一原则工作的最佳方法
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 2014-05-11
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多