同じグループにある2つのランダムに描画されたユニット間の予想される相関としてのICC


12

マルチレベルモデリングでは、クラス内相関はしばしば変量効果ANOVAから計算されます

yj=γ00+あなたはj+ej

ここで、はレベル2の残差、はレベル1の残差です。次に、u_je_ {ij}の分散についてそれぞれ推定値と\ hat {\ sigma} _e ^ 2を取得し、それらを次の式に代入します。あなたはjejσ^あなたは2σ^e2あなたはjej

ρ=σ^あなたは2σ^あなたは2+σ^e2

Hox(2002)はp15に次のように書いています。

クラス内相関ρは、同じグループ内にある2つのランダムに描画されたユニット間の予想される相関としても解釈できます。

質問がありますここで(それは、この代わりにほぼ等しいのとまったく同じである理由)高度な質問をし、先進的な答えを取得します。

ただし、もっと簡単な質問をしたいと思います。

質問:同じグループ内にある2つのランダムに描かれたユニット間の相関について話すことはどういう意味ですか?

クラス内相関はペアのデータではなくグループで機能するという事実を基本的に理解しています。ただし、同じグループからランダムに描画された2つのユニットのみが相関関係を計算する方法を理解できません。たとえば、WikipediaページのICCのドットプロットを見ると、複数のグループと各グループ内の複数のポイントがあります。

回答:


10

グループごとに2人しかいない場合を考えると、同等性を確認するのが最も簡単な場合があります。それでは、特定の例を見てみましょう(これには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")

したがって、それぞれ2人の個人を持つ8つのグループがあります。次に、変量効果ANOVAモデルを適合させましょう。

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(クラス内相関係数)ではなく、クラス間相関係数である通常のピアソンの積率相関係数です。長い形式のデータでは、だれが人1で誰が人2であるかは完全に任意であることに注意してください。ペアは順序付けられていません。グループ内のデータをシャッフルすると、同じ結果が得られます。しかし、ワイド形式データではy.1、誰がの下にリストされ、誰がの下にリストされるかはarbitrary意的ではありませんy.2。一部の個人を切り替えた場合、異なる相関関係が得られます(ただし、すべての個人を切り替えた場合を除き、これは以下と同等です)cor(dat[,3], dat[,2])もちろんこれはまだあなたに与えます0.8161138)。

フィッシャーが指摘したのは、ICCにワイド形式のデータを取得するためのちょっとしたトリックです。すべてのペアを両方の順序で2回含めてから、相関を計算します。

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

これにより、次の結果が得られます0.75

したがって、ご覧のとおり、ICCは実際には相関係数です。同じグループの2人の個人の「ペアになっていない」データに対するものです。

グループごとに2人以上の個人がいる場合でも、グループ内に個人のペアを作成する方法が他にあることを除いて、ICCをそのように考えることができます。ICCは、すべての可能なペアリング間の相関関係です(これも順不同です)。


7

@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つの推定値とよく一致し、ランダムペアリング手順と比較して、計算がはるかに速く、分散が少ないという意味でより効率的な推定値である必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.