Coeficientes de correlação intraclasse (ICC) com múltiplas variáveis


13

Suponha que eu tenha medido alguma variável em irmãos, que estão aninhados nas famílias. A estrutura de dados fica assim:

valor do irmão da família
------ ------- -----
1 1 y_11
1 2 y_12
2 1 y_21
2 2 y_22
2 3 y_23
... ... ...

Quero saber a correlação entre as medidas tomadas em irmãos dentro da mesma família. A maneira usual de fazer isso é calcular o ICC com base em um modelo de interceptação aleatória:

res <- lme(yij ~ 1, random = ~ 1 | family, data=dat)
getVarCov(res)[[1]] / (getVarCov(res)[[1]] + res$s^2)

Isso seria equivalente a:

res <- gls(yij ~ 1, correlation = corCompSymm(form = ~ 1 | family), data=dat)

exceto que a última abordagem também permite um TPI negativo.

Agora, suponha que eu tenha medido três itens em irmãos aninhados em famílias. Portanto, a estrutura de dados fica assim:

valor do item irmão da família
------ ------- ---- -----
1 1 1 y_111
1 1 2 y_112
1 1 3 y_113
1 2 1 y_121
1 2 2 y_122
1 2 3 y_123
2 1 1 y_211
2 1 2 y_212
2 1 3 y_213
2 2 1 y_221
2 2 2 y_222
2 2 3 y_223
2 3 1 y_231
2 3 2 y_232
2 3 3 y_233
... ... ... ...

Agora, quero saber sobre:

  1. a correlação entre as medidas tomadas em irmãos da mesma família para o mesmo item
  2. a correlação entre medidas realizadas em irmãos da mesma família para itens diferentes

Se eu tivesse apenas pares de irmãos dentro de famílias, faria apenas:

res <- gls(yijk ~ item, correlation = corSymm(form = ~ 1 | family), 
           weights = varIdent(form = ~ 1 | item), data=dat)

6×6

[σ12ρ12σ1σ2ρ13σ1σ3ϕ11σ12ϕ12σ1σ2ϕ13σ1σ3σ22ρ23σ2σ3ϕ22σ22ϕ23σ2σ3σ32ϕ33σ32σ12ρ12σ1σ2ρ13σ1σ3σ22ρ23σ2σ3σ32]

ϕjjϕjj

Alguma idéia / sugestão de como eu poderia abordar isso? Agradecemos antecipadamente por qualquer ajuda!

Respostas:


1

O pacote MCMCglmm pode manipular e estimar facilmente estruturas de covariância e efeitos aleatórios. No entanto, ele usa estatísticas bayesianas que podem ser intimidantes para novos usuários. Consulte as Notas do curso do MCMCglmm para obter um guia completo sobre o MCMCglmm e o capítulo 5, em particular, para esta pergunta. Eu absolutamente recomendo a leitura da avaliação da convergência do modelo e da mistura de cadeias antes de analisar os dados reais no MCMCglmm.

library(MCMCglmm)

O MCMCglmm usa priors, este é um wishart inverso não informativo.

p<-list(G=list(
  G1=list(V=diag(2),nu=0.002)),
R=list(V=diag(2),nu=0.002))

Ajuste o modelo

m<-MCMCglmm(cbind(x,y)~trait-1,
#trait-1 gives each variable a separate intercept
        random=~us(trait):group,
#the random effect has a separate intercept for each variable but allows and estiamtes the covariance between them.
        rcov=~us(trait):units,
#Allows separate residual variance for each trait and estimates the covariance between them
        family=c("gaussian","gaussian"),prior=p,data=df)

No resumo do modelo, summary(m)a estrutura G descreve a variação e covariância das interceptações aleatórias. A estrutura R descreve a variação do nível de observação e a covariância de interceptação, que funcionam como resíduos no MCMCglmm.

Se você é persuasivo bayesiano, pode obter toda a distribuição posterior dos termos de co / variância m$VCV. Observe que são desvios após contabilizar os efeitos fixos.

simular dados

library(MASS)
n<-3000

#draws from a bivariate distribution
df<-data.frame(mvrnorm(n,mu=c(10,20),#the intercepts of x and y
                   Sigma=matrix(c(10,-3,-3,2),ncol=2)))
#the residual variance covariance of x and y


#assign random effect value
number_of_groups<-100
df$group<-rep(1:number_of_groups,length.out=n)
group_var<-data.frame(mvrnorm(number_of_groups, mu=c(0,0),Sigma=matrix(c(3,2,2,5),ncol=2)))
#the variance covariance matrix of the random effects. c(variance of x,
#covariance of x and y,covariance of x and y, variance of y)

#the variables x and y are the sum of the draws from the bivariate distribution and the random effect
df$x<-df$X1+group_var[df$group,1]
df$y<-df$X2+group_var[df$group,2]

