aov_ez
is called specifying the factors as character vectors, aov_car
is called using a formula similar to aov
specifying an error strata for the within-subject factor(s), and aov_4
is called with a aov
which can be passed to e.g., Anova
(from the car::Anova
.aov_ez(id, dv, data, between = NULL, within = NULL, covariate = NULL,
observed = NULL, fun.aggregate = NULL, type = afex_options("type"),
factorize = afex_options("factorize"),
check.contrasts = afex_options("check.contrasts"),
return = afex_options("return_aov"),
anova_table = list(), ..., print.formula = FALSE)aov_car(formula, data, fun.aggregate = NULL, type = afex_options("type"),
factorize = afex_options("factorize"),
check.contrasts = afex_options("check.contrasts"),
return = afex_options("return_aov"), observed = NULL,
anova_table = list(), ...)
aov_4(formula, data, observed = NULL, fun.aggregate = NULL, type = afex_options("type"),
factorize = afex_options("factorize"),
check.contrasts = afex_options("check.contrasts"),
return = afex_options("return_aov"),
anova_table = list(), ..., print.formula = FALSE)
aov
(for aov_car
or similar to lme4:lmer
for aov_4
). Should include an error term (i.e., Error(id/...)
for data.frame
containing the data. Mandatory.NULL
issues a warning if aggregation is necessary and uses
afex_options("type")
, which is initially set to 3. Passed to Anova
. Possible values are "II"
, <afex_options("factorize")
, which is initially TRUE
. If one wants to run an ANCOVA, needs to be set to FAL
logical
. Should contrasts for between-subject factors be checked and (if necessary) changed to be "contr.sum"
. See details. The default is given by afex_options("check.contrasts")
, which is initially TRUE
character
vector indicating which of the variables are observed (i.e, measured) as compared to experimentally manipulated. The default effect size reported (generalized eta-squared) requires correct specification of the obsered (in contrast tlist
of further arguments passed to function producing the ANOVA table. Arguments such as es
(effect size) or correction
are passed to either anova.afex_aov
or nice
. Note that those settinfun.aggregate
.character
vector (of length 1) indicating the subject identifier column in data
.character
vector (of length 1) indicating the column containing the dependent variable in data
.character
vector indicating the between-subject(s) factor(s)/column(s) in data
. Default is NULL
indicating no between-subjects factors.character
vector indicating the within-subject(s)(or repeated-measures) factor(s)/column(s) in data
. Default is NULL
indicating no within-subjects factors.character
vector indicating the between-subject(s) covariate(s) (i.e., column(s)) in data
. Default is NULL
indicating no covariates.aov_ez
and aov_4
are wrapper for aov_car
. This boolean argument indicates whether the formula in the call to car.aov
should be printed.aov_car
, aov_4
, and aov_ez
are wrappers for Anova
and aov
, the return value is dependent on the return
argument. Per default, an S3 object of class "afex_aov"
is returned containing the following slots:[object Object],[object Object],[object Object],[object Object],[object Object]
In addition, the object has the following attributes: "dv"
, "id"
, "within"
, "between"
, and "type"
.
The print method for afex_aov
objects (invisibly) returns (and prints) the same as if return
is "nice"
: a nice ANOVA table (produced by nice
) with the following columns: Effect
, df
, MSE
(mean-squared errors), F
(potentially with significant symbols), ges
(generalized eta-squared), p
.
aov_ez
will concatenate all between-subject factors using *
(i.e., producing all main effects and interactions) and all covariates by +
(i.e., adding only the main effects to the existing between-subject factors). The within-subject factors do fully interact with all between-subject factors and covariates. This is essentially identical to the behavior of SPSS's glm
function.The formula
s for aov_car
or aov_4
must contain a single Error
term specifying the ID
column and potential within-subject factors (you can use mixed
for running mixed-effects models with multiple error terms). Factors outside the Error
term are treated as between-subject factors (the within-subject factors specified in the Error
term are ignored outside the Error
term; in other words, it is not necessary to specify them outside the Error
term, see Examples).
Suppressing the intercept (i.e, via 0 +
or - 1
) is ignored. Specific specifications of effects (e.g., excluding terms with -
or using ^
) could be okay but is not tested. Using the I
or poly
function within the formula is not tested and not supported!
To run an ANCOVA you need to set factorize = FALSE
and make sure that all variables have the correct type (i.e., factors are factors and numeric variables are numeric and centered).
Note that the default behavior is to include calculation of the effect size generalized eta-squared for which all non-manipluated (i.e., observed) variables need to be specified via the observed
argument to obtain correct results. When changing the effect size to "pes"
(partial eta-squared) or "none"
via anova_table
this becomes unnecessary.
If check.contrasts = TRUE
, contrasts will be set to "contr.sum"
for all between-subject factors if default contrasts are not equal to "contr.sum"
or attrib(factor, "contrasts") != "contr.sum"
. (within-subject factors are hard-coded "contr.sum"
.)
}
Note that lower order effects (e.g., main effects) in type 3 ANOVAs are only meaningful with contr.sum
to obtain meaningful results. This is imposed automatically for the functions discussed here as long as check.contrasts
is TRUE
(the default). I nevertheless recommend to set the contrasts globally to contr.sum
via running set_sum_contrasts
. For a discussion of the other (non-recommended) coding schemes see
lsmeans::lsmeans
for further analysis. This allows to test any type of contrasts that might be of interest independent of whether or not this contrast involves between-subject variables, within-subject variables, or a combination thereof. The general procedure to run those contrasts is the following (see Examples for a full example):
afex_aov
object with the function returned here. For example:x <- aov_car(dv ~ a*b + (id/c), d)
ref.grid
object by runninglsmeans
on theafex_aov
object from step 1 using the factors involved in the contrast. For example:r <- lsmeans(x, ~a:c)
con1 <- list(a_x = c(-1, 1, 0, 0, 0, 0), b_x = c(0, 0, -0.5, -0.5, 0, 1))
contrast
. For example:contrast(r, con1)
contrast(r, con1, adjust = "holm")
Note that lsmeans(x, "a", contr = "pairwise")
) or advanced control for multiple testing by passing objects to
A caveat regarding the use of
library
or require
.
}
afex_aov
Objectsafex_aov
objects is provided in the corresponding help page: afex_aov-methods
. The probably most important ones for end-users are summary
and anova
.
The summary
method returns, for ANOVAs containing within-subject (repeated-measures) factors with more than two levels, the complete univariate analysis: Results without df-correction, the Greenhouse-Geisser corrected results, the Hyunh-Feldt corrected results, and the results of the Mauchly test for sphericity.
The anova
method returns a data.frame
of class "anova"
containing the ANOVA table in numeric form (i.e., the one in slot anova_table
of a afex_aov
). This method has arguments such as correction
and es
and can be used to obtain an ANOVA table with different correction than the one initially specified.
}
Venables, W.N. (2000). Exegeses on linear models. Paper presented to the S-Plus User's Conference, Washington DC, 8-9 October 1998, Washington, DC. Available from:
afex_aov
are available: afex_aov-methods
nice
creates the nice ANOVA tables which is by default printed. See also there for a slightly longer discussion of the available effect sizes.
mixed
provides a (formula) interface for obtaining p-values for mixed-models via
##########################
## 1: Specifying ANOVAs ##
##########################
# Example using a purely within-subjects design
# (Maxwell & Delaney, 2004, Chapter 12, Table 12.5, p. 578):
data(md_12.1)
aov_ez("id", "rt", md_12.1, within = c("angle", "noise"),
anova_table=list(correction = "none", es = "none"))
# Default output
aov_ez("id", "rt", md_12.1, within = c("angle", "noise"))
# examples using obk.long (see ?obk.long), a long version of the OBrienKaiser dataset (car package).
# Data is a split-plot or mixed design: contains both within- and between-subjects factors.
data(obk.long, package = "afex")
# estimate mixed ANOVA on the full design:
aov_car(value ~ treatment * gender + Error(id/(phase*hour)),
data = obk.long, observed = "gender")
aov_4(value ~ treatment * gender + (phase*hour|id),
data = obk.long, observed = "gender")
aov_ez("id", "value", obk.long, between = c("treatment", "gender"),
within = c("phase", "hour"), observed = "gender")
# the three calls return the same ANOVA table:
## Effect df MSE F ges p.value
## 1 treatment 2, 10 22.81 3.94 + .20 .05
## 2 gender 1, 10 22.81 3.66 + .11 .08
## 3 treatment:gender 2, 10 22.81 2.86 .18 .10
## 4 phase 1.60, 15.99 5.02 16.13 *** .15 .0003
## 5 treatment:phase 3.20, 15.99 5.02 4.85 * .10 .01
## 6 gender:phase 1.60, 15.99 5.02 0.28 .003 .71
## 7 treatment:gender:phase 3.20, 15.99 5.02 0.64 .01 .61
## 8 hour 1.84, 18.41 3.39 16.69 *** .13 <.0001
## 9 treatment:hour 3.68, 18.41 3.39 0.09 .002 .98
## 10 gender:hour 1.84, 18.41 3.39 0.45 .004 .63
## 11 treatment:gender:hour 3.68, 18.41 3.39 0.62 .01 .64
## 12 phase:hour 3.60, 35.96 2.67 1.18 .02 .33
## 13 treatment:phase:hour 7.19, 35.96 2.67 0.35 .009 .93
## 14 gender:phase:hour 3.60, 35.96 2.67 0.93 .01 .45
## 15 treatment:gender:phase:hour 7.19, 35.96 2.67 0.74 .02 .65
# "numeric" variables are per default converted to factors (as long as factorize = TRUE):
obk.long$hour2 <- as.numeric(as.character(obk.long$hour))
# gives same results as calls before
aov_car(value ~ treatment * gender + Error(id/hour2*phase),
data = obk.long, observed = c("gender"))
# ANCOVA: adding a covariate (necessary to set factorize = FALSE)
aov_car(value ~ treatment * gender + age + Error(id/(phase*hour)),
data = obk.long, observed = c("gender", "age"), factorize = FALSE)
aov_4(value ~ treatment * gender + age + (phase*hour|id),
data = obk.long, observed = c("gender", "age"), factorize = FALSE)
aov_ez("id", "value", obk.long, between = c("treatment", "gender"),
within = c("phase", "hour"), covariate = "age",
observed = c("gender", "age"), factorize = FALSE)
# aggregating over one within-subjects factor (phase), with warning:
aov_car(value ~ treatment * gender + Error(id/hour), data = obk.long, observed = "gender")
aov_ez("id", "value", obk.long, c("treatment", "gender"), "hour", observed = "gender")
# aggregating over both within-subjects factors (again with warning),
# only between-subjects factors:
aov_car(value ~ treatment * gender + Error(id), data = obk.long, observed = c("gender"))
aov_4(value ~ treatment * gender + (1|id), data = obk.long, observed = c("gender"))
aov_ez("id", "value", obk.long, between = c("treatment", "gender"), observed = "gender")
# only within-subject factors (ignoring between-subjects factors)
aov_car(value ~ Error(id/(phase*hour)), data = obk.long)
aov_4(value ~ (phase*hour|id), data = obk.long)
aov_ez("id", "value", obk.long, within = c("phase", "hour"))
### changing defaults of ANOVA table:
# no df-correction & partial eta-squared:
aov_car(value ~ treatment * gender + Error(id/(phase*hour)),
data = obk.long, anova_table = list(correction = "none", es = "pes"))
# no df-correction and no MSE
aov_car(value ~ treatment * gender + Error(id/(phase*hour)),
data = obk.long,observed = "gender",
anova_table = list(correction = "none", MSE = FALSE))
###########################
## 2: Follow-up Analysis ##
###########################
# use data as above
data(obk.long, package = "afex")
# 1. obtain afex_aov object:
a1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"),
within = c("phase", "hour"), observed = "gender")
# 1b. plot data:
lsmip(a1, gender ~ hour | treatment+phase)
# 2. obtain reference grid object:
r1 <- lsmeans(a1, ~treatment +phase)
r1
# 3. create list of contrasts on the reference grid:
c1 <- list(
A_B_pre = c(0, -1, 1, rep(0, 6)), # A versus B for pretest
A_B_comb = c(0, 0, 0, 0, -0.5, 0.5, 0, -0.5, 0.5), # A vs. B for post and follow-up combined
effect_post = c(0, 0, 0, -1, 0.5, 0.5, 0, 0, 0), # control versus A&B post
effect_fup = c(0, 0, 0, 0, 0, 0, -1, 0.5, 0.5), # control versus A&B follow-up
effect_comb = c(0, 0, 0, -0.5, 0.25, 0.25, -0.5, 0.25, 0.25) # control versus A&B combined
)
# 4. test contrasts on reference grid:
contrast(r1, c1)
# same as before, but using Bonferroni-Holm correction for multiple testing:
contrast(r1, c1, adjust = "holm")
# 2. (alternative): all pairwise comparisons of treatment:
lsmeans(a1, "treatment", contr = "pairwise")
#######################
## 3: Other examples ##
#######################
data(obk.long, package = "afex")
# replicating ?Anova using aov_car:
obk_anova <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)),
data = obk.long, type = 2)
# in contrast to aov you do not need the within-subject factors outside Error()
str(obk_anova, 1, give.attr = FALSE)
## List of 6
## $ anova_table:Classes 'anova' and 'data.frame': 15 obs. of 6 variables:
## $ aov :List of 5
## $ Anova :List of 14
## $ lm :List of 13
## $ data :List of 3
## $ information:List of 5
obk_anova$Anova
## Type II Repeated Measures MANOVA Tests: Pillai test statistic
## Df test stat approx F num Df den Df Pr(>F)
## (Intercept) 1 0.970 318 1 10 0.0000000065 ***
## treatment 2 0.481 5 2 10 0.03769 *
## gender 1 0.204 3 1 10 0.14097
## treatment:gender 2 0.364 3 2 10 0.10447
## phase 1 0.851 26 2 9 0.00019 ***
## treatment:phase 2 0.685 3 4 20 0.06674 .
## gender:phase 1 0.043 0 2 9 0.82000
## treatment:gender:phase 2 0.311 1 4 20 0.47215
## hour 1 0.935 25 4 7 0.00030 ***
## treatment:hour 2 0.301 0 8 16 0.92952
## gender:hour 1 0.293 1 4 7 0.60237
## treatment:gender:hour 2 0.570 1 8 16 0.61319
## phase:hour 1 0.550 0 8 3 0.83245
## treatment:phase:hour 2 0.664 0 16 8 0.99144
## gender:phase:hour 1 0.695 1 8 3 0.62021
## treatment:gender:phase:hour 2 0.793 0 16 8 0.97237
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Run the code above in your browser using DataLab