2015-09-09 4 views
3

Я хотел бы построить взвешенный CDF, используя ggplot. Некоторые старые обсуждения, не связанные с SO (например, this с 2012 года), предполагают, что это невозможно, но я подумал, что сделаю ререйз.R ggplot: Weighted CDF

Для примера рассмотрим эти данные:

df <- data.frame(x=sort(runif(100)), w=1:100) 

я могу показать невзвешенное CDF с

ggplot(df, aes(x)) + stat_ecdf() 

enter image description here

Как бы я вес это, w? В этом примере я ожидал бы функцию наблюдения x^2, поскольку большие номера имеют более высокий вес.

ответ

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() 

enter image description here

+1

Для дальнейшего использования вы можете использовать, например, 'ДФ $ cumpct <-с (ДФ, cumsum (x * w)/sum (x * w)) '. Однако это не влияет на ваш ответ. – jlhoward

+0

Спасибо @jlhoward, отредактирован. Я в основном использую 'data.table', так что забыл о' с' :) –