Come posso determinare se due correlazioni sono significativamente diverse?


9

Voglio determinare quale di due serie di dati (B1, B2) sia meglio correlata (pere r) a un'altra serie (A). Mancano dati in tutti i set di dati. Come posso determinare se la correlazione risultante è significativamente diversa o no?

Ad esempio 8426 valori sono presenti sia in A che in B1, r = 0,74. 8798 sono presenti sia in A che B2, r = 0,72.

Ho pensato che questa domanda potesse essere d'aiuto, ma è senza risposta: come sapere che un sistema è significativamente migliore di un altro?


Possiamo assumere grande ? n
Firebug,

1
@Firebug n è di solito sta per essere tra il 7000 e il 8760.
Greenglass

Risposte:


6

A volte si potrebbe essere in grado di raggiungere questo obiettivo in regressione multipla, dove A è il DV, B è il punteggio le persone hanno su scala, e C è un codice fittizio che dice che è sia B1 o B2: lm(A~B+C+B*C). Il termine di interazione B*C, ti dirà se le correlazioni sono diverse, mentre semplici pendenze tra A e B ad entrambi i livelli di C ti diranno le correlazioni.

Tuttavia, non è possibile adattare tutti i tipi di confronti tra condizioni in questo quadro. Il cocorpacchetto R è molto utile e ha un'interfaccia point-and-click molto semplice sul web. Si noti che, con diversi dati mancanti, non si hanno campioni indipendenti o dipendenti. Vorrei usare la cancellazione listwise qui, per mantenerlo semplice (e il potere non è un problema per te).


2
Sebbene questa sia la risposta più breve, il link a Cocor è ciò che mi ha indirizzato verso le informazioni di cui avevo bisogno. Grazie molto.
greenglass,

15

Oh il potere del bootstrap. Vediamo tre vettori per l'illustrazione: , e dove: UNB1B2

Cor(UN,B1)=0.92
Cor(UN,B2)=0.86
inserisci qui la descrizione dell'immagine

L'obiettivo è determinare se la correlazione di questi due set di dati è significativamente diversa. Prendendo campioni bootstrap in questo modo:

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

Possiamo tracciare le distribuzioni bootstrap delle due correlazioni: inserisci qui la descrizione dell'immagine

Possiamo anche ottenere intervalli di confidenza al 95% per .Cor(UN,Bio)

IC al 95% per : Corr(UN,B1)

(0,897,0,947)

IC al 95% per : Corr(UN,B2)

(0,810,0,892)

Il fatto che gli intervalli non si sovrappongano (a malapena) ci fornisce alcune prove del fatto che la differenza nelle correlazioni dei campioni che abbiamo osservato è statisticamente significativa.

Come sottolinea l'ameba nei commenti, un risultato più "potente" deriva dall'ottenere la differenza per ciascuno dei campioni bootstrap. inserisci qui la descrizione dell'immagine

Un IC al 95% per la differenza tra i due è:

(0,019,0,108)

Notando che l'intervallo (a malapena) esclude 0, abbiamo prove simili a prima.


Per gestire il problema dei dati mancanti, basta selezionare i campioni bootstrap dalle coppie contenute in entrambi i set di dati.


7
È possibile migliorare questa procedura calcolando il 95% CI di cor1-cor2 e verificando se include zero o meno.
ameba,

1
È un buon punto. Lo includerò tra poco.
Knrumsey,

Bene, +1.
amoeba

1
Grazie per questa risposta Era molto interessante e scritto in modo informativo, anche se non era quello che ho finito per usare.
greenglass

7

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

Quindi ne consegue che, a causa del fatto che le variabili trasformate di Fisher sono ora normalmente distribuite e la somma delle variabili casuali normalmente distribuite è ancora normalmente distribuita:

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

S=S12+S22=1n1-3+1n2-3

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

ttnt

-

