Rを使用して相関が所定の値に等しいという仮説をテストする方法は?


10

2つのベクトルの相関が特定の数値、たとえば0.75に等しいという仮説をテストする関数はありますか?cor.testを使用すると、cor = 0をテストでき、0.75が信頼区間内にあるかどうかを確認できます。しかし、cor = 0.75のp値を計算する関数はありますか?

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

2
この質問はcrossvalidated.comに適しています
Sacha Epskamp '13

1
@sacha-最初にサイトのFAQを確認してください。stats.seサイトのfaqでは、Rを使用したプログラミングの質問をSOに投稿することをお勧めしています。
ケブ2013

質問「cor = 0.75のp値を計算する関数はありますか?」プログラミングとは何の関係もありません。統計的な質問です。
Sacha Epskamp 2011

私は統計の人々に相談し、彼らがどう思うか見てみましょう。
ケブ2013

1
@mosaicこちらからアカウントを登録してください。このようにして、SOアカウントを現在のアカウントに関連付けることができます。
11

回答:


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値の任意のバージョン。明らかに、これへの入力としてサンプルサイズnとサンプル相関係数が必要rです。


+1ご回答ありがとうございます-この場合、フィッシャートランスフォームが適切であるかどうかはわかりませんでしたが、あなたの回答はそれを明確にするのに役立ちます。
Gavin Simpson

@ギャビン、あなたはOPの意図が何であったかを明確にしようとしました。私はちょうどそのような質問が発生するモーダルな状況を想定し、それがうまくいったかのように見えます:)。
StasK 2011

4

rhoの周りのr_hatの分布は、Xu CuiのWebページで Matlabコードから適応されたこのR関数によって与えられます。これを、サンプルサイズが「n」で仮想の真の値が「ro」の場合、観測値「r」がありそうもない確率の推定値に変換することはそれほど難しくありません。

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

次に、この関数を使用して、0.75のnull rhoの分布をプロットし、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

R vis.testTeachingDemosパッケージの関数には、この実装が含まれています。例として実行するには、次の方法があります。

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.