มาตรฐานที่มีประสิทธิภาพและเป็นที่เข้าใจกันดีในทางทฤษฎีและเป็นที่ยอมรับกันอย่างแพร่หลายในการวัด "สมดุล" คือฟังก์ชั่นของRipley Kและฟังก์ชัน L ที่สัมพันธ์กันอย่างใกล้ชิด แม้ว่าโดยทั่วไปแล้วสิ่งเหล่านี้จะใช้เพื่อประเมินการกำหนดค่าจุดเชิงพื้นที่สองมิติ แต่การวิเคราะห์ที่จำเป็นในการปรับให้เข้ากับมิติหนึ่ง (ซึ่งโดยทั่วไปจะไม่ได้รับในการอ้างอิง) นั้นเป็นเรื่องง่าย
ทฤษฎี
ฟังก์ชัน K ประมาณการสัดส่วนของคะแนนภายในระยะทางของจุดทั่วไป สำหรับการแจกแจงแบบสม่ำเสมอในช่วงเวลา[ 0 , 1 ]สัดส่วนที่แท้จริงสามารถคำนวณได้และ (asymptotically ในขนาดตัวอย่าง) เท่ากับ1 - ( 1 - d )d[0,1]2 ฟังก์ชัน L รุ่นหนึ่งมิติที่เหมาะสมจะลบค่านี้จาก K เพื่อแสดงการเบี่ยงเบนจากความสม่ำเสมอ ดังนั้นเราอาจพิจารณาปรับมาตรฐานของชุดข้อมูลให้มีช่วงหน่วยและตรวจสอบฟังก์ชัน L เพื่อหาค่าเบี่ยงเบนรอบศูนย์1−(1−d)2
ตัวอย่างการทำงาน
เพื่อแสดงให้เห็นว่าฉันได้จำลองตัวอย่างอิสระจำนวนตัวอย่างจากขนาด64จากการแจกแจงแบบเดียวกันและได้วางแผนฟังก์ชัน L (ปกติ) สำหรับระยะทางที่สั้นกว่า (จาก0ถึง1 /999640 ) จึงสร้างซองจดหมายเพื่อประเมินการกระจายตัวอย่างของฟังก์ชั่นเปิด L (พล็อตจุดที่ดีภายในซองจดหมายนี้ไม่สามารถแยกความแตกต่างอย่างมีนัยสำคัญจากความเท่าเทียมกัน) เหนือสิ่งนี้ฉันได้วางแผนฟังก์ชัน L สำหรับตัวอย่างที่มีขนาดเท่ากันจากการกระจายรูปตัวยูการกระจายแบบผสมที่มีส่วนประกอบที่ชัดเจนสี่ประการ ฮิสโตแกรมของตัวอย่างเหล่านี้ (และของการแจกแจงพาเรนต์) แสดงขึ้นเพื่อการอ้างอิงโดยใช้สัญลักษณ์เส้นเพื่อจับคู่กับฟังก์ชั่น L1/3
เดือยแหลมแยกออกจากกันของการกระจายรูปตัวยู (เส้นประสีแดง, ฮิสโตแกรมซ้ายสุด) สร้างกลุ่มของค่าที่เว้นระยะอย่างใกล้ชิด นี่คือภาพสะท้อนจากความลาดชันที่มีขนาดใหญ่มากในการทำงานของ L ที่0จากนั้นฟังก์ชั่น L จะลดลงจนกลายเป็นลบในที่สุดเพื่อสะท้อนช่องว่างในระยะทางระดับกลาง0
ตัวอย่างจากการแจกแจงแบบปกติ (เส้นทึบสีน้ำเงิน, ฮิสโตแกรมขวาสุด) นั้นใกล้เคียงกับการกระจายแบบสม่ำเสมอ ดังนั้นฟังก์ชั่น L จึงไม่ออกจากอย่างรวดเร็ว อย่างไรก็ตามโดยระยะทาง0.10หรือมากกว่านั้นมันได้เพิ่มขึ้นอย่างเพียงพอเหนือซองจดหมายเพื่อส่งสัญญาณแนวโน้มที่จะจัดกลุ่มเล็กน้อย การเพิ่มขึ้นอย่างต่อเนื่องในระยะทางกลางแสดงว่าการจัดกลุ่มนั้นกระจายและแพร่หลาย (ไม่ จำกัด เฉพาะบางจุดที่แยกได้)00.10
ความชันเริ่มต้นขนาดใหญ่สำหรับตัวอย่างจากการกระจายของส่วนผสม (ฮิสโตแกรมกลาง) แสดงการจัดกลุ่มที่ระยะทางเล็ก ๆ (น้อยกว่า ) เมื่อปล่อยลงสู่ระดับลบจะเป็นการส่งสัญญาณการแยกที่ระยะทางระดับกลาง เมื่อเปรียบเทียบสิ่งนี้กับฟังก์ชั่น L การกระจายตัวของรูปตัวยูจะเผยให้เห็น: ความลาดชันที่0จำนวนที่เส้นโค้งเหล่านี้เพิ่มขึ้นสูงกว่า0และอัตราที่พวกเขาลงไปในที่สุด0.1500ทั้งหมดให้ข้อมูลเกี่ยวกับลักษณะของการรวมกลุ่ม ข้อมูล. คุณลักษณะใด ๆ เหล่านี้สามารถเลือกได้ว่าเป็น "การวัดคู่" แบบเดี่ยวเพื่อให้เหมาะกับการใช้งานเฉพาะ0
ตัวอย่างเหล่านี้แสดงให้เห็นว่า L-function สามารถตรวจสอบได้อย่างไรเพื่อประเมินการออกของข้อมูลจากความสม่ำเสมอ ("สม่ำเสมอ") และข้อมูลเชิงปริมาณเกี่ยวกับขนาดและลักษณะของการแยกออกจากมัน
(หนึ่งสามารถพล็อตฟังก์ชั่น L ทั้งหมดซึ่งขยายไปถึงระยะปกติเต็มรูปแบบที่เพื่อประเมินการออกเดินทางขนาดใหญ่จากความสม่ำเสมอโดยปกติแม้ว่าการประเมินพฤติกรรมของข้อมูลในระยะทางเล็ก ๆ นั้นมีความสำคัญมากกว่า)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")