ICC作为同一组中两个随机抽取的单元之间的预期相关性


12

在多层次建模中,类内相关性通常是根据随机效应方差分析来计算的

yij=γ00+uj+eij

其中uj是2级残差,而eij是1级残差。然后,我们得到的估计σ^u2σ 2 Ë为的方差ü ĴË Ĵ分别,并将其插入公式如下:σ^e2ujeij

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

Hox(2002)在第15页写道

类内相关ρ也可以解释为同一组中两个随机绘制的单元之间的预期相关性

有一个问题在这里,询问了先进的问题(为什么它正好等于这个代替近似相等),并获得了先进的答案。

但是,我想问一个简单得多的问题。

问题:谈论同一组中两个随机绘制的单元之间的相关性甚至意味着什么?

我对类内关联适用于组而不适用于成对的数据这一事实有基本的了解。但是,如果我们只有来自同一组的两个随机抽取的单位,我仍然不知道如何计算相关性。例如,如果我查看Wikipedia页面上ICC的点图,则我们有多个组,每个组中有多个点。

Answers:


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个人。现在让我们拟合随机效应方差分析模型:

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.1y.2

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

这产生: 0.8161138

等一下 这里发生了什么?应该不是0.75吗?不完全的!我上面计算的不是ICC(类内相关系数),而是规则的Pearson乘积矩相关系数,它是类间相关系数。请注意,在长格式数据中,谁是人1和谁是人2完全是任意的-这些对是无序的。您可以重新组合组中的数据,您将获得相同的结果。但是在宽格式数据中,谁在下列出y.1以及谁在下列出并不是任意的y.2。如果您要切换一些人,您将获得不同的相关性(除非您要切换所有人,否则等价于cor(dat[,3], dat[,2])当然,这仍然可以为您提供0.8161138)。

Fisher指出,使用宽格式数据获取ICC是一个小技巧。将两个对按两个顺序包括两次,然后计算相关性:

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

这将产生:0.75

因此,如您所见,ICC实际上是一个相关系数-对于来自同一组的两个人的“未配对”数据。

如果每个组中有两个以上的个人,您仍然可以用这种方式来考虑ICC,除了在组内创建对个人的方式更多之外。然后,ICC是所有可能配对之间的相关性(再次以无序方式)。


7

@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

与其他两个估算值非常吻合,并且与随机配对过程相比,它的计算速度要快得多,并且在具有较小方差的意义上也应该是更有效的估算值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.