Ukuran "kemerataan" standar, kuat, dipahami dengan baik, secara teoritis mapan, dan sering diterapkan Ripley K dan kerabat dekatnya, fungsi L. Meskipun ini biasanya digunakan untuk mengevaluasi konfigurasi titik spasial dua dimensi, analisis yang diperlukan untuk menyesuaikannya dengan satu dimensi (yang biasanya tidak diberikan dalam referensi) sederhana.
Teori
Fungsi K memperkirakan proporsi rata-rata titik dalam jarak dari titik tipikal. Untuk distribusi yang seragam pada interval [ 0 , 1 ] , proporsi sebenarnya dapat dihitung dan (asimtotik dalam ukuran sampel) sama dengan 1 - ( 1 - d ) 2 . Versi satu dimensi yang sesuai dari fungsi L mengurangi nilai ini dari K untuk menunjukkan penyimpangan dari keseragaman. Karena itu kami dapat mempertimbangkan untuk menormalkan setiap batch data untuk memiliki rentang unit dan memeriksa fungsi L untuk penyimpangan di sekitar nol.d[0,1]1−(1−d)2
Contoh yang berhasil
Untuk menggambarkan , saya telah disimulasikan sampel independen dari ukuran 64 dari distribusi seragam dan diplot (dinormalisasi) fungsi L mereka untuk jarak pendek (dari 0 ke 1 / 39996401/3 ), sehingga menciptakan sebuah amplop untuk memperkirakan distribusi sampling dari fungsi L. (Poin yang diplot dengan baik di dalam amplop ini tidak dapat dibedakan secara signifikan dari keseragaman.) Lebih dari ini saya telah merencanakan fungsi L untuk sampel dengan ukuran yang sama dari distribusi berbentuk-U, distribusi campuran dengan empat komponen yang jelas, dan distribusi Normal standar. Histogram sampel ini (dan distribusi induknya) ditunjukkan untuk referensi, menggunakan simbol garis untuk mencocokkan dengan fungsi L.
Paku tajam yang terpisah dari distribusi berbentuk-U (garis merah putus-putus, histogram paling kiri) membuat kluster nilai-nilai yang berjarak dekat. Ini tercermin oleh kemiringan yang sangat besar pada fungsi L pada . Fungsi L kemudian berkurang, akhirnya menjadi negatif untuk mencerminkan kesenjangan pada jarak menengah.0
Sampel dari distribusi normal (garis biru solid, histogram paling kanan) cukup dekat dengan terdistribusi secara merata. Dengan demikian, fungsi L-nya tidak berangkat dari dengan cepat. Namun, dengan jarak 0,1000.10 atau lebih, itu telah naik cukup di atas amplop untuk memberi sinyal kecenderungan kecil untuk mengelompok. Terus naik melintasi jarak menengah menunjukkan pengelompokan tersebar dan tersebar luas (tidak terbatas pada beberapa puncak terisolasi).
Kemiringan besar awal untuk sampel dari distribusi campuran (histogram tengah) menunjukkan pengelompokan pada jarak kecil (kurang dari ). Dengan jatuh ke level negatif, itu menandakan pemisahan pada jarak menengah. Membandingkan ini dengan fungsi L distribusi berbentuk U mengungkapkan: kemiringan pada 0 , jumlah di mana kurva ini naik di atas 0 , dan tingkat di mana mereka akhirnya turun kembali ke 0 semua memberikan informasi tentang sifat dari gugus yang ada di data. Setiap karakteristik ini dapat dipilih sebagai ukuran tunggal "kerataan" yang sesuai dengan aplikasi tertentu.0.15000
Contoh-contoh ini menunjukkan bagaimana fungsi-L dapat diperiksa untuk mengevaluasi keberangkatan data dari keseragaman ("evenness") dan bagaimana informasi kuantitatif tentang skala dan sifat keberangkatan dapat diekstraksi darinya.
(Seseorang memang dapat memplot seluruh fungsi L, meluas ke jarak penuh normalisasi , untuk menilai keberangkatan skala besar dari keseragaman. Namun, biasanya, menilai perilaku data pada jarak yang lebih kecil lebih penting.)1
Perangkat lunak
R
kode untuk menghasilkan gambar ini mengikuti. Dimulai dengan mendefinisikan fungsi untuk menghitung K dan L. Ini menciptakan kemampuan untuk mensimulasikan dari distribusi campuran. Kemudian menghasilkan data yang disimulasikan dan membuat plot.
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")