Coefficienti di correlazione intraclasse (ICC) con variabili multiple


13

Supponiamo che io abbia misurato una variabile nei fratelli, che sono nidificati all'interno delle famiglie. La struttura dei dati è simile alla seguente:

valore di pari livello familiare
------ ------- -----
1 1 y_11
1 2 y_12
2 1 y_21
2 2 y_22
2 3 y_23
... ... ...

Voglio conoscere la correlazione tra le misurazioni effettuate sui fratelli della stessa famiglia. Il modo normale per farlo è calcolare l'ICC in base a un modello di intercettazione casuale:

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

Ciò equivarrebbe a:

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

tranne che quest'ultimo approccio consente anche un ICC negativo.

Supponiamo ora di aver misurato tre elementi in fratelli nidificati all'interno di famiglie. Quindi, la struttura dei dati è simile alla seguente:

valore dell'articolo del fratello della famiglia
------ ------- ---- -----
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
... ... ... ...

Ora voglio scoprire:

  1. la correlazione tra le misurazioni effettuate sui fratelli della stessa famiglia per lo stesso oggetto
  2. la correlazione tra le misurazioni effettuate sui fratelli della stessa famiglia per articoli diversi

Se avessi solo coppie di fratelli all'interno delle famiglie, farei solo:

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'

Qualche idea / suggerimento su come potrei affrontarlo? Grazie in anticipo per qualsiasi aiuto!

Risposte:


1

Il pacchetto MCMCglmm può facilmente gestire e stimare strutture di covarianza ed effetti casuali. Tuttavia utilizza statistiche bayesiane che possono intimidire i nuovi utenti. Vedi le note sul corso MCMCglmm per una guida completa a MCMCglmm e il capitolo 5 in particolare per questa domanda. Consiglio vivamente di leggere sulla valutazione della convergenza del modello e della miscelazione della catena prima di analizzare i dati reali in MCMCglmm.

library(MCMCglmm)

MCMCglmm usa i priori, questo è un wishart inverso non informativo.

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

Montare il modello

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)

Nel riassunto del modello summary(m)la struttura G descrive la varianza e la covarianza delle intercettazioni casuali. La struttura R descrive la varianza del livello di osservazione e la covarianza dell'intercetta, che funzionano come residui in MCMCglmm.

Se sei di una persuasione bayesiana puoi ottenere l'intera distribuzione posteriore dei termini di co / varianza m$VCV. Si noti che queste sono variazioni dopo la contabilizzazione degli effetti fissi.

simulare dati

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]

Stimare la co / varianza originale degli effetti casuali richiede un gran numero di livelli per l'effetto casuale. Invece il tuo modello probabilmente stimerà le co / varianze osservate che possono essere calcolate dacov(group_var)


0

Se stai cercando di ottenere un "effetto famiglia" e un "effetto oggetto", possiamo pensare che ci siano intercettazioni casuali per entrambi, e quindi modellarlo con il pacchetto 'lme4'.

Ma prima dobbiamo dare a ciascun fratello un ID unico, piuttosto che un ID unico all'interno della famiglia.

Quindi per "la correlazione tra le misure prese sui fratelli della stessa famiglia per oggetti diversi ", possiamo specificare qualcosa come:

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

Questo ci darà un'intercettazione di effetti fissi per tutti i fratelli e poi due intercettazioni di effetti casuali (con varianza), per famiglia e oggetto.

Quindi, per "la correlazione tra le misurazioni prese sui fratelli della stessa famiglia per lo stesso oggetto", possiamo fare la stessa cosa ma semplicemente sottoinsieme i nostri dati, quindi abbiamo qualcosa di simile:

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

Penso che questo potrebbe essere un approccio più semplice alla tua domanda. Ma, se vuoi solo l'ICC per oggetto o famiglia, il pacchetto 'psych' ha una funzione ICC () - stai solo attento a come si fondono oggetto e valore nei tuoi dati di esempio.

Aggiornare

Alcune delle seguenti sono nuove per me, ma mi è piaciuto elaborarlo. Non ho davvero familiarità con l'idea di correlazione intraclasse negativa. Tuttavia, vedo su Wikipedia che le "prime definizioni ICC" consentivano una correlazione negativa con i dati associati. Ma poiché è più comunemente usato ora, ICC è intesa come la proporzione della varianza totale che è varianza tra i gruppi. E questo valore è sempre positivo. Mentre Wikipedia potrebbe non essere il riferimento più autorevole, questo riassunto corrisponde a come ho sempre visto l'ICC usato:

