Bagaimana cara menentukan kontras khusus untuk tindakan berulang ANOVA menggunakan mobil?

12

Saya mencoba menjalankan tindakan berulang Anova di R diikuti oleh beberapa kontras khusus pada dataset itu. Saya pikir pendekatan yang benar akan digunakan Anova()dari paket mobil.

Mari kita ilustrasikan pertanyaan saya dengan contoh yang diambil dari ?Anovamenggunakan OBrienKaiserdata (Catatan: Saya menghilangkan faktor gender dari contoh):
Kami memiliki desain dengan satu antara faktor subjek, pengobatan (3 tingkat: kontrol, A, B), dan 2 diulang -Mengukur faktor (dalam mata pelajaran), fase (3 level: pretest, posttest, followup) dan jam (5 level: 1 hingga 5).

Tabel ANOVA standar diberikan oleh (berbeda dengan contoh (Anova) saya beralih ke Tipe 3 Jumlah Kuadrat, itulah yang diinginkan bidang saya):

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)

Sekarang, bayangkan interaksi urutan tertinggi akan menjadi signifikan (yang tidak terjadi) dan kami ingin mengeksplorasi lebih lanjut dengan kontras berikut:
Apakah ada perbedaan antara jam 1 & 2 versus jam 3 (kontras 1) dan antara jam 1 & 2 versus jam 4 & 5 (kontras 2) dalam kondisi perawatan (A&B bersama)?
Dengan kata lain, bagaimana cara menentukan kontras ini:

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

Ide saya adalah menjalankan ANOVA lain dengan kondisi perawatan yang tidak diperlukan (kontrol):

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)

Namun, saya masih tidak tahu bagaimana mengatur matriks kontras dalam-subjek yang sesuai membandingkan jam 1 & 2 dengan 3 dan 1 & 2 dengan 4 & 5. Dan saya tidak yakin apakah menghilangkan kelompok pengobatan yang tidak dibutuhkan memang ide yang baik karena mengubah keseluruhan istilah kesalahan.

Sebelum pergi untuk Anova()saya juga berpikir untuk pergi lme. Namun, ada perbedaan kecil dalam nilai F dan p antara buku teks ANOVA dan apa yang dikembalikan anove(lme) karena kemungkinan variasi negatif dalam ANOVA standar (yang tidak diizinkan masuklme ). Terkait, seseorang menunjuk saya ke glsyang memungkinkan untuk mengukur ANOVA tindakan yang berulang, namun, tidak memiliki argumen kontras.

Untuk memperjelas: Saya ingin uji F atau t (menggunakan jumlah kuadrat tipe III) yang menjawab apakah kontras yang diinginkan signifikan atau tidak.


Memperbarui:

Saya sudah mengajukan pertanyaan yang sangat mirip pada R-help, tidak ada jawaban .

Pertanyaan serupa diajukan pada R-help beberapa waktu lalu. Namun, jawabannya juga tidak menyelesaikan masalah.


Pembaruan (2015):

Karena pertanyaan ini masih menghasilkan beberapa kegiatan, menentukan tesis dan pada dasarnya semua kontras lainnya sekarang dapat dilakukan relatif mudah dengan afexpaket dalam kombinasi dengan lsmeanspaket seperti yang dijelaskan dalam sketsa afex .

Henrik
sumber
1
Sudahkah Anda memutuskan untuk tidak menggunakan uji-t? Maksud saya adalah 1) membuang data dari kelompok kontrol, 2) mengabaikan level yang berbeda treatment, 3) untuk rata-rata setiap orang di atas level prePostFup, 4) untuk rata-rata setiap orang lebih dari jam 1,2 (= kelompok data 1) serta lebih dari jam 3,4 (= kelompok data 2), 5) jalankan uji-t untuk 2 kelompok dependen. Karena Maxwell & Delaney (2004) dan juga Kirk (1995) mencegah melakukan kontras dengan istilah kesalahan yang dikumpulkan dalam desain, ini bisa menjadi alternatif sederhana.
caracal
Saya ingin melakukan analisis kontras dan tidak mengumpulkan tes t. Alasannya adalah bahwa kontras (terlepas dari masalah mereka) tampaknya menjadi prosedur standar dalam Psikologi dan apa yang diinginkan pembaca / resensi / pengawas. Selain itu, mereka relatif lurus ke depan untuk dilakukan di SPSS. Namun, meskipun saya 2 tahun sebagai pengguna R aktif sejauh ini saya belum dapat mencapainya dengan R. Sekarang saya harus melakukan beberapa kontras dan saya tidak ingin kembali ke SPSS hanya untuk ini. Ketika R adalah masa depan (yang saya pikir itu adalah), kontras harus dimungkinkan.
Henrik

Jawaban:

6

Metode ini umumnya dianggap "kuno" sehingga walaupun mungkin, sintaksinya sulit dan saya curiga lebih sedikit orang yang tahu bagaimana memanipulasi perintah anova untuk mendapatkan yang Anda inginkan. Metode yang lebih umum digunakan glhtdengan model berbasis kemungkinan dari nlmeatau lme4. (Saya tentu saja dibuktikan salah dengan jawaban lain.)

