@ Вольфганг уже дал отличный ответ. Я хочу немного подробнее остановиться на этом, чтобы показать, что вы также можете достичь оценочной 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
Это хорошо согласуется с двумя другими оценками, и по сравнению с процедурой случайного спаривания, вычисление выполняется намного быстрее, а также должно быть более эффективной оценкой в смысле меньшей дисперсии.