@ ওল্ফগ্যাং ইতিমধ্যে একটি দুর্দান্ত উত্তর দিয়েছে। আমি এটিতে আরও প্রসারিত করতে চাই যে আপনি তার উদাহরণস্বরূপ 0.75 এর আনুমানিক আইসিসিতে এসে পৌঁছাতে পারবেন আক্ষরিক অর্থে এলোমেলোভাবে মানগুলির অনেক জোড়া নির্বাচন করার স্বজ্ঞাত অ্যালগরিদম - যেখানে প্রতিটি জোড়ের সদস্যরা আসে একই গ্রুপ - এবং তারপরে কেবল তাদের পারস্পরিক সম্পর্ককে গণনা করা। এবং তারপরে এই একই পদ্ধতিটি যে কোনও আকারের গ্রুপ সহ ডেটাসেটগুলিতে সহজেই প্রয়োগ করা যেতে পারে, যেমন আমি এটিও দেখাব।y
প্রথমে আমরা @ ওল্ফগ্যাংয়ের ডেটাসেট লোড করি (এখানে দেখানো হয়নি)। এখন আসুন একটি সাধারণ আর ফাংশন সংজ্ঞায়িত করি যা ডেটা.ফ্রেম নেয় এবং একই গ্রুপ থেকে এলোমেলোভাবে নির্বাচিত এক পর্যবেক্ষণের জোড় দেয়:
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
এখন আইসিসি অনুমান করার জন্য, আমরা কেবলমাত্র এই ফাংশনটিকে একটি বিশাল সংখ্যক বার বলি এবং তারপরে দুটি কলামের মধ্যে পারস্পরিক সম্পর্ক গণনা করি।
random_pairs <- replicate(100000, get_random_pair(dat))
cor(t(random_pairs))
# [,1] [,2]
# [1,] 1.0000000 0.7493072
# [2,] 0.7493072 1.0000000
এই একই পদ্ধতিটি কোনও আকারের গ্রুপ সহ ডেটাসেটগুলিতে কোনও পরিবর্তন ছাড়াই প্রয়োগ করা যেতে পারে। উদাহরণস্বরূপ, আসুন সত্যিকারের আইসিসি @ ওল্ফগ্যাংয়ের উদাহরণ অনুসারে ০.75৫ সেট রয়েছে, প্রতিটি প্রত্যক্ষ পর্যবেক্ষণের 100 টি গ্রুপের সমন্বয়ে একটি ডেটাসেট তৈরি করি।
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")
মিশ্র মডেল থেকে বৈকল্পিক উপাদানগুলির উপর ভিত্তি করে আইসিসি অনুমান করা, আমরা পাই:
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
যা ঘনিষ্ঠভাবে বৈকল্পিক উপাদান অনুমানের সাথে একমত।
নোট করুন যে এলোমেলো জোড় করার পদ্ধতিটি এক ধরণের স্বজ্ঞাত এবং কার্যকরভাবে কার্যকর, তবে @ ওল্ফগ্যাং দ্বারা চিত্রিত পদ্ধতিটি আসলে অনেক বেশি স্মার্ট। এই আকারের ১০০ * ১০০ এর মতো একটি ডেটাসেটের জন্য, গ্রুপ-জুটির জোড়গুলির মধ্যে স্ব-জুটিগুলি অন্তর্ভুক্ত নয়) এটি ৫০৫,০০০ - একটি বড় তবে জ্যোতির্বিদ্যার সংখ্যা নয় - সুতরাং আমাদের পক্ষে পারস্পরিক সম্পর্ককে গণনা করা সম্পূর্ণভাবে সম্ভব ডেটাসেট থেকে এলোমেলোভাবে নমুনার প্রয়োজনের চেয়ে সমস্ত সম্ভাব্য জুটির সম্পূর্ণ ক্লান্ত সেট। যে কোনও আকারের গ্রুপগুলির সাথে সাধারণ কেসের জন্য সমস্ত সম্ভাব্য জুটিগুলি পুনরুদ্ধার করতে এখানে একটি ফাংশন রয়েছে:
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
যা অন্য দুটি অনুমানের সাথে ভালভাবে একমত এবং এলোমেলো জোড় পদ্ধতির তুলনায়, গণনা করা আরও দ্রুত এবং কম পার্থক্য থাকার দিক থেকে আরও কার্যকর অনুমানও হওয়া উচিত।