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