Interactions I: Num x Cat

Learning Objectives

At the end of this lab, you will:

  1. Understand the concept of an interaction
  2. Be able to interpret the meaning of a numeric \(\times\) categorical interaction
  3. Be able to visualize and probe interactions

What You Need

  1. Be up to date with lectures
  2. Have completed all labs from Semester 1

Required R Packages

Remember to load all packages within a code chunk at the start of your RMarkdown file using library(). If you do not have a package and need to install, do so within the console using install.packages(" "). For further guidance on installing/updating packages, see Section C here.

For this lab, you will need to load the following package(s):

  • tidyverse
  • kableExtra
  • psych
  • sjPlot
  • patchwork
  • sandwich
  • interactions

Presenting Results

All results should be presented following APA guidelines. If you need a reminder on how to hide code, format tables/plots, etc., make sure to review the rmd bootcamp.

The example write-up sections included as part of the solutions are not perfect - they instead should give you a good example of what information you should include and how to structure this. Note that you must not copy any of the write-ups included below for future reports - if you do, you will be committing plagiarism, and this type of academic misconduct is taken very seriously by the University. You can find out more here.

Lab Data

You can download the data required for this lab here or read it in via this link https://uoepsy.github.io/data/wellbeing_rural.csv

Study Overview

Research Question

Does the association between wellbeing and the number of social interactions differ between rural and non-rural residents?

Wellbeing/Rurality data codebook.

Setup

Setup
  1. Create a new RMarkdown file
  2. Load the required package(s)
  3. Read the wellbeing_rural dataset into R, assigning it to an object named mwdata

Solution

Exercises

Study & Analysis Plan Overview

Question 1

Provide a brief overview of the study design and data, before detailing your analysis plan to address the research question.

  • State what type of analysis you will conduct in order to address the research question
  • Specify the model to be fitted to address the research question (note that you will need to specify the reference level of your categorical variable)
  • Specify your chosen significance (\(\alpha\)) level
  • State your hypotheses

Much of the information required can be found in the Study Overview codebook.

If we fit the interaction x1:x2, we almost always want to also fit the separate effects x1 and x2:

“Except in special circumstances, a model including a product term for interaction between two explanatory variables should also include terms with each of the explanatory variables individually, even though their coefficients may not be significantly different from zero. Following this rule avoids the logical inconsistency of saying that the effect of \(X_1\) depends on the level of \(X_2\) but that there is no effect of \(X_1\).”
Ramsey and Schafer (2012)

Solution


Question 2

Check coding of variables (e.g., that categorical variables are coded as factors).

Note that the “location” variable currently has three levels (Rural/Suburb/City). In order to address the research question, we only want two (Rural/Not Rural) locations - you will need to fix this.

As specified in Q1, we want ‘not rural’ as the reference group, so make sure to specify this.

One way to do this would be to use ifelse() to define a variable which takes one value (“Rural”) if the observation meets from some condition, or another value (“Not Rural”) if it does not.

Type ?ifelse in the console if you want to see the help function. You can use it to add a new variable either inside mutate(), or using data$new_variable_name <- ifelse(test, x, y) syntax.

Solution

Descriptive Statistics & Visualisations

Question 3

Provide a table of descriptive statistics and visualise your data.

In particular:

  1. Explore the associations among the variables included in your analysis
  2. Produce a visualisation of the association between weekly number of social interactions and well-being, with separate facets for rural vs non-rural respondents OR with different colours for each level of the isRural variable.
  1. For your table of descriptive statistics, both the group_by() and summarise() functions will come in handy here.
  2. If you use the select() function and get an error along the lines of Error in select...unused arguments..., you will need to specify dplyr::select() (this just tells R which package to use the select function from).
  3. The pairs.panels() function from the psych package can plot all variables in a dataset against one another. This will save you the time you would have spent creating individual plots, but is only useful for continuous variables.
  4. To include facets, within your ggplot() argument you will need to specify + facet_wrap() in order to produce facets for each location. It would also be useful to specify geom_smooth(method="lm").
  5. To include different colours for each location, you will need to specify colour = isRural within your ggplot() argument, as well as + scale_colour_discrete() to state the name = of your legend and the labels = associated with each coloured line.

Solution

Model Fitting & Interpretation

Question 4

Fit your model using lm(), and assign it as an object with the name “rural_mod”.

When fitting a regression model in R with two explanatory variables A and B, and their interaction, these three are equivalent:

  • y ~ A + B + A:B
  • y ~ A + B + A*B
  • y ~ A*B

