@ Wolfgang sudah memberikan jawaban yang bagus. Saya ingin sedikit mengembangkannya untuk menunjukkan bahwa Anda juga dapat sampai pada perkiraan ICC 0,75 dalam dataset contohnya dengan benar-benar menerapkan algoritma intuitif memilih secara acak banyak pasangan nilai-nilai - di mana anggota setiap pasangan berasal dari kelompok yang sama - dan kemudian hanya menghitung korelasinya. Dan kemudian prosedur yang sama ini dapat dengan mudah diterapkan pada dataset dengan kelompok ukuran berapa pun, seperti yang akan saya tunjukkan.y
Pertama kita memuat dataset @ Wolfgang (tidak ditampilkan di sini). Sekarang mari kita mendefinisikan fungsi R sederhana yang mengambil data.frame dan mengembalikan pasangan pengamatan tunggal yang dipilih secara acak dari grup yang sama:
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"])
}
Berikut adalah contoh dari apa yang kita dapatkan jika kita memanggil fungsi ini 10 kali pada dataset @ 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
Sekarang untuk memperkirakan ICC, kita cukup memanggil fungsi ini beberapa kali dan kemudian menghitung korelasi antara kedua kolom.
random_pairs <- replicate(100000, get_random_pair(dat))
cor(t(random_pairs))
# [,1] [,2]
# [1,] 1.0000000 0.7493072
# [2,] 0.7493072 1.0000000
Prosedur yang sama ini dapat diterapkan, tanpa modifikasi sama sekali, untuk kumpulan data dengan kelompok ukuran apa pun. Sebagai contoh, mari kita buat dataset yang terdiri dari 100 kelompok yang terdiri dari 100 pengamatan masing-masing, dengan ICC yang sebenarnya ditetapkan ke 0,75 seperti pada contoh @ 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")
Memperkirakan ICC berdasarkan komponen varians dari model campuran, kita mendapatkan:
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
Dan jika kita menerapkan prosedur pemasangan acak, kita dapatkan
random_pairs <- replicate(100000, get_random_pair(dat))
cor(t(random_pairs))
# [,1] [,2]
# [1,] 1.0000000 0.7503004
# [2,] 0.7503004 1.0000000
yang sangat setuju dengan estimasi komponen varians.
Perhatikan bahwa meskipun prosedur pemasangan acak agak intuitif, dan bermanfaat secara didaktik, metode yang diilustrasikan oleh @Wolfgang sebenarnya jauh lebih pintar. Untuk dataset seperti ini dengan ukuran 100 * 100, jumlah pasangan dalam-kelompok yang unik (tidak termasuk pasangan mandiri) adalah 505.000 - angka besar tetapi bukan astronomi - sehingga sangat mungkin bagi kita untuk menghitung korelasi dari set lengkap semua pasangan yang memungkinkan, daripada perlu sampel secara acak dari dataset. Berikut adalah fungsi untuk mengambil semua pasangan yang memungkinkan untuk kasus umum dengan grup dari berbagai ukuran:
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"])
}))
}
Sekarang jika kita menerapkan fungsi ini ke dataset 100 * 100 dan menghitung korelasinya, kita mendapatkan:
cor(get_all_pairs(dat))
# [,1] [,2]
# [1,] 1.0000000 0.7504817
# [2,] 0.7504817 1.0000000
Yang setuju dengan dua estimasi lainnya, dan dibandingkan dengan prosedur pairing acak, jauh lebih cepat untuk dihitung, dan juga harus menjadi estimasi yang lebih efisien dalam arti memiliki lebih sedikit varians.