如何为使用汽车的重复测量方差分析指定特定的对比?


12

我正在尝试在R中运行重复测量Anova,然后对该数据集进行一些特定的对比。我认为正确的方法是 Anova()从汽车包装中使用。

让我们用?Anova使用 OBrienKaiser数据的示例来说明我的问题(注意:我省略了示例中的性别因素):
我们设计了一个在受试者因素,治疗之间(3个级别:对照,A,B)和两个重复的因素-测量(在受试者内)因素,阶段(3个级别:测试前,测试后,随访)和小时(5个级别:1至5)。

标准ANOVA表的给出方式为(与example(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&2小时与3小时(对比1)之间以及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允许重复测量方差分析(ANOVA),但是它没有对比论证。

澄清一下:我想要一个F或t检验(使用III型平方和)来回答所需的对比度是否显着。


更新:

我已经在R-help上问了一个非常类似的问题,没有答案

不久前,对R-help提出了类似的问题。但是,答案也不能解决问题。


更新(2015):

由于此问题仍会产生一些活动,因此可以使用afex小插图中所述afexlsmeans包装与包装相结合,相对轻松地指定这些内容以及基本上所有其他对比。


1
您是否已决定不使用t检验?我的意思是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实现它。当R是未来(我认为是未来)时,必须有可能形成对比。
亨里克

Answers:


6

这种方法通常被认为是“过时的”,因此虽然可能,但语法很困难,我怀疑很少有人知道如何操纵方差分析命令来获得所需的内容。更常见的方法是将或中glht的基于似然模型一起使用。(当然,我也欢迎被其他答案证明是错误的。)nlmelme4

就是说,如果我需要这样做,那么我就不会为anova命令所困扰。我只是使用拟合等效模型lm,为该对比选择正确的误差项,然后自己计算F检验(或等效地,因为只有1 df而进行t检验)。这就要求所有事物都必须平衡并且具有球形,但是如果没有球形,则可能仍应使用基于似然度的模型。您可能可以使用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

非常感谢。我将接受此答案(而不是其他好的答案),因为它包括一些关于球度校正的想法。
亨里克

未来读者注意:球形度校正同样适用于其他解决方案。
亚伦(Aaron)

6

如果您希望/必须将对比与来自相应方差分析的合并误差项一起使用,则可以执行以下操作。不幸的是,这会很长,而且我不知道如何更方便地执行此操作。不过,我认为结果是正确的,因为已通过Maxwell&Delaney进行了验证(请参见下文)。

要因素内比较第一组hour中的SPF-p.qr设计(符号从柯克(1995):裂区因子设计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,因此切换到仅包含treatmenthour作为IV 的更简单的SPF-pq设计。

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方差分析中,hour针对交互作用测试的效果id:hour,即该交互作用为测试提供了误差项。现在,hour可以通过简单地替换误差项和相应的自由度,像在单对象间ANOVA中那样测试组的对比。获得此交互作用的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

现在我们有了正确的误差项,我们可以为计划的比较建立通常的测试统计量:其中是对比度矢量是其长度,是对比度估计,是交互作用的均方(适当的误差项)。 c| | c| | ψ=qΣķ=1个Çķ中号ķ中号小号Ë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)

对于多重比较,您必须考虑更正方法,例如Bonferroni。α

p。的Maxwell&Delaney(2004)示例的相应计算。599f可以在这里找到。请注意,M&D计算F值,要看到结果相同,必须对t统计量的值求平方。该代码还包括使用Anova()from 进行的分析car,以及对内部因素的主要影响的校正的手动计算。ϵ^


好答案。如果我有足够的耐心解决这个问题,这大概是我会做的。
亚伦(Aaron)

感谢您的详细回答。尽管在实践中似乎有点不方便。
亨里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.