ICC ตามความคาดหวังความสัมพันธ์ระหว่างหน่วยสุ่มสองหน่วยที่อยู่ในกลุ่มเดียวกัน


12

ในการสร้างแบบจำลองหลายระดับความสัมพันธ์ intraclass มักจะได้รับการคำนวณจากการสุ่มผลกระทบ ANOVA

yij=γ00+uj+eij

โดยที่เป็นค่าระดับ 2 และเป็นค่าระดับ 1 จากนั้นเราจะได้รับการประมาณและสำหรับความแปรปรวนของและตามลำดับและเสียบเข้ากับสมการต่อไปนี้:ujeijσ^u2σ^e2ujeij

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

Hox (2002) เขียนบน p15ที่

ความสัมพันธ์ภายใน intraclass ρยังสามารถตีความได้ว่าเป็นความสัมพันธ์ที่คาดหวังระหว่างหน่วยสุ่มสองหน่วยที่อยู่ในกลุ่มเดียวกัน

มีคำถามอยู่ที่นี่ซึ่งถามคำถามขั้นสูง (เพราะเหตุใดมันจึงมีค่าเท่ากับนี้แทนที่จะเท่ากับโดยประมาณ) และได้รับคำตอบขั้นสูง

อย่างไรก็ตามฉันต้องการถามคำถามที่ง่ายกว่านี้มาก

คำถาม:การพูดคุยเกี่ยวกับความสัมพันธ์ระหว่างหน่วยสุ่มสองหน่วยที่อยู่ในกลุ่มเดียวกันหมายความว่าอย่างไร

ฉันมีความเข้าใจพื้นฐานเกี่ยวกับความจริงที่ว่าความสัมพันธ์ภายในอินทราเน็ตทำงานในกลุ่มและไม่ได้อยู่ในข้อมูลที่จับคู่ อย่างไรก็ตามฉันยังไม่เข้าใจว่าสามารถคำนวณความสัมพันธ์ได้อย่างไรหากเรามีหน่วยสุ่มสองกลุ่มจากกลุ่มเดียวกัน ถ้าฉันดูจุดแปลงในหน้า Wikipedia สำหรับ ICCเช่นเรามีหลายกลุ่มและหลายจุดภายในแต่ละกลุ่ม

คำตอบ:


10

มันอาจจะง่ายที่สุดที่จะเห็นความเท่าเทียมกันถ้าคุณพิจารณากรณีที่มีเพียงสองคนต่อกลุ่ม ดังนั้นเรามาดูตัวอย่างที่เฉพาะเจาะจง (ฉันจะใช้ R สำหรับสิ่งนี้):

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

ดังนั้นเรามี 8 กลุ่มที่มี 2 คนต่อคน ตอนนี้เรามาปรับโมเดล ANOVA แบบสุ่มเอฟเฟกต์:

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

และสุดท้ายเราคำนวณ ICC:

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