Yang mengatakan, jika saya perlu melakukan ini, saya tidak akan repot dengan perintah anova; Saya hanya cocok menggunakan model setara lm, memilih istilah kesalahan yang tepat untuk kontras ini, dan menghitung uji F sendiri (atau setara, uji t karena hanya ada 1 df). Ini mengharuskan semuanya seimbang dan memiliki kebulatan, tetapi jika Anda tidak memilikinya, Anda mungkin harus tetap menggunakan model berbasis kemungkinan. Anda mungkin dapat mengoreksi non-sphericity menggunakan Greenhouse-Geiser atau Huynh-Feldt koreksi yang (saya percaya) menggunakan statistik F yang sama tetapi memodifikasi df dari istilah kesalahan.

Jika Anda benar-benar ingin menggunakannya car, Anda mungkin merasa sketsa heplot bermanfaat; mereka menggambarkan bagaimana matriks dalam carpaket didefinisikan.

Menggunakan metode caracal (untuk kontras 1 & 2 - 3 dan 1 & 2 - 4 & 5), saya mengerti

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

Inilah cara saya mendapatkan nilai-p yang sama:

Bentuk kembali data ke dalam format panjang dan jalankan lmuntuk mendapatkan semua persyaratan 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)

Buat matriks kontras alternatif untuk jangka waktu satu jam.

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

Periksa apakah kontras saya memberikan SS yang sama dengan kontras default (dan sama seperti dari model lengkap).

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

Dapatkan SS dan df hanya untuk dua kontras yang saya inginkan.

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

Dapatkan nilai-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

Secara opsional sesuaikan untuk kebulatan.

pf(F, 1*.48867, 52*.48867, lower=FALSE)
pf(F, 1*.57413, 52*.57413, lower=FALSE)
Aaron meninggalkan Stack Overflow
sumber
Itu juga berhasil! Dan terima kasih untuk tautan ke heplotssketsa, itu adalah ringkasan yang bagus tentang apa yang terjadi dalam hal model linear umum.
caracal
Terima kasih banyak. Saya akan menerima jawaban ini (alih-alih jawaban hebat lainnya), karena mencakup beberapa pemikiran tentang koreksi kebulatan.
Henrik
Catatan untuk pembaca masa depan: Koreksi bola juga berlaku untuk solusi lain.
Aaron meninggalkan Stack Overflow
6

Jika Anda ingin / harus menggunakan kontras dengan istilah kesalahan gabungan dari ANOVA yang sesuai, Anda dapat melakukan hal berikut. Sayangnya, ini akan lama, dan saya tidak tahu bagaimana melakukan ini dengan lebih nyaman. Namun, saya pikir hasilnya benar, karena diverifikasi terhadap Maxwell & Delaney (lihat di bawah).

Anda ingin membandingkan kelompok faktor dalam pertama Anda dalam hourdesain SPF-p.qr (notasi dari Kirk (1995): Desain Split-Plot-Faktorial 1 antara faktor treatmentdengan kelompok p, faktor pertama hourdengan faktor kelompok q, faktor kedua prePostFupdengan faktor kelompok r grup). Berikut ini mengasumsikan treatmentkelompok dan kebulatan ukuran identik .

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

Perhatikan pertama bahwa efek utama houradalah sama setelah rata-rata berakhir prePostFup, sehingga beralih ke desain SPF-pq sederhana yang hanya berisi treatmentdan hoursebagai infus.

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

Sekarang perhatikan bahwa dalam SPF-pq ANOVA, efek untuk hourdiuji terhadap interaksi id:hour, yaitu interaksi ini memberikan istilah kesalahan untuk pengujian. Sekarang kontras untuk hourkelompok dapat diuji seperti di ANOVA antara subjek dengan hanya mengganti istilah kesalahan, dan derajat kebebasan yang sesuai. Cara mudah untuk mendapatkan SS dan df dari interaksi ini adalah menyesuaikan model 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

Tapi mari kita juga menghitung semuanya secara manual di sini.

# 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

Sekarang setelah kita memiliki istilah kesalahan yang benar, kita dapat membangun statistik pengujian yang biasa untuk perbandingan yang direncanakan: mana adalah vektor kontras,adalah panjangnya, adalah estimasi kontras, dan adalah rata-rata kuadrat untuk interaksi (istilah kesalahan yang sesuai). c| | c| | Ψ=qΣk=1ckM. 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)

Untuk beberapa perbandingan, Anda harus berpikir tentang metode koreksi , misalnya, Bonferroni.α

Perhitungan yang sesuai untuk contoh Maxwell & Delaney (2004) pada hal. 599f dapat ditemukan di sini . Perhatikan bahwa M&D menghitung nilai-F, untuk melihat bahwa hasilnya identik, Anda harus kuadratkan nilai untuk t-statistik. Kode itu juga mencakup analisis yang dilakukan dengan Anova()dari car, serta perhitungan manual dari koreksi untuk efek utama faktor-dalam.ϵ^

caracal
sumber
Jawaban bagus. Ini kurang lebih apa yang akan saya lakukan jika saya memiliki kesabaran untuk menyelesaikan semuanya.
Aaron meninggalkan Stack Overflow
Terima kasih atas jawaban terinci Anda. Meskipun sepertinya sedikit tidak enak dalam praktek.
Henrik