ICC как ожидаемая корреляция между двумя случайно выбранными единицами, которые находятся в одной группе

12

В многоуровневом моделировании внутриклассовая корреляция часто рассчитывается по ANOVA со случайными эффектами

yij=γ00+uj+eij

где - остатки уровня 2, а - остатки уровня 1. Затем мы получаем оценки и для дисперсии и соответственно и включаем их в следующее уравнение:е я J σ 2 U σ 2 е у J е я Jujeijσ^u2σ^e2ujeij

ρзнак равноσ^U2σ^U2+σ^е2

Hox (2002) пишет на стр. 15, что

Внутриклассовая корреляция ρ также может интерпретироваться как ожидаемая корреляция между двумя случайно выбранными единицами, которые находятся в одной группе.

Там есть вопрос здесь , что спрашивает продвинутый вопрос (почему именно равно это вместо примерно равны) и получает расширенный ответ.

Однако я хотел бы задать гораздо более простой вопрос.

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

У меня есть базовое понимание того факта, что внутриклассовая корреляция работает с группами, а не с парными данными. Тем не менее, я до сих пор не понимаю, как можно рассчитать корреляцию, если бы у нас были только две случайно выбранные единицы из одной группы. Например, если я посмотрю на точечные графики на странице Википедии для ICC , у нас будет несколько групп и несколько точек в каждой группе.

user1205901 - Восстановить Монику
источник

Ответы:

10

Это может быть легче увидеть эквивалентность, если вы рассматриваете случай, когда в группе только два человека. Итак, давайте рассмотрим конкретный пример (для этого я буду использовать R):

