Otomobil kullanarak tekrarlanan ölçümler ANOVA için belirli kontrastlar nasıl belirlenir?


12

Bu veri kümesinde bazı belirli zıtlıklar ardından R tekrarlanan önlemler Anova çalıştırmak için çalışıyorum. Bence doğru yaklaşım Anova()araç paketinden kullanmak olacaktır .

Verilerimi verileri ?Anovakullanarak alınan örnekle OBrienKaiseraçıklayalım (Not: Örnekte cinsiyet faktörünü göz ardı ettim):
Denekler faktörü, tedavi (3 seviye: kontrol, A, B) ve tekrarlanan 2 arasında bir tasarıma sahibiz -Ölçümler (denekler içinde) faktörleri, faz (3 seviye: ön test, son test, takip) ve saat (5 seviye: 1 ila 5).

Standart ANOVA tablosu (örnek (Anova) 'dan farklı olarak Tip 3 Kareler Toplamı'na geçtim, alanımın istediği bu):

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)

Şimdi, en yüksek dereceli etkileşimin önemli olacağını düşünün (durum böyle değildir) ve aşağıdaki kontrastlarla daha fazla araştırmak istiyoruz:
1 ve 2 saatleri ile saat 3 (kontrast 1) ile saat 1 ve 2 saatleri arasında bir fark var mı? tedavi koşullarında saat 4 ve 5'e (kontrast 2) karşı mı (birlikte A&B)?
Başka bir deyişle, bu karşıtlıkları nasıl belirleyebilirim:

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

Benim fikrim, gerekli olmayan tedavi koşulu (kontrol) ile uyumlu başka bir ANOVA çalıştırmak olacaktır:

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)

Bununla birlikte, hala 1 ve 2 saatleri 3 ve 1 ve 2 ve 4 ve 5 ile karşılaştırarak uygun konu içi kontrast matrisinin nasıl kurulacağına dair hiçbir fikrim yok. Gereksiz tedavi grubunun ihmal edilmesinin, genel hata terimini değiştirdiği için gerçekten iyi bir fikir olup olmadığından emin değilim.

Gitmeden önce de gitmeyi Anova()düşünüyordum lme. Ancak, ANOVA ders kitabı anove(lme) ile standart ANOVA'daki olası negatif varyanslardan (bunlara izin verilmezlme ) kaynaklanan geri dönüşler arasında F ve p değerleri arasında küçük farklılıklar vardır . Buna bağlı olarak, biri bana glstekrarlanan ölçümler ANOVA'nın takılmasına izin veren bir işaret etti , ancak kontrast argümanı yok.

Açıklığa kavuşturmak için: İstenen kontrastların anlamlı olup olmadığını yanıtlayan bir F veya t testi (tip III toplam kareler kullanarak) istiyorum.


Güncelleme:

Zaten cevap gelmedi, R-yardımına çok benzer bir soru soruldu .

Benzer sorular R-help'de de bir süre önce sorulmuştu. Ancak, cevaplar da sorunu çözmedi.


Güncelleme (2015):

Bu soru hala bir aktivite ürettiğinden, tezlerin ve temelde diğer tüm kontrastların belirlenmesi , afeks vinyetinde tarif edildiği gibi paketle afexbirlikte paketle nispeten kolay bir şekilde yapılabilir .lsmeans


1
T-testlerini kullanmaya karşı zaten karar verdiniz mi? Demek istediğim 1) kontrol grubundan veri atmak, 2) farklı seviyeleri göz ardı etmek treatment, 3) her kişi ortalaması prePostFupiçin, 4) seviyeleri üzerinden her kişi için ortalama saat 1, 2 (= veri grubu 1) saatin yanı sıra 3,4 (= veri grubu 2), 5) 2 bağımlı grup için t-testi uygular. Maxwell ve Delaney (2004) ve Kirk (1995) iç tasarımlarda toplanmış bir hata terimiyle tezat oluşturmayı caydırdığından, bu basit bir alternatif olabilir.
caracal

Ben t kontrast analizi yapmak ve bir araya getirilmemiş t testleri yapmak istiyorum. Bunun nedeni, zıtlıkların (sorunlarına rağmen) Psikolojide standart bir prosedür olduğu ve okuyucuların / gözden geçirenlerin / denetçilerin istediği şey olmasıdır. Ayrıca, SPSS'de yapmak nispeten düzdür. Ancak, aktif bir R kullanıcısı olarak geçirdiğim 2 yıla rağmen, R ile başaramadım. Şimdi bazı karşıtlıklar yapmak zorundayım ve sadece bunun için SPSS'ye geri dönmek istemiyorum. R gelecek olduğunda (ki sanırım öyle), zıtlıklar mümkün olmalıdır.
Henrik