อัตราผลตอบแทนนี้: 0.7500003(0.75 แน่นอน

ทีนี้ลองเปลี่ยนรูปร่างข้อมูลจากรูปแบบยาวเป็นรูปแบบกว้าง:

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

ดูเหมือนตอนนี้:

   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

และคำนวณความสัมพันธ์ระหว่างy.1กับy.2:

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

อัตราผลตอบแทนนี้: 0.8161138

รออะไร? เกิดอะไรขึ้นที่นี่? มันควรจะเป็น 0.75 ใช่ไหม ไม่มาก! สิ่งที่ฉันได้คำนวณข้างต้นไม่ได้เป็น ICC ( intraclassค่าสัมประสิทธิ์สหสัมพันธ์) แต่เพียร์สันปกติค่าสัมประสิทธิ์สหสัมพันธ์ทันทีผลิตภัณฑ์ซึ่งเป็นinterclassค่าสัมประสิทธิ์สหสัมพันธ์ โปรดทราบว่าในข้อมูลที่มีการจัดรูปแบบยาวมันจะไม่มีความหมายว่าใครคือบุคคลที่ 1 และเป็นบุคคลที่ 2 - คู่ไม่มีการเรียงลำดับ คุณสามารถสับเปลี่ยนข้อมูลภายในกลุ่มและคุณจะได้ผลลัพธ์เดียวกัน แต่ในข้อมูลแบบกว้างก็ไม่ได้โดยพลการที่อยู่ภายใต้และผู้ที่อยู่ภายใต้y.1 y.2หากคุณต้องสลับรอบบุคคลบางคนคุณจะได้รับความสัมพันธ์ที่แตกต่างกัน (ยกเว้นถ้าคุณต้องสลับรอบพวกเขาทั้งหมด - แล้วนี่จะเทียบเท่ากับcor(dat[,3], dat[,2])ซึ่งแน่นอนว่ายังคงให้คุณ0.8161138)

สิ่งที่ฟิชเชอร์ชี้ให้เห็นคือเคล็ดลับเล็กน้อยในการรับ ICC ด้วยข้อมูลแบบกว้าง ให้ทุกคู่รวมกันสองครั้งตามลำดับทั้งสองและจากนั้นคำนวณความสัมพันธ์:

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

อัตราผลตอบแทนนี้: 0.75.

อย่างที่คุณเห็น ICC นั้นเป็นสัมประสิทธิ์สหสัมพันธ์จริง ๆ สำหรับข้อมูล "unpaired" ของบุคคลสองคนจากกลุ่มเดียวกัน

หากมีมากกว่าสองคนต่อกลุ่มคุณยังคงสามารถนึกถึง ICC ในลักษณะนั้นยกเว้นว่าจะมีวิธีเพิ่มเติมในการสร้างคู่ของบุคคลภายในกลุ่ม ICC นั้นจะมีความสัมพันธ์ระหว่างการจับคู่ที่เป็นไปได้ทั้งหมด (อีกครั้งในทางที่ไม่ได้สั่ง)


7

@ Wolfgang ให้คำตอบที่ดีอยู่แล้ว ฉันต้องการขยายให้เล็ก ๆ น้อย ๆ เพื่อแสดงให้เห็นว่าคุณสามารถไปถึง ICC โดยประมาณที่ 0.75 ในชุดข้อมูลตัวอย่างของเขาโดยใช้อัลกอริทึมที่ใช้งานง่ายอย่างแท้จริงในการสุ่มเลือกค่าจำนวนมากซึ่งสมาชิกของแต่ละคู่มาจาก กลุ่มเดียวกัน - จากนั้นคำนวณความสัมพันธ์ของพวกเขา จากนั้นขั้นตอนเดียวกันนี้สามารถนำไปใช้กับชุดข้อมูลที่มีกลุ่มขนาดใดก็ได้อย่างที่ฉันจะแสดงy

ก่อนอื่นเราโหลดชุดข้อมูลของ @ Wolfgang (ไม่แสดงที่นี่) ทีนี้เรามานิยามฟังก์ชั่น R แบบง่าย ๆ ที่ใช้ data.frame และคืนค่าการสังเกตแบบสุ่มที่เลือกจากกลุ่มเดียวกัน:

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

นี่คือตัวอย่างของสิ่งที่เราได้รับถ้าเราเรียกฟังก์ชันนี้ 10 ครั้งในชุดข้อมูลของ @ 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

ทีนี้เพื่อประมาณค่า ICC เราแค่เรียกใช้ฟังก์ชันนี้หลายครั้งแล้วคำนวณความสัมพันธ์ระหว่างสองคอลัมน์

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

สามารถใช้ขั้นตอนเดียวกันนี้โดยไม่มีการดัดแปลงเลยกับชุดข้อมูลที่มีกลุ่มขนาดใดก็ได้ ตัวอย่างเช่นลองสร้างชุดข้อมูลที่ประกอบด้วยการสังเกต 100 รายการแต่ละกลุ่มโดยมี ICC จริงตั้งไว้ที่ 0.75 ดังตัวอย่างของ @ 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")

ป้อนคำอธิบายรูปภาพที่นี่

การประมาณค่า ICC โดยพิจารณาจากส่วนประกอบความแปรปรวนจากโมเดลผสมเราได้รับ:

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

และถ้าเราใช้ขั้นตอนการจับคู่แบบสุ่มเราก็จะได้

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

ซึ่งเห็นด้วยอย่างใกล้ชิดกับการประเมินองค์ประกอบความแปรปรวน

โปรดทราบว่าในขณะที่ขั้นตอนการจับคู่แบบสุ่มนั้นเป็นวิธีที่ใช้งานง่ายและมีประโยชน์ในทางปฏิบัติวิธีการที่ @Wolfgang แสดงให้เห็นนั้นฉลาดกว่ามาก สำหรับชุดข้อมูลเช่นขนาด 100 * 100 นี้จำนวนการจับคู่ภายในกลุ่มที่ไม่ซ้ำกัน (ไม่รวมการจับคู่ด้วยตนเอง) คือ 505,000 - เป็นหมายเลขที่ใหญ่ แต่ไม่ใช่ดาราศาสตร์ - ดังนั้นจึงเป็นไปได้ที่เราจะคำนวณความสัมพันธ์ ของชุดการจับคู่ที่หมดไปทั้งหมดของการจับคู่ที่เป็นไปได้ทั้งหมดแทนที่จะต้องสุ่มตัวอย่างจากชุดข้อมูล นี่คือฟังก์ชั่นเพื่อดึงการจับคู่ที่เป็นไปได้ทั้งหมดสำหรับเคสทั่วไปกับกลุ่มที่มีขนาดใด ๆ :

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

ตอนนี้ถ้าเราใช้ฟังก์ชันนี้กับชุดข้อมูล 100 * 100 และคำนวณความสัมพันธ์เราจะได้:

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

ซึ่งเห็นด้วยกับอีกสองประมาณการและเมื่อเทียบกับขั้นตอนการจับคู่แบบสุ่มจะคำนวณได้เร็วกว่ามากและควรเป็นการประมาณที่มีประสิทธิภาพมากกว่าในแง่ของการมีความแปรปรวนน้อยลง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.