จะระบุความแตกต่างที่เฉพาะเจาะจงสำหรับการวัด ANOVA ซ้ำโดยใช้รถยนต์ได้อย่างไร


12

ฉันพยายามเรียกใช้มาตรการ Anova ใน R ซ้ำแล้วตามด้วยความแตกต่างเฉพาะบนชุดข้อมูลนั้น ฉันคิดว่าวิธีที่ถูกต้องน่าจะใช้ Anova()จากแพ็คเกจรถ

ช่วยให้แสดงคำถามของฉันพร้อมตัวอย่างที่นำมาจากการ?Anovaใช้ OBrienKaiserข้อมูล (หมายเหตุ: ฉันสรุปปัจจัยทางเพศจากตัวอย่าง):
เรามีการออกแบบที่มีปัจจัยหนึ่งระหว่างวิชาการรักษา (3 ระดับ: การควบคุม A, B) และซ้ำ 2 - วัด (ภายในวิชา) ปัจจัยระยะ (3 ระดับ: แบบทดสอบก่อนเรียนหลังการติดตาม) และชั่วโมง (5 ระดับ: 1 ถึง 5)

ตาราง ANOVA มาตรฐานมอบให้โดย (แตกต่างจากตัวอย่าง (Anova) ฉันเปลี่ยนเป็น Type 3 Sums 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 และ 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อย่างไรก็ตามมีความแตกต่างเล็กน้อยในค่า F และ p ระหว่างตำรา ANOVA และสิ่งที่ส่งคืนจากanove(lme) เนื่องจากความแปรปรวนเชิงลบที่เป็นไปได้ใน ANOVA มาตรฐาน (ซึ่งไม่ได้รับอนุญาตในlme ) มีใครบางคนชี้ให้ฉันเห็นว่าglsมาตรการ ANOVA ที่เหมาะสมได้ทำซ้ำแล้วซ้ำอีกอย่างไรก็ตามไม่มีข้อโต้แย้งที่ขัดแย้งกัน

ในการชี้แจง: ฉันต้องการการทดสอบแบบ F หรือ t (โดยใช้ผลบวกสแควร์สแควร์ III) ซึ่งตอบว่าว่าความแตกต่างที่ต้องการนั้นมีความสำคัญหรือไม่


ปรับปรุง:

ฉันแล้วถามคำถามที่คล้ายกันมากใน R-ความช่วยเหลือไม่มีคำตอบ

คำถามที่คล้ายกันถูกวางไว้บน R- ช่วยบางเวลาที่ผ่านมา อย่างไรก็ตามคำตอบยังไม่สามารถแก้ปัญหาได้


อัปเดต (2015):

เมื่อคำถามนี้ยังคงสร้างกิจกรรมการระบุวิทยานิพนธ์และโดยทั่วไปความแตกต่างอื่น ๆ สามารถทำได้ค่อนข้างง่ายเมื่อใช้ร่วมกับafexแพ็คเกจรวมกับlsmeansแพ็คเกจตามที่อธิบายไว้ในบทความสุดท้าย


1
คุณตัดสินใจไม่ใช้การทดสอบ t หรือไม่? สิ่งที่ฉันหมายถึงคือ 1) โยนข้อมูลจากกลุ่มควบคุม 2) เพิกเฉยในระดับที่แตกต่างกันtreatment3) สำหรับแต่ละคนโดยเฉลี่ยมากกว่าระดับprePostFup4) สำหรับแต่ละคนโดยเฉลี่ยมากกว่าชั่วโมง 1,2 (= กลุ่มข้อมูล 1) รวมถึงชั่วโมงกว่า 3,4 (= กลุ่มข้อมูล 2), 5) รันการทดสอบ t สำหรับกลุ่มที่ขึ้นกับ 2 กลุ่ม เนื่องจาก Maxwell & Delaney (2004) และ Kirk (1995) ไม่สนับสนุนการทำข้อขัดแย้งกับคำว่าข้อผิดพลาดพูในการออกแบบภายในนี่อาจเป็นทางเลือกที่ง่าย
caracal

ฉันต้องการวิเคราะห์ความเปรียบต่างและไม่รวมการทดสอบ t เหตุผลก็คือความแตกต่าง (แม้จะมีปัญหา) ดูเหมือนจะเป็นขั้นตอนมาตรฐานในด้านจิตวิทยาและเป็นสิ่งที่ผู้อ่าน / ผู้ตรวจสอบ / หัวหน้างานต้องการ นอกจากนี้พวกเขาค่อนข้างตรงไปตรงมาที่จะทำใน SPSS อย่างไรก็ตามแม้จะมี 2 ปีในฐานะผู้ใช้ R ที่ใช้งานจนถึงตอนนี้ฉันยังไม่สามารถบรรลุมันได้ด้วย R ตอนนี้ฉันต้องทำสิ่งที่ตรงกันข้ามและฉันไม่ต้องการกลับไปที่ SPSS เพียงแค่นี้ เมื่อ R คืออนาคต (ซึ่งฉันคิดว่ามันเป็น) ความแตกต่างจะต้องเป็นไปได้
Henrik

คำตอบ:


6

