@ 울프 강은 이미 큰 답을 주었다. 나는 값 의 많은 쌍을 무작위로 선택하는 직관적 인 알고리즘을 문자 그대로 구현함으로써 각 예제 데이터 세트에서 0.75의 추정 ICC에 도달 할 수 있음을 보여주기 위해 조금 확장하고 싶습니다 . 같은 그룹-단순히 상관 관계를 계산합니다. 그런 다음 동일한 절차를 모든 크기의 그룹이있는 데이터 세트에 쉽게 적용 할 수 있습니다.y
먼저 @Wolfgang의 데이터 셋을로드합니다 (여기에 표시되지 않음). 이제 data.frame을 가져와 같은 그룹에서 무작위로 선택된 단일 관측 값 쌍을 반환하는 간단한 R 함수를 정의 해 보겠습니다.
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"])
}
@Wolfgang의 데이터 세트에서이 함수를 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
이 동일한 절차는 모든 크기의 그룹이있는 데이터 세트에 전혀 수정없이 적용 할 수 있습니다. 예를 들어 @Wolfgang의 예에서와 같이 실제 ICC가 0.75로 설정된 100 개의 관측치 그룹 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")
혼합 모형의 분산 성분을 기반으로 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
다른 두 추정치와 잘 일치하고 랜덤 페어링 절차와 비교할 때 계산 속도가 훨씬 빠르며 분산이 적다는 의미에서보다 효율적인 추정치가되어야합니다.