Un estándar, potente, bien entendido que, en teoría bien establecida, y frecuentemente implementadas medida de la "uniformidad" es la K de Ripley función y su pariente cercano, el L de la función. Aunque estos suelen ser utilizados para evaluar dos dimensiones espaciales de la configuración de los puntos, el análisis necesario para adaptarlos a una dimensión (que generalmente no se da en las referencias) es simple.
La teoría de la
El K de la función de las estimaciones de la media de la proporción de puntos dentro de una distancia $d$ de un típico punto. Para una distribución uniforme en el intervalo de $[0,1]$, la proporción verdadera puede ser calculado y (asintóticamente en el tamaño de la muestra) es igual a $1 - (1-d)^2$. La adecuada dimensiones de la versión de la L función resta este valor de K para mostrar las desviaciones de la homogeneidad. Por lo tanto, podríamos considerar la normalización de cualquier lote de datos para tener una gama de unidades y el examen de su L función de las desviaciones alrededor de cero.
Trabajó Ejemplos
Para ilustrar, he simulado $999$ muestras independientes de tamaño $64$ a partir de una distribución uniforme y planearon su (normalizado) L funciones para distancias cortas (de$0$$1/3$), creando un sobre para la estimación de la distribución de muestreo de la L función. (Puntos graficados bien dentro de esta dotación puede ser significativamente distinguidos de la uniformidad.) En esto han conspirado de la L funciones para las muestras del mismo tamaño de una U-forma de la distribución, una mezcla de distribución con cuatro obvio componentes, y una distribución Normal estándar. Los histogramas de estas muestras (y de sus padres distribuciones) se muestran a modo de referencia, el uso de símbolos de línea para que coincida con los de la L funciones.
La fuerte separados los picos de la forma de U de distribución (líneas discontinuas de la línea roja, a la izquierda del histograma) crear grupos de estrechamente espaciados valores. Esto se refleja por una pendiente muy grande en la L de la función en $0$. La L función luego disminuye, llegando a ser negativo para reflejar las brechas en distancias intermedias.
La muestra de la distribución normal (línea azul sólida, de más a la derecha del histograma) está bastante cerca distribuidos de manera uniforme. En consecuencia, L función no salen de $0$ rápidamente. Sin embargo, por las distancias de $0.10$ o así, ha aumentado suficientemente por encima de la envolvente de la señal de una ligera tendencia a agruparse. La subida continua a través de distancias intermedias indica el agrupamiento difuso y generalizado (no se limita a algunos picos aislados).
La inicial de gran pendiente para la muestra de la mezcla de la distribución (media histograma) revela la agrupación en pequeñas distancias (menos de $0.15$). Cayendo a niveles negativos, las señales de separación en distancias intermedias. Comparando esto con la forma de U de la distribución de L función es revelador: las pistas de $0$, los importes por los que estas curvas de elevarse por encima de $0$, y las tasas a las que finalmente descender de nuevo a $0$ dar información sobre la naturaleza de la agrupación presentes en los datos. Cualquiera de estas características podría ser elegida como una única medida de "nivelación" para adaptarse a una aplicación en particular.
Estos ejemplos muestran cómo un L-función puede ser examinado para evaluar las salidas de los datos de la uniformidad ("uniformidad") y cómo cuantitativo de la información acerca de la escala y la naturaleza de las salidas puede ser extraída.
(Uno puede, de hecho, la trama de toda la L función, que se extiende a la totalidad normalizado distancia de $1$, para evaluar a gran escala de las desviaciones de la homogeneidad. Normalmente, sin embargo, evaluar el comportamiento de los datos en distancias menores es de la mayor importancia.)
Software
R
código para generar esta figura de la siguiente manera. Se empieza por definir funciones para calcular K y L. Se crea una capacidad para simular a partir de una mezcla de distribución. A continuación, genera los datos simulados y hace que las parcelas.
Ripley.K <- function(x, scale) {
# Arguments:
# x is an array of data.
# scale (not actually used) is an option to rescale the data.
#
# Return value:
# A function that calculates Ripley's K for any value between 0 and 1 (or `scale`).
#
x.pairs <- outer(x, x, function(a,b) abs(a-b)) # All pairwise distances
x.pairs <- x.pairs[lower.tri(x.pairs)] # Distances between distinct pairs
if(missing(scale)) scale <- diff(range(x.pairs))# Rescale distances to [0,1]
x.pairs <- x.pairs / scale
#
# The built-in `ecdf` function returns the proportion of values in `x.pairs` that
# are less than or equal to its argument.
#
return (ecdf(x.pairs))
}
#
# The one-dimensional L function.
# It merely subtracts 1 - (1-y)^2 from `Ripley.K(x)(y)`.
# Its argument `x` is an array of data values.
#
Ripley.L <- function(x) {function(y) Ripley.K(x)(y) - 1 + (1-y)^2}
#-------------------------------------------------------------------------------#
set.seed(17)
#
# Create mixtures of random variables.
#
rmixture <- function(n, p=1, f=list(runif), factor=10) {
q <- ceiling(factor * abs(p) * n / sum(abs(p)))
x <- as.vector(unlist(mapply(function(y,f) f(y), q, f)))
sample(x, n)
}
dmixture <- function(x, p=1, f=list(dunif)) {
z <- matrix(unlist(sapply(f, function(g) g(x))), ncol=length(f))
z %*% (abs(p) / sum(abs(p)))
}
p <- rep(1, 4)
fg <- lapply(p, function(q) {
v <- runif(1,0,30)
list(function(n) rnorm(n,v), function(x) dnorm(x,v), v)
})
f <- lapply(fg, function(u) u[[1]]) # For random sampling
g <- lapply(fg, function(u) u[[2]]) # The distribution functions
v <- sapply(fg, function(u) u[[3]]) # The parameters (for reference)
#-------------------------------------------------------------------------------#
#
# Study the L function.
#
n <- 64 # Sample size
alpha <- beta <- 0.2 # Beta distribution parameters
layout(matrix(c(rep(1,3), 3, 4, 2), 2, 3, byrow=TRUE), heights=c(0.6, 0.4))
#
# Display the L functions over an envelope for the uniform distribution.
#
plot(c(0,1/3), c(-1/8,1/6), type="n",
xlab="Normalized Distance", ylab="Total Proportion",
main="Ripley L Functions")
invisible(replicate(999, {
plot(Ripley.L(x.unif <- runif(n)), col="#00000010", add=TRUE)
}))
abline(h=0, lwd=2, col="White")
#
# Each of these lines generates a random set of `n` data according to a specified
# distribution, calls `Ripley.L`, and plots its values.
#
plot(Ripley.L(x.norm <- rnorm(n)), col="Blue", lwd=2, add=TRUE)
plot(Ripley.L(x.beta <- rbeta(n, alpha, beta)), col="Red", lwd=2, lty=2, add=TRUE)
plot(Ripley.L(x.mixture <- rmixture(n, p, f)), col="Green", lwd=2, lty=3, add=TRUE)
#
# Display the histograms.
#
n.breaks <- 24
h <- hist(x.norm, main="Normal Sample", breaks=n.breaks, xlab="Value")
curve(dnorm(x)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, col="Blue")
h <- hist(x.beta, main=paste0("Beta(", alpha, ",", beta, ") Sample"),
breaks=n.breaks, xlab="Value")
curve(dbeta(x, alpha, beta)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, lty=2, col="Red")
h <- hist(x.mixture, main="Mixture Sample", breaks=n.breaks, xlab="Value")
curve(dmixture(x, p, g)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, lty=3, col="Green")