¿Cómo determino si dos correlaciones son significativamente diferentes?


9

Quiero determinar cuál de los dos conjuntos de datos (B1, B2) se correlaciona mejor (pearsons r) con otro conjunto (A). Faltan datos en todos los conjuntos de datos. ¿Cómo puedo determinar si la correlación resultante es significativamente diferente o no?

Por ejemplo, los valores 8426 están presentes tanto en A como en B1, r = 0.74. 8798 están presentes tanto en A como en B2, r = 0.72.

Pensé que esta pregunta podría ayudar, pero no tiene respuesta: ¿Cómo saber que un sistema es significativamente mejor que otro?


¿Podemos suponer grande ? n
Firebug

1
@Firebug n generalmente estará entre 7000 y 8760.
greenglass

Respuestas:


6

A veces uno puede ser capaz de lograr esto en la regresión múltiple, donde A es el DV, B es la puntuación de la gente tiene en una escala, y C es un código ficticio que dice que es o bien B1 o B2: lm(A~B+C+B*C). El término de interacción B*C, le dirá si las correlaciones son diferentes, mientras que las pendientes simples entre A y B en ambos niveles de C le indicarán las correlaciones.

Sin embargo, no es posible ajustar todos los tipos de comparaciones entre condiciones en este marco. El cocorpaquete R es muy útil y tiene una interfaz muy simple de apuntar y hacer clic en la web. Tenga en cuenta que, con diferentes datos faltantes, no tiene muestras independientes ni dependientes. Usaría la eliminación por listas aquí, para que sea simple (y el poder no es un problema para usted).


2
Aunque esta es la respuesta más corta, el enlace a Cocor es lo que me dirigió hacia la información que necesitaba. Muchas gracias.
greenglass

15

Oh, el poder del bootstrap. Veamos tres vectores para la ilustración: UNA , si1 y si2 donde:

Cor(UNA,si1)=0,92
Cor(UNA,si2)=0,86
ingrese la descripción de la imagen aquí

El objetivo es determinar si la correlación de estos dos conjuntos de datos es significativamente diferente. Al tomar muestras de bootstrap así:

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

Podemos trazar las distribuciones de arranque de las dos correlaciones: ingrese la descripción de la imagen aquí

También podemos obtener intervalos de confianza del 95% para Cor(UNA,siyo) .

95% CI para Corr(UNA,si1) :

(0.897,0.947)

IC del 95% para Corr(UNA,si2) :

(0.810,0.892)

El hecho de que los intervalos no se superpongan (apenas) nos da alguna evidencia de que la diferencia en las correlaciones muestrales que observamos es de hecho estadísticamente significativa.

Como la ameba señala en los comentarios, un resultado más "poderoso" proviene de obtener la diferencia para cada una de las muestras de bootstrap. ingrese la descripción de la imagen aquí

Un IC del 95% para la diferencia entre los dos es:

(0,019,0,108)

Observando que el intervalo (apenas) excluye 0, tenemos evidencia similar a la anterior.


Para manejar el problema de datos faltantes, simplemente seleccione sus muestras de bootstrap de los pares que están contenidos en ambos conjuntos de datos.


77
Puede mejorar este procedimiento calculando el IC del 95% de cor1-cor2 y comprobando si incluye cero o no.
ameba

1
Ese es un buen punto. Lo incluiré en breve.
knrumsey

Genial, +1.
ameba

1
Gracias por esta respuesta Fue muy interesante e informativamente escrito, aunque no fue el que terminé usando.
greenglass

7

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

Luego se deduce que, debido al hecho de que las variables transformadas de Fisher ahora están normalmente distribuidas y la suma de las variables aleatorias normalmente distribuidas todavía se distribuye normalmente:

z=r1-r2Snorte(0 0,1)

S=S12+S22=1norte1-3+1norte2-3

H0 0:z=0 0PAG(z0 0)=2PAG(Z>El |zEl |)

ttnortet

-

Después del comentario de @Josh , podemos incorporar de alguna manera la posibilidad de interdependencia entre muestras (recuerde que ambas correlaciones dependen de la distribución de A). Sin suponer muestras independientes y usar la desigualdad de Cauchy-Schwarz, podemos obtener el siguiente límite superior (ver: ¿Cómo encuentro la desviación estándar de la diferencia entre dos medias? ):

SS1+S2

S1norte1-3+1norte2-3

2
Esta habría sido mi recomendación, pero una fórmula alternativa para la transformación z de Fisher es z = .5 * ln ((1 + r) / (1-r)). Haga esto para cada r y proceda como se indicó anteriormente.
dbwilson

@dbwilson Oh sí (+1), son equivalentes, usaré agregar su sugerencia para que sea más claro para un público más amplio.
Firebug

r1r2

6

Editado después de comentarios útiles de Mark White (¡gracias!)

Una opción es calcular ambas relaciones (B1 con A y B2 con A) en un solo modelo que también estima la diferencia entre ellas. Esto es fácil de lograr con regresión múltiple . Ejecutaría un modelo con A como variable dependiente, y luego una variable continua con todos los puntajes para B1 y B2, una variable categórica que indica qué variable era (B1 o B2), y la interacción entre ellos. 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

Aquí están las correlaciones de los datos que generé:

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

Cambiar el formato de los datos para satisfacer las necesidades del modelo (reformatear a "largo"):

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

Aquí está el modelo:

resumen (lm (A ~ valor * 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

Los resultados aquí (de mis datos inventados) sugieren que existe una relación significativa entre B1 y A (la prueba del coeficiente de "valor", ya que B1 es el grupo de referencia para el coeficiente "var"), pero que la diferencia entre la relación B1 con A y la relación B2 con A no es significativa (la prueba del coeficiente "valor: varB2").

Si le gusta pensar en términos de correlación en lugar de coeficientes de regresión, simplemente estandarice todas sus variables (A, B1 y B2) antes de ejecutar el modelo y los coeficientes de regresión que obtendrá serán estandarizados (no exactamente lo mismo que un correlación de orden cero, pero mucho más cercana en términos de interpretación).

También tenga en cuenta que esto va a restringir su análisis sólo a los casos que tienen tanto B1 y B2 ( eliminación por lista ). Mientras eso te deje con suficientes datos para no tener poca potencia, y mientras los datos faltantes falten al azar (o una proporción lo suficientemente pequeña del total de datos como para no importar mucho, incluso si faltan de manera no aleatoria), entonces está bien.

El hecho de que esté restringiendo su análisis al mismo conjunto de datos para estimar los efectos tanto para B1 como para B2 (en lugar de usar conjuntos de datos ligeramente diferentes, basados ​​en los diferentes patrones de falta) tiene la ventaja de interpretar un poco la diferencia entre correlaciones Más sencillo. Si calcula las correlaciones por separado para cada una y luego prueba la diferencia entre ellas , se encuentra con el problema de que los datos subyacentes son ligeramente diferentes en cada caso: cualquier diferencia que vea podría deberse tanto a diferencias en las muestras como a diferencias en las relaciones reales entre variables.


2
¿No es el caso que lm(A~B1*B2)pondrá a prueba si la correlación entre B1y A depende de la B2puntuación de uno ? Ese término de interacción no prueba si las correlaciones son diferentes; está probando si los dos predictores interactúan entre sí. Puede crear un código ficticio, Cque codifica si la escala Bes B1o no B2. Entonces eso le diría que la correlación entre By Adepende de si es B1o B2, es decir, si las correlaciones son diferentes.
Mark White

1
@ MarkWhite Oh, Dios, tienes toda la razón! Gracias por atrapar eso. ¡Ay! Lo editaré para arreglar eso.
Rose Hartman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.