Wie kann man die Hypothese testen, dass die Korrelation mit R gleich dem gegebenen Wert ist?

10

Gibt es eine Funktion zum Testen der Hypothese, dass die Korrelation zweier Vektoren gleich einer bestimmten Zahl ist, beispielsweise 0,75? Mit cor.test kann ich cor = 0 testen und sehen, ob 0,75 innerhalb des Konfidenzintervalls liegt. Aber gibt es eine Funktion zur Berechnung des p-Wertes für cor = 0,75?

x <- rnorm(10)
y <- x+rnorm(10)
cor.test(x, y)
Mosaik
quelle
2
Diese Frage ist besser geeignet für crossvalidated.com
Sacha Epskamp
1
@sacha - Bitte überprüfen Sie zuerst die FAQ einer Site. In der FAQ zu stats.se wird empfohlen, Programmierfragen mit R auf SO zu stellen.
Kev
Die Frage "Gibt es eine Funktion zur Berechnung des p-Wertes für cor = 0,75?" hat nichts mit Programmierung zu tun. Es ist eine statistische Frage.
Sacha Epskamp
Ich werde die Statistik-Leute konsultieren und sehen, was sie denken.
Kev
1
@mosaic Bitte registrieren Sie Ihr Konto hier. Auf diese Weise können Sie Ihr SO-Konto dem aktuellen Konto zuordnen.
Chl

Antworten:

12

Mit der Varianz, die die Fisher-Atan-Transformation stabilisiert , können Sie den p-Wert als erhalten

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

oder welche Version des einseitigen / zweiseitigen p-Werts Sie auch immer interessieren. Offensichtlich benötigen Sie die Stichprobengröße nund den Stichproben-Korrelationskoeffizienten rals Eingabe dafür.

StasK
quelle
+1 Danke für Ihre Antwort - Mir war nicht klar, ob die Fisher-Transformation in diesem Fall angemessen war oder nicht, aber Ihre Antwort hilft, dies zu klären.
Gavin Simpson
@ Gavin, Sie haben versucht zu klären, was die Absicht des OP war. Ich habe gerade die modale Situation angenommen, in der eine solche Frage auftauchen würde, und es sieht so aus, als ob es geklappt hätte :).
StasK
4

Die Verteilung von r_hat um rho wird durch diese R-Funktion angegeben, die aus dem Matlab-Code auf der Webseite von Xu Cui angepasst wurde . Es ist nicht so schwierig, daraus eine Schätzung für die Wahrscheinlichkeit zu machen, dass ein beobachteter Wert "r" bei einer Stichprobengröße von "n" und einem hypothetischen wahren Wert von "ro" unwahrscheinlich ist.

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

Dann können Sie mit dieser Funktion die Verteilung eines Null-Rho von 0,75 zeichnen, die Wahrscheinlichkeit berechnen, dass r_hat kleiner als 0,6 ist, und in diesem Bereich des Diagramms Schatten spenden:

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

Geben Sie hier die Bildbeschreibung ein

DWin
quelle
4

Ein anderer Ansatz, der möglicherweise weniger genau ist als die Transformation von Fisher, aber ich denke, er könnte intuitiver sein (und neben der statistischen Signifikanz auch Ideen zur praktischen Bedeutung liefern), ist der visuelle Test:

 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

Es gibt eine Implementierung in der vis.testFunktion im TeachingDemosPaket für R. Eine Möglichkeit, sie für Ihr Beispiel auszuführen, ist:

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 )

Wenn Ihre realen Daten nicht normal sind oder die Beziehung nicht linear ist, kann dies natürlich mit dem obigen Code leicht erfasst werden. Wenn Sie diese gleichzeitig testen möchten, würde der obige Code dies tun, oder der obige Code könnte angepasst werden, um die Art der Daten besser darzustellen.

Greg Snow
quelle