ICC come correlazione attesa tra due unità disegnate casualmente che si trovano nello stesso gruppo


12

Nella modellazione multilivello la correlazione intraclasse viene spesso calcolata da un ANOVA ad effetti casuali

yioj=γ00+uj+eioj

dove sono i residui di livello 2 ed sono i residui di livello 1. Quindi otteniamo stime, e per la varianza di ed e inserirle nella seguente equazione:e i j σ 2 u σ 2 e u j e i jujeiojσ^u2σ^e2ujeioj

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

Hox (2002) scrive su p15 che

La correlazione intraclasse ρ può anche essere interpretata come la correlazione attesa tra due unità disegnate a caso nello stesso gruppo

C'è una domanda qui che fa una domanda avanzata (perché è esattamente uguale a questa invece che approssimativamente uguale) e ottiene una risposta avanzata.

Tuttavia, vorrei porre una domanda molto più semplice.

Domanda: cosa significa anche parlare di una correlazione tra due unità disegnate a caso nello stesso gruppo?

Ho una conoscenza di base del fatto che la correlazione intraclasse funziona su gruppi e non su dati associati. Tuttavia, non capisco ancora come si possa calcolare la correlazione se tutto ciò che avevamo fossero due unità disegnate a caso dallo stesso gruppo. Se guardo i diagrammi a punti sulla pagina di Wikipedia per ICC , ad esempio, abbiamo più gruppi e più punti all'interno di ciascun gruppo.

Risposte:


10

Potrebbe essere più semplice vedere l'equivalenza se si considera un caso in cui ci sono solo due individui per gruppo. Quindi, passiamo attraverso un esempio specifico (userò R per questo):

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

Quindi, abbiamo 8 gruppi con 2 individui ciascuno. Ora adattiamo il modello ANOVA ad effetti casuali:

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

E infine, calcoliamo l'ICC:

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

Questo produce: 0.7500003(è 0,75 per l'esattezza, ma c'è una leggera impressione numerica nella procedura di stima qui).

Ora rimodelliamo i dati dal formato lungo al formato grande:

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

Sembra così adesso:

   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

E ora calcola la correlazione tra y.1e y.2:

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

Questo produce: 0.8161138

Aspetta cosa? Cosa sta succedendo qui? Non dovrebbe essere 0,75? Non proprio! Quello che ho calcolato sopra non è ICC ( intraclassi coefficiente di correlazione), ma il regolare coefficiente di Pearson prodotto-momento di correlazione, che è un interclassista coefficiente di correlazione. Si noti che nei dati di formato lungo, è del tutto arbitrario chi è la persona 1 e chi è la persona 2: le coppie non sono ordinate. È possibile rimescolare i dati all'interno dei gruppi e ottenere gli stessi risultati. Ma nei dati di grande formato, non è arbitrario chi è elencato sotto y.1e chi è elencato sotto y.2. Se dovessi cambiare alcune persone, otterresti una correlazione diversa (eccetto se dovessi cambiare tutte - quindi questo equivale acor(dat[,3], dat[,2])che ovviamente ti dà ancora 0.8161138).

Ciò che Fisher ha sottolineato è un piccolo trucco per ottenere l'ICC con i dati di grande formato. Ogni coppia deve essere inclusa due volte, in entrambi gli ordini, quindi calcola la correlazione:

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

Questo produce: 0.75.

Quindi, come puoi vedere, l'ICC è davvero un coefficiente di correlazione - per i dati "non accoppiati" di due individui dello stesso gruppo.

Se ci fossero più di due individui per gruppo, puoi ancora pensare all'ICC in quel modo, tranne che ci sarebbero più modi per creare coppie di individui all'interno dei gruppi. L'ICC è quindi la correlazione tra tutti i possibili accoppiamenti (sempre in modo non ordinato).


7

@ Wolfgang ha già dato un'ottima risposta. Voglio espanderlo un po 'per mostrare che puoi anche arrivare all'ICC stimato di 0,75 nel suo set di dati di esempio implementando letteralmente l'algoritmo intuitivo di selezione casuale di molte coppie di valori - dove i membri di ciascuna coppia provengono dal stesso gruppo - e quindi semplicemente calcolando la loro correlazione. E quindi questa stessa procedura può essere facilmente applicata a set di dati con gruppi di qualsiasi dimensione, come mostrerò anche.y

Per prima cosa cariciamo il set di dati di @ Wolfgang (non mostrato qui). Ora definiamo una semplice funzione R che accetta un data.frame e restituisce una singola coppia di osservazioni selezionate casualmente dallo stesso gruppo:

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

Ecco un esempio di ciò che otteniamo se chiamiamo questa funzione 10 volte nel set di dati di @ 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

Ora per stimare l'ICC, chiamiamo questa funzione un gran numero di volte e quindi calcoliamo la correlazione tra le due colonne.

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

Questa stessa procedura può essere applicata, senza alcuna modifica, a set di dati con gruppi di qualsiasi dimensione. Ad esempio, creiamo un set di dati composto da 100 gruppi di 100 osservazioni ciascuno, con il vero ICC impostato su 0,75 come nell'esempio di @ 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")

inserisci qui la descrizione dell'immagine

Stimando l'ICC in base ai componenti di varianza di un modello misto, otteniamo:

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

E se applichiamo la procedura di accoppiamento casuale, otteniamo

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

che concorda strettamente con la stima della componente di varianza.

Si noti che mentre la procedura di accoppiamento casuale è piuttosto intuitiva e didatticamente utile, il metodo illustrato da @Wolfgang è in realtà molto più intelligente. Per un set di dati come questo di dimensioni 100 * 100, il numero di accoppiamenti univoci all'interno del gruppo (esclusi gli auto-accoppiamenti) è 505.000 - un numero grande ma non astronomico - quindi è totalmente possibile per noi calcolare la correlazione dell'insieme completamente esaurito di tutti i possibili accoppiamenti, piuttosto che dover campionare casualmente dal set di dati. Ecco una funzione per recuperare tutti gli accoppiamenti possibili per il caso generale con gruppi di qualsiasi dimensione:

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

Ora se applichiamo questa funzione al set di dati 100 * 100 e calcoliamo la correlazione, otteniamo:

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

Che concorda bene con le altre due stime, e rispetto alla procedura di accoppiamento casuale, è molto più veloce da calcolare e dovrebbe anche essere una stima più efficiente nel senso di avere una minore varianza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.