Как определить, существенно ли отличаются две корреляции?


9

Я хочу определить, какой из двух наборов данных (B1, B2) лучше соотносит (Pearsons r) с другим набором (A). Во всех наборах данных отсутствуют данные. Как я могу определить, существенно ли отличается результирующая корреляция или нет?

Например, значения 8426 присутствуют как в A, так и в B1, r = 0,74. 8798 присутствуют как в А, так и в В2, r = 0,72.

Я думал, что этот вопрос может помочь, но он остается без ответа: Как узнать, что одна система значительно лучше, чем другая?


Можем ли мы принять большое ? N
Firebug

1
@Firebug n обычно будет между 7000 и 8760.
greenglass

Ответы:


6

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

Тем не менее, невозможно сопоставить все типы сравнений между условиями в этой структуре. Пакет cocorR очень полезен и имеет очень простой интерфейс «укажи и щелкни» в Интернете. Обратите внимание, что с другими отсутствующими данными у вас нет ни независимых, ни зависимых выборок. Я бы использовал удаление по списку, чтобы сделать его простым (и власть не является проблемой для вас).


2
Хотя это самый короткий ответ, ссылка на cocor - это то, что направило меня к нужной мне информации. Большое спасибо.
greenglass

15

О, сила бутстрапа. Для иллюстрации рассмотрим три вектора: A , В1 и В2 где:

Сор(A,В1)знак равно0,92
Сор(A,В2)знак равно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% доверительные интервалы для Сор(A,Вя) .

95% ДИ для Сорр(A,В1) :

(0.897,0.947)

95% ДИ для Cорр(A,В2) :

(0,810,0,892)

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

Как указывает амеба в комментариях, более «мощный» результат получается из разницы для каждого из примеров начальной загрузки. введите описание изображения здесь

95% -й доверительный интервал для разницы между ними составляет:

(0,019,0,108)

Отмечая, что интервал (едва) исключает 0, у нас есть аналогичные доказательства, как и раньше.


Чтобы решить проблему с отсутствующими данными, просто выберите образцы начальной загрузки из пар, которые содержатся в обоих наборах данных.


7
Вы можете улучшить эту процедуру, вычислив 95% -й CI cor1-cor2 и проверив, содержит ли он ноль или нет.
амеба

1
Неплохо подмечено. Я включу это в ближайшее время.
knrumsey

Круто, +1.
амеба

1
Спасибо за этот ответ. Это было очень интересно и информативно написано, хотя это был не тот, который я в конечном итоге использовал.
Грингласс

7

р1'знак равноTANH-1(р1)р2'знак равноTANH-1(р2)r1=12ln(1+r11r1)r2=12ln(1+r21r2)

Затем следует, что из-за того факта, что преобразованные по Фишеру переменные теперь нормально распределены, а сумма нормально распределенных случайных величин по-прежнему нормально распределена:

z=r1r2SN(0,1)

S=S12+S22=1n13+1n23

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

tTNT

-

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

SS1+S2

S1N1-3+1N2-3

2
Это было бы моей рекомендацией, но альтернативная формула для преобразования Фишера z - это z = .5 * ln ((1 + r) / (1-r)). Сделайте это для каждого r и действуйте, как указано выше.
dbwilson

@dbwilson О да (+1), они эквивалентны, я буду использовать, чтобы добавить ваше предложение, чтобы оно было понятнее для широкой аудитории.
Firebug

р1р2

6

Отредактировано после полезного отзыва от Mark White (спасибо!)

Одним из вариантов является вычисление обоих отношений (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)
> 

Вот модель:

сводка (лм (A ~ значение * переменная, данные = 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) перед запуском модели, и вы получите стандартизированные коэффициенты регрессии (не совсем то же самое, что и корреляция нулевого порядка, но гораздо ближе с точки зрения интерпретации).

Также обратите внимание , что это будет ограничивать свой анализ, только в тех случаях , которые имеют как В1 и В2 ( listwise удаление ). До тех пор, пока у вас остается достаточно данных, чтобы их не было недостаточно, и если отсутствующие данные отсутствуют случайным образом (или достаточно малая доля общих данных, чтобы они не имели большого значения, даже если они отсутствуют случайно), то это нормально.

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


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

1
@MarkWhite О боже, ты совершенно прав! Спасибо, что поймали это. Хлоп! Я буду редактировать, чтобы исправить это.
Роза Хартман,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.