¿Cómo calcular la distribución acumulativa en R?

23

Necesito calcular la función de distribución acumulativa de una muestra de datos.

¿Hay algo similar a hist () en R que mida la función de densidad acumulativa?

He intentado ecdf () pero no puedo entender la lógica.

emanuele
fuente

Respuestas:

32

La ecdffunción aplicada a una muestra de datos devuelve una función que representa la función empírica de distribución acumulativa. Por ejemplo:

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

ingrese la descripción de la imagen aquí

Si desea que un objeto que representa el CDF empírico sea evaluado a valores específicos (en lugar de como un objeto de función), puede hacerlo

> 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

Tenga en cuenta que pcontiene como máximo la misma cantidad de información que P(y posiblemente contiene menos) que a su vez contiene la misma cantidad de información que X.

Chris Taylor
fuente
Sí, lo sé, pero ¿cómo es posible acceder a los valores de ecdf? Esto es un misterio para mí.
emanuele
2
Si quieres su valor xsimplemente escribe P(x). Tenga en cuenta que xpuede ser un vector (vea las últimas oraciones de mi respuesta).
Chris Taylor
@ChrisTaylor La terminología correcta es la función empírica de distribución acumulativa, no la función de densidad.
Michael R. Chernick
1

Lo que parece necesitar es obtener la distribución acumulada (probabilidad de obtener un valor <= que x en una muestra), ecdf le devuelve una función, pero parece estar hecha para trazar, y así, el argumento de esa función , si se tratara de una escalera, sería el índice de la banda de rodadura.

Puedes usar esto:

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.

Lamentablemente, el uso de esta función no es muy rápido. No sé si R tiene una función que hace que esto te devuelva una función, eso sería más eficiente.

Casas
fuente
3
Parece mezclar el ECDF con su inverso. Rcalcula, de hecho, el ECDF: su argumento es un valor potencial de la variable aleatoria y devuelve valores en el intervalo[0 0,1]. Esto se verifica fácilmente. Por ejemplo, ecdf(c(-1,0,3,9))(8)vuelve 0.75. Un inverso generalizado del ECDF es la función cuantil, implementada por quantilein R.
whuber
1

Siempre me pareció ecdf()un poco confuso. Además, creo que solo funciona en el caso univariante. Terminé rodando mi propia función para esto en su lugar.

Primero instale data.table . Luego instale mi paquete, mltools (o simplemente copie el método empirical_cdf () en su entorno R).

Entonces es tan fácil como

# 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 de un vector

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 columna '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 de las columnas 'x' e '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
fuente
1

amigo, puedes leer el código en este 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

Se pueden encontrar más detalles en el siguiente enlace:

r cdf e histograma

CrossWorld2
fuente