pingouin.mixed_anova(data=None, dv=None, within=None, subject=None, between=None, correction='auto')[source]

Mixed-design (split-plot) ANOVA.


DataFrame. Note that this function can also directly be used as a Pandas method, in which case this argument is no longer needed.


Name of column containing the dependent variable.


Name of column containing the within-subject factor (repeated measurements).


Name of column containing the between-subject identifier.


Name of column containing the between factor.

correctionstring or boolean

If True, return Greenhouse-Geisser corrected p-value. If ‘auto’ (default), compute Mauchly’s test of sphericity to determine whether the p-values needs to be corrected.


ANOVA summary

'Source' : Names of the factor considered
'ddof1' : Degrees of freedom (numerator)
'ddof2' : Degrees of freedom (denominator)
'F' : F-values
'p-unc' : Uncorrected p-values
'np2' : Partial eta-square effect sizes
'eps' : Greenhouse-Geisser epsilon factor ( = index of sphericity)
'p-GG-corr' : Greenhouse-Geisser corrected p-values
'W-spher' : Sphericity test statistic
'p-spher' : p-value of the sphericity test
'sphericity' : sphericity of the data (boolean)


Data are expected to be in long-format (even the repeated measures). If your data is in wide-format, you can use the pandas.melt() function to convert from wide to long format.

Missing values are automatically removed (listwise deletion) using the pingouin.remove_rm_na() function. This could drastically decrease the power of the ANOVA if many missing values are present. In that case, it might be better to use linear mixed effects models.

Results have been tested against R and JASP.


If the between-subject groups are unbalanced (= unequal sample sizes), a type II ANOVA will be computed. Note however that SPSS, JAMOVI and JASP by default return a type III ANOVA, which may lead to slightly different results.


For more examples, please refer to the Jupyter notebooks

Compute a two-way mixed model ANOVA.

>>> from pingouin import mixed_anova, read_dataset
>>> df = read_dataset('mixed_anova')
>>> aov = mixed_anova(dv='Scores', between='Group',
...                   within='Time', subject='Subject', data=df)
>>> aov
        Source     SS  DF1  DF2     MS      F     p-unc    np2    eps
0        Group  5.460    1   58  5.460  5.052  0.028420  0.080      -
1         Time  7.628    2  116  3.814  4.027  0.020373  0.065  0.999
2  Interaction  5.168    2  116  2.584  2.728  0.069530  0.045      -