Rでlmerを使用してカスタムコントラストを設定する方法


9

Rでlmerを使用して、条件(cond)の結果への影響を確認しています。ここではいくつかのSは主題識別子であるデータを、作られておりabそしてc条件です。

library("tidyr")
library("dplyr")
set.seed(123)
temp <- data.frame(s = paste0("S", 1:30), 
                   a = rnorm(30, -2, 1), 
                   b = rnorm(30, -3, 1), 
                   c = rnorm(30, -4, 1)) 

比較したい

  1. レベルaレベルの平均にbc
  2. レベルbからレベルへc

私の質問は、切片が3つの条件の平均を反映し、2つの計算された推定値が1.と2。

私が試した

c1 <- cbind(c(-0.5, 0.25, 0.25), c(0, -0.5, 0.5))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c1))

どこcond2OKのようですが、cond1ではありません。

以下のこれらのカスタムコントラストをどのように解釈しますか?、代わりに一般化された逆を使用しようとしましたが、これらの推定値も意味がありません。

c2 <- t(ginv(c1))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c2))

私もヘルマートのコントラストを試しましたが、手段はまだ一致していません。

gather(temp, cond, result, a, b, c) %>%
  mutate(cond = factor(cond, levels = c("c", "b", "a"))) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = contr.helmert))

これを行う正しい方法は何ですか?


これはヘルマートのコントラストのように聞こえます(cが最初のレベル、次にb、次にa)。
マイケルM

私もヘルマートを試してみましたが、数字は私が探している手段ではありません。質問を編集して、ヘルマートの対比を含めました。ありがとうございます。
M4RT1NK4 2015

回答:


13

次の手順では、長い形式のデータフレームが必要です。データフレームは、dat従属変数含まれresult、カテゴリ予測cond:(レベルabおよびc、ランダム因子)s

library(tidyr)
dat <- gather(temp, cond, result, a, b, c)

以下では、比較する条件に対応するコントラストマトリックスを作成する2つの方法を示します。

  1. ab+c2
  2. bc

カスタムコントラスト

マトリックスmatはレベル差に対応します。

mat <- rbind(c(1, -0.5, -0.5),     # a vs. (b + c) / 2
             c(0, 1, -1))          # b vs. c

実際のコントラスト行列を作成するために、ginv(からMASS)で一般化された逆行列を計算します。

library(MASS)
cMat <- ginv(mat)
#            [,1]          [,2]
# [1,]  0.6666667 -7.130169e-17
# [2,] -0.3333333  5.000000e-01
# [3,] -0.3333333 -5.000000e-01

このコントラスト行列cMatはで使用できますlmer

library(lme4)
res <- lmer(result ~ cond + (1|s), data = dat, 
            contrasts = list(cond = cMat))
coef(summary(res))    
#              Estimate Std. Error    t value
# (Intercept) -2.948115  0.0946025 -31.163182
# cond1        1.351517  0.2006822   6.734612
# cond2        1.153918  0.2317279   4.979625

ご覧のとおり、固定効果の推定値は上記で指定された差異に対応しています。さらに、切片は全体の平均を表します。

ヘルマートとの対比 contr.helmert

組み込みcontr.helmert関数を使用して、コントラストマトリックスを作成することもできます。

cHelmert <- contr.helmert(3)
#   [,1] [,2]
# 1   -1   -1
# 2    1   -1
# 3    0    2

ただし、注文は質問で指定したものと一致しません。したがって、列と行の順序を逆にする必要があります。最初の列はbvsに対応しa、2番目の列cbとの平均に対応していaます。

cHelmert2 <- cHelmert[c(3:1), 2:1]
#   [,1] [,2]
# 3    2    0
# 2   -1    1
# 1   -1   -1

コントラスト行列cHelmert2をと比較しcMatます。列が他の行列のスケーリングされたバージョンであることがわかります。

の結果lmerは次のとおりです。

library(lme4)
res2 <- lmer(result ~ cond + (1|s), data = dat, 
             contrasts = list(cond = cHelmert2))
coef(summary(res2))    
#               Estimate Std. Error    t value
# (Intercept) -2.9481150 0.09460250 -31.163182
# cond1        0.4505056 0.06689407   6.734612
# cond2        0.5769590 0.11586393   4.979625

このコントラストマトリックスにより、カスタムコントラストマトリックスと同じ比較を行うことができます。ただし、行列の値が異なるため、固定効果係数も異なります。当然のことながら、値は同じです。t


まことにありがとうございます!私がこれを今理解していることを確認するためだけに-最初のレベルを4レベルの変数の残りのレベルと比較したい場合はどうmatなりc(1, -1/3, -1/3, -1/3)ますか?したがって、私は常に数式(a +(b + c + d)/ 3)のように数値を設定ginvし、係数を適切にスケーリングして、係数が直接差を反映するようにします。Helmertの例で順序を変更したとき、それは単に質問と一致するためですか?そうでなければ、コントラストの順序に関係なく、結果は同じになるはずですよね?
M4RT1NK4 2015

@ M4RT1NK4数式と対応するコントラストが正しくありません。列の順序が問題の列の順序と一致するように変更されました。ただし、最初のレベルは参照レベルであるため、行の順序は重要です。あなたの例では、参照レベルは3番目のレベルです。
Sven Hohenstein、2015

@SvenHohensteinこの回答に基づいて関連する質問がありました。stats.stackexchange.com/questions/357781/…– 18
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.