車を使用して繰り返し測定ANOVAの特定のコントラストを指定する方法は?


12

RでAnovaを繰り返し測定した後、そのデータセットでいくつかの特定のコントラストを実行しようとしています。正しいアプローチはAnova()、車のパッケージから使用することだと思い ます。

データの?Anova使用 から得られた例で私の質問を説明しましょうOBrienKaiser(注:例から性別因子を省略しました):
被験者因子、治療(3レベル:コントロール、A、B)、および2反復の間の1つのデザインがあります-測定(被験者内)要因、フェーズ(3レベル:事前テスト、事後テスト、フォローアップ)および時間(5レベル:1〜5)。

標準のANOVAテーブルは次のようになります(example(Anova)とは異なり、タイプ3の二乗和に切り替えました。これが私の分野の望みです)。

require(car)
phase <- factor(rep(c("pretest", "posttest", "followup"), c(5, 5, 5)),
levels=c("pretest", "posttest", "followup"))
hour <- ordered(rep(1:5, 3))
idata <- data.frame(phase, hour)
mod.ok <- lm(cbind(pre.1, pre.2, pre.3, pre.4, pre.5, post.1, post.2, post.3, post.4, post.5, fup.1, fup.2, fup.3, fup.4, fup.5) ~ treatment, data=OBrienKaiser)
av.ok <- Anova(mod.ok, idata=idata, idesign=~phase*hour, type = 3)
summary(av.ok, multivariate=FALSE)

ここで、最高次の相互作用が重要であると想定し(そうではありません)、次の対比でさらに詳しく調べたいと思います:
時間1と2と時間3(コントラスト1)と時間1と2の間に違いはありますか?治療条件での4時間と5時間(コントラスト2)との比較(A&Bを一緒に)?
言い換えれば、これらのコントラストをどのように指定するのですか?

  1. ((treatment %in% c("A", "B")) & (hour %in% 1:2))((treatment %in% c("A", "B")) & (hour %in% 3))
  2. ((treatment %in% c("A", "B")) & (hour %in% 1:2))((treatment %in% c("A", "B")) & (hour %in% 4:5))

私のアイデアは、不要な治療条件(コントロール)を省略して別のANOVAを実行することです。

mod2 <- lm(cbind(pre.1, pre.2, pre.3, pre.4, pre.5, post.1, post.2, post.3, post.4, post.5, fup.1, fup.2, fup.3, fup.4, fup.5) ~ treatment, data=OBrienKaiser, subset = treatment != "control")
av2 <- Anova(mod2, idata=idata, idesign=~phase*hour, type = 3)
summary(av2, multivariate=FALSE)

ただし、時間1&2を3と、1&2を4&5と比較する適切な被験者内コントラストマトリックスを設定する方法はまだわかりません。そして、全体のエラー期間を変更するため、不要な治療グループを省略することが本当に良いアイデアであるかどうかはわかりません。

行く前に、行くAnova()ことも考えていましたlme。ただし、教科書のANOVAとanove(lme) 標準のANOVAで負の分散がlme生じる可能性があるために返されるものとの間には、Fとpの値にわずかな違いがあります(では許可されていません)。関連して、gls反復測定ANOVAのフィッティングを許可する誰かが私を指摘しましたが、コントラストの議論はありません。

明確にするために、目的のコントラストが有意であるかどうかを答えるFまたはt検定(タイプIIIの平方和を使用)が必要です。


更新:

私はすでにR-helpでよく似た質問をしましたが、答えはありませんでした

同様の質問が、少し前にR-helpで提起されました。ただし、答えは問題を解決しませんでした。


更新(2015):

この質問はまだある程度のアクティビティを生成するため、afex vignetteで説明されているように、パッケージafexとパッケージを組み合わせて使用​​することで、これらと基本的に他のすべてのコントラストを指定することが比較的簡単になりました。lsmeans


1
T検定の使用を既にやめましたか?つまり、1)対照群からデータを捨てる、2)の異なるレベルを無視するtreatment、3)のレベルを超える各人の平均、、prePostFup4)時間1,2を超える各人の平均(=データグループ1)同様に、3、4時間(=データグループ2)、5)2つの依存グループに対してt検定を実行します。Maxwell&Delaney(2004)とKirk(1995)は、設計内のプールされたエラー用語との対比を思いとどまらせるので、これは単純な代替案である可能性があります。
カラカル

プールされたt検定ではなく、コントラスト分析を行いたいです。その理由は、コントラストは(問題があるにもかかわらず)心理学の標準手順であるように思われ、読者/査読者/監督者が望むものだからです。さらに、SPSSで行うのは比較的簡単です。ただし、これまでアクティブなRユーザーとして2年間働いていたにもかかわらず、Rでそれを達成することはできませんでした。今では、いくつかの対比を行う必要があり、これだけのためにSPSSに戻りたくありません。Rが未来である場合(そうだと思います)、コントラストが可能でなければなりません。
ヘンリック

