4 votos

R Kernel Density Plots - Proporciones extrañas

Al trazar dos estimaciones de desitiy del núcleo en el mismo marco

plot(density(all4[,3],kernel="epanechnikov"),col='red',ylim=c(0,0.4),xlim=c(-50,50))
lines(density(all2[,3],kernel="epanechnikov"),col="blue",ylim=c(0,0.4),xlim=c(-50,50))

el resultado es el siguiente:

enter image description here

lo cual es bastante extraño ya que el área bajo ambas parcelas debería ser la unidad. Los datos relacionados con la curva roja tienen un valor atípico (su máximo es 702,6).

> summary(all4[,3])
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-22.3100  -4.0940  -0.4151  -0.1533   3.4880 702.6000 
> summary(all2[,3])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-23.520  -4.041  -0.367  -0.109   3.533  67.780 

Tras eliminar el valor atípico, las curvas coinciden bastante bien

a4 = sort(all4[,3])
a2 = sort(all2[,3])
a4 = a4[6:999995]
a2 = a2[6:999995]
plot(density(a4,kernel="epanechnikov"),col='red',ylim=c(0,0.2),xlim=c(-50,50),lwd=3)
lines(density(a2,kernel="epanechnikov"),col="blue",ylim=c(0,0.2),xlim=c(-50,50))

> summary(a4)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-21.0200  -4.0940  -0.4151  -0.1541   3.4880  39.6700 
> summary(a2)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-21.9200  -4.0410  -0.3670  -0.1091   3.5330  32.2900 

enter image description here

Estoy confundido, ya que el valor atípico debería ROBAR la masa de probabilidad del cuerpo de la distribución. Pero la curva roja de la primera imagen parece estar inflada. Además, como ambas curvas de densidad están en las mismas escalas, el área bajo ambas curvas debería ser la misma, también en el primer gráfico. ¿Dónde está mi error?

EDIT: Siguiendo las recomendaciones de Momos he integrado sobre las densidades. ¡Efectivamente, el resultado para el raro es mucho más allá de la unidad!

library(sfsmisc)
dd1 = density(all4[,3],kernel="epanechnikov")
dd2 = density(all2[,3],kernel="epanechnikov")
integrate.xy(dd1$x,dd1$y)
[1] 1.490016
integrate.xy(dd2$x,dd2$y)
[1] 0.9977962

4voto

jldugger Puntos 7490

El problema es el error de discretización.

density divide el rango de datos por defecto en n=512 intervalos. El valor atípico hace que los intervalos sean al menos un orden de magnitud mayor que en otras circunstancias. Con cantidades muy grandes de datos (parece que se necesita algo más de 105 para que este problema sea realmente evidente con el valor por defecto de n y este valor atípico de orden de magnitud), el error de discretización acumulado se impone.

La lección general, que no se limita a la estimación de la densidad ni a la R --es que cuando las herramientas de rutina se ven empujadas hacia sus límites, tenemos que entender cómo hacen sus cálculos y debemos recordar prestar atención a todos los parámetros que controlan su precisión.


No he realizado la ingeniería inversa del código fuente para determinar esto definitivamente, pero proporcionaré algunas pruebas empíricas utilizando conjuntos de datos aleatorios.

trial <- function(n, mean=0, sd=5, outlier=700, kernel="epanechnikov", width=512) {
  set.seed(17) # Makes everything reproducible
  x <- c(outlier, rnorm(n, mean, sd))
  #
  # Plot the densities for visual comparison.
  #
  plot(dd1 <- density(x, kernel=kernel, n=width), col="Red", xlim=c(-sd,sd)*5)
  lines(dd2 <- density(x[-1], kernel=kernel, n=width), col="Blue", xlim=c(-sd,sd)*5)
  #
  # Print crude integral estimates (trapezoidal rule) to memorialize the results.
  # 
  print (c(outlier=sum(diff(dd1$x)*(dd1$y[-1] + dd1$y[-length(dd1$y)])/2),
         non.outlier=sum(diff(dd2$x)*(dd2$y[-1] + dd2$y[-length(dd2$y)])/2)))
}
trial(10^6)                       # Looks like the error in the question
trial(10^6, kernel="rectangular") # Has similar results--problem is not the kernel
trial(10^6, width=2^13)           # Both integrals are essentially 1 now
trial(10^3)                       # Agreement is ok
trial(10^3, width=2^6)            # The problem is reproduced
trial(10^3, outlier=10^4)         # The problem is enormous due to the wide range

3voto

RoMa Puntos 401

Lo único que se me ocurre es que el ancho de banda seleccionado con los valores atípicos es muy pequeño y su densidad "roja" es sólo un montón de picos en los puntos de datos. Sin embargo, como sólo se evalúa en n=512 puntos y la función de trazado sólo une los valores de la función, aparece suavizada y con valores más altos en todas partes.

Pruebe esto para ver el efecto

a <- rnorm(5000000)

plot(density(a))

lines(density(a, bw=0.001, kernel="epanechnikov"), col="red")

lines(density(a, bw=0.001, kernel="epanechnikov", n=500000), col="blue")

1voto

Avraham Puntos 1845

Probablemente la línea roja tiene una cola más fina (que se extiende infinitamente en cualquier dirección al igual que la azul) y ahí se capta la zona "perdida", que es difícil de ver en tu gráfico, que se centra en la mediana/modo y es de una escala demasiado gruesa para captar la diferencia de la cola.

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