Làm thế nào để xác định độ tương phản cụ thể cho các biện pháp lặp lại ANOVA sử dụng xe hơi?


12

Tôi đang cố gắng chạy một số đo lặp lại Anova trong R theo sau là một số tương phản cụ thể trên tập dữ liệu đó. Tôi nghĩ rằng cách tiếp cận chính xác sẽ là sử dụng Anova()từ gói xe hơi.

Hãy minh họa câu hỏi của tôi với ví dụ được lấy từ ?Anovaviệc sử dụng OBrienKaiserdữ liệu (Lưu ý: Tôi sử dụng yếu tố giới tính từ ví dụ):
Chúng tôi có một thiết kế với một yếu tố giữa các đối tượng, điều trị (3 cấp độ: kiểm soát, A, B) và 2 lần lặp lại -measure (trong đối tượng) các yếu tố, giai đoạn (3 cấp độ: trước, posttest, theo dõi) và giờ (5 cấp độ: 1 đến 5).

Bảng ANOVA tiêu chuẩn được đưa ra bởi (khác với ví dụ (Anova) Tôi đã chuyển sang Loại 3 Tổng bình phương, đó là những gì lĩnh vực của tôi muốn):

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)

Bây giờ, hãy tưởng tượng rằng tương tác bậc cao nhất sẽ có ý nghĩa (không phải vậy) và chúng tôi muốn khám phá thêm về sự tương phản sau:
Có sự khác biệt giữa giờ 1 & 2 so với giờ 3 (tương phản 1) và giữa giờ 1 & 2 so với giờ 4 & 5 (tương phản 2) trong điều kiện điều trị (A & B với nhau)?
Nói cách khác, làm thế nào để tôi chỉ định những tương phản này:

  1. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) đấu với ((treatment %in% c("A", "B")) & (hour %in% 3))
  2. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) đấu với ((treatment %in% c("A", "B")) & (hour %in% 4:5))

Ý tưởng của tôi sẽ là chạy một ANOVA khác với điều kiện điều trị không cần thiết (kiểm soát):

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)

Tuy nhiên, tôi vẫn không biết làm thế nào để thiết lập ma trận tương phản trong chủ đề phù hợp so sánh giờ 1 & 2 với 3 và 1 & 2 với 4 & 5. Và tôi không chắc chắn nếu bỏ qua nhóm điều trị không cần thiết thực sự là một ý tưởng tốt vì nó thay đổi thời hạn lỗi tổng thể.

Trước khi đi cho Anova()tôi cũng đã suy nghĩ đi lme. Tuy nhiên, có sự khác biệt nhỏ về giá trị F và p giữa sách giáo khoa ANOVA và những gì được trả về anove(lme) do phương sai âm có thể có trong ANOVA tiêu chuẩn (không được phép tronglme ). Liên quan, ai đó đã chỉ cho tôi glsđiều đó cho phép điều chỉnh các biện pháp lặp lại ANOVA, tuy nhiên, nó không có đối số tương phản.

Để làm rõ: Tôi muốn thử nghiệm F hoặc t (sử dụng tổng bình phương loại III) để trả lời liệu độ tương phản mong muốn có đáng kể hay không.


Cập nhật:

Tôi đã hỏi một câu hỏi tương tự trên R-help, không có câu trả lời .

Một câu hỏi tương tự đã được đặt ra trên R-help một thời gian trước đây. Tuy nhiên, câu trả lời cũng không giải quyết được vấn đề.


Cập nhật (2015):

Vì câu hỏi này vẫn tạo ra một số hoạt động, việc chỉ định luận văn và về cơ bản tất cả các tương phản khác hiện có thể được thực hiện tương đối dễ dàng với afexgói kết hợp với lsmeansgói như được mô tả trong họa tiết afex .


1
Bạn đã quyết định không sử dụng thử nghiệm t? Ý tôi là 1) loại bỏ dữ liệu khỏi nhóm kiểm soát, 2) bỏ qua các mức khác nhau treatment, 3) cho mỗi người trung bình trên các mức prePostFup, 4) cho mỗi người trung bình trong nhiều giờ 1,2 (= nhóm dữ liệu 1) cũng như qua giờ 3,4 (= nhóm dữ liệu 2), 5) chạy thử nghiệm t cho 2 nhóm phụ thuộc. Vì Maxwell & Delaney (2004) cũng như Kirk (1995) không khuyến khích làm tương phản với một thuật ngữ lỗi trong các thiết kế bên trong, đây có thể là một cách thay thế đơn giản.
caracal

Tôi muốn làm các phân tích tương phản và không thử nghiệm t gộp. Lý do là sự tương phản (mặc dù có vấn đề của họ) dường như là quy trình chuẩn trong Tâm lý học và là điều mà độc giả / người đánh giá / người giám sát muốn. Hơn nữa, họ tương đối thẳng về phía trước để làm trong SPSS. Tuy nhiên, mặc dù đã 2 năm làm người dùng R hoạt động cho đến nay tôi vẫn không thể đạt được điều đó với R. Bây giờ tôi phải thực hiện một số tương phản và tôi không muốn quay lại SPSS chỉ vì điều này. Khi R là tương lai (mà tôi nghĩ là vậy), sự tương phản phải có thể.
Henrik

