@Wolfgangはすでに素晴らしい答えを出しました。私はそれを少し拡張して、値の多くのペアをランダムに選択する直感的なアルゴリズムを文字通り実装することにより、彼のサンプルデータセットで推定ICC 0.75に到達できることを示したいと思います-各ペアのメンバーは同じグループ-そして、単にそれらの相関を計算します。そして、この同じ手順を、任意のサイズのグループを持つデータセットに簡単に適用できます。これについても説明します。y
まず、@ Wolfgangのデータセットをロードします(ここには表示されていません)。次に、data.frameを受け取り、同じグループからランダムに選択した1つの観測値のペアを返す単純な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を推定するために、この関数を何度も呼び出してから、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
この同じ手順を、変更を加えずに、任意のサイズのグループを持つデータセットに適用できます。たとえば、@ 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
これは、他の2つの推定値とよく一致し、ランダムペアリング手順と比較して、計算がはるかに速く、分散が少ないという意味でより効率的な推定値である必要があります。