Estimar a co-variação original dos efeitos aleatórios requer um grande número de níveis para o efeito aleatório. Em vez disso, seu modelo provavelmente estimará as co / variações observadas que podem ser calculadas porcov(group_var)


0

Se você deseja obter um "efeito de família" e um "efeito de item", podemos pensar em haver interceptações aleatórias para ambos e modelá-lo com o pacote 'lme4'.

Mas, primeiro, precisamos dar a cada irmão um ID único, em vez de um ID único dentro da família.

Em seguida, para "a correlação entre medidas tomadas em irmãos dentro da mesma família para itens diferentes ", podemos especificar algo como:

mod<-lmer(value ~ (1|family)+(1|item), data=family)

Isso nos dará uma interceptação de efeitos fixos para todos os irmãos e, em seguida, dois efeitos aleatórios interceptam (com variação), para família e item.

Então, para "a correlação entre medições feitas em irmãos dentro da mesma família para o mesmo item", podemos fazer a mesma coisa, mas apenas agrupar nossos dados, para ter algo como:

mod2<-lmer(value ~ (1|family), data=subset(family,item=="1")) 

Acho que essa pode ser uma abordagem mais fácil para sua pergunta. Mas, se você deseja apenas o ICC para item ou família, o pacote 'psych' possui uma função ICC () - apenas tenha cuidado com a forma como o item e o valor são derretidos nos dados de exemplo.

Atualizar

Alguns dos itens abaixo são novos para mim, mas gostei de resolver isso. Realmente não estou familiarizado com a ideia de correlação intraclasse negativa. Embora eu veja na Wikipedia que as "primeiras definições da ICC" permitiram uma correlação negativa com os dados emparelhados. Porém, como é mais comumente usado agora, o ICC é entendido como a proporção da variação total que é a variação entre grupos. E esse valor é sempre positivo. Embora a Wikipedia possa não ser a referência mais autorizada, este resumo corresponde a como eu sempre vi o ICC usado:

Uma vantagem dessa estrutura ANOVA é que diferentes grupos podem ter diferentes números de valores de dados, o que é difícil de lidar usando as estatísticas anteriores da ICC. Observe também que este CCI é sempre não negativo, permitindo que seja interpretado como a proporção da variação total "entre grupos". Esse CCI pode ser generalizado para permitir efeitos covariáveis; nesse caso, o CCI é interpretado como capturando o similaridade dentro da classe dos valores de dados ajustados por covariáveis.

Dito isto, com dados como você forneceu aqui, a correlação entre classes entre os itens 1, 2 e 3 pode muito bem ser negativa. E podemos modelar isso, mas a proporção da variação explicada entre os grupos ainda será positiva.

# load our data and lme4
library(lme4)    
## Loading required package: Matrix    

dat<-read.table("http://www.wvbauer.com/fam_sib_item.dat", header=TRUE)

Então, qual a porcentagem da variação entre famílias, controlando também a variação entre grupos entre grupos de itens? Podemos usar um modelo de interceptações aleatórias, como você sugeriu:

mod<-lmer(yijk ~ (1|family)+(1|item), data=dat)
summary(mod)    
## Linear mixed model fit by REML ['lmerMod']
## Formula: yijk ~ (1 | family) + (1 | item)
##    Data: dat
## 
## REML criterion at convergence: 4392.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.6832 -0.6316  0.0015  0.6038  3.9801 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  family   (Intercept) 0.3415   0.5843  
##  item     (Intercept) 0.8767   0.9363  
##  Residual             4.2730   2.0671  
## Number of obs: 1008, groups:  family, 100; item, 3
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)    2.927      0.548   5.342

Calculamos o ICC obtendo a variação dos dois efeitos aleatórios intercepta e dos resíduos. Em seguida, calculamos o quadrado da variação familiar sobre a soma dos quadrados de todas as variações.

temp<-as.data.frame(VarCorr(mod))$vcov
temp.family<-(temp[1]^2)/(temp[1]^2+temp[2]^2+temp[3]^2)
temp.family    
## [1] 0.006090281

Podemos então fazer o mesmo para as outras duas estimativas de variação:

# variance between item-groups
temp.items<-(temp[2]^2)/(temp[1]^2+temp[2]^2+temp[3]^2)
temp.items    
## [1] 0.04015039    
# variance unexplained by groups
temp.resid<-(temp[3]^2)/(temp[1]^2+temp[2]^2+temp[3]^2)
temp.resid    
## [1] 0.9537593    
# clearly then, these will sum to 1
temp.family+temp.items+temp.resid    
## [1] 1

Esses resultados sugerem que muito pouco da variação total é explicado pela variação entre famílias ou entre grupos de itens. Mas, como observado acima, a correlação entre classes entre itens ainda pode ser negativa. Primeiro, vamos obter nossos dados em um formato mais amplo:

# not elegant but does the trick
dat2<-cbind(subset(dat,item==1),subset(dat,item==2)[,1],subset(dat,item==3)[,1])
names(dat2)<-c("item1","family","sibling","item","item2","item3")

