Як визначити, чи значно відрізняються дві кореляції?


9

Я хочу визначити, який із двох наборів даних (B1, B2) краще співвідноситься (груші r) з іншим набором (A). У всіх наборах даних відсутні дані. Як я можу визначити, чи є істотна різниця отриманої кореляції чи ні?

Наприклад, значення 8426 присутні як в А, так і в B1, r = 0,74. 8798 присутні як в A, так і в B2, r = 0,72.

Я подумав, що це питання може допомогти, але воно не відповідає: як знати, що одна система значно краща за іншу?


Чи можна вважати великим n?
Firebug

1
@Firebug n зазвичай буде від 7000 до
8760.

Відповіді:


6

Іноді один може бути в змозі зробити це в множинноїрегресії, де А DV, B є оцінкою людей за шкалою, і C є фіктивним кодом , який говорить , що це або B1 або B2: lm(A~B+C+B*C). Термін взаємодії, B*Cпідкаже вам, чи кореляції різні, тоді як прості нахили між A і B на обох рівнях C скажуть вам кореляції.

Однак неможливо встановити всі типи порівнянь між умовами в цьому рамках. Пакет cocorR дуже корисний, і він має дуже простий інтерфейс "натискання та натискання" в Інтернеті. Зауважте, що з різними відсутніми даними у вас немає ні незалежних, ні залежних зразків. Тут я б скористався видаленням listwise, щоб зробити це просто (і живлення не є проблемою для вас).


2
Хоча це найкоротша відповідь, посилання на cocor - це те, що спрямовувало мене на потрібну мені інформацію. Дуже дякую.
greenglass

15

О сила завантажувача. Розглянемо для ілюстрації три вектори:A, B1 і B2 де:

Cor(A,B1)=0.92
Cor(A,B2)=0.86
введіть тут опис зображення

Мета - визначити, чи співвідношення цих двох наборів даних значно відрізняється. Беручи зразки завантажувальної машини так:

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

Ми можемо побудувати розподіл завантажувальних програм двох кореляцій: введіть тут опис зображення

Ми також можемо отримати 95% довірчі інтервали для Cor(A,Bi).

95% ДІ за Corr(A,B1):

(0.897,0.947)

95% ДІ за Corr(A,B2):

(0.810,0.892)

Той факт, що інтервали не перетинаються (ледве), дає нам деякі докази того, що різниця у вибіркових кореляціях, яку ми спостерігали, справді є статистично достовірною.

Як в коментарях вказує амеба, більш "потужний" результат походить від отримання різниці для кожного з зразків завантажувальної програми. введіть тут опис зображення

95% ІС для різниці між ними:

(0.019,0.108)

Зазначаючи, що інтервал (ледь) виключає 0, ми маємо аналогічні докази, як і раніше.


Для вирішення проблеми, що відсутня, просто виберіть зразки завантажувальної програми з пар, що містяться в обох наборах даних.


7
Ви можете вдосконалити цю процедуру, обчисливши 95% ІС cor1-cor2 та перевіривши, чи містить він нуль чи ні.
амеба

1
Це хороший момент. Я незабаром включу це.
кнрумсей

Класно, +1.
амеба

1
Дякую за цю відповідь. Це було дуже цікаво та інформативно написано, навіть не в тому, що я в кінцевому підсумку використовував.
зелене скло

7

Припустимо перетворення Фішера: r1=tanh1(r1) і r2=tanh1(r2). Або, рівнозначним і, можливо, більш зрозумілим способом (завдяки @dbwilson !),r1=12ln(1+r11r1) і r2=12ln(1+r21r2).

Тоді випливає, що через те, що перетворені Фішером змінні тепер нормально розподіляються, а сума нормально розподілених випадкових змінних все ще нормально розподіляється:

z=r1r2SN(0,1)
З

S=S12+S22=1n13+1n23

Отже ви перевіряєте нульові гіпотези H0:z=0 шляхом отримання P(z0)=2P(Z>|z|).

У порівнянні зі звичним t-тест, зауважте, ми не змогли скористатися цим t-статистика настільки легко, див. Який розподіл різниці двох-t-розподілів , тому слід враховувати ступінь свободи, наявну в обчисленні, тобто ми припускаємоn досить великий, тому нормальне наближення може бути розумно відповідним t статистика.