Câu trả lời:


6

Phương pháp này thường được coi là "lỗi thời" vì vậy trong khi có thể, cú pháp rất khó và tôi nghi ngờ có ít người biết cách thao tác các lệnh anova để đạt được điều bạn muốn. Phương pháp phổ biến hơn là sử dụng glhtvới mô hình dựa trên khả năng từ nlmehoặc lme4. (Tôi chắc chắn hoan nghênh bị chứng minh là sai bởi các câu trả lời khác.)

Điều đó nói rằng, nếu tôi cần làm điều này, tôi sẽ không bận tâm với các lệnh anova; Tôi chỉ phù hợp với mô hình tương đương bằng cách sử dụng lm, chọn ra thuật ngữ lỗi phù hợp cho độ tương phản này và tự mình tính toán thử nghiệm F (hoặc tương đương, thử nghiệm t vì chỉ có 1 df). Điều này đòi hỏi mọi thứ phải được cân bằng và có tính toàn cầu, nhưng nếu bạn không có điều đó, có lẽ bạn nên sử dụng một mô hình dựa trên khả năng. Bạn có thể có thể sửa lỗi phần nào cho tính không hình cầu bằng cách sử dụng các hiệu chỉnh Gree Gree-Geiser hoặc Huynh-Feldt mà tôi sử dụng cùng một thống kê F nhưng sửa đổi df của thuật ngữ lỗi.

Nếu bạn thực sự muốn sử dụng car, bạn có thể thấy các họa tiết heplot hữu ích; chúng mô tả cách các ma trận trong cargói được định nghĩa.

Sử dụng phương pháp của caracal (đối với độ tương phản 1 & 2 - 3 và 1 & 2 - 4 & 5), tôi nhận được

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

Đây là cách tôi có được các giá trị p tương tự:

Định hình lại dữ liệu thành định dạng dài và chạy lmđể có được tất cả các điều khoản 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)

Tạo một ma trận tương phản thay thế cho thời hạn.

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

Kiểm tra xem độ tương phản của tôi có cùng SS với độ tương phản mặc định (và giống như từ mô hình đầy đủ).

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

Lấy SS và df chỉ cho hai độ tương phản tôi muốn.

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

Lấy giá trị 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

Tùy chọn điều chỉnh cho tính hình cầu.

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

Điều đó cũng có tác dụng! Và cảm ơn vì liên kết đến heplotshọa tiết, đó thực sự là một bản tóm tắt hay về những gì đang diễn ra theo mô hình tuyến tính nói chung.
caracal

Cảm ơn rất nhiều. Tôi sẽ chấp nhận câu trả lời này (thay vì câu trả lời tuyệt vời khác), vì nó bao gồm một số suy nghĩ về hiệu chỉnh hình cầu.
Henrik

Lưu ý cho độc giả trong tương lai: Việc hiệu chỉnh hình cầu cũng được áp dụng tương tự cho các giải pháp khác.
Aaron rời Stack Overflow

6

Nếu bạn muốn / phải sử dụng độ tương phản với cụm từ lỗi gộp từ ANOVA tương ứng, bạn có thể thực hiện các thao tác sau. Thật không may, điều này sẽ kéo dài và tôi không biết làm thế nào để làm điều này thuận tiện hơn. Tuy nhiên, tôi nghĩ rằng kết quả là chính xác, vì chúng được xác minh chống lại Maxwell & Delaney (xem bên dưới).

Bạn muốn so sánh các nhóm của yếu tố đầu tiên của mình trong hourthiết kế SPF-p.qr (ký hiệu từ Kirk (1995): Thiết kế phân chia-yếu tố 1 giữa các yếu tố treatmentvới các nhóm p, đầu tiên trong các yếu tố hourvới các nhóm q, thứ hai trong yếu tố prePostFupvới nhóm r). Sau đây giả định treatmentcác nhóm có kích thước giống hệt nhau và tính hình cầu.

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

Đầu tiên lưu ý rằng hiệu ứng chính hourlà như nhau sau khi tính trung bình prePostFup, do đó chuyển sang thiết kế SPF-pq đơn giản hơn chỉ chứa treatmenthourdưới dạng IV.

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

Bây giờ lưu ý rằng trong ANOVA SPF-pq, hiệu ứng hourđược kiểm tra đối với sự tương tác id:hour, nghĩa là tương tác này cung cấp thuật ngữ lỗi cho thử nghiệm. Bây giờ độ tương phản của hourcác nhóm có thể được kiểm tra giống như trong một khoảng thời gian giữa các chủ thể ANOVA bằng cách thay thế thuật ngữ lỗi và mức độ tự do tương ứng. Cách dễ dàng để có được SS và df của tương tác này là phù hợp với mô hình 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

Nhưng hãy cũng tính toán mọi thứ bằng tay ở đây.

# 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ε^


Câu trả lời tốt đẹp. Đây là ít nhiều những gì tôi sẽ làm nếu tôi có đủ kiên nhẫn để giải quyết tất cả.
Aaron rời Stack Overflow

Cảm ơn câu trả lời chi tiết của bạn. Mặc dù có vẻ như một chút để cởi mở trong thực tế.
Henrik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.