Comment déterminer si deux corrélations sont significativement différentes?

9

Je veux déterminer lequel des deux ensembles de données (B1, B2) correspond le mieux (pearsons r) à un autre ensemble (A). Il manque des données dans tous les ensembles de données. Comment puis-je déterminer si la corrélation résultante est significativement différente ou non?

Par exemple, 8426 valeurs sont présentes dans A et B1, r = 0,74. 8798 sont présents dans A et B2, r = 0,72.

Je pensais que cette question pourrait aider, mais elle est sans réponse: comment savoir qu'un système est nettement meilleur qu'un autre?

verre vert
la source
Pouvons-nous supposer un grand ? n
Firebug
1
@Firebug n sera généralement compris entre 7000 et 8760.
greenglass

Réponses:

6

Parfois , on pourrait être en mesure d' y arriver dans la régression multiple, où A est le DV, B est le peuple pointage ont à l'échelle, et C est un code factice qui dit qu'il est soit B1 ou B2: lm(A~B+C+B*C). Le terme d'interaction, B*Cvous indiquera si les corrélations sont différentes, tandis que les pentes simples entre A et B aux deux niveaux de C vous indiqueront les corrélations.

Cependant, il n'est pas possible d'adapter tous les types de comparaisons entre les conditions dans ce cadre. Le cocorpackage R est très utile, et il a une interface très simple pointer-cliquer sur le Web. Notez qu'avec des données manquantes différentes, vous n'avez ni échantillons indépendants ni dépendants. J'utiliserais la suppression par liste ici, pour rester simple (et le pouvoir n'est pas un problème pour vous).

Mark White
la source
2
Bien que ce soit la réponse la plus courte, le lien vers cocor est ce qui m'a dirigé vers les informations dont j'avais besoin. Merci beaucoup.
greenglass
15

Oh la puissance du bootstrap. Regardons trois vecteurs pour l'illustration: , et où: UNEB1B2

Cor(UNE,B1)=0,92
Cor(UNE,B2)=0,86
entrez la description de l'image ici

L'objectif est de déterminer si la corrélation de ces deux ensembles de données est significativement différente. En prenant des échantillons de bootstrap comme ceci:

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

Nous pouvons tracer les distributions bootstrap des deux corrélations: entrez la description de l'image ici

Nous pouvons également obtenir des intervalles de confiance à 95% pour .Cor(UNE,Bje)

IC à 95% pour : Corr(UNE,B1)

(0,897,0,947)

IC à 95% pour : Corr(UNE,B2)

(0,810,0,892)

Le fait que les intervalles ne se chevauchent pas (à peine) nous donne la preuve que la différence de corrélations d'échantillons que nous avons observée est effectivement statistiquement significative.

Comme le souligne amoeba dans les commentaires, un résultat plus "puissant" vient de la différence pour chacun des échantillons de bootstrap. entrez la description de l'image ici

Un IC à 95% pour la différence entre les deux est:

(0,019,0,108)

En notant que l'intervalle exclut (à peine) 0, nous avons des preuves similaires à celles précédentes.


Pour gérer le problème des données manquantes, sélectionnez simplement vos échantillons de bootstrap parmi les paires contenues dans les deux ensembles de données.

knrumsey
la source
7
Vous pouvez améliorer cette procédure en calculant l'IC à 95% du cor1-cor2 et en vérifiant s'il inclut zéro ou non.
amibe
1
C'est un bon point. Je vais l'inclure sous peu.
knrumsey
Cool, +1.
amibe
1
Merci pour cette réponse. C'était très intéressant et écrit de manière informative, même si ce n'est pas celui que j'ai fini par utiliser.
greenglass
7

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

Ensuite, il s'ensuit que, du fait que les variables transformées de Fisher sont maintenant normalement distribuées et que la somme des variables aléatoires normalement distribuées est toujours normalement distribuée:

z=r1-r2SN(0,1)

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

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

ttnt

-