-

Після коментаря @Josh , ми можемо дещо включити можливість взаємозалежності між зразками (пам’ятайте, що обидві кореляції залежать від розподілу A). Не припускаючи незалежних вибірок і використовуючи нерівність Коші-Шварца, ми можемо отримати таку верхню межу (див. Як я можу знайти стандартне відхилення різниці двох засобів? ):

SS1+S2

S1n13+1n23

2
Це було б моєю рекомендацією, але альтернативною формулою перетворення z Фішера є z = .5 * ln ((1 + r) / (1-r)). Зробіть це для кожного r і продовжуйте, як зазначено вище.
dbwilson

@dbwilson О так (+1), вони рівноцінні, я використаю додавання вашої пропозиції, щоб було зрозуміліше для широкої аудиторії.
Firebug

Чи ця формула не передбачає незалежності між ними r1 і r2? Я б подумав, що їх немає ...
Джош

6

Відредаговано після корисних відгуків від Марка Уайта (дякую!)

Один з варіантів - обчислити обидва відносини (B1 з A, а B2 з A) в одній моделі, яка також оцінює різницю між ними. Це легко досягти за допомогою багаторазової регресії . Ви б запустили модель з A як залежну змінну, а потім одну суцільну змінну з усіма оцінками для B1 і B2, категоричну змінну із зазначенням, якою вона була (B1 або B2) та взаємодію між ними. В г:

> 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

Ось кореляції з даних, які я створив:

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

Зміна формату даних для задоволення потреб моделі (переформатування на "довге"):

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

Ось модель:

резюме (lm (A ~ значення * 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

Отримані тут результати (з моїх складених даних) говорять про те, що між B1 і A існує значне співвідношення (тест коефіцієнта "значення", оскільки B1 є референтною групою для коефіцієнта "var"), але що різниця між співвідношенням B1 з A і зв'язком B2 з A не суттєво (тест коефіцієнта "значення: varB2").

Якщо вам подобається думати з точки зору кореляції, а не коефіцієнтів регресії, просто стандартизуйте всі свої змінні (A, B1 і B2), перш ніж запустити модель, і коефіцієнти регресії, які ви отримаєте, будуть стандартизовані (не зовсім те саме, що кореляція нульового порядку, але набагато ближча з точки зору інтерпретації).

Також зауважте, що це обмежить ваш аналіз лише випадками, що мають і B1, і B2 ( списки видалення ). Поки це залишає у вас достатньо даних, щоб не бути недооціненими, і поки відсутні дані відсутні випадковим чином (або достатньо невелика частка загальних даних, щоб вони не мали великого значення, навіть якщо вони відсутні випадково), то це добре.

Той факт, що ви обмежуєте свій аналіз одним і тим же набором даних для оцінки ефектів як для B1, так і для B2 (замість того, щоб використовувати дещо різні набори даних на основі різних моделей відсутності), має перевагу в тому, щоб зробити інтерпретацію різниці між кореляціями трохи більш прямолінійний. Якщо ви обчислюєте кореляції окремо для кожного, а потім перевіряєте різницю між ними , ви стикаєтеся з проблемою, що базові дані трохи відрізняються в кожному випадку --- будь-яка різниця, яку ви бачите, може бути пов’язана з різницею у вибірках стільки ж, скільки відмінностями у фактичних зв’язках між змінними.


2
Чи не випадок, який lm(A~B1*B2)перевірятиме, чи співвідношення B1та A залежність від B2оцінки буде залежати ? Цей термін взаємодії не є тестуванням, якщо кореляції різні; це тестування, чи взаємодіють два предиктори один з одним. Ви можете створити фіктивний код, Cякий кодує ледве не масштаб Bє B1або B2. Тоді , що б вам сказати , що кореляція між Bі Aзалежить від того, якщо B1або B2, тобто, якщо кореляції різні.
Марк Уайт

1
@MarkWhite О, боже, ви абсолютно праві! Дякуємо, що це зробили. Yikes! Я відредагую це, щоб виправити це.
Роза Хартман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.