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

Более простой способ построения кумулятивного распределения частот в ggplot?

Я ищу более простой способ нарисовать кумулятивную линию распределения в ggplot.

У меня есть некоторые данные, гистограмма которых я могу сразу отобразить с помощью

qplot (mydata, binwidth=1);

Я нашел способ сделать это на http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph, но он включает в себя несколько шагов и при исследовании данных он занимает много времени.

Есть ли способ сделать это более простым способом в ggplot, подобно тому, как строки тренда и доверительные интервалы могут быть добавлены путем указания параметров?

4b9b3361

Ответ 1

В R есть встроенная функция ecdf(), которая должна упростить задачу. Здесь некоторый пример кода, используя plyr

library(plyr)
data(iris)

## Ecdf over all species
iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length), 
                            ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)))

ggplot(iris.all, aes(Sepal.Length, ecdf)) + geom_step()

#Ecdf within species
iris.species <- ddply(iris, .(Species), summarize,
                            Sepal.Length = unique(Sepal.Length),
                            ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)))

ggplot(iris.species, aes(Sepal.Length, ecdf, color = Species)) + geom_step()

Изменить Я только понял, что вам нужна кумулятивная частота. Вы можете получить это, умножив значение ecdf на общее количество наблюдений:

iris.all <- summarize(iris, Sepal.Length = unique(Sepal.Length), 
                            ecdf = ecdf(Sepal.Length)(unique(Sepal.Length)) * length(Sepal.Length))

iris.species <- ddply(iris, .(Species), summarize,
                            Sepal.Length = unique(Sepal.Length),
                            ecdf = ecdf(Sepal.Length)(unique(Sepal.Length))*length(Sepal.Length))

Ответ 2

В новой версии ggplot2 (0.9.2.1) есть встроенная функция stat_ecdf(), которая позволяет легко строить кумулятивные распределения.

qplot(rnorm(1000), stat = "ecdf", geom = "step")

или

df <- data.frame(x = c(rnorm(100, 0, 3), rnorm(100, 0, 10)),
             g = gl(2, 100))
ggplot(df, aes(x, colour = g)) + stat_ecdf()

Примеры кода из документации ggplot2.

Ответ 3

Еще проще:

qplot(unique(mydata), ecdf(mydata)(unique(mydata))*length(mydata), geom='step')