31 votos

Cómo encontrar/estimar la función de densidad de probabilidad a partir de la función de densidad en R

Supongamos que tengo una variable como X con distribución desconocida. En Mathematica, utilizando SmoothKernelDensity Esta función de densidad estimada puede utilizarse junto con la función de densidad estimada. PDF para calcular la función de densidad de probabilidad de un valor como X en forma de PDF[density,X] asumiendo que la "densidad" es el resultado de SmoothKernelDensity . Sería bueno que existiera esta función en R. Así es como funciona en Mathematica

http://reference.wolfram.com/mathematica/ref/SmoothKernelDistribution.html

Como ejemplo (basado en funciones de Mathematica):

data = RandomVariate[NormalDistribution[], 100]; #generates 100 values from N(0,1)

density= SmoothKernelDistribution[data]; #estimated density

PDF[density, 2.345] returns 0.0588784 

Aquí encontrará más información sobre PDF:

http://reference.wolfram.com/mathematica/ref/PDF.html

Sé que puedo trazar su función de densidad utilizando density(X) en R y utilizando ecdf(X) Puedo obtener su función de distribución acumulativa empírica. ¿Es posible hacer lo mismo en R basándome en lo que he descrito sobre Mathematica?

Se agradece cualquier ayuda e idea.

46voto

AdamSane Puntos 1825

?density señala que utiliza approx para hacer ya la interpolación lineal; ?approx señala que approxfun genera una función adecuada:

x <- log(rgamma(150,5))
df <- approxfun(density(x))
plot(density(x))
xnew <- c(0.45,1.84,2.3)
points(xnew,df(xnew),col=2)

enter image description here

Mediante el uso de integrate partiendo de una distancia adecuada por debajo del mínimo de la muestra (un múltiplo -digamos 4 ó 5, quizás- del ancho de banda utilizado en df para una distancia adecuada), se puede obtener una buena aproximación de la fdc correspondiente a df .

1voto

Bryan Shalloway Puntos 405

spatstat.core::CDF() puede utilizarse para crear una función de densidad acumulativa a partir de una salida dada de density() .

set.seed(123)
x <- rnorm(10000000)

x_density <- density(x, n = 10000)

x_cdf <- spatstat.core::CDF(x_density)

sds <- c(-2, -1, 0, 1, 2)
names(sds) <- sds

# check cdf at different values
setNames(
  x_cdf(sds), 
  sds)
#>         -2         -1          0          1          2 
#> 0.02285086 0.15889356 0.50009332 0.84134448 0.97717762

# compare against theoretical
pnorm(sds)
#>         -2         -1          0          1          2 
#> 0.02275013 0.15865525 0.50000000 0.84134475 0.97724987

Creado el 2021-11-22 por el paquete reprex (v2.0.0)

Actualización

Una versión anterior de esta respuesta copiaba código de la versión obsoleta de spatstat:::CDF() que se dividió (en ?2020?) en varios paquetes más. Si alguien conoce un paquete más ligero en el que exista actualmente esta función CDF, ¡le encantaría saberlo en los comentarios!

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