İki korelasyonun önemli ölçüde farklı olup olmadığını nasıl belirleyebilirim?


9

İki veri kümesinden (B1, B2) hangisinin (pearson r) başka bir kümeye (A) daha iyi bağdaştığını belirlemek istiyorum. Tüm veri kümelerinde veri eksik. Ortaya çıkan korelasyonun önemli ölçüde farklı olup olmadığını nasıl belirleyebilirim?

Örneğin 8426 değerleri hem A hem de B1'de bulunur, r = 0.74. 8798 hem A hem de B2'de bulunur, r = 0.72.

Bu sorunun yardımcı olabileceğini düşündüm ama cevapsız: Bir sistemin diğerinden önemli ölçüde daha iyi olduğunu nasıl bilebilirim?


Büyük miyiz ? n
Firebug

1
@Firebug n genellikle 7000 ile 8760 arasında olacak.
greenglass

Yanıtlar:


6

Bazen bir A DV olan çoklu regresyon, içinde bunu gerçekleştirmek mümkün olabilir, B insanlar bir ölçekte olması puanıdır ve C o da B1 ya da B2 olduğunu söyleyen bir kukla kodudur: lm(A~B+C+B*C). Etkileşim terimi, B*Ckorelasyonların farklı olup olmadığını söylerken, her iki C seviyesindeki A ve B arasındaki basit eğimler size korelasyonları söyleyecektir.

Bununla birlikte, bu çerçevedeki koşullar arasında her türlü karşılaştırmaya uymak mümkün değildir. cocorR paketi çok faydalı olduğunu ve çok basit sahiptir web'de noktası ve tıkla arayüzü. Farklı eksik verilerle, ne bağımsız ne de bağımlı örnekleriniz olmadığını unutmayın. Basit tutmak için burada listwise silme işlemini kullanırdım (ve güç sizin için bir sorun değildir).


2
Her ne kadar bu en kısa cevap olsa da, beni ihtiyaç duyduğum bilgilere yönlendiren koza bağlantısı. Çok teşekkürler.
greenglass

15

Oh, önyüklemenin gücü. Resim için üç vektöre bakalım: , ve burada: birB1B2

CÖr(bir,B1)=0.92
CÖr(bir,B2)=0.86
resim açıklamasını buraya girin

Amaç, bu iki veri kümesinin korelasyonunun önemli ölçüde farklı olup olmadığını belirlemektir. Böyle bootstrap örnekleri alarak:

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

İki korelasyonun bootstrap dağılımlarını çizebiliriz: resim açıklamasını buraya girin

Ayrıca için% 95 Güven Aralığı elde edebiliriz .CÖr(bir,Bben)

için% 95 CI : CÖrr(bir,B1)

(0.897,0.947)

için% 95 CI : CÖrr(bir,B2)

(0.810,0.892)

Aralıkların örtüşmemesi (ancak) bize gözlemlediğimiz örnek korelasyonlardaki farkın gerçekten istatistiksel olarak anlamlı olduğuna dair bazı kanıtlar vermektedir.

Amip yorumlarda belirtildiği gibi, daha "güçlü" bir sonuç, her bir bootstrap örneği için fark elde etmekten gelir. resim açıklamasını buraya girin

İkisi arasındaki fark için% 95 CI:

(0.019,0.108)

Aralığın (zar zor) 0'ı hariç tuttuğunu belirterek, eskisine benzer kanıtlarımız var.


Eksik veri sorununu çözmek için, her iki veri kümesinde bulunan çiftlerden önyükleme örneklerinizi seçmeniz yeterlidir.


7
Bu prosedürü, cor1-cor2'nin% 95 CI'sini hesaplayarak ve sıfır içerip içermediğini kontrol ederek geliştirebilirsiniz.
amip

1
İyi bir noktaya değindin. Bunu kısaca ekleyeceğim.
knrumsey

Harika, +1.
amip

1
Bu cevap için teşekkürler. Çok ilginç ve bilgilendirici bir şekilde yazılmıştı, ancak kullandığım bir şey olmasa da.
greenglass

7

Fisher dönüşümünü varsayalım: ve . Veya eşdeğer ve belki de daha açık bir şekilde ( @dbwilson sayesinde !), ve .r1'=tanh-1(r1)r2'=tanh-1(r2)r1'=12ln(1+r11-r1)r2'=12ln(1+r21-r2)

Ardından, Fisher tarafından dönüştürülen değişkenlerin artık Normal olarak dağıtıldığı ve normal olarak dağıtılan rasgele değişkenlerin toplamının hala normal olarak dağıtıldığı sonucuna varılır:

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

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

Böylece elde ederek null hipotezlerini test .'H0:z=0P(z0)=2P(Z>|z|)

Alışılmış testi ile karşılaştırıldığında , istatistiklerini bu kadar kolay kullanamadığımıza dikkat edin , bkz . İki-t-dağılımları arasındaki farkın dağılımı nedir , bu nedenle hesaplama, yani varsayabiliriz normal yaklaşık ilgili makul olabilir çok büyük yeterince istatistiklerine.ttnt

