Bagaimana saya menentukan apakah dua korelasi berbeda secara signifikan?

9

Saya ingin menentukan yang mana dari dua set data (B1, B2) berkorelasi lebih baik (pearsons r) ke set lain (A). Ada data yang hilang di semua set data. Bagaimana saya bisa menentukan apakah korelasi yang dihasilkan berbeda secara signifikan atau tidak?

Misalnya, nilai-nilai 8426 hadir dalam A dan B1, r = 0,74. 8798 hadir dalam A dan B2, r = 0,72.

Saya pikir pertanyaan ini mungkin membantu tetapi tidak dijawab: Bagaimana mengetahui satu sistem secara signifikan lebih baik daripada yang lain?

greenglass
sumber
Bisakah kita menganggap besar ? n
Firebug
1
@ Firebug n biasanya akan antara 7000 dan 8760.
greenglass

Jawaban:

6

Kadang-kadang satu mungkin bisa mencapai hal ini dalam regresi berganda, di mana A adalah DV, B adalah skor orang memiliki pada skala, dan C adalah kode dummy yang mengatakan itu adalah baik B1 atau B2: lm(A~B+C+B*C). Istilah interaksi B*C,, akan memberi tahu Anda jika korelasinya berbeda, sementara kemiringan sederhana antara A dan B pada kedua tingkat C akan memberi tahu Anda korelasinya.

Namun, tidak mungkin untuk mencocokkan semua jenis perbandingan antara kondisi dalam kerangka kerja ini. The cocorpaket R sangat berguna, dan memiliki sangat sederhana antarmuka point-and-klik di web. Perhatikan bahwa, dengan data hilang yang berbeda, Anda tidak memiliki sampel independen maupun tergantung. Saya akan menggunakan penghapusan listwise di sini, untuk membuatnya tetap sederhana (dan kekuasaan bukan masalah bagi Anda).

Mark White
sumber
2
Meskipun ini adalah jawaban terpendek, tautan ke cocor adalah yang mengarahkan saya ke informasi yang saya butuhkan. Terimakasih banyak.
greenglass
15

Oh kekuatan bootstrap. Mari kita lihat tiga vektor untuk ilustrasi: , dan mana: SEBUAHB1B2

CHair(SEBUAH,B1)=0,92
CHair(SEBUAH,B2)=0,86
masukkan deskripsi gambar di sini

Tujuannya adalah untuk menentukan apakah korelasi dari dua set data ini berbeda secara signifikan. Dengan mengambil sampel bootstrap seperti:

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

Kami dapat merencanakan distribusi bootstrap dari dua korelasi: masukkan deskripsi gambar di sini

Kami juga dapat memperoleh Interval Kepercayaan 95% untuk .CHair(SEBUAH,Bsaya)

95% CI untuk : CHairr(SEBUAH,B1)

(0,897,0,947)

95% CI untuk : CHairr(SEBUAH,B2)

(0,810,0,892)

Fakta bahwa interval tidak tumpang tindih (nyaris) memberi kita beberapa bukti bahwa perbedaan dalam korelasi sampel yang kami amati memang signifikan secara statistik.

Seperti yang ditunjukkan amuba dalam komentar, hasil yang lebih "kuat" berasal dari perbedaan untuk masing-masing sampel bootstrap. masukkan deskripsi gambar di sini

A 95% CI untuk perbedaan antara keduanya adalah:

(0,019,0,108)

Memperhatikan bahwa interval (nyaris) tidak termasuk 0, kami memiliki bukti yang sama seperti sebelumnya.


Untuk menangani masalah data yang hilang, cukup pilih sampel bootstrap Anda dari pasangan yang terkandung dalam kedua set data.

Knrumsey
sumber
7
Anda dapat meningkatkan prosedur ini dengan menghitung 95% CI dari cor1-cor2, dan memeriksa apakah itu termasuk nol atau tidak.
amoeba
1
Itu poin yang bagus. Saya akan memasukkan itu segera.
Knrumsey
Keren, +1.
amoeba
1
Terima kasih atas jawaban ini. Itu sangat menarik dan ditulis secara informatif, meskipun bukan yang akhirnya saya gunakan.
greenglass
7

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

Maka karena itu, karena variabel Fisher berubah sekarang terdistribusi secara normal dan jumlah variabel acak yang terdistribusi normal masih terdistribusi normal:

z=r1-r2SN(0,1)

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

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

ttnt

-

