web-dev-qa-db-fra.com

Un moyen plus simple de tracer la distribution de fréquence cumulative dans ggplot?

Je cherche un moyen plus simple de dessiner la ligne de distribution cumulative dans ggplot.

J'ai des données dont je peux immédiatement afficher l'histogramme avec

qplot (mydata, binwidth=1);

J'ai trouvé un moyen de le faire à http://www.r-tutor.com/elementary-statistics/quantitative-data/cumulative-frequency-graph mais cela implique plusieurs étapes et lors de l'exploration des données, c'est long.

Existe-t-il un moyen de le faire de manière plus simple dans ggplot, de la même manière que les lignes de tendance et les intervalles de confiance peuvent être ajoutés en spécifiant des options?

30
wishihadabettername

Il existe une fonction ecdf() intégrée dans R qui devrait faciliter les choses. Voici un exemple de code, utilisant 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()

Edit Je viens de réaliser que vous voulez une fréquence cumulative. Vous pouvez l'obtenir en multipliant la valeur ecdf par le nombre total d'observations:

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))
24
JoFrhwld

La nouvelle version de ggplot2 (0.9.2.1) a une fonction intégrée stat_ecdf () qui vous permet de tracer des distributions cumulatives très facilement.

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

Ou

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

Exemples de code de la documentation de ggplot2.

55
Chris

Encore plus simple:

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