Dopo il commento di @Josh , possiamo in qualche modo incorporare la possibilità di interdipendenza tra i campioni (ricordare che entrambe le correlazioni dipendono dalla distribuzione di A). Senza assumere campioni indipendenti e usare la disuguaglianza di Cauchy-Schwarz possiamo ottenere il seguente limite superiore (vedi: Come posso trovare la deviazione standard della differenza tra due mezzi? ):

SS1+S2

S1n1-3+1n2-3

2
Questa sarebbe stata la mia raccomandazione, ma una formula alternativa per la trasformazione z di Fisher è z = .5 * ln ((1 + r) / (1-r)). Fare questo per ogni r e procedere come sopra.
dbwilson,

@dbwilson Oh yeah (+1), sono equivalenti, userò aggiungere il tuo suggerimento in modo che sia più chiaro per un pubblico più ampio.
Firebug,

r1r2

6

Modificato dopo un utile feedback di Mark White (grazie!)

Un'opzione è calcolare entrambe le relazioni (B1 con A e B2 con A) in un singolo modello che stima anche la differenza tra loro. Questo è facile da realizzare con regressione multipla . Dovresti eseguire un modello con A come variabile dipendente, quindi una variabile continua con tutti i punteggi per B1 e B2, una variabile categoriale che indica quale variabile era (B1 o B2) e l'interazione tra di loro. 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

Ecco le correlazioni dai dati che ho generato:

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

Modifica del formato dei dati per soddisfare le esigenze del modello (riformattazione in "lungo"):

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

Ecco il modello:

riepilogo (lm (A ~ value * var, data = 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

I risultati qui (dai miei dati inventati) suggeriscono che esiste una relazione significativa tra B1 e A (il test del coefficiente "valore", poiché B1 è il gruppo di riferimento per il coefficiente "var"), ma che la differenza tra la relazione B1 con A e la relazione B2 con A non è significativa (il test del coefficiente "valore: varB2").

Se ti piace pensare in termini di correlazione piuttosto che di coefficienti di regressione, basta standardizzare tutte le variabili (A, B1 e B2) prima di eseguire il modello e i coefficienti di regressione che otterrai saranno standardizzati (non esattamente la stessa cosa di un correlazione di ordine zero, ma molto più vicina in termini di interpretazione).

Si noti inoltre che ciò limiterà la tua analisi solo ai casi che hanno sia B1 che B2 ( cancellazione listwise ). Fintanto che ti lascia abbastanza dati per non essere sottodimensionato e fintanto che i dati mancanti mancano in modo casuale (o una proporzione abbastanza piccola dei dati totali per non importare molto anche se mancano in modo casuale), allora va bene.

Il fatto che stai limitando la tua analisi allo stesso set di dati per stimare gli effetti sia per B1 che per B2 (piuttosto che usare set di dati leggermente diversi, basati su diversi modelli di mancanza) ha il vantaggio di rendere leggermente l'interpretazione della differenza tra correlazioni più semplice. Se si calcolano le correlazioni separatamente per ciascuna e quindi si verifica la differenza tra loro , si verifica il problema che i dati sottostanti sono leggermente diversi in ogni caso --- qualsiasi differenza che vedi potrebbe essere dovuta alle differenze nei campioni tanto quanto alle differenze nelle relazioni effettive tra variabili.


2
Non è il caso che lm(A~B1*B2)metterà alla prova se la correlazione tra B1e A dipende dal proprio B2punteggio ? Quel termine di interazione non sta verificando se le correlazioni sono diverse; sta testando se i due predittori interagiscono tra loro. È possibile creare un codice fittizio, Cche Bindica se la scala è B1o meno B2. Quindi questo ti direbbe che la correlazione tra Be Adipende da se è B1o B2, cioè, se le correlazioni sono diverse.
Mark White,

1
@MarkWhite Oh cavolo, hai perfettamente ragione! Grazie per averlo colto. Yikes! Modificherò per risolverlo.
Rose Hartman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.