Solution


Question 5

Look at the parameter estimates from your model, and write a description of what each one corresponds to on the plot shown in Figure 1 (it may help to sketch out the plot yourself and annotate it, and refer to the drop down options below).

Figure 1: Multiple regression model: Wellbeing ~ Social Interactions * is Rural
Options for Mapping Parameter Estimates to Plot

Recall that we can obtain our parameter estimates using various functions such as summary(),coef(), coefficients(), etc.

Solution


Question 6

No participants in our dataset had zero hours of social interactions per week (the lowest was 3), and we’re likely not interested in differences between rural and non-rural residents who have never interacted with others.

Mean center the continuous IV(s), and re-run your model with mean centered variable(s).

There are a couple of different ways that we can re-centre. We could either create a new variable, named say mc_social_int which is social_int - mean(social_int) (which would therefore make everyone who had 12.06 social interactions per week be given a value of 0 in the variable), or we could do it in the model:

mwdata <-
 mwdata %>%
  mutate(
   mc_social_int = social_int - mean(social_int)
    )
rural_mod_mc <- lm(wellbeing ~ I(social_int-12.06) * isRural, data = mwdata)

When we specify the I() notation in the formula syntax of lm() in R, the notation simply means ‘as is’. In other words, in our example, we are specifying that we want to include as a predictor variable the product of social_int - 12.06 in our model.

Solution


Question 7

Note any differences between the summary() output between the original (“rural_mod”) and mean centred (“rural_mod1”) models. Pay particular attention to your coefficients and their significance values. How have your coefficients changed? Why do you think these differences have been observed?

These plots illustrate the difference between the “rural_mod” and “rural_mod1” models.

Figure 2: Difference when social interactions is not vs is mean centered.
Note that the lines without SE intervals on the left plot represent predicted values below the minimum observed number of social interactions, to ensure that zero on the x-axis is visible

Solution

Visualise Interaction Model

Question 8

Using the probe_interaction() function from the interactions package, visualise the interaction effects from your model.

Try to summarise the interaction effects in a short and concise sentence.

In terms of specification, it might be useful to look up the helper function via ?probe_interaction. As a quick guide:

  • model = name model to be used
  • pred = The predictor variable
  • modx = The moderator variable
  • interval = If we say TRUE, then confidence/prediction intervals will be plotted around the line

Make sure to give your plot informative titles/labels. You, for example, likely want to give your plot:

  • a clear and concise title (specify main.title =)
  • axis labels with units or scale included (specify x.label = and y.label =)
  • a legend title (specify legend.main =)

Solution

Writing Up & Presenting Results

Question 9

Provide key model results (from “rural_mod1”) in a formatted table.

Use tab_model() from the sjPlot package.

You can rename your DV and IV labels by specifying dv.labels and pred.labels. To do so, specify your variable name on the left, and what you would like this to be named in the table on the right.

Solution


Question 10

Interpret your results (from “rural_mod1”) in the context of the research question and report your model in full.

Make reference to the interaction plot and regression table.

“The best method of communicating findings about the presence of a significant interaction may be to present a table or graph of the estimated means at various combinations of the interacting variables.”
Ramsey and Schafer (2012)

Solution

Compile Report

Compile Report

Knit your report to PDF, and check over your work. To do so, you should make sure:

  • Only the output you want your reader to see is visible (e.g., do you want to hide your code?)
  • Check that the tinytex package is installed
  • Ensure that the ‘yaml’ (bit at the very top of your document) looks something like this:
---
title: "this is my report title"
author: "B1234506"
date: "07/09/2024"
output: bookdown::pdf_document2
---

If you are having issues knitting directly to PDF, try the following:

  • Knit to HTML file
  • Open your HTML in a web-browser (e.g. Chrome, Firefox)
  • Print to PDF (Ctrl+P, then choose to save to PDF)
  • Open file to check formatting

To not show the code of an R code chunk, and only show the output, write:

```{r, echo=FALSE}
# code goes here
```

To show the code of an R code chunk, but hide the output, write:

```{r, results='hide'}
# code goes here
```

To hide both code and output of an R code chunk, write:

```{r, include=FALSE}
# code goes here
```

You must make sure you have tinytex installed in R so that you can “Knit” your Rmd document to a PDF file:

install.packages("tinytex")
tinytex::install_tinytex()

Solution

References

Ramsey, Fred, and Daniel Schafer. 2012. The Statistical Sleuth: A Course in Methods of Data Analysis. Cengage Learning.