ลองมาดูกันว่านี่เป็นการทดสอบที่ดีหรือไม่ มันมีอะไรมากกว่านั้นเพียงแค่อ้างว่ามันแย่หรือแสดงในอินสแตนซ์เดียวที่มันใช้งานไม่ได้ การทดสอบส่วนใหญ่ทำงานได้ไม่ดีในบางสถานการณ์ดังนั้นบ่อยครั้งที่เราต้องเผชิญกับการระบุสถานการณ์ที่การทดสอบใด ๆ ที่เสนออาจเป็นทางเลือกที่ดี
คำอธิบายของการทดสอบ
เช่นเดียวกับการทดสอบสมมติฐานใด ๆ อันนี้ประกอบด้วย (a) สมมติฐานว่างและสำรองและ (b) สถิติทดสอบ (สัมประสิทธิ์สหสัมพันธ์) มีวัตถุประสงค์เพื่อแยกแยะระหว่างสมมติฐาน
สมมุติฐานว่างคือตัวแปรทั้งสองมาจากการแจกแจงแบบเดียวกัน จะแม่นยำให้เราตั้งชื่อตัวแปรXและYและถือว่าเราได้สังเกตเห็นnxกรณีของXเรียกว่าxi=(x1,x2,…,xnx)และnyกรณีของYเรียกว่าyiผม สมมติฐานว่างคือว่าทุกอินสแตนซ์ของXและYมีความเป็นอิสระและกระจายตัวเหมือนกัน (iid)
ขอให้เราใช้สมมุติฐานทางเลือกว่า (a) อินสแตนซ์ทั้งหมดของคือ iid ตามการแจกแจงพื้นฐานF Xและ (b) อินสแตนซ์ทั้งหมดของYเป็น iid ตามการแจกแจงพื้นฐานF Yแต่ (c) F Xแตกต่างจากF Y (ดังนั้นเราจะไม่มองหาความสัมพันธ์ระหว่างx i , สหสัมพันธ์ระหว่างy i , สหสัมพันธ์ระหว่างx iและy jหรือความแตกต่างของการแจกแจงระหว่างxหรือyXFXYFYFXFYxiyixiyjxyแยกจากกัน: ซึ่งสันนิษฐานว่าไม่น่าเชื่อถือ)
สถิติการทดสอบที่เสนอถือว่า (เรียกค่านี้ว่าn ) และคำนวณค่าสัมประสิทธิ์สหสัมพันธ์ของ( x [ i ] , y [ i ] ) (ที่ไหนตามปกติ[ i ]กำหนดi th ที่เล็กที่สุด ของข้อมูล) เรียกสิ่งนี้T ( x , Y )nx=nyn(x[i],y[i])[i]itht(x,y)
การทดสอบการเปลี่ยนรูป
ในสถานการณ์เช่นนี้ - ว่าสิ่งที่ไม่มีสถิติจะเสนอ - เราสามารถดำเนินการทดสอบการเปลี่ยนแปลง ภายใต้สมมติฐานที่ความน่าจะเป็นของข้อมูล( ( x 1 , x 2 , ... , x n ) , ( ปี1 , ปี2 , ... , Y n ) )เป็นเช่นเดียวกับโอกาสของการเปลี่ยนแปลงของใด ๆ2 nค่าข้อมูล กล่าวอีกนัยหนึ่งคือการมอบหมายข้อมูลครึ่งหนึ่งให้แก่Xและอีกครึ่งหนึ่งเป็นYt((x1,x2,…,xn),(y1,y2,…,yn))2nXYเป็นเรื่องบังเอิญที่บริสุทธิ์แบบสุ่ม นี่คือการที่ง่ายและผลโดยตรงจากสมมติฐาน IID และสมมติฐานที่ YFX=FY
ดังนั้นการแจกแจงตัวอย่างของ , มีเงื่อนไขในการสังเกตx iและy i , คือการกระจายของค่าทั้งหมดของt ที่บรรลุสำหรับทุกคน( 2 n ) ! การเรียงสับเปลี่ยนของข้อมูล เราสนใจสิ่งนี้เพราะสำหรับขนาดการทดสอบที่กำหนดไว้αเช่นα = .05 (ตรงกับความมั่นใจ95 %) เราจะสร้างพื้นที่วิกฤตสองด้านจากการกระจายตัวตัวอย่างของt : ประกอบด้วยสุดขีดมากที่สุดt(x,y)xiyit(2n)!αα=.0595t % ของค่าที่เป็นไปได้ของ t (บนด้านสูงเนื่องจากความสัมพันธ์สูงสอดคล้องกับการแจกแจงที่คล้ายกันและความสัมพันธ์ต่ำไม่ได้) นี่คือวิธีที่เราจะพิจารณาว่าสัมประสิทธิ์สหสัมพันธ์นั้นมีขนาดใหญ่เพียงใดเพื่อที่จะตัดสินใจว่าข้อมูลนั้นมาจากการแจกแจงที่ต่างกัน100αt
จำลองการแจกแจงตัวอย่างการโมฆะ
เพราะ(หรือถ้าคุณต้องการ( 2 n(2n)!(2nn)/2, which counts the number of ways of splitting the 2n data into two pieces of size n) gets big even for small n, it is not practicable to compute the sampling distribution exactly, so we sample it using a simulation. (For instance, when n=16, (2nn)/2=300 540 195 and (2n)!≈2.63×1035.) About a thousand samples often suffices (and certainly will for the explorations we are about to undertake).
There are two things we need to find out: first, what does the sampling distribution look like under the null hypothesis. Second, how well does this test discriminate between different distributions?
There is a complication: the sampling distribution depends on the nature of the data. All we can do is to look at realistic data, created to emulate whatever it is we are interested in studying, and hope that what we learn from the simulations will apply to our own situation.
Implementation
To illustrate, I have carried out this work in R
. It falls naturally into three pieces.
ฟังก์ชั่นการคำนวณสถิติทดสอบ ) เนื่องจากฉันต้องการทั่วไปมากกว่านิดหน่อยรุ่นของฉันจึงจัดการกับชุดข้อมูลขนาดแตกต่างกัน ( n x ≠ n y ) โดยการสอดแทรกเชิงเส้นตรงระหว่างค่าในชุดข้อมูลที่มีขนาดใหญ่กว่า (เรียงลำดับ) เพื่อสร้างการจับคู่กับชุดข้อมูลขนาดเล็กกว่า เพราะฟังก์ชั่นนี้ได้ทำไปแล้วฉันแค่เอาผลลัพธ์ของมันมา:t(x,y)nx≠nyR
qqplot
test.statistic <- function(x, y) {
transform <- function(z) -log(1-z^2)/2
fit <- qqplot(x,y, plot.it=FALSE)
transform(cor(fit$x, fit$y))
}
บิดเล็กน้อย - ไม่จำเป็น แต่มีประโยชน์สำหรับการสร้างภาพ - แสดงค่าสัมประสิทธิ์สหสัมพันธ์อีกครั้งในแบบที่จะทำให้การแจกแจงของโมฆะสถิติมีค่าประมาณสมมาตร นั่นคือสิ่งที่transform
กำลังทำ
การจำลองการกระจายตัวตัวอย่าง สำหรับใส่ฟังก์ชั่นนี้รับจำนวนซ้ำn.iter
พร้อมกับสองชุดของข้อมูลในอาร์เรย์และx
y
มันส่งออกอาร์เรย์ของn.iter
ค่าของสถิติการทดสอบ ผลงานภายในควรโปร่งใสแม้กับR
ผู้ใช้ที่ไม่ใช่:
permutation.test <- function(n.iter, x, y) {
z <- c(x,y)
n.x <- length(x)
n.y <- length(y)
n <- length(z)
k <- min(n.x, n.y)
divide <- function() {
i <- sample.int(n, size=k)
test.statistic(z[i], z[-i])
}
replicate(n.iter, divide())
}
ถึงแม้ว่านั่นคือทั้งหมดที่เราต้องทำการทดสอบเพื่อศึกษามันเราจะต้องการทำแบบทดสอบซ้ำหลายครั้ง ดังนั้นเราจึงทำการทดสอบหนึ่งครั้งและห่อโค้ดนั้นภายในเลเยอร์การทำงานที่สามโดยทั่วไปชื่อf
ที่นี่ซึ่งเราสามารถเรียกซ้ำได้ เพื่อให้เป็นเรื่องทั่วไปที่เพียงพอสำหรับการศึกษาแบบกว้าง ๆ สำหรับอินพุตมันยอมรับขนาดของชุดข้อมูลเพื่อจำลอง ( n.x
และn.y
) จำนวนการทำซ้ำสำหรับการทดสอบการเปลี่ยนรูปแต่ละครั้ง ( n.iter
) อ้างอิงกับฟังก์ชันtest
เพื่อคำนวณสถิติการทดสอบ (คุณจะเห็น ชั่วครู่ว่าทำไมเราไม่ต้องการเขียนโค้ดแบบนี้) และสองฟังก์ชั่นเพื่อสร้างค่าสุ่ม iid หนึ่งค่าสำหรับ ( ) และอีกหนึ่งสำหรับY ( ) ตัวเลือกXdist.x
Ydist.y
plot.it
มีประโยชน์ในการช่วยดูว่าเกิดอะไรขึ้น
f <- function(n.x, n.y, n.iter, test=test.statistic, dist.x=runif, dist.y=runif,
plot.it=FALSE) {
x <- dist.x(n.x)
y <- dist.y(n.y)
if(plot.it) qqplot(x,y)
t0 <- test(x,y)
sim <- permutation.test(n.iter, x, y)
p <- mean(sim > t0) + mean(sim==t0)/2
if(plot.it) {
hist(sim, xlim=c(min(t0, min(sim)), max(t0, max(sim))),
main="Permutation distribution")
abline(v=t0, col="Red", lwd=2)
}
return(p)
}
เอาท์พุทเป็นจำลอง "p-value": สัดส่วนของการจำลองยอมสถิติที่มีลักษณะอื่น ๆที่รุนแรงกว่าหนึ่งคำนวณจริงสำหรับข้อมูลที่
ส่วน (2) และ (3) เป็นเรื่องธรรมดามาก: คุณสามารถทำการศึกษาแบบนี้เพื่อการทดสอบที่แตกต่างได้ง่ายๆโดยแทนที่test.statistic
ด้วยการคำนวณอื่น เราทำด้านล่าง
ผลลัพธ์ครั้งแรก
ตามค่าเริ่มต้นรหัสของเราจะเปรียบเทียบข้อมูลที่ดึงมาจากการแจกแจงแบบเดียวกัน ฉันปล่อยให้มันทำอย่างนั้น (สำหรับซึ่งเป็นชุดข้อมูลที่มีขนาดค่อนข้างเล็กและดังนั้นจึงนำเสนอกรณีทดสอบที่ยากพอสมควร) จากนั้นทำซ้ำเพื่อเปรียบเทียบชุดปกติและเปรียบเทียบชุดเอกซ์โปเนนเชียล (การแจกแจงแบบสม่ำเสมอนั้นไม่ใช่เรื่องง่ายที่จะแยกความแตกต่างจากการแจกแจงแบบปกติเว้นแต่คุณจะมีค่ามากกว่า16บิตแต่การแจกแจงแบบเอ็กซ์โพเนนเชียล - มีความเบ้สูงและหางขวายาว - มักจะแยกความแตกต่างได้ง่ายn.x=n.y=1616
set.seed(17) # Makes the results reproducible
n.per.rep <- 1000 # Number of iterations to compute each p-value
n.reps <- 1000 # Number of times to call `f`
n.x <- 16; n.y <- 16 # Dataset sizes
par(mfcol=c(2,3)) # Lay results out in three columns
null <- replicate(n.reps, f(n.x, n.y, n.per.rep))
hist(null, breaks=20)
plot(null)
normal <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=rnorm))
hist(normal, breaks=20)
plot(normal)
exponential <- replicate(n.reps, f(n.x, n.y, n.per.rep, dist.y=function(n) rgamma(n, 1)))
hist(exponential, breaks=20)
plot(exponential)
XYXY
16xi16yif
0.051116ค่าอิสระจากแต่ละ นั่นเป็นพลังงานที่ค่อนข้างต่ำ แต่บางทีมันก็หลีกเลี่ยงไม่ได้ดังนั้นมาเริ่มกันเลยดีกว่า
พล็อตขวามือในทำนองเดียวกันทดสอบการกระจายอย่างสม่ำเสมอกับหนึ่งแทน ผลลัพธ์นี้เป็นสิ่งที่แปลกประหลาด การทดสอบนี้มีแนวโน้มที่จะสรุปได้ว่าบ่อยครั้งที่ข้อมูลเครื่องแบบและข้อมูลเอ็กซ์โปเนนเชียลมีลักษณะเหมือนกัน ดูเหมือนว่า "คิด" ว่าชุดรูปแบบและเลขชี้กำลังมีความคล้ายคลึงกันมากกว่าชุดตัวแปรสองชุด เกิดอะไรขึ้นที่นี่?
ปัญหาคือข้อมูลจากการแจกแจงแบบเอ็กซ์โปเนนเชียลมีแนวโน้มที่จะมีค่าสูงมาก เมื่อคุณสร้างจุดกระจายของค่าเทียบกับค่าที่กระจายอย่างสม่ำเสมอจะมีจุดสองสามจุดที่อยู่ทางขวาบนของส่วนที่เหลือทั้งหมด ที่สอดคล้องกับค่าสัมประสิทธิ์สหสัมพันธ์ที่สูงมาก ดังนั้นเมื่อใดก็ตามที่การแจกแจงสร้างค่าสุดโต่งไม่กี่ค่าสัมประสิทธิ์สหสัมพันธ์เป็นตัวเลือกที่น่ากลัวสำหรับการวัดความแตกต่างของการแจกแจง สิ่งนี้นำไปสู่ปัญหาที่เลวร้ายยิ่งขึ้นอีก: เมื่อขนาดของชุดข้อมูลเพิ่มขึ้นโอกาสในการได้รับการสังเกตที่เพิ่มขึ้นเล็กน้อย ดังนั้นเราสามารถคาดหวังว่าการทดสอบนี้จะทำงานได้แย่ลงและแย่ลงเมื่อปริมาณข้อมูลเพิ่มขึ้น ช่างน่ากลัวจริงๆ ...
การทดสอบที่ดีขึ้น
คำถามเดิมได้รับการตอบในเชิงลบ อย่างไรก็ตามมีการทดสอบที่รู้จักกันดีและมีประสิทธิภาพสำหรับการแบ่งแยกระหว่างการแจกแจง: การทดสอบ Kolmogorov-Smirnov แทนที่จะเป็นค่าสัมประสิทธิ์สหสัมพันธ์มันจะคำนวณค่าเบี่ยงเบนแนวตั้งที่ใหญ่ที่สุดจากเส้นY= xในพล็อต QQ ของพวกเขา (เมื่อข้อมูลมาจากการแจกแจงแบบเดียวกันพล็อต QQ มีแนวโน้มที่จะทำตามบรรทัดนี้ไม่เช่นนั้นมันจะเบี่ยงเบนไปที่ใดที่หนึ่งสถิติแคนซัสรับส่วนเบี่ยงเบนดังกล่าวมากที่สุด)
นี่คือการR
ดำเนินการ:
test.statistic <- function(x, y) {
ks.test(x,y)$statistic
}
ถูกต้องแล้ว: มันมีอยู่ในซอฟต์แวร์ดังนั้นเราจึงต้องเรียกมันเท่านั้น แต่เดี๋ยวก่อน! หากคุณอ่านคู่มืออย่างละเอียดคุณจะได้เรียนรู้ว่า (a) การทดสอบให้ค่า p-value แต่ (b) ที่ p-value นั้นผิดพลาดเมื่อทั้งคู่x
และy
เป็นชุดข้อมูล มันมีไว้สำหรับใช้เมื่อคุณเชื่อว่าคุณรู้อย่างชัดเจนว่าการกระจายข้อมูลx
มาจากไหนและคุณต้องการดูว่ามันจริงหรือไม่ ดังนั้นการทดสอบไม่สามารถรองรับความไม่แน่นอนเกี่ยวกับการกระจายของข้อมูลที่y
มาอย่างเหมาะสม
ไม่มีปัญหา! กรอบการทดสอบการเปลี่ยนรูปยังคงใช้ได้เหมือนเดิม ด้วยการเปลี่ยนแปลงก่อนหน้านี้test.statistic
สิ่งที่เราต้องทำคือเรียกใช้การศึกษาก่อนหน้านี้อีกครั้งโดยไม่เปลี่ยนแปลง นี่คือผลลัพธ์
แม้ว่าการแจกแจงโมฆะจะไม่เหมือนกัน (ซ้ายบน) แต่ก็ค่อนข้างสม่ำเสมอด้านล่างp = 0.20หรืออย่างนั้นซึ่งเป็นที่ที่เราให้ความสำคัญกับคุณค่าของมัน ภาพรวมของพล็อตด้านล่าง (ด้านล่างซ้าย) แสดงให้เห็นถึงปัญหา: สถิติ KS มีแนวโน้มที่จะจัดกลุ่มค่าที่ไม่ต่อเนื่องสองสามค่า (ปัญหานี้จะหายไปสำหรับชุดข้อมูลขนาดใหญ่)
ฮิสโทแกรมกลาง (เครื่องแบบกับปกติ) และขวา ( ฮิสโตแกรมสม่ำเสมอกับเอ็กซ์โปแนนเชียล) กำลังทำสิ่งที่ถูกต้อง: ในกรณีส่วนใหญ่ที่การแจกแจงทั้งสองแตกต่างกันการทดสอบนี้ทำให้เกิดค่า p- น้อย ตัวอย่างเช่นมันมี70โอกาส% ที่จะให้ค่า p น้อยกว่า 0.05เมื่อเปรียบเทียบเครื่องแบบกับค่าปกติตามค่า 16 ค่าจากแต่ละค่า เปรียบเทียบสิ่งนี้กับ piddling11ทำได้โดยการทดสอบสัมประสิทธิ์สหสัมพันธ์
ฮิสโตแกรมที่ถูกต้องนั้นไม่ค่อยดีนัก แต่อย่างน้อยก็อยู่ในทิศทางที่ถูกต้องแล้ว! เราประเมินว่ามันมี30% โอกาสของการตรวจจับความแตกต่างระหว่างการกระจายแบบสม่ำเสมอและเลขชี้กำลังที่ α = 5ระดับ% และ 50มีโอกาสของการตรวจจับที่ α = 10ระดับ% (เพราะทั้งสองแท่งสำหรับ p-value น้อยกว่า 0.10 รวมมากกว่า 500 จาก 1,000 การซ้ำ)
สรุปผลการวิจัย
ดังนั้นปัญหาของการทดสอบสหสัมพันธ์จึงไม่ได้เกิดจากความยากลำบากในการตั้งค่านี้ การทดสอบความสัมพันธ์ไม่เพียง แต่ทำงานได้ไม่ดีเท่านั้นมันไม่ดีเมื่อเทียบกับการทดสอบที่เป็นที่รู้จักและมีอยู่ทั่วไป (ฉันเดาว่ามันไม่สามารถยอมรับได้ซึ่งหมายความว่ามันจะทำงานได้แย่กว่าโดยเฉลี่ยกว่าเวอร์ชั่นทดสอบการเปลี่ยนแปลงของ KS ซึ่งหมายความว่าไม่มีเหตุผลที่จะใช้มัน)