Bagaimana menguji hipotesis bahwa korelasinya sama dengan nilai yang diberikan menggunakan R?

10

Apakah ada fungsi untuk menguji hipotesis bahwa korelasi dua vektor sama dengan angka yang diberikan, katakanlah 0,75? Dengan menggunakan cor.test saya dapat menguji cor = 0 dan saya dapat melihat apakah 0,75 berada di dalam interval kepercayaan. Tetapi apakah ada fungsi untuk menghitung nilai p untuk cor = 0,75?

x <- rnorm(10)
y <- x+rnorm(10)
cor.test(x, y)
mosaik
sumber
2
Pertanyaan ini lebih cocok untuk crossvalidated.com
Sacha Epskamp
1
@sacha - silakan periksa FAQ situs terlebih dahulu, faq situs stats.se merekomendasikan agar pertanyaan pemrograman menggunakan R diposting di SO.
Kev
Pertanyaan "apakah ada fungsi untuk menghitung nilai p untuk cor = 0,75?" tidak ada hubungannya dengan pemrograman. Ini adalah pertanyaan statistik.
Sacha Epskamp
Saya akan berkonsultasi dengan orang-orang statistik dan melihat apa yang mereka pikirkan.
Kev
1
@mosaic Silakan, daftarkan akun Anda di sini. Dengan cara ini, Anda dapat mengaitkan akun SO Anda dengan yang sekarang.
chl

Jawaban:

12

Menggunakan varians menstabilkan transformasi atan Fisher , Anda bisa mendapatkan nilai-p sebagai

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

atau versi apa pun dari nilai p satu sisi / dua sisi yang Anda minati. Tentunya, Anda memerlukan ukuran sampel ndan koefisien korelasi sampel rsebagai masukan untuk ini.

Tugas
sumber
+1 Terima kasih atas Jawaban Anda - Tidak jelas bagi saya bahwa transformasi Fisher sesuai atau tidak dalam hal ini, tetapi jawaban Anda membantu menjernihkan hal itu.
Gavin Simpson
@ Gavin, Anda mencoba menjelaskan apa maksud OP. Saya hanya mengasumsikan situasi modal di mana pertanyaan seperti itu akan muncul, dan sepertinya itu berhasil :).
Tugas
4

Distribusi r_hat di sekitar rho diberikan oleh fungsi R ini yang diadaptasi dari kode Matlab di halaman web Xu Cui . Tidaklah sulit untuk mengubahnya menjadi perkiraan untuk probabilitas bahwa nilai yang diamati "r" tidak mungkin diberikan dengan ukuran sampel "n" dan nilai sebenarnya hipotetis "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)) }

Kemudian dengan fungsi itu Anda dapat memplot distribusi nol nol 0,75, menghitung probabilitas bahwa r_hat akan kurang dari 0,6 dan teduh di area itu pada plot:

 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")

masukkan deskripsi gambar di sini

DWIN
sumber
4

Pendekatan lain yang mungkin kurang tepat daripada tranformasi Fisher, tapi saya pikir bisa lebih intuitif (dan bisa memberikan ide tentang signifikansi praktis selain signifikansi statistik) adalah tes visual:

 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

Ada implementasi ini dalam vis.testfungsi dalam TeachingDemospaket untuk R. Salah satu cara untuk menjalankannya sebagai contoh adalah:

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 )

Tentu saja jika data asli Anda tidak normal atau hubungannya tidak linier maka itu akan dengan mudah diambil dengan kode di atas. Jika Anda ingin menguji secara simultan untuk itu, maka kode di atas akan melakukan itu, atau kode di atas dapat disesuaikan untuk lebih mewakili sifat data.

Greg Snow
sumber