ECDF на том же участке, используя ggplot2
У меня есть кадр данных, который после применения функции расплава выглядит так:
var val
1 a 0.6133426
2 a 0.9736237
3 b 0.6201497
4 b 0.3482745
5 c 0.3693730
6 c 0.3564962
..................
В исходном фрейме данных было 3 столбца с именами столбцов, a, b, c и их ассоциированными значениями.
Мне нужно построить график на том же графике, используя ggplot, связанный с ecdf для каждого из этих столбцов (ecdf (a), ecdf (b), ecdf (c)), но я не могу этого сделать. Я пробовал:
p<-ggplot(melt_exp,aes(melt_exp$val,ecdf,colour=melt_exp$var))
pg<-p+geom_step()
Но я получаю сообщение об ошибке: аргументы подразумевают различное количество строк: 34415, 0.
Есть ли у кого-нибудь идея о том, как это можно сделать? График должен выглядеть так же, как тот, который возвращался по графику (ecdf (x)), а не пошаговый.
Спасибо!
Ответы
Ответ 1
Моя первая мысль заключалась в том, чтобы попытаться использовать stat_function
, но поскольку ecdf
возвращает функцию, я не мог быстро это сделать. Вместо этого здесь решение требует, чтобы вы сначала приложили вычисляемые значения к кадру данных (используя данные примера Ramnath):
library(plyr) # function ddply()
mydf_m <- ddply(mydf_m, .(variable), transform, ecd = ecdf(value)(value))
ggplot(mydf_m,aes(x = value, y = ecd)) +
geom_line(aes(group = variable, colour = variable))
![enter image description here]()
Если вам нужна плавная оценка ECDF, вы также можете использовать geom_smooth
вместе с функцией ns()
из пакета spline
:
library(splines) # function ns()
ggplot(mydf_m, aes(x = value, y = ecd, group = variable, colour = variable)) +
geom_smooth(se = FALSE, formula = y ~ ns(x, 3), method = "lm")
![enter image description here]()
Как отмечено в комментарии выше, начиная с версии 0.9.2.1, ggplot2 имеет конкретную статистику для этой цели: stat_ecdf. Используя это, мы бы просто сделали что-то вроде этого:
ggplot(mydf_m,aes(x = value)) + stat_ecdf(aes(colour = variable))
Ответ 2
Основанный на Ramnath, подход выше, вы получите ecdf из ggplot2, выполнив следующее:
require(ggplot2)
mydf = data.frame(
a = rnorm(100, 0, 1),
b = rnorm(100, 2, 1),
c = rnorm(100, -2, 0.5)
)
mydf_m = melt(mydf)
p0 = ggplot(mydf_m, aes(x = value)) +
stat_ecdf(aes(group = variable, colour = variable))
print(p0)
Ответ 3
Вот один подход
require(ggplot2)
mydf = data.frame(
a = rnorm(100, 0, 1),
b = rnorm(100, 2, 1),
c = rnorm(100, -2, 0.5)
)
mydf_m = melt(mydf)
p0 = ggplot(mydf_m, aes(x = value)) +
geom_density(aes(group = variable, colour = variable)) +
opts(legend.position = c(0.85, 0.85))