Aynı grupta yer alan iki rastgele çizilmiş birim arasında beklenen korelasyon


12

Çok düzeyli modellemede, sınıf içi korelasyon genellikle rastgele etkiler ANOVA'dan hesaplanır

ybenj=γ00+uj+ebenj

burada seviye-2 artıklar ve e i j seviye-1 artıklardır. Sonra, tahminleri elde σ 2 u ve σ 2 e varyansı için u j ve E i j sırasıyla aşağıdaki denkleme içine takın:ujebenjσ^u2σ^e2ujebenj

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

(2002) Hox P15 yazıyor o

Sınıf içi korelasyon ρ, aynı grupta yer alan iki rasgele çizilmiş ünite arasındaki beklenen korelasyon olarak da yorumlanabilir

Bir soru var burada (bu yerine yaklaşık olarak eşit bir tam olarak eşit olmasının nedeni) gelişmiş bir soru sorar ve gelişmiş bir cevap alır.

Ancak, çok daha basit bir soru sormak istiyorum.

Soru: Aynı grupta yer alan iki rastgele çizilmiş birim arasındaki korelasyon hakkında konuşmak ne anlama geliyor?

Sınıf içi korelasyonun eşleştirilmiş veriler üzerinde değil gruplar üzerinde çalıştığı konusunda temel bir anlayışa sahibim. Ancak, sahip olduğumuz tek şey aynı gruptan rastgele seçilmiş iki birim ise korelasyonun nasıl hesaplanabileceğini hala anlamıyorum. Örneğin, ICC için Wikipedia sayfasındaki nokta çizimlerine bakarsam , her grupta birden fazla grup ve birden çok nokta bulunur.

Yanıtlar:


10

Grup başına sadece iki kişinin olduğu bir vakayı düşünürseniz denkliği görmek en kolay yol olabilir. Öyleyse, belirli bir örneği inceleyelim (bunun için R'yi kullanacağım):

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

Yani her biri 2 kişiden oluşan 8 grubumuz var. Şimdi rastgele efektler ANOVA modeline uyalım:

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

Ve son olarak, ICC'yi hesaplayalım:

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

Bu 0.7500003sonuç verir: (tam olarak 0.75'tir, ancak buradaki tahmin prosedüründe hafif bir sayısal izlenim vardır).

Şimdi verileri uzun formattan geniş formata yeniden şekillendirelim:

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

Şimdi şöyle görünüyor:

   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

Ve şimdi y.1ve arasındaki korelasyonu hesaplayın y.2:

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

Bu şu sonuçları verir: 0.8161138

Bir dakika ne? Burada neler oluyor? 0.75 olmamalı mı? Pek değil! Yukarıda hesapladığım şey ICC ( sınıf içi korelasyon katsayısı) değil, sınıflar arası korelasyon katsayısı olan normal Pearson ürün-moment korelasyon katsayısıdır. Uzun formatlı verilerde, kimin 1 ve kimin 2 olduğu tamamen keyfi olur - çiftler sırasızdır. Verileri gruplar içinde yeniden karıştırabilir ve aynı sonuçları elde edersiniz. Ancak geniş formatlı verilerde, kimin altında y.1ve kimin altında listelendiği keyfi değildir y.2. Bazı bireyler arasında geçiş yaparsanız, farklı bir korelasyon elde edersiniz (hepsi arasında geçiş yapmanız dışında - o zaman bu eşdeğerdir)cor(dat[,3], dat[,2])tabii ki hala sana veriyor 0.8161138).

Fisher'ın işaret ettiği şey, ICC'yi geniş formatlı verilerle elde etmek için küçük bir numara. Her çiftin her iki sıraya da iki kez dahil edilmesini sağlayın ve ardından korelasyonu hesaplayın:

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

Bu verir: 0.75.

Gördüğünüz gibi, ICC gerçekten bir korelasyon katsayısıdır - aynı gruptan iki kişinin "eşleştirilmemiş" verileri için.

Grup başına ikiden fazla kişi varsa, yine de ICC'yi bu şekilde düşünebilirsiniz, ancak gruplar içinde birey çiftleri oluşturmanın daha fazla yolu olacaktır. ICC, o zaman tüm olası eşleşmeler arasındaki korelasyondur (yine düzensiz bir şekilde).


7

y

Önce @ Wolfgang'ın veri kümesini yüklüyoruz (burada gösterilmemiştir). Şimdi bir data.frame alan ve aynı gruptan rastgele seçilmiş tek bir gözlem çifti döndüren basit bir R fonksiyonu tanımlayalım:

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

Bu işlevi @ Wolfgang'ın veri kümesinde 10 kez çağırırsak ne elde edeceğimize bir örnek:

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

Şimdi ICC'yi tahmin etmek için, bu işleve çok sayıda diyoruz ve sonra iki sütun arasındaki korelasyonu hesaplıyoruz.

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

Aynı prosedür, herhangi bir değişiklik olmaksızın, herhangi bir boyuttaki gruplara sahip veri kümelerine uygulanabilir. Örneğin, her biri 100 gözlemden oluşan 100 gruptan oluşan bir veri kümesi oluşturalım, gerçek ICC @ Wolfgang örneğinde olduğu gibi 0.75 olarak ayarlanmış.

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

resim açıklamasını buraya girin

ICC'yi karışık bir modelin varyans bileşenlerine göre tahmin ederek şunları elde ederiz:

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

Ve rastgele eşleştirme prosedürünü uygularsak,

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

bu da varyans bileşeni tahmini ile yakından uyumludur.

Rastgele eşleme prosedürü sezgisel ve didaktik olarak kullanışlı olsa da, @Wolfgang tarafından gösterilen yöntemin aslında çok daha akıllı olduğunu unutmayın. 100 * 100 boyutundaki böyle bir veri kümesi için, benzersiz grup içi eşleştirme sayısı (kendi kendine eşleştirme dahil değil) 505.000'dir - büyük ama astronomik olmayan bir sayı - bu yüzden korelasyonu hesaplamamız tamamen mümkündür veri kümesinden rastgele örnekleme yapmak yerine, tüm olası eşleşmelerin tamamen bitmiş kümesinin. Aşağıda, herhangi bir boyuttaki gruplarla genel durum için olası tüm eşleştirmeleri almak için bir işlev bulunmaktadır:

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

Şimdi bu işlevi 100 * 100 veri kümesine uygular ve korelasyonu hesaplarsak:

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

Diğer iki tahminle iyi uyum sağlayan ve rastgele eşleştirme prosedürüne kıyasla, hesaplamak çok daha hızlıdır ve daha az sapma olması açısından daha verimli bir tahmin olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.