【发布时间】:2013-04-06 13:15:21
【问题描述】:
我喜欢加权案例以在 ggplot 中绘制图表。我对每种情况都有一个特定的权重因子,例如:
value weight
2 0.34
5 0.75
6 2.31
等等...绘制简单的分组条(“交叉表”)很容易,我可以使用 xtabs 函数:
ftab <- round(xtabs(weightBy ~ varCount + varGroup),0)
当我想用加权案例绘制直方图、简单条形图或单箱图时,我想保持分布,所以我使用以下函数来加权案例:
weightby <- function(var, weight) {
items <- unique(var)
newvar <- c()
for (i in 1:length(items)) {
newcount = round(sum(weight[which(var==items[i])]))
newvar <- c(newvar, rep(items[i], newcount))
}
return (newvar)
}
if (!is.null(weightBy)) {
variable <- weightby(variable, weightBy)
}
然而,这个函数忽略了原来的案例顺序,“案例”现在是升序编号的 根据相关类别。但是...如果我想绘制分组箱线图,我需要 a) 具有加权计数的加权变量 b) 具有加权组的加权变量 c) 每组内的加权均值、中位数和分位数
我该怎么做?我有正确的加权交叉表,但没有每个子组的加权平均值,因为我不能使用上面显示的函数来创建表格(因为丢失了正确的大小写顺序)。
非常感谢任何提示!
【问题讨论】:
-
也许我应该举一个直观的例子。假设我想要按性别分组的变量“年龄”的箱线图:!Click here for box plots example image。现在,如果我用 xtabs(体重〜年龄+性别)对“年龄”和“性别”进行加权,我有正确的权重,但我需要知道每组的新平均值和中值(女性和男性的平均年龄) - 不知道该怎么做。
-
你为什么不直接使用重量美学?
-
好的,aes(weight=...) 有助于分组箱线图和小提琴图,非常感谢!我想念的最后一件事是计算加权组的平均值。我使用 ggplot(mydat, aes(x=group, y=frq, fill=group, weight=wb)) + geom_boxplot() + stat_summary(fun.y="mean" 对未加权数据(wb 设置为 1)执行此操作, geom="点", 形状=21)。当我使用加权数据(wb 设置为某个权重因子)时,箱线图分位数和中位数明显变化,但均值不变。
-
P.S.:对于非分组框或小提琴图,获取平均值没有问题,因为我手动计算了没有 stat_summary 函数的加权平均值。