ICC sebagai korelasi yang diharapkan antara dua unit yang ditarik secara acak yang berada dalam kelompok yang sama

12

Dalam pemodelan bertingkat, korelasi intraclass sering dihitung dari efek acak ANOVA

yij=γ00+uj+eij

di mana uj adalah tingkat-2 residual dan eij adalah residual level-1. Kemudian kita mendapatkan σ^u2 dan σ 2 e untuk varians dari u j dan e i j masing-masing, dan plug mereka ke persamaan berikut:σ^e2ujeij

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

Hox (2002) menulis di halaman 15 itu

Korelasi intraclass ρ juga dapat diartikan sebagai korelasi yang diharapkan antara dua unit yang diambil secara acak yang berada dalam kelompok yang sama

Ada pertanyaan di sini yang mengajukan pertanyaan lanjutan (mengapa persis sama dengan ini, bukan kira-kira sama) dan mendapat jawaban lanjutan.

Namun, saya ingin mengajukan pertanyaan yang lebih sederhana.

Pertanyaan: Apa artinya berbicara tentang korelasi antara dua unit yang ditarik secara acak yang berada dalam kelompok yang sama?

Saya memiliki pemahaman dasar tentang fakta bahwa korelasi intraclass bekerja pada kelompok dan bukan pada data berpasangan. Namun, saya masih tidak mengerti bagaimana korelasi dapat dihitung jika yang kami miliki adalah dua unit yang diambil secara acak dari kelompok yang sama. Jika saya melihat titik plot pada halaman Wikipedia untuk ICC , misalnya, kami memiliki beberapa grup dan beberapa poin dalam setiap grup.

user1205901 - Pasang kembali Monica
sumber

Jawaban:

10

Mungkin paling mudah untuk melihat kesetaraan jika Anda mempertimbangkan kasus di mana hanya ada dua individu per kelompok. Jadi, mari kita lihat contoh spesifik (saya akan menggunakan R untuk ini):

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

Jadi, kami memiliki 8 grup dengan masing-masing 2 individu. Sekarang mari kita masukkan model ANOVA efek-acak:

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

Dan akhirnya, mari kita hitung ICC:

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

Ini menghasilkan: 0.7500003(tepatnya 0,75, tetapi ada sedikit kesan numerik dalam prosedur estimasi di sini).

Sekarang mari kita membentuk kembali data dari format panjang ke format lebar:

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

Ini terlihat seperti ini sekarang:

   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

Dan sekarang hitung korelasi antara y.1dan y.2:

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

Ini menghasilkan: 0.8161138

Tunggu apa? Apa yang terjadi di sini? Bukankah seharusnya 0,75? Tidak terlalu! Apa yang saya hitung di atas bukanlah ICC ( koefisien korelasi intraclass ), tetapi koefisien korelasi product-moment Pearson, yang merupakan koefisien korelasi antar kelas . Perhatikan bahwa dalam data format panjang, sepenuhnya sewenang-wenang siapa orang 1 dan siapa orang 2 - pasangan tidak berurutan. Anda dapat merombak data dalam grup dan Anda akan mendapatkan hasil yang sama. Namun dalam data format lebar, tidak sembarang siapa yang terdaftar di bawah y.1dan siapa yang terdaftar di bawah y.2. Jika Anda beralih di antara beberapa individu, Anda akan mendapatkan korelasi yang berbeda (kecuali jika Anda harus beralih di antara mereka semua - maka ini setara dengancor(dat[,3], dat[,2])yang tentu saja masih memberi Anda 0.8161138).

Apa yang ditunjukkan Fisher adalah sedikit trik untuk mendapatkan ICC dengan data format lebar. Mintalah setiap pasangan dimasukkan dua kali, dalam kedua pesanan, dan kemudian hitung korelasinya:

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

Ini menghasilkan: 0.75.

Jadi, seperti yang Anda lihat, ICC benar-benar merupakan koefisien korelasi - untuk data "tidak berpasangan" dari dua individu dari kelompok yang sama.

Jika ada lebih dari dua individu per grup, Anda masih bisa memikirkan ICC dengan cara itu, kecuali bahwa akan ada lebih banyak cara untuk menciptakan pasangan individu dalam kelompok. ICC kemudian merupakan korelasi antara semua pasangan yang memungkinkan (sekali lagi dengan cara yang tidak teratur).

Wolfgang
sumber
7

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

masukkan deskripsi gambar di sini

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.

Jake Westfall
sumber