Come calcolare la distribuzione cumulativa in R?


23

Devo calcolare la funzione di distribuzione cumulativa di un campione di dati.

C'è qualcosa di simile a hist () in R che misura la funzione di densità cumulativa?

Ho provato ecdf () ma non riesco a capire la logica.

Risposte:


32

La ecdffunzione applicata a un campione di dati restituisce una funzione che rappresenta la funzione di distribuzione cumulativa empirica. Per esempio:

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

inserisci qui la descrizione dell'immagine

Se vuoi avere un oggetto che rappresenta il CDF empirico valutato su valori specifici (piuttosto che come un oggetto funzione), puoi farlo

> 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

Nota che pcontiene al massimo la stessa quantità di informazioni di P(e possibilmente contiene meno) che a sua volta contiene la stessa quantità di informazioni di X.


Sì, lo so, ma come è possibile accedere ai valori di ecdf? questo è un mistero per me
emanuele,

2
Se vuoi il suo valore, xscrivi semplicemente P(x). Nota che xpuò essere un vettore (vedi le ultime due frasi della mia risposta.)
Chris Taylor,

@ChrisTaylor La terminologia corretta è la funzione di distribuzione cumulativa empirica e non la funzione di densità.
Michael R. Chernick,

1

Ciò di cui hai bisogno è questo per ottenere la distribuzione accumulata (probabilità di ottenere un valore <= rispetto a x su un campione), ecdf ti restituisce una funzione, ma sembra essere fatta per la stampa, e quindi, l'argomento di quella funzione , se fosse una scala, sarebbe l'indice del battistrada.

Puoi usare questo:

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.

Purtroppo l'uso di questa funzione non è molto veloce. Non so se R ha una funzione che fa questo restituendoti una funzione, sarebbe più efficiente.


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

1

Ho sempre trovato ecdf()un po 'confuso. Inoltre, penso che funzioni solo nel caso univariato. Finì invece con questa funzione.

Prima installa data.table . Quindi installa il mio pacchetto, mltools (o semplicemente copia il metodo empirical_cdf () nel tuo ambiente R.)

Quindi è facile come

# 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 di un vettore

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 della colonna 'x' di 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 delle colonne 'x' e 'y' di 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

1

amico, puoi leggere il codice su questo 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

maggiori dettagli sono disponibili sul seguente link:

r cdf e istogramma

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.