Yanıtlar:


6

Bu yöntem genellikle "eski moda" olarak kabul edilir, bu yüzden mümkün olsa da, sözdizimi zordur ve daha az insanın ne istediğini elde etmek için anova komutlarını nasıl kullanacağını bildiklerinden şüpheleniyorum. Daha yaygın olan yöntem, veya ' glhtden gelen olasılık tabanlı bir modelle kullanmaktır . (Kesinlikle diğer cevaplar tarafından yanlış kanıtlanmasına hoş geldiniz.)nlmelme4

Bununla birlikte, eğer bunu yapmam gerekirse, anova komutlarıyla uğraşmazdım; Sadece eşdeğer modeli kullanarak lm, bu kontrast için doğru hata terimini seçer ve F testini kendim hesaplarım (veya sadece 1 df olduğundan eşdeğer olarak t testi). Bu, her şeyin dengelenmesini ve küreselliğe sahip olmasını gerektirir, ancak buna sahip değilseniz, muhtemelen olasılık tabanlı bir model kullanmalısınız. Aynı F istatistiğini kullanan ancak hata teriminin df'sini değiştiren Greenhouse-Geiser veya Huynh-Feldt düzeltmelerini kullanarak küreselliksizliği biraz düzeltebilirsiniz.

Gerçekten kullanmak caristiyorsanız, heplot vinyetlerini yararlı bulabilirsiniz ; carpaketteki matrislerin nasıl tanımlandığını açıklarlar.

Karakulak yöntemini kullanarak (1 & 2 - 3 ve 1 & 2 - 4 & 5 kontrastları için)

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

Aynı p değerlerini bu şekilde elde ederim:

Verileri uzun formatta yeniden şekillendirin ve lmtüm SS terimlerini almak için çalıştırın .

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)

Saat terimi için alternatif bir kontrast matrisi oluşturun.

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

Kontrastlarımın, varsayılan kontrastlarla aynı SS'yi verdiğini (ve tam modeldekiyle aynı olduğunu) kontrol edin.

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

İstediğim iki kontrast için SS ve df'yi alın.

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

P değerlerini alın.

> 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

İsteğe bağlı olarak küresellik için ayarlayın.

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

Bu da işe yarıyor! Ve heplotsskeç ile bağlantı için teşekkürler , bu gerçekten genel doğrusal model açısından neler olup bittiğinin güzel bir özeti.
caracal

Çok teşekkürler. Küresellik düzeltmesi üzerine bazı düşünceler içerdiğinden, bu yanıtı kabul edeceğim (diğer büyük cevap yerine).
Henrik

Gelecekteki okuyucular için not: Küresellik düzeltmesi diğer çözelti için de aynı şekilde geçerlidir.
Aaron Stack Overflow'dan ayrıldı

6

Karşılık gelen ANOVA'dan toplanan hata terimiyle kontrast kullanmak istiyorsanız / kullanmak zorundaysanız, aşağıdakileri yapabilirsiniz. Ne yazık ki, bu uzun olacak ve bunu nasıl daha rahat yapacağımı bilmiyorum. Yine de, Maxwell & Delaney'e karşı doğrulandıkları için sonuçların doğru olduğunu düşünüyorum (aşağıya bakın).

hourBir SPF-p.qr tasarımında ilk faktörünüzdeki grupları karşılaştırmak istiyorsunuz ( Kirk (1995) notasyonu : Split-Plot-Faktöriyel tasarım 1 treatment, p grupları ile faktör arasında , ilk hourolarak q grupları ile, ikinci faktör prePostFupile r grupları). Aşağıdaki özdeş boyutlu treatmentgruplar ve küresellik varsayar .

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

İlk olarak, ana etkinin hourortalamadan sonra aynı olduğunu ve prePostFupböylece sadece IV içeren treatmentve daha basit olan SPF-pq tasarımına hourgeçildiğini unutmayın.

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

Şimdi SPF-pq ANOVA'da etkisinin houretkileşime karşı test edildiğini id:hour, yani bu etkileşimin test için hata terimini sağladığını unutmayın. Artık hourgruplar için kontrastlar, özneler arasındaki ANOVA gibi bir yoldaki gibi, sadece hata terimini ve karşılık gelen serbestlik derecelerini değiştirerek test edilebilir. Bu etkileşimin SS ve df'sini almanın kolay yolu, modele uymaktır 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

Ama burada her şeyi manuel olarak hesaplayalım.

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


Güzel cevap. Her şeyi halletmek için sabrım olsaydı, bu az çok yapardım.
Aaron Stack Overflow'dan ayrıldı

Ayrıntılı cevabınız için teşekkürler. Her ne kadar pratikte biraz kullanışlı görünmese de.
Henrik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.