@Wolfgang已经给出了一个很好的答案。我想在此稍作扩展,以显示您还可以通过从字面上实现随机选择许多对值的直观算法来获得他的示例数据集中估计的0.75的ICC- 其中每对成员都来自同一组-然后简单地计算它们的相关性。然后,同样的过程可以轻松地应用于具有任意大小的组的数据集,正如我还将展示的那样。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"])
}
这是一个示例,如果我们在@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
可以对具有任意大小的组的数据集应用相同的过程,而无需进行任何修改。例如,让我们创建一个数据集,该数据集包含100组,每组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
与其他两个估算值非常吻合,并且与随机配对过程相比,它的计算速度要快得多,并且在具有较小方差的意义上也应该是更有效的估算值。