Como determino se duas correlações são significativamente diferentes?

9

Quero determinar qual dos dois conjuntos de dados (B1, B2) melhor se correlaciona (pearsons r) a outro conjunto (A). Faltam dados em todos os conjuntos de dados. Como posso determinar se a correlação resultante é significativamente diferente ou não?

Por exemplo, os valores 8426 estão presentes em A e B1, r = 0,74. 8798 estão presentes em A e B2, r = 0,72.

Achei que essa pergunta pudesse ajudar, mas não foi respondida: como saber que um sistema é significativamente melhor que outro?

greenglass
fonte
Podemos assumir grande ? n
Firebug
11
@Firebug n é geralmente vai ser entre 7000 e 8760.
Greenglass

Respostas:

6

Às vezes um pode ser capaz de fazer isso em regressão múltipla, onde A é o DV, B é a pontuação pessoas têm em uma escala, e C é um código fictício que diz que é B1 ou B2: lm(A~B+C+B*C). O termo de interação, B*Cdirá se as correlações são diferentes, enquanto simples inclinações entre A e B nos dois níveis de C indicarão as correlações.

No entanto, não é possível ajustar todos os tipos de comparações entre condições nesta estrutura. O cocorpacote R é muito útil e possui uma interface simples de apontar e clicar na web. Observe que, com diferentes dados ausentes, você não tem amostras independentes nem dependentes. Eu usaria a exclusão listwise aqui, para mantê-lo simples (e o poder não é um problema para você).

Mark White
fonte
2
Embora essa seja a resposta mais curta, o link para a cocor é o que me direcionou para as informações de que eu precisava. Muito Obrigado.
Greenglass
15

Oh, o poder do bootstrap. Vamos analisar três vetores para ilustração: , e onde: AB1B2

Cor(A,B1)=0.92
Cor(A,B2)=0.86
insira a descrição da imagem aqui

O objetivo é determinar se a correlação desses dois conjuntos de dados é significativamente diferente. Ao coletar amostras de bootstrap da seguinte forma:

 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 plotar as distribuições de bootstrap das duas correlações: insira a descrição da imagem aqui

Também podemos obter intervalos de confiança de 95% para .Cor(A,Bi)

IC95% para : Corr(A,B1)

(0.897,0.947)

IC95% para : Corr(A,B2)

(0.810,0.892)

O fato de que os intervalos não se sobrepõem (apenas) nos dá alguma evidência de que a diferença nas correlações da amostra que observamos é realmente estatisticamente significativa.

Como a ameba aponta nos comentários, um resultado mais "poderoso" vem da obtenção da diferença para cada uma das amostras de inicialização. insira a descrição da imagem aqui

Um IC de 95% para a diferença entre os dois é:

(0.019,0.108)

Observando que o intervalo (apenas) exclui 0, temos evidências semelhantes às de antes.


Para lidar com o problema de dados ausentes, basta selecionar suas amostras de autoinicialização dos pares contidos nos dois conjuntos de dados.

Knrumsey
fonte
7
Você pode melhorar esse procedimento calculando o IC 95% do cor1-cor2 e verificando se ele inclui zero ou não.
Ameba
11
Este é um bom ponto. Vou incluir isso em breve.
knrumsey
Legal, +1.
ameba
11
Obrigado por esta resposta. Foi muito interessante e informativo, apesar de não ter sido o que acabei usando.
Greenglass
7

Suponha a transformação Fisher: e . Ou, de maneira equivalente e talvez mais clara (graças a @dbwilson !), e .r1=tanh1(r1)r2=tanh1(r2)r1=12ln(1+r11r1)r2=12ln(1+r21r2)

Então, devido ao fato de as variáveis ​​transformadas de Fisher agora estarem normalmente distribuídas e a soma de variáveis ​​aleatórias normalmente distribuídas ainda estar normalmente distribuída:

z=r1r2SN(0,1)
Com

S=S12+S22=1n13+1n23

Portanto, você testa as hipóteses nulas obtendo .H0:z=0P(z0)=2P(Z>|z|)

