วิธีทดสอบสมมติฐานว่าสหสัมพันธ์เท่ากับค่าที่กำหนดโดยใช้ R อย่างไร


10

มีฟังก์ชั่นในการทดสอบสมมติฐานว่าสหสัมพันธ์ของเวกเตอร์สองตัวมีค่าเท่ากับตัวเลขที่กำหนดหรือไม่พูดว่า 0.75? การใช้ cor.test ฉันสามารถทดสอบ cor = 0 และฉันเห็นได้ว่า 0.75 อยู่ในช่วงความมั่นใจหรือไม่ แต่มีฟังก์ชั่นในการคำนวณค่า p สำหรับ cor = 0.75 หรือไม่?

x <- rnorm(10)
y <- x+rnorm(10)
cor.test(x, y)

2
คำถามนี้เหมาะสำหรับ crossvalidated.com
Sacha Epskamp

1
@sacha - โปรดตรวจสอบคำถามที่พบบ่อยของเว็บไซต์ก่อนเว็บไซต์ stats.se คำถามที่พบบ่อยแนะนำให้โพสต์คำถามการเขียนโปรแกรมโดยใช้ R บน SO
Kev

คำถาม "มีฟังก์ชั่นในการคำนวณ p-value สำหรับ cor = 0.75 หรือไม่?" ไม่มีอะไรเกี่ยวข้องกับการเขียนโปรแกรม มันเป็นคำถามเชิงสถิติ
Sacha Epskamp

ฉันจะปรึกษาผู้คนในสถิติและดูว่าพวกเขาคิดอย่างไร
Kev

1
@mosaic กรุณาลงทะเบียนบัญชีของคุณที่นี่ ด้วยวิธีนี้คุณจะสามารถเชื่อมโยงบัญชี SO ของคุณกับบัญชีปัจจุบัน
chl

คำตอบ:


12

การใช้ความแปรปรวนที่ทำให้การแปลง atan ของฟิชเชอร์คงที่คุณสามารถรับค่า p เป็น

pnorm( 0.5 * log( (1+r)/(1-r) ), mean = 0.5 * log( (1+0.75)/(1-0.75) ), sd = 1/sqrt(n-3) )

หรือค่า p-value แบบด้านเดียว / สองด้านใด ๆ ที่คุณสนใจถ้าคุณต้องการขนาดตัวอย่างnและค่าสัมประสิทธิ์สหสัมพันธ์ของตัวอย่างrเป็นอินพุต


+1 ขอบคุณสำหรับคำตอบของคุณ - ฉันไม่ชัดเจนว่าการแปลง Fisher เหมาะสมหรือไม่ในกรณีนี้ แต่คำตอบของคุณช่วยให้ชัดเจนขึ้น
Gavin Simpson

@ กาวินคุณพยายามชี้แจงว่าเจตนาของ OP คืออะไร ฉันแค่คิดว่าสถานการณ์เป็นกิริยาช่วยซึ่งคำถามเช่นนั้นจะเกิดขึ้นและดูเหมือนว่ามันจะเป็นไปได้ :)
StasK

4

การกระจายตัวของรอบโร r_hat จะได้รับจากการทำงานวิจัยนี้ดัดแปลงมาจาก Matlab รหัสที่หน้าเว็บของเสี่ยว Cui ไม่ใช่เรื่องยากที่จะเปลี่ยนเป็นค่าประมาณสำหรับความน่าจะเป็นที่ค่าที่สังเกตได้ "r" นั้นไม่น่าจะเป็นไปได้เมื่อกำหนดขนาดตัวอย่างเป็น "n" และค่าจริงที่เป็นสมมุติของ "ro"

corrdist <- function (r, ro, n) {
        y = (n-2) * gamma(n-1) * (1-ro^2)^((n-1)/2) * (1-r^2)^((n-4)/2)
        y = y/ (sqrt(2*pi) * gamma(n-1/2) * (1-ro*r)^(n-3/2))
        y = y* (1+ 1/4*(ro*r+1)/(2*n-1) + 9/16*(ro*r+1)^2 / (2*n-1)/(2*n+1)) }

จากนั้นด้วยฟังก์ชั่นนั้นคุณสามารถพล็อตการกระจายของ rho เป็นศูนย์ที่ 0.75 คำนวณความน่าจะเป็นที่ r_hat จะน้อยกว่า 0.6 และแรเงาในพื้นที่นั้นบนพล็อต:

 plot(seq(-1,1,.01), corrdist( seq(-1,1,.01), 0.75, 10) ,type="l")
 integrate(corrdist, lower=-1, upper=0.6, ro=0.75, n=10)
# 0.1819533 with absolute error < 2e-09
 polygon(x=c(seq(-1,0.6, length=100), 0.6, 0), 
         y=c(sapply(seq(-1,0.6, length=100), 
         corrdist, ro=0.75, n=10), 0,0), col="grey")

ป้อนคำอธิบายรูปภาพที่นี่


4

อีกวิธีที่อาจไม่แม่นยำกว่าการเปลี่ยนรูปแบบของฟิชเชอร์ แต่ฉันคิดว่าน่าจะเป็นสัญชาตญาณมากกว่า (และสามารถให้ความคิดเกี่ยวกับความสำคัญเชิงปฏิบัตินอกเหนือจากนัยสำคัญทางสถิติ) คือการทดสอบด้วยภาพ:

 Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne,
 D.F and Wickham, H. (2009) Statistical Inference for exploratory
 data analysis and model diagnostics Phil. Trans. R. Soc. A 2009
 367, 4361-4383 doi: 10.1098/rsta.2009.0120

มีการใช้สิ่งนี้ในvis.testฟังก์ชั่นในTeachingDemosแพคเกจสำหรับอาร์วิธีหนึ่งในการรันสำหรับตัวอย่างของคุณคือ:

vt.scattercor <- function(x,y,r,...,orig=TRUE)
{
    require('MASS')
    par(mar=c(2.5,2.5,1,1)+0.1)
    if(orig) {
        plot(x,y, xlab="", ylab="", ...)
    } else {
        mu <- c(mean(x), mean(y))
        var <- var( cbind(x,y) )
        var[ rbind( 1:2, 2:1 ) ] <- r * sqrt(var[1,1]*var[2,2])
        tmp <- mvrnorm( length(x), mu, var )
        plot( tmp[,1], tmp[,2], xlab="", ylab="", ...)
    }
}

test1 <- mvrnorm(100, c(0,0), rbind( c(1,.75), c(.75,1) ) )
test2 <- mvrnorm(100, c(0,0), rbind( c(1,.5), c(.5,1) ) )

vis.test( test1[,1], test1[,2], r=0.75, FUN=vt.scattercor )
vis.test( test2[,1], test2[,2], r=0.75, FUN=vt.scattercor )

แน่นอนหากข้อมูลจริงของคุณไม่ปกติหรือความสัมพันธ์ไม่เป็นเชิงเส้นก็จะหยิบขึ้นมาได้อย่างง่ายดายด้วยรหัสข้างต้น หากคุณต้องการทดสอบพร้อมกันสำหรับโค้ดเหล่านั้นโค้ดด้านบนจะทำเช่นนั้นหรือโค้ดด้านบนสามารถปรับเปลี่ยนเพื่อแสดงถึงลักษณะของข้อมูลได้ดียิ่งขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.