Un vantaggio di questo framework ANOVA è che gruppi diversi possono avere un numero diverso di valori di dati, che è difficile da gestire usando le statistiche ICC precedenti. Nota anche che questo ICC è sempre non negativo, permettendogli di essere interpretato come la proporzione della varianza totale che è "tra i gruppi". Questo ICC può essere generalizzato per consentire effetti covariati, nel qual caso l'ICC viene interpretato come una cattura della somiglianza all'interno della classe dei valori dei dati adeguati alla covariata.

Detto questo, con dati come quelli forniti qui, la correlazione tra le classi tra gli elementi 1, 2 e 3 potrebbe benissimo essere negativa. E possiamo modellarlo, ma la proporzione della varianza spiegata tra i gruppi sarà comunque 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)

Quindi, quale percentuale della varianza è tra le famiglie, controllando anche tra la varianza di gruppo tra gruppi di articoli? Possiamo usare un modello di intercettazione casuale come hai suggerito:

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

Calcoliamo l'ICC ottenendo la varianza dalle due intercettazioni di effetti casuali e dai residui. Calcoliamo quindi il quadrato della varianza familiare sulla somma dei quadrati di tutte le varianze.

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

Possiamo quindi fare lo stesso per le altre due stime di varianza:

# 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

Questi risultati suggeriscono che molto poco della varianza totale è spiegata dalla varianza tra famiglie o tra gruppi di articoli. Ma, come notato sopra, la correlazione tra classi tra gli elementi potrebbe ancora essere negativa. Innanzitutto otteniamo i nostri dati in un formato più ampio:

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

Ora possiamo modellare la correlazione tra, ad esempio, item1 e item3 con un'intercettazione casuale per la famiglia come prima. Ma prima, forse vale la pena ricordare che per una semplice regressione lineare, la radice quadrata del quadrato r del modello è la stessa del coefficiente di correlazione tra le classi (r di Pearson) per l'elemento 1 e l'elemento2.

# 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

La relazione tra item1 e item3 è positiva. Ma, solo per verificare che qui possiamo ottenere una correlazione negativa, manipoliamo i nostri dati:

# 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

Quindi sì, la relazione tra gli articoli può essere negativa. Ma se osserviamo la proporzione di varianza tra le famiglie in questa relazione, cioè ICC (famiglia), quel numero sarà comunque positivo. Come prima:

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

Quindi, per la relazione tra item1 e item3, circa il 17% di questa varianza è dovuto alla varianza tra famiglie. E abbiamo ancora permesso che ci sia una correlazione negativa tra gli articoli.


Grazie per il suggerimento, ma non vedo come questo possa effettivamente fornire le correlazioni. Ho pubblicato alcuni dati qui: wvbauer.com/fam_sib_item.dat Nota che desidero stimare 9 correlazioni diverse (più le 3 variazioni degli articoli).
Wolfgang,

Quindi suggerisco di dare un'occhiata alla prima delle domande correlate qui . La risposta in questo post è molto buona se alla fine stai cercando solo le nove diverse ICC.
5

Grazie ancora, ma comunque - come possono fornire le nove ICC? Il modello qui discusso non lo prevede. Inoltre, è un modello di componente di varianza che non consente ICC negativi, ma come ho già detto, non mi aspetto che tutti gli ICC siano positivi.
Wolfgang,

Non ho familiarità con il problema dell'ICC negativo in un modello come questo - non ci sono tali vincoli qui. Ma per calcolare questa correlazione, quando guardi il riepilogo del tuo modello con il codice sopra, hai tre stime di varianza: famiglia, articolo e residuo. Ad esempio, come spiegato in altri post, ICC (famiglia), sarà var (famiglia) ^ 2 / (var (famiglia) ^ 2 + var (articolo) ^ 2) + var (residuo) ^ 2). In altre parole, la varianza del risultato è quadrata rispetto alla somma della varianza al quadrato per i due effetti casuali e il residuo. Ripeti per te 9 combinazioni di famiglia e oggetti.
5

1
A quale delle 9 differenti ICC var(family)^2/(var(family)^2+var(item)^2)+var(residual)^2)corrisponde? E sì, le ICC possono essere negative. Come ho descritto all'inizio della mia domanda, si può stimare direttamente l'ICC con il gls()modello, che consente stime negative. D'altro canto, i modelli di componenti di varianza non consentono stime negative.
Wolfgang,
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.