एक मानक, शक्तिशाली, अच्छी तरह से समझे जाने वाले, सैद्धांतिक रूप से अच्छी तरह से स्थापित, और अक्सर "समरूपता" के लागू किए गए माप रिप्ले के फ़ंक्शन और इसके करीबी रिश्तेदार, एल फ़ंक्शन है। हालांकि ये आम तौर पर दो-आयामी स्थानिक बिंदु कॉन्फ़िगरेशन का मूल्यांकन करने के लिए उपयोग किया जाता है, उन्हें एक आयाम (जो आमतौर पर संदर्भों में नहीं दिया जाता है) के अनुकूल होने के लिए आवश्यक विश्लेषण सरल है।
सिद्धांत
K फ़ंक्शन किसी विशिष्ट बिंदु की दूरी के भीतर बिंदुओं के औसत अनुपात का अनुमान लगाता है । अंतराल [ 0 , 1 ] पर एक समान वितरण के लिए , सही अनुपात की गणना की जा सकती है और (नमूना आकार में समान रूप से) 1 - ( 1 - d ) 2 के बराबर होती है । L फ़ंक्शन का उपयुक्त एक-आयामी संस्करण इस मान को एकरूपता से विचलन दिखाने के लिए K से घटाता है । इसलिए हम इकाई के पास डेटा के किसी भी बैच को सामान्य करने पर विचार कर सकते हैं और शून्य के आसपास विचलन के लिए इसके एल फ़ंक्शन की जांच कर सकते हैं।d[0,1]1−(1−d)2
काम के उदाहरण
इसे समझने के लिए , मैं नकली है आकार के स्वतंत्र नमूने 64 (से एक समान वितरण से और कम दूरी के लिए उनके (सामान्य) एल कार्यों साजिश रची 0 करने के लिए 1 / 3 ), जिससे एल समारोह के नमूने वितरण अनुमान लगाने के लिए एक लिफाफा बनाने। (इस लिफाफे के भीतर अच्छी तरह से प्लॉट किए गए बिंदुओं को एकरूपता से काफी अलग नहीं किया जा सकता है।) इस पर मैंने यू आकार के वितरण, समान स्पष्ट घटकों के साथ मिश्रण वितरण और एक मानक सामान्य वितरण से समान आकार के नमूनों के लिए एल फ़ंक्शन प्लॉट किए हैं। इन नमूनों के हिस्टोग्राम (और उनके माता-पिता के वितरण के) संदर्भ के लिए दिखाए जाते हैं, एल प्रतीकों के उन कार्यों से मेल खाने के लिए रेखा प्रतीकों का उपयोग करते हैं।9996401/3
यू-आकार के वितरण के तेज अलग-अलग स्पाइक्स (धराशायी लाल रेखा, सबसे ऊपरी हिस्टोग्राम) बारीकी से स्थित मूल्यों के समूह बनाते हैं। यह 0 समारोह में एल समारोह में एक बहुत बड़ी ढलान द्वारा परिलक्षित होता है0 । L फ़ंक्शन तब कम हो जाता है, अंततः मध्यवर्ती दूरी पर अंतराल को प्रतिबिंबित करने के लिए नकारात्मक हो रहा है।
सामान्य वितरण (सॉलिड ब्लू लाइन, राइटस्ट हिस्टोग्राम) से नमूना समान रूप से वितरित होने के काफी करीब है। तदनुसार, इसका एल फ़ंक्शन से जल्दी से प्रस्थान नहीं करता है । हालाँकि, 0.10 या उससे अधिक की दूरी पर , यह क्लस्टर के लिए एक मामूली प्रवृत्ति का संकेत देने के लिए लिफाफे के ऊपर पर्याप्त रूप से बढ़ गया है। मध्यवर्ती दूरी में निरंतर वृद्धि इंगित करती है कि क्लस्टरिंग फैलाना और व्यापक है (कुछ पृथक चोटियों तक सीमित नहीं है)।00.10
मिश्रण वितरण (मध्य हिस्टोग्राम) से नमूने के लिए प्रारंभिक बड़ी ढलान छोटी दूरी ( से कम ) पर क्लस्टरिंग का पता चलता है । नकारात्मक स्तर तक छोड़ने से, यह मध्यवर्ती दूरी पर अलगाव का संकेत देता है। इसकी तुलना यू-आकार के वितरण के L फंक्शन से की जा रही है: 0 पर ढलान , ये मात्राएँ जिनसे ये वक्र 0 से ऊपर उठते हैं , और वे जिस दर से अंततः 0 पर वापस आते हैं, वे सभी मौजूद क्लस्टरिंग की प्रकृति के बारे में जानकारी प्रदान करते हैं। आँकड़े। इनमें से किसी भी विशेषता को एक विशेष अनुप्रयोग के अनुरूप "समरूपता" के एकल माप के रूप में चुना जा सकता है।0.15000
इन उदाहरणों से पता चलता है कि एक एल-फ़ंक्शन को एकरूपता ("समरूपता") से डेटा के प्रस्थान का मूल्यांकन करने के लिए कैसे जांच की जा सकती है और प्रस्थान के पैमाने और प्रकृति के बारे में मात्रात्मक जानकारी इससे कैसे निकाली जा सकती है।
( एकरूपता से बड़े पैमाने पर प्रस्थान का आकलन करने के लिए, वास्तव में पूरे एल फ़ंक्शन को प्लॉट किया जा सकता है, की पूर्ण सामान्यीकृत दूरी के लिए। एकरूपता से, हालांकि, छोटी दूरी पर डेटा के व्यवहार का आकलन करना अधिक महत्वपूर्ण है।)1
सॉफ्टवेयर
R
इस आंकड़े को उत्पन्न करने के लिए कोड निम्नानुसार है। यह K और L की गणना करने के लिए कार्यों को परिभाषित करने से शुरू होता है। यह मिश्रण वितरण से अनुकरण करने की क्षमता बनाता है। फिर यह नकली डेटा उत्पन्न करता है और प्लॉट बनाता है।
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")