我想使用ggplot
绘制加权CDF。一些旧的非SO讨论(例如2012年的this)表明这是不可能的,但我认为我会重新加入。
例如,请考虑以下数据:
df <- data.frame(x=sort(runif(100)), w=1:100)
我可以用
显示未加权的CDFggplot(df, aes(x)) + stat_ecdf()
我如何通过w
加权?对于这个例子,我期望一个x^2
- 看起来的函数,因为较大的数字具有较高的权重。
答案 0 :(得分:8)
您可以计算数据框内的累积分布,即:
df <- df[order(df$x), ] # Won't change anything since it was created sorted
df$cum.pct <- with(df, cumsum(x * w) / sum(x * w))
ggplot(df, aes(x, cum.pct)) + geom_line()
答案 1 :(得分:1)
您的答案有误。
这是计算加权ECDF的正确代码:
df <- df[order(df$x), ] # Won't change anything since it was created sorted
df$cum.pct <- with(df, cumsum(w) / sum(w))
ggplot(df, aes(x, cum.pct)) + geom_line()
ECDF是函数F(a)
,等于x<a
除以权重总和后的观察值的权重(概率)之和。
但是这里有一个更令人满意的选项,它只是修改了ggplot2 stat_ecdf的原始代码: https://github.com/NicolasWoloszko/stat_ecdf_weighted