Skip to main content
Statistics LibreTexts

14.7: Rcmdr Multiway ANOVA

  • Page ID
    45232
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Introduction

    We have been talking about the two-way randomized, balanced, replicated design. Here, we take you step by step through use of R to conduct the multiway ANOVA.

    R code: Multiway ANOVA

    Rcmdr: Statistics Means Multiway ANOVA… we will review this as Option 1

    or

    Rcmdr: Statistics Fit Models Linear model… we will review this as Option 2

    In either case, as a reminder, your data set must be a stacked worksheet, like the data in this table.

    Table \(\PageIndex{1}\). Data set, example.14.7
    Diet Population Response
    A 1 4
    A 1 6
    A 1 5
    A 2 5
    A 2 8
    A 2 9
    B 1 12
    B 1 15
    B 1 11
    B 2 5
    B 2 7
    B 2 8

    Option 1

    Your first option is to use the ANOVA menus via “Means.” This is a perfectly good way to handle a standard two-way, fully-crossed, fixed effects model. However, other designs will not run with this command and R will return a report of errors for ANOVA models that do not conform to the replicated, balanced, crossed design.

    Rcmdr: Statistics Means Multiway Analysis of variance …

    Factors: highlight “Diet” AND “Population”

    Response variable: pick one (in this window, all we see is “Response”)

    Multi-way ANOVA popup in R Commander. Selected factors are Diet and Population, and the response variable is Response.
    Figure \(\PageIndex{1}\): Multi-Way Analysis of Variance popup in R Commander.
    Note:

    Don’t forget to convert numeric Population to factor

    Interpret the output

    AnovaModel.2 <- (lm(Response ~ Diet*Population, data=example.14.7))
    
    Anova(AnovaModel.2)
     
    Anova Table (Type II tests)
    Response: Response
                      Sum Sq    Df    F value      Pr(>F) 
    Diet              36.750     1    12.2500    0.008079 **
    Population        10.083     1     3.3611    0.104104 
    Diet:Population   52.083     1    17.3611    0.003136 **
    Residuals         24.000     8
    ---
    Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
    tapply(example.14.7 Response, list(Diet=example.14.7 Diet, 
    + Population=example.14.7 Population), mean, na.rm=TRUE) # means
    Population
    Diet 1 2
    A 5.00000 7.333333
    B 12.66667 6.666667
    
    tapply(example.14.7 Response, list(Diet=example.14.7 Diet, 
    + Population=example.14.7 Population), sd, na.rm=TRUE) # std. deviations
    Population
    Diet 1 2
    A 1.000000 2.081666
    B 2.081666 1.527525
    
    tapply(example.14.7 Response, list(Diet=example.14.71 Diet, 
    + Population=example.14.7 Population), function(x) sum(!is.na(x))) # counts
    Population
    Diet 1 2
    A 3 3
    B 3 3
    
    

    End R output

    Summary of multi-way ANOVA command

    The multi-way ANOVA command returns our ANOVA table plus the adjusted means, along with standard deviations and number of observations (counts). The adjusted means would then be good to put into a chart to present group comparisons following adjustments from the effects of levels within groups.

    Rcmdr: Models → Graphs → Predictor effect plots …

    Here’s the chart (hint: \(\pm SEM = \frac{SD}{\sqrt{count}}\))

    Plot of diet predictor effect on the two populations. Plot of population predictor effect on the two diets.
    Figure \(\PageIndex{2}\): Plots of the predictor effects of each factor.

    Option 2

    A more general approach is to use the General linear model. This approach can handle the standard 2-way fixed effects ANOVA (above), but any other model as well. The model is Response ~ Diet*Population.

    Rcmdr: Statistics Fit Models Linear model…

    Linear Model popup menu in R Commander. Model formula is input as Response ~ Diet * Population.
    Figure \(\PageIndex{3}\): Linear Model screenshot in R Commander with model formula input.

    Interpret the output

    LinearModel.1 <- lm(Response ~ Diet * Population, data=example.14.7)
    
    summary(LinearModel.1)
    
    Call:
    lm(formula = Response ~ Diet * Population, data = example.14.7)
    
    Residuals:
    Min 1Q Median 3Q Max 
    -2.3333 -1.1667 0.1667 1.0833 2.3333 
    
    Coefficients:
                            Estimate    Std. Error ..t value .  Pr(>|t|) 
    (Intercept) .              5.000         1.000 .   5.000    .0.00105 ** 
    Diet[T.B] .                7.667       ..1.414 .   5.421    .0.00063 ***
    Population[T.2]           .2.333       ..1.414 .   1.650    .0.13757 
    Diet[T.B]:Population[T.2] -8.333       ..2.000    -4.167    .0.00314 ** 
    ---
    Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
    
    Residual standard error: 1.732 on 8 degrees of freedom
    Multiple R-squared: 0.8047, Adjusted R-squared: 0.7315 
    F-statistic: 10.99 on 3 and 8 DF, p-value: 0.003285 
    

    End R output

    Lots to sort through, so let’s begin with what is in common between the two approaches in Rcmdr, the Multi-way ANOVA command versus the linear model command.

    Compare the two outputs

    As a direct output, the linear model option does not provide an ANOVA summary table. Instead of our ANOVA table, the linear model returns estimates of coefficients along with \(t\)-test results for each coefficient of the model from the lm() command output

    Recall that we can get ANOVA tables through the following R commands via Rcmdr.

    Rcmdr: Models Hypothesis tests ANOVA Table.

    Let’s do so for this linear model (accept the default for type of tests = “Type II”).

    And the output is

    Anova(LinearModel.1, type="II")
    Anova Table (Type II tests)
    
    Response: Response
                    Sum Sq Df F value   Pr(>F)   
    Diet            36.750  1 12.2500 0.008079 **
    Population      10.083  1  3.3611 0.104104   
    Diet:Population 52.083  1 17.3611 0.003136 **
    Residuals       24.000  8                    
    ---
    Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    End R output

    Now we’re in business, and, using the lm() function, we have the estimates for each model coefficient plus our ANOVA table.

    Both methods give the same answer! Of course. Which to choose, Option 1 or Option 2? Use the lm() option: it is more flexible and covers more designs than the multiway ANOVA, which is strictly for the crossed fully replicated design.


    Questions

    1. Write out the two-way model described for the data in Table \(\PageIndex{1}\).
    2. Write the null hypotheses and provide a summary of the statistical significance of the model.

    This page titled 14.7: Rcmdr Multiway ANOVA is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by Michael R Dohm via source content that was edited to the style and standards of the LibreTexts platform.

    • Was this article helpful?