Agora podemos modelar a correlação entre, por exemplo, item1 e item3 com uma interceptação aleatória para a família como antes. Mas primeiro, talvez valha a pena lembrar que, para uma regressão linear simples, a raiz quadrada do quadrado do r do modelo é igual ao coeficiente de correlação entre classes (r de pearson) para o item1 e o item2.

# a simple linear regression
mod2<-lm(item1~item3,data=dat2)
# extract pearson's r 
sqrt(summary(mod2)$r.squared)    
## [1] 0.6819125    
# check this 
cor(dat2$item1,dat2$item3)    
## [1] 0.6819125    
# yep, equal

# now, add random intercept to the model
mod3<-lmer(item1 ~ item3 + (1|family), data=dat2)
summary(mod3)    

## Linear mixed model fit by REML ['lmerMod']
## Formula: item1 ~ item3 + (1 | family)
##    Data: dat2
## 
## REML criterion at convergence: 1188.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.3148 -0.5348 -0.0136  0.5724  3.2589 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  family   (Intercept) 0.686    0.8283  
##  Residual             1.519    1.2323  
## Number of obs: 336, groups:  family, 100
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept) -0.07777    0.15277  -0.509
## item3        0.52337    0.02775  18.863
## 
## Correlation of Fixed Effects:
##       (Intr)
## item3 -0.699

A relação é entre o item1 e o item3 é positivo. Mas, apenas para verificar se podemos obter uma correlação negativa aqui, vamos manipular nossos dados:

# just going to multiply one column by -1
# to force this cor to be negative

dat2$neg.item3<-dat2$item3*-1
cor(dat2$item1, dat2$neg.item3)    
## [1] -0.6819125    

# now we have a negative relationship
# replace item3 with this manipulated value

mod4<-lmer(item1 ~ neg.item3 + (1|family), data=dat2)
summary(mod4)    

## Linear mixed model fit by REML ['lmerMod']
## Formula: item1 ~ neg.item3 + (1 | family)
##    Data: dat2
## 
## REML criterion at convergence: 1188.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.3148 -0.5348 -0.0136  0.5724  3.2589 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  family   (Intercept) 0.686    0.8283  
##  Residual             1.519    1.2323  
## Number of obs: 336, groups:  family, 100
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept) -0.07777    0.15277  -0.509
## neg.item3   -0.52337    0.02775 -18.863
## 
## Correlation of Fixed Effects:
##           (Intr)
## neg.item3 0.699

Então, sim, o relacionamento entre os itens pode ser negativo. Mas se observarmos a proporção de variação existente entre as famílias nesse relacionamento, ou seja, ICC (família), esse número ainda será positivo. Como antes:

temp2<-as.data.frame(VarCorr(mod4))$vcov
(temp2[1]^2)/(temp2[1]^2+temp2[2]^2)    
## [1] 0.1694989

Portanto, para o relacionamento entre o item1 e o item3, cerca de 17% dessa variação é devido à variação entre famílias. E ainda permitimos que haja uma correlação negativa entre os itens.


Obrigado pela sugestão, mas não vejo como isso realmente forneceria as correlações. Postei alguns dados aqui: wvbauer.com/fam_sib_item.dat Observe que quero estimar 9 correlações diferentes (mais as 3 variações de itens).
Wolfgang

Sugiro dar uma olhada na primeira da lista de perguntas relacionadas aqui . A resposta neste post é muito boa se, no final das contas, você estiver procurando apenas os nove ICC diferentes.
5ayat

Mais uma vez obrigado, mas ainda assim - como isso fornece os nove ICCs? O modelo discutido lá não fornece isso. Além disso, é um modelo de componente de variação que não permite ICCs negativos, mas como mencionei, não espero que todos os ICCs sejam positivos.
Wolfgang

Não estou familiarizado com o problema do ICC negativo em um modelo como este - não há tais restrições aqui. Porém, para calcular essa correlação, quando você olha o resumo do seu modelo com o código acima, você tem três estimativas de variação: família, item e residual. Assim, por exemplo, conforme explicado em outro post, o ICC (família) será var (família) ^ 2 / (var (família) ^ 2 + var (item) ^ 2) + var (residual) ^ 2). Em outras palavras, a variação do resultado ao quadrado sobre a soma da variação ao quadrado para os dois efeitos aleatórios e o residual. Repita para você 9 combinações de família e itens.
5ayat 13/05

1
A qual dos 9 ICCs diferentes var(family)^2/(var(family)^2+var(item)^2)+var(residual)^2)corresponde? E sim, os ICCs podem ser negativos. Como descrevi no início da minha pergunta, é possível estimar diretamente o ICC com o gls()modelo, o que permite estimativas negativas. Por outro lado, os modelos de componentes de variação não permitem estimativas negativas.
Wolfgang
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.