โดยทั่วไปแล้ววิธีการนี้ถือว่าเป็น "สมัยเก่า" ดังนั้นในขณะที่อาจเป็นไปได้ไวยากรณ์เป็นเรื่องยากและฉันสงสัยว่ามีคนน้อยกว่าที่รู้วิธีจัดการคำสั่ง anova เพื่อให้ได้สิ่งที่คุณต้องการ วิธีที่พบมากขึ้นจะใช้glhtกับรูปแบบความน่าจะตามมาจากหรือnlme lme4(ฉันยินดีรับการพิสูจน์ว่าผิดโดยคำตอบอื่น ๆ )

ที่กล่าวว่าถ้าฉันต้องการทำเช่นนี้ฉันจะไม่รำคาญกับคำสั่ง anova; ฉันแค่พอดีกับรุ่นที่เทียบเท่าโดยใช้lmเลือกคำผิดพลาดที่ถูกต้องสำหรับความคมชัดนี้และคำนวณการทดสอบ F ด้วยตัวเอง (หรือเทียบเท่าการทดสอบ t เนื่องจากมีเพียง 1 df) สิ่งนี้ต้องการทุกอย่างเพื่อให้มีความสมดุลและมีความกลมกลืน แต่ถ้าคุณไม่มีสิ่งนั้นคุณควรจะใช้แบบจำลองความเป็นไปได้ คุณอาจสามารถแก้ไขการไม่กลมกลืนได้โดยใช้การแก้ไข Greenhouse-Geiser หรือ Huynh-Feldt ซึ่ง (ฉันเชื่อว่า) ใช้สถิติ F เดียวกัน แต่แก้ไข df ของคำผิดพลาด

หากคุณต้องการใช้จริงๆ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

ขอบคุณมาก. ฉันจะยอมรับคำตอบนี้ (แทนที่จะเป็นคำตอบที่ยอดเยี่ยมอื่น ๆ ) เนื่องจากมีความคิดเกี่ยวกับการแก้ไข sphericity
Henrik

หมายเหตุถึงผู้อ่านในอนาคต: การแก้ไขแบบกลมนั้นใช้ได้กับโซลูชันอื่นเช่นกัน
Aaron ออกจาก Stack Overflow ใน

6

หากคุณต้องการ / จำเป็นต้องใช้ความแตกต่างกับคำว่าข้อผิดพลาดที่รวมกันจาก ANOVA ที่เกี่ยวข้องคุณสามารถทำดังต่อไปนี้ น่าเสียดายที่มันใช้เวลานานและฉันไม่รู้วิธีการทำสิ่งนี้สะดวกยิ่งขึ้น อย่างไรก็ตามฉันคิดว่าผลลัพธ์นั้นถูกต้องเนื่องจากพวกเขาได้รับการตรวจสอบกับ Maxwell & Delaney (ดูด้านล่าง)

คุณต้องการเปรียบเทียบกลุ่มของปัจจัยภายในตัวแรกhourในการออกแบบ SPF-p.qr (สัญกรณ์จากKirk (1995): การออกแบบ Split-Plot-Factorial 1 ระหว่างปัจจัย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และhourเป็น 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))

โปรดทราบว่าใน SPF-pq ANOVA เอฟเฟกต์hourนั้นจะถูกทดสอบกับการโต้ตอบid:hourนั่นคือการโต้ตอบนี้จะให้ข้อความแสดงข้อผิดพลาดสำหรับการทดสอบ ตอนนี้ความแตกต่างของhourกลุ่มสามารถทดสอบได้เช่นเดียวกับการวิเคราะห์ ANOVA ระหว่างอาสาสมัครโดยเพียงแค่แทนที่คำผิดและองศาอิสระที่สอดคล้องกัน วิธีที่ง่ายที่จะได้รับเอสเอสและ 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

ตอนนี้เรามีคำผิดพลาดที่ถูกต้องแล้วเราสามารถสร้างสถิติทดสอบตามปกติสำหรับการเปรียบเทียบที่วางแผนไว้:โดยที่คือเวกเตอร์ตัดกัน,คือความยาวคือการเปรียบเทียบความแตกต่างและคือสแควร์เฉลี่ยสำหรับการโต้ตอบ (คำผิดพลาดที่เหมาะสม) c| | c| | ψ=QΣk=1kM kMSEt=ψ^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)

สำหรับการเปรียบเทียบหลายรายการคุณจะต้องคิดถึง -correction method เช่น Bonferroniα

การคำนวณที่สอดคล้องกันสำหรับตัวอย่างของ Maxwell & Delaney (2004) ในหน้า 599f สามารถพบได้ที่นี่ โปรดทราบว่า M&D คำนวณค่า F เพื่อดูว่าผลลัพธ์เหมือนกันคุณจะต้องกำหนดค่าสี่เหลี่ยมสำหรับสถิติ t รหัสนั้นยังรวมถึงการวิเคราะห์ที่ทำด้วยAnova()จากcarรวมถึงการคำนวณด้วยตนเองของการแก้ไขสำหรับผลกระทบหลักของปัจจัยภายในϵ^


คำตอบที่ดี นี่คือสิ่งที่ฉันจะทำมากหรือน้อยหากฉันมีความอดทนในการทำงานทั้งหมด
แอรอนออกจาก Stack Overflow ใน

ขอบคุณสำหรับคำตอบโดยละเอียดของคุณ แม้ว่ามันจะดูลำบากเล็กน้อยในทางปฏิบัติ
Henrik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.