dat <- read.table(header=TRUE, text = "
group person   y
1     1        5
1     2        6
2     1        3
2     2        2
3     1        7
3     2        9
4     1        2
4     2        2
5     1        3
5     2        5
6     1        6
6     2        9
7     1        4
7     2        2
8     1        8
8     2        7")

Итак, у нас есть 8 групп по 2 человека в каждой. Теперь давайте подгоним модель ANOVA со случайными эффектами:

library(nlme)
res <- lme(y ~ 1, random = ~ 1 | group, data=dat, method="ML")

И, наконец, давайте вычислим ICC:

getVarCov(res)[1] / (getVarCov(res)[1] + res$sigma^2)

Это дает: 0.7500003(это 0,75, если быть точным, но здесь есть небольшое количественное впечатление в процедуре оценки).

Теперь давайте изменим данные из длинного формата в широкий:

dat <- as.matrix(reshape(dat, direction="wide", v.names="y", idvar="group", timevar="person"))

Теперь это выглядит так:

   group y.1 y.2
1      1   5   6
3      2   3   2
5      3   7   9
7      4   2   2
9      5   3   5
11     6   6   9
13     7   4   2
15     8   8   7

А теперь вычислите соотношение между y.1и y.2:

cor(dat[,2], dat[,3])

Это дает: 0.8161138

Чего ждать? Что тут происходит? Разве это не должно быть 0,75? Не совсем! То, что я вычислил выше, это не ICC ( коэффициент внутриклассовой корреляции), а обычный коэффициент корреляции Пирсона и момента произведения, который является коэффициентом межклассовой корреляции. Обратите внимание, что в данных длинного формата совершенно произвольно, кто является лицом 1, а кто лицом 2 - пары неупорядочены. Вы можете переставлять данные в группах, и вы получите те же результаты. Но в широкоформатных данных, это не произвольно, кто указан в списке, y.1а кто указан в y.2. Если бы вам пришлось переключаться между некоторыми людьми, вы бы получили другую корреляцию (кроме случаев, когда вы должны были переключаться вокруг всех них - тогда это эквивалентноcor(dat[,3], dat[,2])что конечно еще тебе даст 0.8161138).

Фишер указал на небольшую хитрость, чтобы получить ICC с широкоформатными данными. Сделайте так, чтобы каждая пара была включена дважды, в обоих порядках, а затем вычислите соотношение:

dat <- rbind(dat, dat[,c(1,3,2)])
cor(dat[,2], dat[,3])

Это дает: 0.75.

Итак, как вы можете видеть, ICC действительно является коэффициентом корреляции - для «непарных» данных двух лиц из одной группы.

Если в группе было более двух человек, вы все равно можете думать о МУС таким образом, за исключением того, что было бы больше способов создать пары людей в группах. Тогда ICC является корреляцией между всеми возможными парами (опять же неупорядоченным образом).

Wolfgang
источник
7

@ Вольфганг уже дал отличный ответ. Я хочу немного подробнее остановиться на этом, чтобы показать, что вы также можете достичь оценочной ICC 0,75 в его примере набора данных, буквально реализуя интуитивный алгоритм случайного выбора множества пар значений - откуда члены каждой пары происходят из та же группа - а затем просто вычислить их соотношение. И тогда эту же процедуру можно легко применить к наборам данных с группами любого размера, как я также покажу.Y

Сначала мы загружаем набор данных @ Wolfgang (здесь не показан). Теперь давайте определим простую функцию R, которая принимает data.frame и возвращает одну случайно выбранную пару наблюдений из той же группы:

get_random_pair <- function(df){
  # select a random row
  i <- sample(nrow(df), 1)
  # select a random other row from the same group
  # (the call to rep() here is admittedly odd, but it's to avoid unwanted
  # behavior when the first argument to sample() has length 1)
  j <- sample(rep(setdiff(which(dat$group==dat[i,"group"]), i), 2), 1)
  # return the pair of y-values
  c(df[i,"y"], df[j,"y"])
}

Вот пример того, что мы получим, если 10 раз вызовем эту функцию в наборе данных @ Wolfgang:

test <- replicate(10, get_random_pair(dat))
t(test)
#       [,1] [,2]
#  [1,]    9    6
#  [2,]    2    2
#  [3,]    2    4
#  [4,]    3    5
#  [5,]    3    2
#  [6,]    2    4
#  [7,]    7    9
#  [8,]    5    3
#  [9,]    5    3
# [10,]    3    2

Теперь, чтобы оценить ICC, мы просто вызываем эту функцию большое количество раз, а затем вычисляем корреляцию между двумя столбцами.

random_pairs <- replicate(100000, get_random_pair(dat))
cor(t(random_pairs))
#           [,1]      [,2]
# [1,] 1.0000000 0.7493072
# [2,] 0.7493072 1.0000000

Эта же процедура может быть применена, без каких-либо изменений, к наборам данных с группами любого размера. Например, давайте создадим набор данных, состоящий из 100 групп по 100 наблюдений в каждой, с истинным значением ICC, равным 0,75, как в примере @ Wolfgang.

set.seed(12345)
group_effects <- scale(rnorm(100))*sqrt(4.5)
errors <- scale(rnorm(100*100))*sqrt(1.5)
dat <- data.frame(group = rep(1:100, each=100),
                  person = rep(1:100, times=100),
                  y = rep(group_effects, each=100) + errors)

stripchart(y ~ group, data=dat, pch=20, col=rgb(0,0,0,.1), ylab="group")

введите описание изображения здесь

Оценивая ICC на основе компонентов дисперсии из смешанной модели, мы получаем:

library("lme4")
mod <- lmer(y ~ 1 + (1|group), data=dat, REML=FALSE)
summary(mod)
# Random effects:
#  Groups   Name        Variance Std.Dev.
#  group    (Intercept) 4.502    2.122   
#  Residual             1.497    1.223   
# Number of obs: 10000, groups:  group, 100

4.502/(4.502 + 1.497)
# 0.7504584

И если мы применим процедуру случайного спаривания, мы получим

random_pairs <- replicate(100000, get_random_pair(dat))
cor(t(random_pairs))
#           [,1]      [,2]
# [1,] 1.0000000 0.7503004
# [2,] 0.7503004 1.0000000

что близко согласуется с оценкой компонента дисперсии.

Обратите внимание, что хотя процедура случайного спаривания является интуитивно понятной и полезной, метод, показанный @Wolfgang, на самом деле намного умнее. Для такого набора данных, который имеет размер 100 * 100, количество уникальных пар внутри группы (не включая самопары) составляет 505 000 - большое, но не астрономическое число, поэтому мы вполне можем вычислить корреляцию из полностью исчерпанного набора всех возможных пар, вместо того, чтобы делать выборку случайным образом из набора данных. Вот функция для извлечения всех возможных пар для общего случая с группами любого размера:

get_all_pairs <- function(df){
  # do this for every group and combine the results into a matrix
  do.call(rbind, by(df, df$group, function(group_df){
    # get all possible pairs of indices
    i <- expand.grid(seq(nrow(group_df)), seq(nrow(group_df)))
    # remove self-pairings
    i <- i[i[,1] != i[,2],]
    # return a 2-column matrix of the corresponding y-values
    cbind(group_df[i[,1], "y"], group_df[i[,2], "y"])
  }))
}

Теперь, если мы применим эту функцию к набору данных 100 * 100 и вычислим корреляцию, мы получим:

cor(get_all_pairs(dat))
#           [,1]      [,2]
# [1,] 1.0000000 0.7504817
# [2,] 0.7504817 1.0000000

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

Джейк Уэстфолл
источник