23 votos

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

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

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

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

32voto

Adrian Puntos 440

El ecdf aplicada a una muestra de datos devuelve un función que representa la función de distribución acumulativa empírica. 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)

enter image description here

Si desea tener un objeto que represente la FCD empírica evaluada en valores específicos (en lugar de un objeto función), puede hacer

> 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 p contiene como máximo la misma cantidad de información que P (y posiblemente contenga menos) que a su vez contiene la misma cantidad de información que X .

0 votos

Sí, lo sé, pero ¿cómo es posible acceder a los valores de ecdf? esto es un misterio para mí.

2 votos

Si quieres su valor en x simplemente escribe P(x) . Tenga en cuenta que x puede ser un vector (ver las últimas frases de mi respuesta.)

0 votos

@ChrisTaylor La terminología correcta es función de distribución acumulativa empírica no función de densidad.

1voto

Casas Puntos 1

Lo que parece que necesitas es esto para obtener la distribución acumulada (probabilidad de obtener un valor <= que x en una muestra), ecdf te devuelve una función, pero parece estar hecha para graficar, y por tanto, el argumento de esa función, si fuera una escalera, sería el índice de la pisada.

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 haga esto devolviéndote una función, eso sería más eficiente.

3 votos

Parece que confundes la ECDF con su inversa. R sí calcula la ECDF: su argumento es un valor potencial de la variable aleatoria y devuelve valores en el intervalo $[0,1]$ . Esto se puede comprobar fácilmente. Por ejemplo, ecdf(c(-1,0,3,9))(8) devuelve 0.75 . Una inversa generalizada de la ECDF es la función cuantil, implementada por quantile en R .

1voto

Pablojim Puntos 4367

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

más detalles en el siguiente enlace:

r cdf e histograma

1voto

Ben Puntos 251

Siempre he encontrado ecdf() para ser un poco confuso. Además, creo que sólo funciona en el caso univariado. Terminé rodando mi propia función para esto en su lugar.

Primera instalación tabla de datos . Luego instala mi paquete, mltools (o simplemente copiar el 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

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X