Après le commentaire de @Josh , nous pouvons quelque peu incorporer la possibilité d'interdépendance entre les échantillons (rappelez-vous que les deux corrélations dépendent de la distribution de A). Sans supposer des échantillons indépendants et en utilisant l'inégalité de Cauchy-Schwarz, nous pouvons obtenir la borne supérieure suivante (voir: Comment puis-je trouver l'écart-type de la différence entre deux moyennes? ):

SS1+S2

S1n1-3+1n2-3
Pyromane
la source
2
Cela aurait été ma recommandation, mais une autre formule pour la transformation z de Fisher est z = 0,5 * ln ((1 + r) / (1-r)). Faites cela pour chaque r et procédez comme ci-dessus.
dbwilson
@dbwilson Oh ouais (+1), ils sont équivalents, je vais utiliser ajouter votre suggestion pour qu'elle soit plus claire pour un public plus large.
Firebug
r1r2
6

Modifié après les commentaires utiles de Mark White (merci!)

Une option consiste à calculer les deux relations (B1 avec A et B2 avec A) dans un modèle unique qui estime également la différence entre elles. Ceci est facile à réaliser avec une régression multiple . Vous exécuteriez un modèle avec A comme variable dépendante, puis une variable continue avec tous les scores pour B1 et B2, une variable catégorielle indiquant de quelle variable il s'agissait (B1 ou B2) et l'interaction entre eux. En 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

Voici les corrélations à partir des données que j'ai générées:

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

Modification du format des données pour répondre aux besoins du modèle (reformatage en "long"):

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

Voici le modèle:

résumé (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

Les résultats ici (à partir de mes données synthétiques) suggèrent qu'il existe une relation significative entre B1 et A (le test du coefficient "valeur", puisque B1 est le groupe de référence pour le coefficient "var"), mais que la différence entre la relation B1 avec A et la relation B2 avec A n'est pas significative (le test du coefficient "valeur: varB2").

Si vous aimez penser en termes de corrélation plutôt que de coefficients de régression, standardisez simplement toutes vos variables (A, B1 et B2) avant d'exécuter le modèle et les coefficients de régression que vous obtiendrez seront standardisés (pas tout à fait la même chose qu'un corrélation d'ordre zéro, mais beaucoup plus proche en termes d'interprétation).

Notez également que cela limitera votre analyse aux seuls cas qui ont à la fois B1 et B2 ( suppression par liste ). Tant que cela vous laisse suffisamment de données pour ne pas être sous-alimenté, et tant que les données manquantes sont manquantes de manière aléatoire (ou une proportion suffisamment petite du total des données pour ne pas avoir beaucoup d'importance même si elles manquent de manière non aléatoire), alors c'est bien.

Le fait que vous limitez votre analyse au même ensemble de données pour estimer les effets à la fois pour B1 et B2 (plutôt que d'utiliser des ensembles de données légèrement différents, en fonction des différents modèles de manque) a l'avantage de rendre l'interprétation de la différence entre les corrélations un peu plus simple. Si vous calculez les corrélations séparément pour chacune et testez ensuite la différence entre elles , vous rencontrez le problème que les données sous-jacentes sont légèrement différentes dans chaque cas --- toute différence que vous voyez pourrait être due à des différences dans les échantillons autant qu'à des différences dans les relations réelles entre les variables.

Rose Hartman
la source
2
N'est-ce pas le cas qui lm(A~B1*B2)testera si la corrélation entre B1et A dépend de son B2score ? Ce terme d'interaction ne teste pas si les corrélations sont différentes; il teste si les deux prédicteurs interagissent l'un avec l'autre. Vous pouvez créer un code factice, Cqui code si l'échelle pour Best B1ou non B2. Alors que diriez - vous dire que la corrélation entre Bet Adépend si elle est B1ou B2, qui est, si les corrélations sont différentes.
Mark White
1
@MarkWhite Oh mon Dieu, vous avez tout à fait raison! Merci d'avoir attrapé ça. Oui! Je vais modifier pour corriger cela.
Rose Hartman