@ वोल्फगैंग ने पहले ही शानदार जवाब दिया। मैं इसे थोड़ा विस्तार से दिखाना चाहता हूं कि आप 0.75 के अनुमानित आईसीसी में भी उसके उदाहरण के डेटासेट में पहुंच सकते हैं, जो कि वैल्यू के कई जोड़े को बेतरतीब ढंग से चुनने के सहज एल्गोरिथ्म को लागू करके - जहां प्रत्येक जोड़ी के सदस्य आते हैं एक ही समूह - और फिर बस उनके सहसंबंध की गणना। और फिर इस प्रक्रिया को आसानी से किसी भी आकार के समूहों के साथ डेटासेट पर लागू किया जा सकता है, जैसा कि मैं भी दिखाऊंगा।y
पहले हम @ वोल्फगैंग का डेटासेट (यहां नहीं दिखाया गया) लोड करते हैं। अब चलो एक साधारण 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 बार कॉल करते हैं, तो इसका एक उदाहरण है:
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 समूहों में से प्रत्येक में 100 समूह होते हैं, जिसमें सच आईसीसी 0.75 पर @ वोल्फगैंग के उदाहरण में सेट है।
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
जो बारीकी से विचरण घटक के अनुमान से सहमत है।
ध्यान दें कि जबकि यादृच्छिक युग्मन प्रक्रिया सहज ज्ञान युक्त है, और विशेष रूप से उपयोगी है, जो विधि @ वुल्फगैंग द्वारा सचित्र है, वास्तव में बहुत चालाक है। इस तरह के डेटासेट के लिए आकार 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
जो अन्य दो अनुमानों से अच्छी तरह सहमत है, और यादृच्छिक युग्मन प्रक्रिया की तुलना में, गणना करने के लिए बहुत तेज है, और कम विचरण करने के अर्थ में एक अधिक कुशल अनुमान भी होना चाहिए।