R-条形图中按组大小加权

R-条形图中按组大小加权,r,plot,ggplot2,data-visualization,weighted-average,R,Plot,Ggplot2,Data Visualization,Weighted Average,假设我有一个如下所示的数据帧: groups <- floor(runif(1000, min=1, max=5)) activity <- rep(c("A1", "A2", "A3", "A4"), times= 250) endorsement <- floor(runif(1000, min=0, max=2)) value1 <- runif(1000, min=1, max=10) area <- rep(c("A", "A", "A", "A", "B

假设我有一个如下所示的数据帧:

groups <- floor(runif(1000, min=1, max=5))
activity <- rep(c("A1", "A2", "A3", "A4"), times= 250)
endorsement <- floor(runif(1000, min=0, max=2))
value1 <- runif(1000, min=1, max=10)
area <- rep(c("A", "A", "A", "A", "B", "C", "C", "D", "D", "E"), times = 100)

df <- data.frame(groups, activity, endorsement, value1, area)
我想计算一些描述性统计数据并创建一些条形图,但如果您查看
区域
变量,
A
表示得非常好,而
B
E
则不是

我对
区域
变量本身不感兴趣,但统计/绘图将由数据集中具有高表示性的区域驱动,因此我需要对数据进行加权,但我不确定在以下情况下正确的方法:

平均值和SD

我正在计算平均值和SD或
值1
,如下所示:

df %>% group_by(groups) %>% summarise(mean=mean(value1), sd=sd(value1))
计算加权平均值/sd以补偿每个区域样本量差异的正确方法是什么(即,我想给每个
区域
相等的权重)

堆叠条形图

ggplot(df, aes(groups)) +
  geom_bar(aes(fill = activity), position = position_fill(reverse = F))

条形图表示每个
组中每个
活动发生的频率比例。同样,这主要是由A区的受访者驱动的-是否有办法平衡这一点并计算出比例,就好像
具有相同的代表性

分组表示

ggplot(aes(x = activity, y = value1, fill=factor(groups)), data=df) +
  geom_bar(position="dodge", stat="summary", fun.y="mean")+
  guides(fill = guide_legend(reverse=F, title="group"))
summary_df <- df %>% group_by(groups, activity) %>%
    summarise(n=n(), count=sum(endorsement)) %>% mutate(prop=(count/n)*100)

ggplot(aes(x = activity, y = prop, fill = factor(groups)), data=summary_df) +
  geom_bar(width=0.8, position = position_dodge(width=0.8), stat="identity") +
  guides(fill = guide_legend(reverse=F, title="group"))

条形图表示每个
活动
组合的
值1
的平均值。同样,这些平均值的加权有利于A区,代表性也不相等

分组计数比例

ggplot(aes(x = activity, y = value1, fill=factor(groups)), data=df) +
  geom_bar(position="dodge", stat="summary", fun.y="mean")+
  guides(fill = guide_legend(reverse=F, title="group"))
summary_df <- df %>% group_by(groups, activity) %>%
    summarise(n=n(), count=sum(endorsement)) %>% mutate(prop=(count/n)*100)

ggplot(aes(x = activity, y = prop, fill = factor(groups)), data=summary_df) +
  geom_bar(width=0.8, position = position_dodge(width=0.8), stat="identity") +
  guides(fill = guide_legend(reverse=F, title="group"))
summary\u df%group\u by(组、活动)%>%
总结(n=n(),计数=sum(背书))%>%mutate(prop=(计数/n)*100)
ggplot(aes(x=活动,y=道具,填充=因子(组)),数据=汇总)+
几何图形栏(宽度=0.8,位置=位置减淡(宽度=0.8),stat=“identity”)+
辅助线(填充=辅助线\图例(反向=F,title=“group”))

对于每个
活动
组合,我正在计算支持该项目的人数(响应
1
),并计算该子组中总人数的比例

上述4个问题都源于同一个问题,所有问题都需要通过
面积
进行加权,以创建相等的表示。然而,可视化都是以不同的方式创建的,并显示不同的内容(平均值、堆叠条、分组平均值、计数比例),我不确定如何正确解释每种情况下的样本大小差异。是否有一个单一的修正会传播到每个图形示例?

一种策略是向下或向上采样您的
数据帧
,以便每个区域具有相同数量的观察值。我们可以使用
caret
软件包中的方便函数
downSample()
upSample()
,根据文档:

“简单随机抽样用于对多数类进行向下抽样。请注意,少数类数据保持不变…”

举例说明:

library(dpyr)
library(caret)
# Before
df %>% group_by(area) %>% summarise(n())
#   area `n()`
#1      A   400
#2      B   100
#3      C   200
#4      D   200
#5      E   100

# After
set.seed(123)
test_down <- downSample(df, df$area)
test_down %>% group_by(area) %>% summarise(n())
#    area `n()`
#1      A   100
#2      B   100
#3      C   100
#4      D   100
#5      E   100

test_up <- upSample(df, df$area)
test_up %>% group_by(area) %>% summarise(n())
#    area `n()`
#1      A   400
#2      B   400
#3      C   400
#4      D   400
#5      E   400


请注意,因为我们使用随机抽样,所以我们无法控制在使用
downSample()
时忽略哪些观察值。因此,如果不使用
set.seed()

谢谢,每次运行的结果可能会略有不同。除了下采样,还有其他选择吗?因为
区域
的分布非常不平衡-一些区域的数据比其他区域多100倍,所以下采样意味着我们将从过度代表的区域中损失很多