자동차를 사용하여 반복 측정 ANOVA에 대한 특정 대비를 지정하는 방법은 무엇입니까?


12

R에서 Anova를 반복적으로 측정하고 그 데이터 세트에 대한 특정 대비를 수행하려고합니다. 올바른 방법은 Anova()자동차 패키지에서 사용하는 것이라고 생각합니다 .

데이터 를 ?Anova사용하여 얻은 예제로 내 질문을 설명 해 보겠습니다 OBrienKaiser(참고 : 예에서 성별 요인을 생략했습니다) :
우리는 주제 요인, 치료 (3 수준 : 통제, A, B) 및 2 반복 중 하나를 가진 디자인을 가지고 있습니다 -측정 (피험자 내) 요인, 단계 (3 단계 : 사전 테스트, 사후 테스트, 후속 조치) 및 시간 (5 단계 : 1-5).

표준 ANOVA 테이블은 다음과 같이 제공됩니다 (예 : (Anova)와 달리 Type 3 Squares of Squares로 전환했습니다.

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 시간 3 (대비 1) 대 2 사이의 시간 1과 2 사이에 차이가 처리 조건 (A & B와 함께)에서 시간 4 & 5 (대비 2) 대?
다시 말해,이 대비를 어떻게 지정합니까?

  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))

내 생각은 필요하지 않은 치료 조건 (제어)을 생략하는 다른 분산 분석을 실행하는 것입니다.

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반복 측정 측량 을 적용 할 수 있다고 지적 했지만 대조적 인 주장은 없습니다.

명확히하기 위해 : 원하는 대비가 중요한지 여부에 대한 F 또는 t 테스트 (유형 III 제곱 사용)를 원합니다.


최신 정보:

나는 이미 R-help에 대해 비슷한 질문을했지만 대답이 없었습니다 .

얼마 전 R-help에 대해서도 비슷한 질문이 제기되었습니다. 그러나 대답은 문제를 해결하지 못했습니다.


업데이트 (2015) :

이 질문은 여전히 논문을 지정하는 몇 가지 활동을 생성하고 기본적으로 모든 다른 대조는 이제 비교적 쉽게 수행 할 수 있습니다으로 afex와 함께 패키지 lsmeans에 설명으로 패키지 AFEX 네트 .


1
이미 t- 검정을 사용하지 않기로 결정 했습니까? 어떤 I 평균 1) (2))의 상이한 레벨 무시 대조군에서 데이터를 버리고 treatment레벨 위에 각각 사람의 평균에 대한, 3) prePostFup시간 동안 각 개인 평균 들어, 4) 1,2 (= 데이터 그룹 1) 뿐만 아니라 시간이 지남에 따라 3,4 (= 데이터 그룹 2), 5) 2 개의 종속 그룹에 대해 t- 테스트를 실행합니다. Maxwell & Delaney (2004)와 Kirk (1995)는 설계 내에서 풀링 된 오류 항과 대조하는 것을 권장하지 않기 때문에 간단한 대안이 될 수 있습니다.
caracal

나는 대조 테스트를하고 싶지만 t 테스트를 풀고 싶습니다. 그 이유는 대조 (문제에도 불구하고)가 심리학의 표준 절차 인 것처럼 보이며 독자 / 검토 자 / 감독자가 원하는 것입니다. 또한 SPSS에서는 비교적 간단합니다. 그러나 지금까지 활발한 R 사용자로 2 년간 근무했지만 R에서는이를 달성 할 수 없었습니다. 이제 몇 가지 대조를해야하므로 SPSS로 돌아가고 싶지 않습니다. R이 미래 일 때 (제 생각에) 대비가 가능해야합니다.
Henrik

답변:


6

이 방법은 일반적으로 "구식"으로 간주되므로 가능하지만 구문이 어려우므로 anova 명령을 조작하여 원하는 것을 얻는 방법을 아는 사람이 더 적습니다. 보다 일반적인 방법은 또는 glht의 가능성 기반 모델과 함께 사용 하는 것 입니다. (그러나 다른 답변으로 잘못 입증 된 것을 환영합니다.)nlmelme4

즉,이 작업을 수행해야한다면 anova 명령을 귀찮게하지 않을 것입니다. 나는를 사용하여 동등한 모델을 적합 lm시키고이 대비에 대한 올바른 오차 항을 골라 내고 F 테스트를 직접 계산합니다 (또는 1df 만 있으므로 t 테스트를 계산합니다). 이를 위해서는 모든 것이 균형을 이루고 구형이 필요하지만,이를 가지고 있지 않다면 어쩌면 우도 기반 모델을 사용해야합니다. 동일한 F 통계를 사용하지만 오류 항의 df를 수정하는 Greenhouse-Geiser 또는 Huynh-Feldt 보정을 사용하여 비 구 형성에 대해 다소 수정할 수 있습니다.

정말로을 사용 car하려면 heplot 비네팅이 도움 이 될 것입니다. car패키지 의 매트릭스가 어떻게 정의 되는지 설명합니다 .

caracal의 방법 (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))

내가 원하는 두 가지 대비에 대한 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비 네트 에 대한 링크 덕분에 , 이것은 일반적인 선형 모델의 관점에서 진행되고있는 것에 대한 훌륭한 요약입니다.
caracal

고마워 구형도 보정에 대한 생각이 포함되어 있기 때문에 다른 답변 대신이 답변을 수락합니다.
Henrik

미래 독자를위한 참고 사항 : 구형도 보정은 다른 솔루션에도 동일하게 적용됩니다.
Aaron은 Stack Overflow를

6

해당 분산 분석에서 풀링 된 오류 항과 대조를 사용하려는 경우 다음을 수행 할 수 있습니다. 불행히도, 이것은 길고, 더 편리하게 수행하는 방법을 모르겠습니다. 여전히 Maxwell & Delaney에 대해 검증되었으므로 결과가 정확하다고 생각합니다 (아래 참조).

hourSPF-p.qr 설계 에서 요인 내 첫 번째 그룹을 비교하려고합니다 ( Kirk (1995)의 표기법 : treatmentp- 그룹과 요인 사이의 분할-플롯-팩토리얼 설계 1 , 먼저 hourq 그룹과 요인 내, 두 번째 요인 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하므로 IV 만 포함 treatment하고 보다 단순한 SPF-pq 설계로 전환합니다 hour.

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그룹에 대한 대비 는 오차 항과 해당 자유도를 간단히 대체하여 개체 간 일원 분산 분석에서와 같이 테스트 할 수 있습니다. 이 상호 작용의 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||MSEc||c||ψ^=k=1qckM.kMSEhour: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)

α

Anova()carϵ^


좋은 대답입니다. 이것은 내가 그것을 모두 해결하기 위해 인내심을 가졌다면 내가했을 것입니다.
Aaron은 Stack Overflow를

자세한 답변 주셔서 감사합니다. 실제로는 실용적이지 않은 것 같습니다.
Henrik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.