ICC comme corrélation attendue entre deux unités tirées au hasard qui sont dans le même groupe


12

Dans la modélisation à plusieurs niveaux, la corrélation intraclasse est souvent calculée à partir d'une ANOVA à effets aléatoires

yij=γ00+uj+eij

où sont les résidus de niveau 2 et sont les résidus de niveau 1. Ensuite, nous obtenons des estimations, et pour la variance de et respectivement, et les à l'équation suivante:ujeijσ^u2σ^e2ujeij

ρ=σ^u2σ^u2+σ^e2

Hox (2002) écrit à la p15 que

La corrélation intraclasse ρ peut également être interprétée comme la corrélation attendue entre deux unités tirées au hasard qui sont dans le même groupe

Il y a une question ici qui pose une question avancée (pourquoi elle est exactement égale à cela au lieu d'approximativement égale) et obtient une réponse avancée.

Cependant, je souhaite poser une question beaucoup plus simple.

Question: Qu'est-ce que cela signifie même de parler d'une corrélation entre deux unités tirées au hasard qui sont dans le même groupe?

J'ai une compréhension de base du fait que la corrélation intraclasse fonctionne sur des groupes et non sur des données appariées. Cependant, je ne comprends toujours pas comment la corrélation pourrait être calculée si tout ce que nous avions était deux unités tirées au hasard du même groupe. Si je regarde les tracés de points sur la page Wikipedia pour ICC , par exemple, nous avons plusieurs groupes et plusieurs points au sein de chaque groupe.

Réponses:


10

Il peut être plus facile de voir l'équivalence si vous considérez un cas où il n'y a que deux individus par groupe. Passons donc à un exemple spécifique (je vais utiliser R pour cela):

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

Nous avons donc 8 groupes de 2 individus chacun. Maintenant, ajustons le modèle ANOVA à effets aléatoires:

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

Et enfin, calculons l'ICC:

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

Cela donne: 0.7500003(c'est 0,75 pour être exact, mais il y a une légère impression numérique dans la procédure d'estimation ici).

Maintenant, remodelons les données du format long au format large:

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

Il ressemble à ceci maintenant:

   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

Et maintenant, calculez la corrélation entre y.1et y.2:

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

Cela donne: 0.8161138

Attends quoi? Que se passe t-il ici? Cela ne devrait-il pas être 0,75? Pas assez! Ce que j'ai calculé ci-dessus n'est pas le ICC ( coefficient de corrélation intraclasse ), mais le coefficient de corrélation produit-moment Pearson régulier, qui est un coefficient de corrélation interclasse . Notez que dans les données de format long, il est tout à fait arbitraire qui est la personne 1 et qui est la personne 2 - les paires ne sont pas ordonnées. Vous pouvez remanier les données au sein des groupes et vous obtiendriez les mêmes résultats. Mais dans les données grand format, il n'est pas arbitraire qui est répertorié sous y.1et qui est répertorié sous y.2. Si vous deviez changer certaines personnes, vous obtiendriez une corrélation différente (sauf si vous deviez les changer toutes - alors cela équivaut àcor(dat[,3], dat[,2])ce qui bien sûr vous donne encore 0.8161138).

Ce que Fisher a souligné est une petite astuce pour obtenir l'ICC avec les données grand format. Demandez à chaque paire d'être incluse deux fois, dans les deux ordres, puis calculez la corrélation:

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

Cela donne: 0.75.

Donc, comme vous pouvez le voir, l'ICC est vraiment un coefficient de corrélation - pour les données «non appariées» de deux individus du même groupe.

S'il y avait plus de deux individus par groupe, vous pouvez toujours penser à la CPI de cette façon, sauf qu'il y aurait plus de façons de créer des paires d'individus au sein des groupes. L'ICC est alors la corrélation entre tous les appariements possibles (encore une fois de manière non ordonnée).


7

@Wolfgang a déjà donné une excellente réponse. Je veux développer un peu pour montrer que vous pouvez également arriver à l'ICC estimé de 0,75 dans son exemple de jeu de données en implémentant littéralement l'algorithme intuitif de sélection aléatoire de nombreuses paires de valeurs - où les membres de chaque paire proviennent de la même groupe - puis simplement calculer leur corrélation. Et puis cette même procédure peut facilement être appliquée à des ensembles de données avec des groupes de n'importe quelle taille, comme je le montrerai également.y

Nous chargeons d'abord le jeu de données de @ Wolfgang (non illustré ici). Définissons maintenant une fonction R simple qui prend un data.frame et renvoie une seule paire d'observations sélectionnées au hasard dans le même groupe:

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

Voici un exemple de ce que nous obtenons si nous appelons cette fonction 10 fois sur le jeu de données de @ 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

Maintenant, pour estimer l'ICC, nous appelons simplement cette fonction un grand nombre de fois, puis calculons la corrélation entre les deux colonnes.

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

Cette même procédure peut être appliquée, sans aucune modification, aux ensembles de données avec des groupes de n'importe quelle taille. Par exemple, créons un ensemble de données composé de 100 groupes de 100 observations chacun, avec le vrai ICC réglé à 0,75 comme dans l'exemple de @ 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")

entrez la description de l'image ici

En estimant l'ICC sur la base des composantes de la variance à partir d'un modèle mixte, nous obtenons:

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

Et si nous appliquons la procédure d'appariement aléatoire, nous obtenons

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

qui concorde étroitement avec l’estimation de la composante de variance.

Notez que bien que la procédure d'appariement aléatoire soit plutôt intuitive et didactiquement utile, la méthode illustrée par @Wolfgang est en réalité beaucoup plus intelligente. Pour un ensemble de données comme celui-ci de taille 100 * 100, le nombre d'appariements intra-groupe uniques (hors auto-appariements) est de 505 000 - un grand nombre mais pas astronomique - il nous est donc tout à fait possible de calculer la corrélation de l'ensemble complètement épuisé de tous les appariements possibles, plutôt que de devoir échantillonner au hasard à partir de l'ensemble de données. Voici une fonction pour récupérer tous les appariements possibles pour le cas général avec des groupes de toute taille:

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

Maintenant, si nous appliquons cette fonction à l'ensemble de données 100 * 100 et calculons la corrélation, nous obtenons:

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

Ce qui est bien en accord avec les deux autres estimations, et par rapport à la procédure d'appariement aléatoire, est beaucoup plus rapide à calculer et devrait également être une estimation plus efficace dans le sens d'avoir moins de variance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.