Wie bestimme ich, ob zwei Korrelationen signifikant unterschiedlich sind?


9

Ich möchte bestimmen, welcher von zwei Datensätzen (B1, B2) besser mit einem anderen Satz (A) korreliert (Pearsons r). In allen Datensätzen fehlen Daten. Wie kann ich feststellen, ob die resultierende Korrelation signifikant unterschiedlich ist oder nicht?

Beispielsweise sind 8426-Werte sowohl in A als auch in B1 vorhanden, r = 0,74. 8798 sind sowohl in A als auch in B2 vorhanden, r = 0,72.

Ich dachte, diese Frage könnte helfen, aber sie bleibt unbeantwortet: Woher weiß man, dass ein System wesentlich besser ist als ein anderes?


Können wir ein großes annehmen ? n
Firebug

1
@ Firebug n wird normalerweise zwischen 7000 und 8760 sein.
Greenglass

Antworten:


6

Manchmal kann man dies in einer multiplen Regression erreichen, wobei A der DV ist, B die Punktzahl ist, die Menschen auf einer Skala haben, und C ein Dummy-Code ist, der besagt, dass es entweder B1 oder B2 ist : lm(A~B+C+B*C). Der Interaktionsterm gibt an B*C, ob die Korrelationen unterschiedlich sind, während einfache Steigungen zwischen A und B auf beiden Ebenen von C die Korrelationen anzeigen.

Es ist jedoch nicht möglich, alle Arten von Vergleichen zwischen Bedingungen in diesem Rahmen anzupassen. Das cocorR-Paket ist sehr nützlich und verfügt über eine sehr einfache Point-and-Click-Oberfläche im Web. Beachten Sie, dass Sie bei unterschiedlichen fehlenden Daten weder unabhängige noch abhängige Stichproben haben. Ich würde hier das listweise Löschen verwenden, um es einfach zu halten (und die Stromversorgung ist für Sie kein Problem).


2
Obwohl dies die kürzeste Antwort ist, hat mich der Link zu cocor zu den Informationen geführt, die ich brauchte. Danke vielmals.
Greenglass

15

Oh, die Kraft des Bootstraps. Schauen wir uns zur Veranschaulichung drei Vektoren an: EIN , B.1 und B.2 wobei:

C.Ör(EIN,B.1)=0,92
C.Ör(EIN,B.2)=0,86
Geben Sie hier die Bildbeschreibung ein

Ziel ist es festzustellen, ob die Korrelation dieser beiden Datensätze signifikant unterschiedlich ist. Indem Sie Bootstrap-Beispiele wie folgt nehmen:

 B <- 10000
 cor1 <- cor2 <- rep(0, B)
 for(i in 1:B){
   samp <- sample(n, n, TRUE)  
   cor1[i] <- cor(A[samp], B1[samp])
   cor2[i] <- cor(A[samp], B2[samp])
 }

Wir können die Bootstrap-Verteilungen der beiden Korrelationen darstellen: Geben Sie hier die Bildbeschreibung ein

Wir können auch 95% -Konfidenzintervalle für C.Ör(EIN,B.ich) .

95% CI für C.Örr(EIN,B.1) :

(0,897,0,947)

95% CI für C.Örr(EIN,B.2) :

(0,810,0,892)

Die Tatsache, dass sich die Intervalle nicht (kaum) überlappen, gibt uns Hinweise darauf, dass der Unterschied in den beobachteten Stichprobenkorrelationen tatsächlich statistisch signifikant ist.

Wie Amöbe in den Kommentaren hervorhebt, ergibt sich ein "leistungsfähigeres" Ergebnis daraus, dass für jedes Bootstrap-Beispiel der Unterschied ermittelt wird. Geben Sie hier die Bildbeschreibung ein

Ein 95% CI für die Differenz zwischen den beiden ist:

(0,019,0,108)

Wenn wir feststellen, dass das Intervall (kaum) 0 ausschließt, haben wir ähnliche Beweise wie zuvor.