Setelah komentar oleh @Josh , kita bisa menggabungkan kemungkinan saling ketergantungan antara sampel (ingat kedua korelasi tergantung pada distribusi A). Tanpa mengasumsikan sampel independen dan menggunakan ketidaksetaraan Cauchy-Schwarz kita bisa mendapatkan batas atas berikut (lihat: Bagaimana cara menemukan standar deviasi perbedaan antara dua cara? ):

SS1+S2

S1n1-3+1n2-3
Pembakar
sumber
2
Ini akan menjadi rekomendasi saya tetapi formula alternatif untuk transformasi z Fisher adalah z = .5 * ln ((1 + r) / (1-r)). Lakukan ini untuk setiap r dan lanjutkan seperti di atas.
dbwilson
@dbwilson Oh yeah (+1), mereka setara, saya akan menggunakan tambahkan saran Anda agar lebih jelas untuk audiens yang lebih luas.
Firebug
r1r2
6

Diedit setelah umpan balik bermanfaat dari Mark White (terima kasih!)

Salah satu opsi adalah untuk menghitung kedua hubungan (B1 dengan A, dan B2 dengan A) dalam model tunggal yang juga memperkirakan perbedaan di antara mereka. Ini mudah dicapai dengan regresi berganda . Anda akan menjalankan model dengan A sebagai variabel dependen, dan kemudian satu variabel kontinu dengan semua skor untuk B1 dan B2, variabel kategori yang menunjukkan variabel mana itu (B1 atau B2), dan interaksi di antara mereka. Dalam 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

Berikut adalah korelasi dari data yang saya hasilkan:

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

Mengubah format data untuk memenuhi kebutuhan model (format ulang ke "panjang"):

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

Inilah modelnya:

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

Hasil di sini (dari data buatan saya) menunjukkan bahwa ada hubungan yang signifikan antara B1 dan A (tes dari koefisien "nilai", karena B1 adalah kelompok referensi untuk koefisien "var"), tetapi perbedaannya adalah antara hubungan B1 dengan A dan hubungan B2 dengan A tidak signifikan (uji koefisien "value: varB2").

Jika Anda suka berpikir dalam hal korelasi daripada koefisien regresi, cukup standarisasi semua variabel Anda (A, B1, dan B2) sebelum menjalankan model dan koefisien regresi yang akan Anda dapatkan akan distandarisasi (tidak sama persis dengan korelasi zero-order, tetapi lebih dekat dalam hal interpretasi).

Juga mencatat bahwa ini akan membatasi analisis Anda hanya kasus-kasus yang memiliki baik B1 dan B2 ( listwise penghapusan ). Selama itu membuat Anda memiliki data yang cukup untuk tidak kekurangan tenaga, dan selama data yang hilang hilang secara acak (atau proporsi yang cukup kecil dari total data tidak menjadi masalah bahkan jika mereka hilang secara non-acak), maka itu tidak masalah.

Fakta bahwa Anda membatasi analisis Anda ke dataset yang sama untuk memperkirakan efek untuk B1 dan B2 (daripada menggunakan dataset yang sedikit berbeda, berdasarkan pada pola-pola yang hilang) memiliki keuntungan dalam membuat interpretasi perbedaan antara korelasi sedikit sedikit. lebih mudah. Jika Anda menghitung korelasi secara terpisah untuk masing-masing dan kemudian menguji perbedaan di antara mereka , Anda mengalami masalah bahwa data yang mendasarinya sedikit berbeda dalam setiap kasus --- setiap perbedaan yang Anda lihat bisa disebabkan oleh perbedaan dalam sampel sebanyak perbedaan dalam hubungan aktual antar variabel.

Rose Hartman
sumber
2
Bukankah ini kasus yang lm(A~B1*B2)akan menguji apakah korelasi antara B1dan A tergantung pada B2skor seseorang ? Istilah interaksi itu tidak menguji apakah korelasinya berbeda; itu menguji apakah kedua prediktor berinteraksi satu sama lain. Anda bisa membuat kode boneka, Cbahwa kode apakah skala untuk Badalah B1atau B2. Maka itu akan memberitahu Anda bahwa korelasi antara Bdan Atergantung pada apakah itu B1atau B2, yaitu, jika korelasinya berbeda.
Mark White
1
@MarkWhite Ya ampun, Anda benar sekali! Terima kasih sudah menangkapnya. Astaga! Saya akan mengedit untuk memperbaikinya.
Rose Hartman