【发布时间】: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 的加权计算,目前仅限于加权均值和加权残差。