Um das Problem mit fehlenden Daten zu beheben, wählen Sie einfach Ihre Bootstrap-Beispiele aus den Paaren aus, die in beiden Datensätzen enthalten sind.


7
Sie können dieses Verfahren verbessern, indem Sie den 95% -KI des cor1-cor2 berechnen und prüfen, ob er Null enthält oder nicht.
Amöbe

1
Das ist ein guter Punkt. Ich werde das in Kürze aufnehmen.
Knrumsey

Cool, +1.
Amöbe

1
Vielen Dank für diese Antwort. Es war sehr interessant und informativ geschrieben, obwohl es nicht das war, das ich letztendlich benutzt habe.
Greenglass

7

r1'=tanh- -1(r1)r2'=tanh- -1(r2)r1'=12ln(1+r11- -r1)r2'=12ln(1+r21- -r2)

Daraus folgt, dass aufgrund der Tatsache, dass die Fisher-transformierten Variablen jetzt normalverteilt sind und die Summe der normalverteilten Zufallsvariablen immer noch normalverteilt ist:

z=r1'- -r2'S.N.(0,1)

S.=S.12+S.22=1n1- -3+1n2- -3

H.0::z=0P.(z0)=2P.(Z.>|z|)

ttnt

- -

Nach dem Kommentar von @Josh können wir die Möglichkeit der gegenseitigen Abhängigkeit zwischen Stichproben etwas berücksichtigen (denken Sie daran, dass beide Korrelationen von der Verteilung von A abhängen). Ohne unabhängige Stichproben anzunehmen und die Cauchy-Schwarz-Ungleichung zu verwenden, können wir die folgende Obergrenze erhalten (siehe: Wie finde ich die Standardabweichung der Differenz zwischen zwei Mitteln? ):

S.S.1+S.2

S.1n1- -3+1n2- -3

2
Dies wäre meine Empfehlung gewesen, aber eine alternative Formel für die z-Transformation nach Fisher lautet z = 0,5 * ln ((1 + r) / (1-r)). Tun Sie dies für jedes r und gehen Sie wie oben vor.
Dbwilson

@dbwilson Oh ja (+1), sie sind gleichwertig. Ich werde Ihren Vorschlag hinzufügen, damit er einem breiteren Publikum klarer wird.
Firebug

r1r2

6

Nach hilfreichem Feedback von Mark White bearbeitet (danke!)

Eine Möglichkeit besteht darin, beide Beziehungen (B1 mit A und B2 mit A) in einem einzigen Modell zu berechnen, das auch den Unterschied zwischen ihnen schätzt. Dies ist mit multipler Regression leicht zu erreichen . Sie würden ein Modell mit A als abhängige Variable und dann eine kontinuierliche Variable mit allen Bewertungen für B1 und B2 ausführen, eine kategoriale Variable, die angibt, um welche Variable es sich handelt (B1 oder B2), und die Interaktion zwischen ihnen. In r:

> set.seed(24601)
> 
> library(tidyverse)
> library(mvtnorm)
> cov <- matrix(c(1, .4, .16,.4, 1, .4, .16, .4, 1), ncol=3, byrow=TRUE)
> mydata <- rmvnorm(n=100, sigma = cov)
> colnames(mydata) = c("A", "B1", "B2")
> head(mydata)
              A         B1         B2
[1,] -0.1046382  0.6031253  0.5641158
[2,] -1.9303293 -0.7663828 -0.7921836
[3,]  0.1244192 -0.4413581 -1.2376256
[4,] -3.2822601 -1.2512055 -0.5586773
[5,] -0.9543368 -0.1743740  1.1884185
[6,] -0.4843183 -0.2612668 -0.7161938

Hier sind die Korrelationen aus den Daten, die ich generiert habe:

> cor(mydata)
           A        B1        B2
A  1.0000000 0.4726093 0.3043496
B1 0.4726093 1.0000000 0.3779376
B2 0.3043496 0.3779376 1.0000000
> 