-

@Josh tarafından yapılan yorumdan sonra, numuneler arasındaki karşılıklı bağımlılık olasılığını bir şekilde dahil edebiliriz (her iki korelasyonun A'nın dağılımına bağlı olduğunu unutmayın). Bağımsız örnekler varsaymadan ve Cauchy-Schwarz eşitsizliğini kullanmadan aşağıdaki üst sınırı elde edebiliriz (bkz: İki yol arasındaki farkın standart sapmasını nasıl bulabilirim? ):

SS1+S2

S1n1-3+1n2-3

2
Bu benim tavsiyem olurdu ama Fisher'ın z dönüşümü için alternatif bir formül z = .5 * ln ((1 + r) / (1-r)). Bunu her r için yapın ve yukarıdaki gibi devam edin.
dbwilson

@dbwilson Oh evet (+1), eşdeğerler, önerinizi eklemek için kullanacağım, böylece daha geniş bir kitleye daha net.
Firebug

Bu formül ve arasında bağımsızlık mu? Ben öyle olmadığını düşünürdüm ...r1r2
Josh

6

Mark White'dan gelen yararlı geri bildirimlerden sonra düzenlendi (teşekkür ederim!)

Bir seçenek, aralarındaki farkı da tahmin eden tek bir modelde her iki ilişkiyi (A ile B1 ve A ile B2) hesaplamaktır. Bunu çoklu regresyon ile başarmak kolaydır . Bağımlı değişken olarak A ile bir model ve daha sonra B1 ve B2 için tüm puanları içeren bir sürekli değişken, hangi değişken olduğunu (B1 veya B2) ve aralarındaki etkileşimi gösteren kategorik bir değişken çalıştırırsınız. R cinsinden:

> 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

Oluşturduğum verilerden korelasyonlar:

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

Verilerin biçimini modelin gereksinimlerini karşılayacak şekilde değiştirme ("uzun" olarak yeniden biçimlendirme):

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

İşte model:

özet (lm (A ~ değer * var, veri = verilerim))

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

Buradaki sonuçlar (yapılanma verilerimden), B1 ve A ("değer" katsayısının testi, çünkü B1 "var" katsayısı için referans grubu olduğundan) arasında anlamlı bir ilişki olduğunu, ancak farkın A ile B1 ilişkisi ve A ile B2 ilişkisi önemli değildir ("değer: varB2" katsayısının testi).

Regresyon katsayıları yerine korelasyon açısından düşünmeyi seviyorsanız, modeli çalıştırmadan önce tüm değişkenlerinizi (A, B1 ve B2) standartlaştırmanız yeterlidir ve alacağınız regresyon katsayıları standartlaştırılacaktır ( sıfır mertebe korelasyon, ancak yorumlama açısından çok daha yakın).

Ayrıca, bunun analizinizi yalnızca hem B1 hem de B2'ye sahip olanlarla ( listwise silme ) sınırlandıracağını unutmayın . Bu, size yetersiz güç verilmemesi için yeterli veri bıraktığı sürece ve eksik veriler rasgele eksik olduğu sürece (veya rasgele eksik olsalar bile toplam verilerin yeterince küçük bir kısmı) önemli değil.

Analizinizi hem B1 hem de B2 için etkileri tahmin etmek için aynı veri kümesiyle sınırlandırmış olmanız (farklı eksiklik modellerine dayalı olarak biraz farklı veri kümeleri kullanmak yerine), korelasyonlar arasındaki farkın biraz yorumlanması avantajına sahiptir. daha basit. Eğer varsa her biri için ayrı ayrı korelasyonları hesaplamak ve sonra aralarındaki farkı test etmek , temeldeki veri her durumda biraz farklı olduğunu sorun çıkıyor --- nedeniyle farklılıkların olduğu kadar örneklerin farklılıklardan olabileceğin gördüğünüz herhangi bir fark değişkenler arasındaki gerçek ilişkilerde.


2
Bu değil mi lm(A~B1*B2)arasındaki korelasyon olmadığını test edecek B1ve A kişinin bağlıdır B2skoru ? Bu etkileşim terimi korelasyonların farklı olup olmadığını test etmemektedir; iki öngörücünün birbiriyle etkileşip etkileşmediğini test ediyor. Sen, bir kukla kod oluşturabilir Ckodları olsun veya olmasın ölçek için o Bolduğunu B1veya B2. O zaman bu size Bve arasındaki ilişkinin ya da yani korelasyonların farklı olup Aolmadığına bağlı olduğunu söyler . B1B2
Mark White

1
@MarkWhite Oh tanrım, tamamen haklısın! Yakaladığınız için teşekkürler. Olmadı! Bunu düzeltmek için düzenleyeceğim.
Rose Hartman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.