回答:


6

この方法は一般に「旧式」と考えられているため、可能かもしれませんが、構文は難しく、希望するものを得るためにanovaコマンドを操作する方法を知っている人は少ないと思われます。より一般的な方法はglhtnlmeまたはから尤度ベースのモデルを使用することlme4です。(しかし、他の答えによって間違っていると証明されることは確かに歓迎します。)

とは言っても、これを行う必要がある場合は、anovaコマンドに煩わされることはありません。を使用して同等のモデルを当てはめるだけでlm、このコントラストに適切な誤差項を選択し、Fテストを自分で計算します(または、dfが1つしかないため、tテスト)。これには、すべてのバランスを取り、球形にする必要がありますが、それがなければ、おそらく尤度ベースのモデルを使用する必要があります。Greenhouse-GeiserまたはHuynh-Feldtの修正を使用して非球面性をある程度修正できる可能性があります。これは同じF統計を使用しますが、エラー項のdfを変更します。

を本当に使用したい場合carは、ヘプロットビネットが役立つかもしれません。carパッケージ内のマトリックスがどのように定義されるかを説明します。

カラカルの方法(コントラスト1&2-3および1&2-4&5)を使用すると、

      psiHat      tStat          F         pVal
1 -3.0208333 -7.2204644 52.1351067 2.202677e-09
2 -0.2083333 -0.6098777  0.3719508 5.445988e-01

これは私がそれらの同じp値を取得する方法です:

データを長い形式に変更し、lmすべてのSS用語を取得するために実行します。

library(reshape2)
d <- OBrienKaiser
d$id <- factor(1:nrow(d))
dd <- melt(d, id.vars=c(18,1:2), measure.vars=3:17)
dd$hour <- factor(as.numeric(gsub("[a-z.]*","",dd$variable)))
dd$phase <- factor(gsub("[0-9.]*","", dd$variable), 
                   levels=c("pre","post","fup"))
m <- lm(value ~ treatment*hour*phase + treatment*hour*phase*id, data=dd)
anova(m)

時間単位の代替コントラストマトリックスを作成します。

foo <- matrix(0, nrow=nrow(dd), ncol=4)
foo[dd$hour %in% c(1,2) ,1] <- 0.5
foo[dd$hour %in% c(3) ,1] <- -1
foo[dd$hour %in% c(1,2) ,2] <- 0.5
foo[dd$hour %in% c(4,5) ,2] <- -0.5
foo[dd$hour %in% 1 ,3] <- 1
foo[dd$hour %in% 2 ,3] <- 0
foo[dd$hour %in% 4 ,4] <- 1
foo[dd$hour %in% 5 ,4] <- 0

私のコントラストがデフォルトのコントラストと同じSSを与えることを確認してください(そしてフルモデルのものと同じです)。

anova(lm(value ~ hour, data=dd))
anova(lm(value ~ foo, data=dd))

希望する2つのコントラストのSSとdfを取得します。

anova(lm(value ~ foo[,1], data=dd))
anova(lm(value ~ foo[,2], data=dd))

p値を取得します。

> F <- 73.003/(72.81/52)
> pf(F, 1, 52, lower=FALSE)
[1] 2.201148e-09
> F <- .5208/(72.81/52)
> pf(F, 1, 52, lower=FALSE)
[1] 0.5445999

必要に応じて、球形度を調整します。

pf(F, 1*.48867, 52*.48867, lower=FALSE)
pf(F, 1*.57413, 52*.57413, lower=FALSE)

それも機能します!そして、heplotsビネットへのリンクに感謝します。これは、実際の一般的な線形モデルの観点から見た素晴らしい要約です。
カラカル

どうもありがとう。球面補正に関するいくつかの考えが含まれているので、この答えを(他の素晴らしい答えの代わりに)受け入れます。
ヘンリック

将来の読者への注意:球形度補正は、他のソリューションにも同様に適用できます。
アーロンはスタックオーバーフローを去りました

6

対応するANOVAからのプールされたエラー用語との対比を使用する/使用する必要がある場合は、次の操作を実行できます。残念ながら、これは長くなり、これをもっと便利に行う方法がわかりません。それでも、Maxwell&Delaneyに対して検証されているため、結果は正しいと思います(以下を参照)。

あなたは、要因の中にあなたの最初のグループを比較したいhourからSPF-p.qr設計(表記でカーク係数とのスプリットプロット-階乗デザイン1:(1995)treatment第一の要因の中に、p個のグループとhour第二の要因の中に、Q基を持つprePostFupとrグループ)。以下は、同じサイズのtreatmentグループと球形度を想定しています。