Ändern des Formats der Daten, um den Anforderungen des Modells zu entsprechen (Neuformatierung auf "lang"):

> mydata <- as.data.frame(mydata) %>% 
+   gather("var", "value", B1, B2)
> 

Hier ist das Modell:

Zusammenfassung (lm (A ~ Wert * var, Daten = mydata))

Call:
lm(formula = A ~ value * var, data = mydata)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.89310 -0.52638  0.02998  0.64424  2.85747 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.09699    0.09014  -1.076    0.283    
value        0.47445    0.09305   5.099 8.03e-07 ***
varB2       -0.10117    0.12711  -0.796    0.427    
value:varB2 -0.13256    0.13965  -0.949    0.344    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.891 on 196 degrees of freedom
Multiple R-squared:  0.158, Adjusted R-squared:  0.1451 
F-statistic: 12.26 on 3 and 196 DF,  p-value: 2.194e-07

Die Ergebnisse hier (aus meinen erfundenen Daten) legen nahe, dass es eine signifikante Beziehung zwischen B1 und A gibt (der Test des "Wert" -Koeffizienten, da B1 die Referenzgruppe für den "var" -Koeffizienten ist), aber dass der Unterschied zwischen der B1-Beziehung zu A und der B2-Beziehung zu A ist nicht signifikant (der Test des Koeffizienten "Wert: varB2").

Wenn Sie lieber in Korrelation als in Regressionskoeffizienten denken möchten, standardisieren Sie einfach alle Ihre Variablen (A, B1 und B2), bevor Sie das Modell ausführen. Die erhaltenen Regressionskoeffizienten werden standardisiert (nicht ganz dasselbe wie a Korrelation nullter Ordnung, aber in Bezug auf die Interpretation viel näher).

Beachten Sie auch, dass dies Ihre Analyse auf die Fälle beschränkt, in denen sowohl B1 als auch B2 vorhanden sind ( listweises Löschen ). Solange Sie genug Daten haben, um nicht unterversorgt zu sein, und solange die fehlenden Daten zufällig fehlen (oder ein ausreichend kleiner Teil der Gesamtdaten, um nicht viel zu bedeuten, auch wenn sie nicht zufällig fehlen), ist das in Ordnung.

Die Tatsache, dass Sie Ihre Analyse auf denselben Datensatz beschränken, um die Auswirkungen für B1 und B2 abzuschätzen (anstatt geringfügig unterschiedliche Datensätze zu verwenden, basierend auf den unterschiedlichen Mustern des Fehlens), hat den Vorteil, dass der Unterschied zwischen den Korrelationen ein wenig interpretiert wird direkter. Wenn Sie die Korrelationen für jede separat berechnen und dann den Unterschied zwischen ihnen testen , stoßen Sie auf das Problem, dass die zugrunde liegenden Daten in jedem Fall geringfügig unterschiedlich sind - jeder Unterschied, den Sie sehen, kann sowohl auf Unterschiede in den Stichproben als auch auf Unterschiede zurückzuführen sein in den tatsächlichen Beziehungen zwischen Variablen.


2
Ist es nicht der Fall, lm(A~B1*B2)der prüft, ob die Korrelation zwischen B1und A von der eigenen B2Punktzahl abhängt ? Dieser Interaktionsterm prüft nicht, ob die Korrelationen unterschiedlich sind. Es wird getestet, ob die beiden Prädiktoren miteinander interagieren. Sie könnten einen Dummy - Code erstellen, Cdass Codes , ob der Maßstab für Bist B1oder B2. Dann würde das Ihnen sagen, dass die Korrelation zwischen Bund Adavon abhängt, ob es ist B1oder B2ob die Korrelationen unterschiedlich sind.
Mark White

1
@ MarkWhite Oh mein Gott, du hast vollkommen recht! Danke, dass du das verstanden hast. Huch! Ich werde bearbeiten, um das zu beheben.
Rose Hartman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.