¿Cómo puedo estimar la densidad de un parámetro inflado a cero en R?

10

Tengo un conjunto de datos con muchos ceros que se ve así:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

Me gustaría dibujar una línea para su densidad, pero la density()función usa una ventana móvil que calcula valores negativos de x.

lines(density(x), col = 'grey')

Hay density(... from, to)argumentos, pero estos parecen solo truncar el cálculo, no alterar la ventana para que la densidad en 0 sea consistente con los datos como se puede ver en la siguiente gráfica:

lines(density(x, from = 0), col = 'black')

(si se cambiara la interpolación, esperaría que la línea negra tuviera una densidad mayor a 0 que la línea gris)

¿Existen alternativas a esta función que proporcionarían un mejor cálculo de la densidad en cero?

ingrese la descripción de la imagen aquí

Abe
fuente

Respuestas:

14

La densidad es infinita en cero porque incluye un pico discreto. Debe estimar el pico utilizando la proporción de ceros y luego estimar la parte positiva de la densidad suponiendo que sea suave. KDE causará problemas en el extremo izquierdo porque pondrá algo de peso en los valores negativos. Un enfoque útil es transformarse en registros, estimar la densidad usando KDE y luego volver a transformar. Ver Wand, Marron & Ruppert (JASA 1991) para una referencia.

La siguiente función R hará la densidad transformada:

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

Entonces lo siguiente le dará la trama que desea:

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

ingrese la descripción de la imagen aquí

Rob Hyndman
fuente
Gracias por su respuesta, pero estoy confundido: usted dice 'estimar el pico usando la proporción de ceros' pero trazarlo sin límites. ¿la espiga tiene una altura discreta o es infinita, si es discreta, es ? P(X=0)
Abe
Esta es una mezcla de una distribución discreta y una distribución continua. Cuando se representa como una densidad, la espiga es infinita (en realidad, una función delta de Dirac). A veces, las personas trazan la parte discreta como una función de masa de probabilidad (de modo que el pico tiene una altura ) y la parte continua como una función de densidad. Eso probablemente hace una mejor visualización, pero involucra dos escalas diferentes. P(X=0)
Rob Hyndman
Esto es útil. FYI: parece que, aunque bw = "SJ" afecta la densidad en el espacio no transformado, la densidad de log es la misma usando "SJ" y el valor predeterminado "nrd0" ... Estoy a punto de leer la referencia de SJ: "Sheather and Jones (1991) Un método confiable de selección de ancho de banda basado en datos para la estimación de la densidad del núcleo ". jstor.org/stable/2345597
Abe
4

Estoy de acuerdo con Rob Hyndman en que debes lidiar con los ceros por separado. Existen algunos métodos para tratar una estimación de la densidad del núcleo de una variable con soporte acotado, que incluye 'reflexión', 'rernormalización' y 'combinación lineal'. Estos no parecen haber sido implementados en la densityfunción de R , pero están disponibles en el kdenspaquete de Benn Jann para Stata .

una parada
fuente
1

Otra opción cuando tiene datos con un límite inferior lógico (como 0, pero podría ser otros valores) que sabe que los datos no irán por debajo y la estimación regular de densidad del núcleo coloca valores por debajo de ese límite (o si tiene un límite superior , o ambos) es usar estimaciones de línea de registro. El paquete logspline para R implementa estos y las funciones tienen argumentos para especificar los límites, por lo que la estimación irá al límite, pero no más allá y todavía escalará a 1.

También hay métodos (la oldlogsplinefunción) que tendrán en cuenta la censura de intervalos, por lo que si esos 0 no son 0 exactos, pero se redondean para que sepa que representan valores entre 0 y algún otro número (un límite de detección, por ejemplo), entonces puede dar esa información a la función de ajuste.

Si los 0 adicionales son 0 verdaderos (no redondeados), la mejor aproximación es estimar la punta o la masa puntual, pero también se puede combinar con la estimación de la línea de registro.

Greg Snow
fuente
0

Puede intentar reducir el ancho de banda (la línea azul es para adjust=0.5), ingrese la descripción de la imagen aquí

pero probablemente KDE simplemente no sea el mejor método para manejar tales datos.


fuente
¿Hay algún otro método que recomendarías?
Abe
@Abe Bueno, esto depende de lo que quieres hacer ...