Nj    <- 10                                             # number of subjects per group
P     <- 3                                              # number of treatment groups
Q     <- 5                                              # number of hour groups
R     <- 3                                              # number of PrePostFup groups
id    <- factor(rep(1:(P*Nj), times=Q*R))                                  # subject
treat <- factor(rep(LETTERS[1:P], times=Q*R*Nj), labels=c("CG", "A", "B")) # treatment
hour  <- factor(rep(rep(1:Q, each=P*Nj), times=R))                         # hour
ppf   <- factor(rep(1:R, each=P*Q*Nj), labels=c("pre", "post", "fup"))     # prePostFup
DV    <- round(rnorm(Nj*P*Q*R, 15, 2), 2)               # some data with no effects
dfPQR <- data.frame(id, treat, hour, ppf, DV)           # data frame long format

summary(aov(DV ~ treat*hour*ppf + Error(id/(hour*ppf)), data=dfPQR)) # SPF-p.qr ANOVA

以下のための主要な効果があること最初のノートhourの上に平均化した後に同じであるprePostFupため、のみを含む単純SPF-PQのデザインへの切り替え、treatmentおよびhourIVをなど。

dfPQ <- aggregate(DV ~ id + treat + hour, FUN=mean, data=dfPQR)  # average over ppf
# SPF-p.q ANOVA, note effect for hour is the same as before
summary(aov(DV ~ treat*hour + Error(id/hour), data=dfPQ))

ここで、SPF-pq ANOVAでは、の効果hourが相互作用に対してテストされることに注意してくださいid:hour。つまり、この相互作用はテストのエラー項を提供します。これで、hourグループの対比は、エラー項と対応する自由度を単純に代入することにより、一方向の被験者間ANOVAのようにテストできます。この相互作用のSSとdfを取得する簡単な方法は、モデルをに適合させることですlm()

(anRes <- anova(lm(DV ~ treat*hour*id, data=dfPQ)))
SSE    <- anRes["hour:id", "Sum Sq"]     # SS interaction hour:id -> will be error SS
dfSSE  <- anRes["hour:id", "Df"]         # corresponding df

ただし、ここでもすべてを手動で計算しましょう。

# substitute DV with its difference to cell / person / treatment group means
Mjk   <- ave(dfPQ$DV,           dfPQ$treat, dfPQ$hour, FUN=mean)  # cell means
Mi    <- ave(dfPQ$DV, dfPQ$id,                         FUN=mean)  # person means
Mj    <- ave(dfPQ$DV,           dfPQ$treat,            FUN=mean)  # treatment means
dfPQ$IDxIV <- dfPQ$DV - Mi - Mjk + Mj                             # interaction hour:id
(SSE  <- sum(dfPQ$IDxIV^2))               # SS interaction hour:id -> will be error SS
dfSSE <- (Nj*P - P) * (Q-1)               # corresponding df
(MSE  <- SSE / dfSSE)                     # mean square

t=ψ^0||c||MSE どこ c は、コントラストベクトルです。 ||c|| その長さです ψ^=k=1qckMk はコントラスト推定値であり、 MSEは、hour:id相互作用の平均二乗です(適切な誤差項)。

Mj     <- tapply(dfPQ$DV, dfPQ$hour, FUN=mean)  # group means for hour
Nj     <- table(dfPQ$hour)                      # cell sizes for hour (here the same)
cntr   <- rbind(c(1, 1, -2,  0, 0),
                c(1, 1, -1, -1, 0))             # matrix of contrast vectors
psiHat <- cntr   %*% Mj                         # estimates psi-hat
lenSq  <- cntr^2 %*% (1/Nj)                     # squared lengths of contrast vectors
tStat  <- psiHat / sqrt(lenSq*MSE)              # t-statistics
pVal   <- 2*(1-pt(abs(tStat), dfSSE))           # p-values
data.frame(psiHat, tStat, pVal)

複数の比較を行うには、次のことを考慮する必要があります α-修正方法、例えば、Bonferroni。

p。のMaxwell&Delaney(2004)の例に対応する計算 599fはここにあります。M&DはF値を計算することに注意してください。結果が同一であることを確認するには、t統計の値を2乗する必要があります。このコードには、Anova()from carで行われた分析と、ϵ^ 因子内の主効果の補正。


いい答え。これは、私がそれをすべて解決する忍耐を持っていた場合、多かれ少なかれ私がしたであろうことです。
アーロンはスタックオーバーフローを

詳細な回答をありがとう。実際には少し不便に思えますが。
ヘンリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.