Comment calculer la distribution cumulée dans R?

23

J'ai besoin de calculer la fonction de distribution cumulative d'un échantillon de données.

Y a-t-il quelque chose de similaire à hist () dans R qui mesure la fonction de densité cumulative?

J'ai essayé ecdf () mais je ne comprends pas la logique.

emanuele
la source

Réponses:

32

La ecdffonction appliquée à un échantillon de données renvoie une fonction représentant la fonction de distribution cumulative empirique. Par exemple:

> X = rnorm(100) # X is a sample of 100 normally distributed random variables
> P = ecdf(X)    # P is a function giving the empirical CDF of X
> P(0.0)         # This returns the empirical CDF at zero (should be close to 0.5)
[1] 0.52
> plot(P)        # Draws a plot of the empirical CDF (see below)

entrez la description de l'image ici

Si vous voulez avoir un objet représentant le CDF empirique évalué à des valeurs spécifiques (plutôt qu'en tant qu'objet fonction), vous pouvez le faire

> z = seq(-3, 3, by=0.01) # The values at which we want to evaluate the empirical CDF
> p = P(z)                # p now stores the empirical CDF evaluated at the values in z

Notez que pcontient au plus la même quantité d'informations que P(et peut-être qu'il en contient moins) qui à son tour contient la même quantité d'informations que X.

Chris Taylor
la source
Oui je sais, mais comment accéder aux valeurs d'ecdf? c'est un mystère pour moi.
emanuele
2
Si vous voulez sa valeur, xécrivez simplement P(x). Notez que cela xpeut être un vecteur (voir les dernières phrases de ma réponse.)
Chris Taylor
@ChrisTaylor La terminologie correcte est fonction de distribution cumulative empirique et non fonction de densité.
Michael R. Chernick
1

Ce dont vous semblez avoir besoin, c'est d'obtenir la distribution cumulée (probabilité d'obtenir une valeur <= que x sur un échantillon), ecdf vous renvoie une fonction, mais elle semble être faite pour le traçage, et donc, l'argument de cette fonction , s'il s'agissait d'un escalier, serait l'indice de la marche.

Vous pouvez utiliser ceci:

acumulated.distrib= function(sample,x){
    minors= 0
    for(n in sample){
        if(n<=x){
            minors= minors+1
        }
    }
    return (minors/length(sample))
}

mysample = rnorm(100)
acumulated.distrib(mysample,1.21) #1.21 or any other value you want.

Malheureusement, l'utilisation de cette fonction n'est pas très rapide. Je ne sais pas si R a une fonction qui fait cela, vous renvoyant une fonction, ce serait plus efficace.

Casas
la source
3
R[0,1]ecdf(c(-1,0,3,9))(8)0.75quantileR
1

J'ai toujours trouvé ecdf()un peu déroutant. De plus, je pense que cela ne fonctionne que dans le cas univarié. A fini par rouler ma propre fonction pour cela à la place.

Installez d'abord data.table . Installez ensuite mon package, mltools (ou copiez simplement la méthode empirical_cdf () dans votre environnement R.)

C'est aussi simple que

# load packages
library(data.table)
library(mltools)

# Make some data
dt <- data.table(x=c(0.3, 1.3, 1.4, 3.6), y=c(1.2, 1.2, 3.8, 3.9))
dt
     x   y
1: 0.3 1.2
2: 1.3 1.2
3: 1.4 3.8
4: 3.6 3.9

CDF d'un vecteur

empirical_cdf(dt$x, ubounds=seq(1, 4, by=1.0))
   UpperBound N.cum  CDF
1:          1     1 0.25
2:          2     3 0.75
3:          3     3 0.75
4:          4     4 1.00

CDF de la colonne 'x' de dt

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0)))
   x N.cum  CDF
1: 1     1 0.25
2: 2     3 0.75
3: 3     3 0.75
4: 4     4 1.00

CDF des colonnes 'x' et 'y' de dt

empirical_cdf(dt, ubounds=list(x=seq(1, 4, by=1.0), y=seq(1, 4, by=1.0)))
    x y N.cum  CDF
 1: 1 1     0 0.00
 2: 1 2     1 0.25
 3: 1 3     1 0.25
 4: 1 4     1 0.25
 5: 2 1     0 0.00
 6: 2 2     2 0.50
 7: 2 3     2 0.50
 8: 2 4     3 0.75
 9: 3 1     0 0.00
10: 3 2     2 0.50
11: 3 3     2 0.50
12: 3 4     3 0.75
13: 4 1     0 0.00
14: 4 2     2 0.50
15: 4 3     2 0.50
16: 4 4     4 1.00
Ben
la source
1

ami, vous pouvez lire le code sur ce blog.

sample.data = read.table ('data.txt', header = TRUE, sep = "\t")
cdf <- ggplot (data=sample.data, aes(x=Delay, group =Type, color = Type)) + stat_ecdf()
cdf

plus de détails peuvent être trouvés sur le lien suivant:

r cdf et histogramme

CrossWorld2
la source