Em comparação com a habitual -teste, aviso que não poderia usar as -Estatísticas tão facilmente, consulte Qual é a distribuição da diferença de dois t-distribuições , por isso há uma consideração a ser feita sobre os graus de liberdade disponíveis o cálculo, ou seja , assumimos grande o suficiente para que a aproximação normal possa ser razoavelmente razoável para as respectivas estatísticas .ttnt

-

Após o comentário de @Josh , podemos incorporar um pouco a possibilidade de interdependência entre amostras (lembre-se de que ambas as correlações dependem da distribuição de A). Sem assumir amostras independentes e usar a desigualdade de Cauchy-Schwarz, podemos obter o seguinte limite superior (consulte: Como encontro o desvio padrão da diferença entre duas médias? ):

SS1+S2

S1n13+1n23
Firebug
fonte
2
Essa teria sido minha recomendação, mas uma fórmula alternativa para a transformação z de Fisher é z = 0,5 * ln ((1 + r) / (1-r)). Faça isso para cada re proceda como acima.
dbwilson
@dbwilson Ah, sim (+1), eles são equivalentes, vou adicionar a sua sugestão para que fique mais clara para um público mais amplo.
Firebug
Essa fórmula não assume independência entre e ? Eu acho que eles não são ...r 2r1r2
Josh
6

Editado após feedback útil de Mark White (obrigado!)

Uma opção é calcular os dois relacionamentos (B1 com A e B2 com A) em um único modelo que também calcula a diferença entre eles. Isso é fácil de realizar com regressão múltipla . Você executaria um modelo com A como variável dependente e, em seguida, uma variável contínua com todas as pontuações para B1 e B2, uma variável categórica indicando qual variável era (B1 ou B2) e a interação entre elas. Em 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

Aqui estão as correlações dos dados que eu gerei:

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

Alterando o formato dos dados para atender às necessidades do modelo (reformatando para "longo"):

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

Aqui está o modelo:

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

Os resultados aqui (dos meus dados elaborados) sugerem que existe uma relação significativa entre B1 e A (o teste do coeficiente "valor", pois B1 é o grupo de referência para o coeficiente "var"), mas que a diferença entre o relacionamento B1 com A e o relacionamento B2 com A não é significativo (o teste do coeficiente "valor: varB2").

Se você gosta de pensar em termos de correlação, em vez de coeficientes de regressão, apenas padronize todas as suas variáveis ​​(A, B1 e B2) antes de executar o modelo, e os coeficientes de regressão obtidos serão padronizados (não exatamente a mesma coisa que um correlação de ordem zero, mas muito mais próxima em termos de interpretação).

Note também que esta vai restringir sua análise apenas aos casos que têm tanto B1 e B2 ( listwise eliminação ). Desde que isso deixe você com dados suficientes para não ficar com pouca potência e contanto que os dados ausentes estejam faltando aleatoriamente (ou uma proporção pequena o suficiente do total de dados para não importar muito, mesmo que estejam ausentes de maneira não aleatória), tudo bem.

O fato de você restringir sua análise ao mesmo conjunto de dados para estimar efeitos para B1 e B2 (em vez de usar conjuntos de dados ligeiramente diferentes, com base nos diferentes padrões de falta) tem a vantagem de interpretar um pouco a diferença entre correlações mais direto. Se você calcular as correlações separadamente para cada uma delas e depois testar a diferença entre elas , terá o problema de que os dados subjacentes são ligeiramente diferentes em cada caso - qualquer diferença que você vê pode ser devido a diferenças nas amostras e a diferenças nas relações reais entre variáveis.

Rose Hartman
fonte
2
Não é o caso que lm(A~B1*B2)testará se a correlação entre B1e A depende da B2pontuação de alguém ? Esse termo de interação não está testando se as correlações são diferentes; está testando se os dois preditores interagem entre si. Você pode criar um código fictício, Cque codifique se a escala Bé B1ou não ou B2. Isso indicaria que a correlação entre Be Adepende de se é B1ou B2, se é, se as correlações são diferentes.
Mark White
11
@ MarkWhite Oh Deus, você está totalmente certo! Obrigado por capturar isso. Caramba! Vou editar para corrigir isso.
Rose Hartman