Подтвердить что ты не робот

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)), а не пошаговый.

Спасибо!

4b9b3361

Ответ 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))