TCC como correlação esperada entre duas unidades sorteadas aleatoriamente que estão no mesmo grupo


12

Na modelagem multinível, a correlação intraclasse geralmente é calculada a partir de uma ANOVA de efeitos aleatórios

yEuj=γ00+vocêj+eEuj

onde são os resíduos de nível 2 e são os resíduos de nível 1. Em seguida, obtemos estimativas e para a variação de e , respectivamente, e as conectamos à seguinte equação:vocêjeEujσ^você2σ^e2vocêjeEuj

ρ=σ^você2σ^você2+σ^e2

Hox (2002) escreve na p15 que

A correlação intraclasse ρ também pode ser interpretada como a correlação esperada entre duas unidades sorteadas aleatoriamente que estão no mesmo grupo

Há uma pergunta aqui que faz uma pergunta avançada (por que é exatamente igual a isso em vez de aproximadamente igual) e obtém uma resposta avançada.

No entanto, desejo fazer uma pergunta muito mais simples.

Pergunta: O que significa falar sobre uma correlação entre duas unidades sorteadas aleatoriamente que estão no mesmo grupo?

Eu tenho um entendimento básico do fato de que a correlação intraclasse funciona em grupos e não em dados emparelhados. No entanto, ainda não entendo como a correlação poderia ser calculada se só tivéssemos duas unidades sorteadas aleatoriamente do mesmo grupo. Se eu olhar os gráficos de pontos na página da Wikipedia para o ICC , por exemplo, teremos vários grupos e vários pontos dentro de cada grupo.

Respostas:


10

Pode ser mais fácil ver a equivalência se você considerar um caso em que haja apenas dois indivíduos por grupo. Então, vamos passar por um exemplo específico (usarei R para isso):

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

Portanto, temos 8 grupos com 2 indivíduos cada. Agora vamos ajustar o modelo ANOVA de efeitos aleatórios:

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

E, finalmente, vamos calcular o ICC:

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

Isso gera: 0.7500003(é 0,75 para ser exato, mas há uma leve impressão numérica no procedimento de estimativa aqui).

Agora vamos remodelar os dados do formato longo para o formato amplo:

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

Parece que isso agora:

   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 agora calcule a correlação entre y.1e y.2:

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

Isso produz: 0.8161138

Espere o que? O que está acontecendo aqui? Não deveria ser 0,75? Não é bem assim! O que eu calculei acima não é o ICC ( coeficiente de correlação intraclasse ), mas o coeficiente de correlação produto-momento regular de Pearson, que é um coeficiente de correlação interclasse . Observe que nos dados de formato longo, é totalmente arbitrário quem é a pessoa 1 e quem é a pessoa 2 - os pares não são ordenados. Você poderia reorganizar os dados em grupos e obteria os mesmos resultados. Mas nos dados de grande formato, não é arbitrário quem está listado em y.1e quem está listado em y.2. Se você trocasse algumas pessoas, obteria uma correlação diferente (exceto se trocasse todas elas - isso é equivalente acor(dat[,3], dat[,2])que, é claro, ainda lhe dá 0.8161138).

O que Fisher apontou é um pequeno truque para obter o ICC com os dados de grande formato. Peça que cada par seja incluído duas vezes, em ambas as ordens e depois calcule a correlação:

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

Isso produz: 0.75.

Portanto, como você pode ver, o TPI é realmente um coeficiente de correlação - para os dados "não emparelhados" de dois indivíduos do mesmo grupo.

Se houvesse mais de dois indivíduos por grupo, você ainda pode pensar no TPI dessa maneira, exceto que haveria mais maneiras de criar pares de indivíduos dentro de grupos. O ICC é então a correlação entre todos os pares possíveis (novamente de forma não ordenada).


7

@Wolfgang já deu uma ótima resposta. Quero expandir um pouco para mostrar que você também pode chegar ao ICC estimado de 0,75 no conjunto de dados de exemplo, implementando literalmente o algoritmo intuitivo de selecionar aleatoriamente muitos pares de valores - de onde os membros de cada par vêm do mesmo grupo - e simplesmente calculando sua correlação. E esse mesmo procedimento pode ser facilmente aplicado a conjuntos de dados com grupos de qualquer tamanho, como também mostrarei.y

Primeiro, carregamos o conjunto de dados do @ Wolfgang (não mostrado aqui). Agora vamos definir uma função R simples que pega um data.frame e retorna um único par de observações selecionadas aleatoriamente do mesmo grupo:

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

Aqui está um exemplo do que obtemos se chamarmos essa função 10 vezes no conjunto de dados do @ 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

Agora, para estimar o ICC, chamamos essa função muitas vezes e depois calculamos a correlação entre as duas colunas.

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

Esse mesmo procedimento pode ser aplicado, sem nenhuma modificação, a conjuntos de dados com grupos de qualquer tamanho. Por exemplo, vamos criar um conjunto de dados composto por 100 grupos de 100 observações cada, com o ICC verdadeiro definido como 0,75, como no exemplo 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")

insira a descrição da imagem aqui

Estimando o ICC com base nos componentes de variação de um modelo misto, obtemos:

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 aplicarmos o procedimento de emparelhamento aleatório, obtemos

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

que concorda intimamente com a estimativa do componente de variação.

Observe que, embora o procedimento de emparelhamento aleatório seja bastante intuitivo e didaticamente útil, o método ilustrado por @Wolfgang é realmente muito mais inteligente. Para um conjunto de dados como este, de tamanho 100 * 100, o número de emparelhamentos exclusivos dentro do grupo (sem incluir os emparelhamentos automáticos) é 505.000 - um número grande, mas não astronômico -, portanto, é totalmente possível calcular a correlação do conjunto totalmente esgotado de todos os pares possíveis, em vez de precisar amostrar aleatoriamente a partir do conjunto de dados. Aqui está uma função para recuperar todos os pares possíveis para o caso geral com grupos de qualquer tamanho:

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

Agora, se aplicarmos essa função ao conjunto de dados 100 * 100 e calcularmos a correlação, obteremos:

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

O que concorda bem com as outras duas estimativas, e comparado ao procedimento de emparelhamento aleatório, é muito mais rápido de calcular e também deve ser uma estimativa mais eficiente no sentido de ter menos variação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.