One of four related functions for mixed effects analyses (based on lmer
and as_lmerModLmerTest
) to get a linear model for downstream steps, or an ANOVA table.
mixed_model
mixed_anova
mixed_model_slopes
mixed_anova_slopes
.
mixed_model(
data,
Y_value,
Fixed_Factor,
Random_Factor,
AvgRF = TRUE,
Formula = NULL,
...
)
a data table object, e.g. data.frame or tibble.
name of column containing quantitative (dependent) variable, provided within "quotes". The following transformations are permitted: "log(Y_value)", "log(Y_value + c)" where c a positive number, "logit(Y_value)" or "logit(Y_value/100)" which may be useful when Y_value
are percentages (note quotes outside the log or logit calls); "sqrt(Y_value)" or "(Y_value)^2" should also work. During posthoc-comparisons, log and logit transformations will be back-transformed to the original scale. Other transformations, e.g., "sqrt(Y_value)" will not be back-transformed. Check out the regrid
and ref_grid
for details if you need back-transformation to the response scale.
name(s) of categorical fixed factors (independent variables) provided within quotes (e.g., "A") or as a vector if more than one (e.g., c("A", "B"). If a numeric variable is used, transformations similar to Y_value
are permitted.
name(s) of random factors to allow random intercepts; to be provided within quotes (e.g., "R") or as a vector when more than one (e.g., c("R1", "R2")).
this is a new argument since v5.0.0. The default AvgRF = TRUE
will use the mean of Y_value
(the response variable) grouped by levels of the Fixed_Factor
and Random_Factor
(using table_summary
). This ensures that replicates within Random_Factor
(or any other unused variable) are averaged (e.g., technical replicates nested within experimental blocks) before fitting a linear model and the denominator Df values are sensible. The name of the data frame in the model object will have (AvgRF)
appended to it to indicate the averaging within levels of the Random_Factor
. Using AvgRF = FALSE
will lead to behaviour like versions <5.0.0.
directly provide an a formula (within quotes) as you would if you were using lmer
. If Y_value
, Fixed_Factor
and Random_Factor
are provided, they will be ignored. This is basically a wrapper, which may be useful if fitting more complex random factor structures.
any additional arguments to pass on to lmer
if required.
This function returns an S4 object of class "lmerModLmerTest".
These functions require a data table, one dependent variable (Y_value), one or more independent variables (Fixed_Factor), and at least one random factor (Random_Factor). These should match names of variables in the long-format data table exactly. Since v5.0.0, if AvgRF = TRUE
, the response variable is averaged over levels of the fixed and random factors (to collapse replicate observations) and reduce the number of denominator degrees of freedom. If you do not want to do this, set AvgRF = FALSE
.
Outputs of mixed_model
and mixed_model_slopes
can be used for post-hoc comparisons with posthoc_Pairwise
, posthoc_Levelwise
, posthoc_vsRef
, posthoc_Trends_Pairwise
, posthoc_Trends_Levelwise
and posthoc_Trends_vsRef
or with emmeans
.
More than one fixed factors can be provided as a vector (e.g. c("A", "B")). A full model with interaction term is fitted.
This means when Y_value = Y, Fixed_factor = c("A", "B"), Random_factor = "R"
are entered as arguments, these are passed on as Y ~ A*B + (1|R)
(which is equivalent to Y ~ A + B + A:B + (1|R)
).
In mixed_model_slopes
and mixed_anova_slopes
, the following kind of formula is used: Y ~ A*B + (S|R)
(which is equivalent to Y ~ A + B + A:B + (S|R)
).
In this experimental implementation, random slopes and intercepts are fitted ((Slopes_Factor|Random_Factor)
). Only one term each is allowed for Slopes_Factor
and Random_Factor
.
#one fixed factor and random factor
mixed_model(data = data_doubling_time,
Y_value = "Doubling_time",
Fixed_Factor = "Student",
Random_Factor = "Experiment")
#> The new argument `AvgRF` is set to TRUE by default in >=5.0.0). Response variable is averaged over levels of Fixed and Random factors. Use help for details.
#> boundary (singular) fit: see help('isSingular')
#> Linear mixed model fit by REML ['lmerModLmerTest']
#> Formula: Doubling_time ~ Student + (1 | Experiment)
#> Data: data_doubling_time (AvgRF)
#> REML criterion at convergence: 95.2499
#> Random effects:
#> Groups Name Std.Dev.
#> Experiment (Intercept) 0.000
#> Residual 1.989
#> Number of obs: 30, groups: Experiment, 3
#> Fixed Effects:
#> (Intercept) StudentB StudentC StudentD StudentE StudentF
#> 19.9619 -0.3713 -0.5929 -1.1728 -0.6286 0.7416
#> StudentG StudentH StudentI StudentJ
#> 0.4885 -0.8083 0.6775 1.2115
#> optimizer (nloptwrap) convergence code: 0 (OK) ; 0 optimizer warnings; 1 lme4 warnings
#with formula
mixed_anova(data = data_doubling_time,
Formula = "Doubling_time ~ Student +(1|Experiment)")
#> boundary (singular) fit: see help('isSingular')
#> Type II Analysis of Variance Table with Kenward-Roger's method
#> Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
#> Student 16.824 1.8694 9 18 0.4725 0.8744
#' #save model
model <- mixed_model(data = data_doubling_time,
Y_value = "Doubling_time",
Fixed_Factor = "Student",
Random_Factor = "Experiment")
#> The new argument `AvgRF` is set to TRUE by default in >=5.0.0). Response variable is averaged over levels of Fixed and Random factors. Use help for details.
#> boundary (singular) fit: see help('isSingular')
#get model summary
summary(model)
#> Linear mixed model fit by REML. t-tests use Satterthwaite's method [
#> lmerModLmerTest]
#> Formula: Doubling_time ~ Student + (1 | Experiment)
#> Data: data_doubling_time (AvgRF)
#>
#> REML criterion at convergence: 95.2
#>
#> Scaled residuals:
#> Min 1Q Median 3Q Max
#> -1.94563 -0.40680 -0.04097 0.42601 1.45893
#>
#> Random effects:
#> Groups Name Variance Std.Dev.
#> Experiment (Intercept) 0.000 0.000
#> Residual 3.956 1.989
#> Number of obs: 30, groups: Experiment, 3
#>
#> Fixed effects:
#> Estimate Std. Error df t value Pr(>|t|)
#> (Intercept) 19.9619 1.1484 20.0000 17.383 1.54e-13 ***
#> StudentB -0.3713 1.6241 20.0000 -0.229 0.821
#> StudentC -0.5929 1.6241 20.0000 -0.365 0.719
#> StudentD -1.1728 1.6241 20.0000 -0.722 0.479
#> StudentE -0.6286 1.6241 20.0000 -0.387 0.703
#> StudentF 0.7416 1.6241 20.0000 0.457 0.653
#> StudentG 0.4885 1.6241 20.0000 0.301 0.767
#> StudentH -0.8083 1.6241 20.0000 -0.498 0.624
#> StudentI 0.6775 1.6241 20.0000 0.417 0.681
#> StudentJ 1.2115 1.6241 20.0000 0.746 0.464
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Correlation of Fixed Effects:
#> (Intr) StdntB StdntC StdntD StdntE StdntF StdntG StdntH StdntI
#> StudentB -0.707
#> StudentC -0.707 0.500
#> StudentD -0.707 0.500 0.500
#> StudentE -0.707 0.500 0.500 0.500
#> StudentF -0.707 0.500 0.500 0.500 0.500
#> StudentG -0.707 0.500 0.500 0.500 0.500 0.500
#> StudentH -0.707 0.500 0.500 0.500 0.500 0.500 0.500
#> StudentI -0.707 0.500 0.500 0.500 0.500 0.500 0.500 0.500
#> StudentJ -0.707 0.500 0.500 0.500 0.500 0.500 0.500 0.500 0.500
#> optimizer (nloptwrap) convergence code: 0 (OK)
#> boundary (singular) fit: see help('isSingular')
#>