Standart, güçlü, iyi anlaşılmış, teorik olarak sağlam ve sıkça uygulanan “düzgünlük” ölçüsü Ripley K fonksiyonu ve yakın akrabası L fonksiyonudur. Bunlar tipik olarak iki boyutlu uzamsal nokta yapılandırmalarını değerlendirmek için kullanılsa da, bunları bir boyuta (genellikle referanslarda verilmez) uyarlamak için gereken analiz basittir.
teori
K fonksiyonu tipik bir noktanın mesafesi içindeki ortalama nokta oranını tahmin eder . aralığında eşit dağılım için, gerçek oran hesaplanabilir ve (örnek boyutunda asimptotik olarak) eşittir . L fonksiyonunun uygun tek boyutlu versiyonu, homojenlikten sapmaları göstermek için bu değeri K'dan çıkarır . Bu nedenle, herhangi bir veri grubunu birim aralığına sahip hale getirmeyi ve L işlevini sıfır civarında sapmalar açısından incelemeyi düşünebiliriz.[ 0 , 1 ] 1 - ( 1 - d ) 2d[0,1]1−(1−d)2
Çalışılan Örnekler
Örnek olarak , bir simüle edilmiş olan boyutundan bağımsız örnekleri düzgün bir dağılım ve (dan daha kısa mesafeler için kendi (normalize edilmiş) L fonksiyonları çizilen için , böylece L fonksiyonunun örnek dağılımını tahmin etmek için bir zarf oluşturma). (Bu zarfın içindeki iyi işaretlenmiş noktalar homojenlikten önemli ölçüde ayırt edilemez.) Bunun üzerinde U şekilli bir dağılımdan, aynı boyutta dört bileşenden oluşan bir karışım dağılımından ve standart bir Normal dağılımdan aynı boyuttaki numuneler için L fonksiyonlarını çizdim. Bu örneklerin histogramları (ve bunların ana dağılımları), L fonksiyonlarınınkilerle eşleşmesi için çizgi sembolleri kullanılarak referans olarak gösterilmiştir.64 0 1 / 39996401/3
U şeklindeki dağılımın keskin ayrılan sivri uçları (kesikli kırmızı çizgi, en soldaki histogram) yakın aralıklı değer kümeleri oluşturur. Bu, fonksiyonundaki L fonksiyonundaki çok büyük bir eğimle yansıtılır . Daha sonra L fonksiyonu azalır, sonunda ara mesafelerdeki boşlukları yansıtmak için negatif olur.0
Normal dağılımdan gelen örnek (koyu mavi çizgi, en sağdaki histogram) eşit olarak dağıtılmışa oldukça yakındır. Buna göre, L işlevi hızla ayrılmaz. Bununla birlikte, ya da daha fazla mesafelerle, hafif bir kümelenme eğilimi sinyalini vermek için zarfın üzerinde yeterince yükselmiştir. Ara mesafeler boyunca devam eden yükseliş, kümelenmenin yaygın ve yaygın olduğunu göstermektedir (bazı izole piklerle sınırlı değildir).0.1000.10
Karışım dağılımından (orta histogram) numune için ilk büyük eğim , küçük mesafelerde ( az) kümelemeyi ortaya çıkarır . Negatif seviyelere düşerek, ara mesafelerde ayrılma sinyalleri verir. U-şeklindeki dağıtımın L işlevi için bu karşılaştırma açıklayıcıdır: en yamaçlar , bu eğriler üzerine çıkması hangi miktarlarda , ve oranlar hangi en sonunda geri iner her kümelenme mevcut doğası ile ilgili olarak bilgi sağlamak veri. Bu özelliklerden herhangi biri, belirli bir uygulamaya uyacak şekilde "eşitliğin" tek bir ölçüsü olarak seçilebilir.0 0 00.15000
Bu örnekler, verilerin tekdüzelikten ("düzgünlük") ayrılmasını değerlendirmek için bir L-fonksiyonunun nasıl incelenebileceğini ve kalkışların ölçeği ve niteliği hakkında nicel bilgilerin nasıl çıkarılabileceğini göstermektedir.
( Tekdüzelikten büyük ölçekli ayrılmaları değerlendirmek için tam normalleştirilmiş mesafeye kadar uzanan tüm L fonksiyonunu çizebilir.1
Yazılım
R
Bu rakamı oluşturmak için kod aşağıdaki gibidir. K ve L'yi hesaplamak için fonksiyonlar tanımlayarak başlar. Bir karışım dağılımından simüle etme yeteneği yaratır. Sonra simüle edilmiş verileri üretir ve grafikleri yapar.
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")