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.
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.
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)
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
.
Sí, lo sé, pero ¿cómo es posible acceder a los valores de ecdf? esto es un misterio para mí.
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.)
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.
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
.
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
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
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
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 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.