plot(density(rexp(100))
Obviamente, toda la densidad a la izquierda de cero representa sesgo.
Estoy buscando resumir algunos datos para los no estadísticos, y quiero evitar preguntas sobre por qué los datos no negativos tienen densidad a la izquierda de cero. Las parcelas son para verificación de aleatorización; Quiero mostrar las distribuciones de variables por grupos de tratamiento y control. Las distribuciones son a menudo exponenciales. Los histogramas son complicados por varias razones.
Una búsqueda rápida en Google me da trabajo de estadísticos sobre núcleos no negativos, por ejemplo: esto .
Pero, ¿se ha implementado algo en R? De los métodos implementados, ¿alguno de ellos es "el mejor" de alguna manera para las estadísticas descriptivas?
EDITAR: incluso si el from
comando puede resolver mi problema actual, sería bueno saber si alguien ha implementado núcleos basados en literatura sobre estimación de densidad no negativa
fuente
plot(density(rexp(100), from=0))
?Respuestas:
Una solución, tomada de los enfoques para ponderar los bordes de las estadísticas espaciales, es truncar la densidad a la izquierda en cero, pero aumentar los datos que están más cerca de cero. La idea es que cada valor se "distribuya" en un núcleo de unidad de área total centrada en x ; cualquier parte del núcleo que se derrame en territorio negativo se elimina y el núcleo se renormaliza al área de la unidad.X X
Por ejemplo, con un núcleo gaussiano , el peso de renormalización esKh( y, x ) = exp( - 12( ( y- x ) / h )2) / 2 π--√
donde es la función de distribución acumulativa de una variable Normal de media x y desviación estándar h . Las fórmulas comparables están disponibles para otros núcleos.Φ X h
Esto es más simple, y mucho más rápido en cómputo, que tratar de reducir los anchos de banda cerca de . De todos modos, es difícil prescribir exactamente cómo se deben cambiar los anchos de banda cerca de 0 . Sin embargo, este método también es ad hoc : todavía habrá algún sesgo cerca de 0 . Parece funcionar mejor que la estimación de densidad predeterminada. Aquí hay una comparación usando un conjunto de datos grande:0 0 0 0 0 0
El azul muestra la densidad predeterminada, mientras que el rojo muestra la densidad ajustada para el borde en . La verdadera distribución subyacente se traza como una línea punteada como referencia.0 0
Código R
La
density
función enR
se quejará de que la suma de los pesos no es la unidad, porque quiere que la integral sobre todos los números reales sea la unidad, mientras que este enfoque hace que la integral sobre los números positivos sea igual a la unidad. Como verificación, la última integral se estima como una suma de Riemann.fuente
Una alternativa es el enfoque de Kooperberg y colegas, basado en la estimación de la densidad utilizando splines para aproximar la densidad logarítmica de los datos. Mostraré un ejemplo utilizando los datos de la respuesta de @ whuber, lo que permitirá una comparación de enfoques.
Necesitará el paquete logspline instalado para esto; instálelo si no es:
Cargue el paquete y calcule la densidad usando la
logspline()
función:A continuación, supongo que el objeto
d
de la respuesta de @ whuber está presente en el espacio de trabajo.La gráfica resultante se muestra a continuación, con la densidad de la línea de registro mostrada por la línea roja.
Además, el soporte para la densidad se puede especificar mediante argumentos
lbound
yubound
. Si deseamos suponer que la densidad es 0 a la izquierda de 0 y hay una discontinuidad en 0, podríamos usarlbound = 0
en la llamada alogspline()
, por ejemploObteniendo la siguiente estimación de densidad (que se muestra aquí con el
m
ajuste de la línea de registro original ya que la figura anterior ya estaba ocupada).La trama resultante se muestra a continuación
x
x
fuente
logspline
? Para mí, la densidad de ambos, la limitada y la versión ilimitada ir a cero alx = 0
.Para comparar distribuciones por grupos (lo que usted dice es el objetivo en uno de sus comentarios) ¿por qué no algo más simple? Las gráficas de caja paralela funcionan bien si N es grande; los gráficos de franjas paralelas funcionan si N es pequeño (y ambos muestran valores atípicos bien, lo que usted dice que es un problema en sus datos).
fuente
Como comenta Stéphane, puede usar
from = 0
y, además, puede representar sus valores bajo la curva de densidad conrug (x)
fuente
from=0
parece que solo suprime el trazado de valores inferiores a 0; no corrige el cálculo por el hecho de que parte de la distribución se ha manchado por debajo de 0.from
comando produce un gráfico que parece tener el pico justo a la derecha de cero. Pero si observa los histogramas con bins continuamente más pequeños, muchos datos mostrarán el pico AT cero. Elfrom
es solo un truco gráfico.from=0
suprima nada. Simplemente comienza la "cuadrícula" en cero.density(rexp(100), from=0)
no tiene nada que ver con el gráfico