Mindful Lawyer Study

Full Analysis

E. G. Nielsen

July 12, 2019

Note: This script was written using versions 3.4.3 and 1.1.414 of R and RStudio, respectively.

Project Components

The study described in this document is part of a larger project looking at the effects of mindfulness in the legal profession. In addition to this script, the following project components are publicly available:

Abstract

This study investigated the effects of a mindfulness meditation intervention on the psychological well-being and self-perceived competency of a group of lawyers. One hundred lawyers were randomly assigned to either an experimental group or a delayed-start control group (n = 50 in each). All participants completed a series of self-report measures designed to assess perceived well-being, affect, and job competency (T1). Following the completion of these measures, the experimental group participated in a 30-day mindfulness program. At the end of this program, all participants completed the self-report measures for a second time (T2). The control group then participated in the same 30-day mindfulness program and, at the end of this program, all participants completed the self-report measures for a third and final time (T3). The completion of the mindfulness program was associated with significant decreases in stress, negative affect, and depression, as well as increases in positive affect, non-reactivity, observing, acting with awareness, non-judging, and perceived job effectiveness. These changes failed to decrease participants’ level of perceived stress to levels experienced by the general population. Nevertheless, significant changes in both groups were observed, suggesting that the intervention was effective in enhancing participants’ mindfulness and improving their psychological well-being. Based on correlation and moderation analyses, most improvements seem to have been unrelated to the amount of program engagement (i.e. the amount of time spent meditating throughout the 30-day program) and length of previous meditation experience. It is, however, important to note that the samples that were ultimately analyzed were relatively small due to participant drop-out throughout the study. Consequently, though the significant findings and general trends within the data are promising, these results should be interpreted with caution and future work should consider ways in which drop-out can be minimized or mitigated.


Introduction

This document outlines the analyses from the Mindful Lawyer Study. Research protocol and planned analyses for this study were registered by Minda and Nielsen and can be viewed here. The purpose of this study was to investigate whether a 30-day mindfulness intervention would improve the well-being of a group of lawyers.

Participants were randomly assigned to one of two conditions: an experimental condition or a delayed-start control condition (n = 50 for both). At the beginning of the study (i.e. T1), all participants were asked to complete a series of self-report measures:

  • The Perceived Stress Scale (PSS; Cohen et al., 1983), which provides a measure of perceived stress.

  • The Positive and Negative Affect Schedule (PANAS; Watson et al., 1988), which provides a measure of both current positive (POS) and current negative (NEG) mood.

  • The Brief Resilience Scale (BRS; Smith et al., 2008), which provides a measure of psychological resilience.

  • The Five Facet Mindfulness Questionnaire-Short Form (FFMQ; Baer et al., 2008; Bohlmeijer et al., 2011), which provides a measure of five aspects of mindful cognition: non-reactivity to inner experience (NR), observing (OB), acting with awareness (AA), describing (DS), and non-judging of inner experience (NJ).

  • The Depression, Anxiety, and Stress Scale-21 (DASS; Lovibond & Lovibond, 1995), which provides a non-clinical measure of the severity of symptoms associated with depression (D), anxiety (A), and stress (S).

  • A Job Effectiveness Questionnaire (JEQ), which provides a measure of perceived job competency.

After completing the above measures, participants in the experimental condition completed a 30-day mindfulness program. After the experimental group had completed the program (i.e. T2), all participants completed the above self-report measures for a second time. Following the T2 testing period, participants in the control condition completed the 30-day mindfulness program. Once the control group had completed the program (i.e. T3), all participants completed the self-report measures for a third time.

If the intervention was effective in improving well-being and perceived job competency, analyses should reveal an interaction between time and condition such that, from T1 to T2, participants in the experimental condition experienced an increase in scores on the JEQ, the BRS, the positive affect subscale of the PANAS, and all subscales of the FFMQ, as well as a decrease in scores on the PSS, the negative affect subscale of the PANAS, and all subscales of the DASS. Between these two testing periods, participants in the control condition should show no change in scores on any of the measures considered; instead, participants in the control condition should demonstrate the predicted changes during T2 and T3.


Analysis Prep

Import Data File

AllData = read.csv("AllData.csv", header = TRUE, quote = "")

This file contains all of the data collected throughout the study.

Some notes regarding the names of variables:

  • Subject denotes subject number.

  • Condition refers to the condition that participants were randomly assigned to (i.e. Control or Experimental).

  • T1 - T3 is an index of whether participants did (1) or did not (0) complete each of the T1, T2, and T3 surveys.

  • Pre_Post is an index of whether participants did (1) or did not (0) complete both the survey that immediately preceded their commencement of the meditation program and the survey that immediately followed their completion of the program. For participants in the experimental condition, the T1 survey acted as an immediate pre-survey while the T2 survey was an immediate post-survey. For participants in the control condition, the T2 survey acted as an immediate pre-survey while the T3 survey was an immediate post-survey.

  • Num_Survey indicates the number of surveys completed by each participant.

  • Late_T1, Late_T2, and Late_T3 indicates whether a participant’s T1, T2, and T3 survey responses were completed more than 10 days after their relevant mindfulness program began or ended (1) or if they were completed within that 10 day response period (0).

  • Gender indicates whether a participant self-identified as either a male (1) or a female (2).

  • Age indicates each participant’s age in years.

  • Position_Length indicates the number of years for which each participant has held their current position at work.

  • Weekly_Hrs indicates the number of hours that each participant typically works per week.

  • Leadership is an index of whether a participant does (1) or does not (2) hold a leadership position.

  • Supervising indicates the number of people who report directly to each participant.

  • Title is an index of whether a participant is an equity shareholder (1), non-equity shareholder (2), of counsel/counsel (3), associate (4), or other (5) within the law firm.

  • Office_Size is an index of whether a participant’s home office contains fewer than 10 (1), 10-20 (3), or more than 20 (4) employees.

  • Med_Prior, Yoga_Prior, and Tai_Prior is an index of whether a participant does (1), or does not (2) have any prior experience practicing meditation, yoga, and/or tai chi.

  • Med_Length, Yoga_Length, and Tai_Length is an index of whether a participant has practiced each activity for 1-3 months (1), 3-6 months (2), 6-12 months (3), 1-3 years (4), or 3+ years (5).

  • Med_Length_Other, Yoga_Length_Other, and Tai_Length_Other is an indication of the number of years each participant has practiced each activity if they had previously indicated that they have practiced for 3+ years (i.e. they had selected option 5 in response to any of the three x_Length variables listed above).

  • Med_Current, Yoga_Current, and Tai_Current is an index of whether a participant currently practices each activity 1-2 times per day (1), 1-2 times per week (2), 3 or more times per week (3), a few times a month (4), or at some other interval (5).

  • Med_Current_Other, Yoga_Current_Other, and Tai_Current_Other is an indication of how often each participant currently practices each activity if they had previously indicated that they currently practice at an interval that was not listed as a response option (i.e. they had selected option 5 in response to any of the three x_Current variables listed above).

  • Personal_Tech is an index of whether participants use Insight Timer (1), Headspace (2), Muse (3), Buddhify (4), Calm (5), Mindfulness App (8), or some other form of technology (7) to assist in their personal meditation practice.

  • Personal_Tech_Other is an indication of which apps or technologies each participant uses in their personal meditation practice if they had previously indicated that they employ a type of technology that was not listed as a response option (i.e. they had selected option 7 in response to the Personal_Tech variable).

  • Med_Week is an indication of how many times per week participants reported meditating during the 30-day meditation program.

  • Mins_Med is an indication of how many minutes (approximately) participants reported meditating for each time that they meditated throughout the 30-day meditation program.

  • Mins_Week is an index combining the Med_Week and Mins_Med variables to indicate how many minutes participants spent meditating per week throughout the 30-day meditation program.

  • Tech and Tech_Other refer to participants use of technology during the 30-day meditation program. These variables are coded the same as Personal_Tech and Personal_Tech_Other.

  • Variables referred to by Cont_X indicate variables related to the meditation practice of participants in the experimental condition in the 30 days after their formal meditation program had ended. Cont_Practice is an index of whether experimental participants did (1) or did not (2) continue meditating during the 30 days after their formal meditation program had ended (i.e. during the 30 days that the control condition was engaged in the meditation program). Cont_Med_Week, Cont_Mins_Med, Cont_Mins_Week, Cont_Tech, and Cont_Tech_Other are similar to the five variables described above.

  • Variables referred to by T_ACRONYM indicate the overall scores obtained by participants on each self-report measure during each testing session (i.e. T1, T2, or T3).

Load Libraries

The following libraries will be needed for this analysis:

# 1. For calculating descriptive statistics:

# install.packages("Rmisc")
library(Rmisc)

# 2. For summarizing data:

#install.packages("summarytools")
library(summarytools)

# 3. For formatting tables:

# a. 

# install.packages("knitr")
library(knitr)

# b.

#install.packages ("kableExtra")
library(kableExtra)

# 4. For plotting with ggplot2:

# install.packages("tidyverse")
library(tidyverse)

# 5. For formatting plots:

# a. 

# install.packages ("grid")
library(grid)

# b.

# install.packages("gridExtra")
library(gridExtra)

# 6. For running Levene's test:

# install.packages("car")
library(car)

# 7. For performing ANOVAs:

# install.packages("ez")
library(ez)

# 8. For calculating eta effect sizes:

# install.packages("DescTools")
library(DescTools)

# 9. For calculating Cohen's d:

# install.packages("effsize")
library(effsize)

# 10. For performing Wilcoxon Tests:

# install.packages("coin")
library(coin)

# 11. For performing correlations:

# install.packages("Hmisc")
library(Hmisc)

# 12. For replacing values with NA:

# install.packages("naniar")
library(naniar)

# 13. For performing t-tests using summary data:

# install.packages("PASWR")
library(PASWR)

Adjust Display Options

ezANOVA prints output using scientific notation. In order to make it easier to read our ANOVA outputs, we’ll turn the scientific notation option off.

options(scipen = 999)

Extra Functions

Legend Selection

For some of our figures, we may want to incorporate a shared legend. The function below allows us to do so by selecting the legend from one of our figures and turning it into a callable object (as described here).

g_legend<-function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)}

Split Violin Plot

We’ll use split violin plots to plot some of our data (derived by DeBruine, 2018).

GeomSplitViolin <- ggproto(
  "GeomSplitViolin", 
  GeomViolin, 
  draw_group = function(self, data, ..., draw_quantiles = NULL) {
    data <- transform(data, 
                      xminv = x - violinwidth * (x - xmin), 
                      xmaxv = x + violinwidth * (xmax - x))
    grp <- data[1,'group']
    newdata <- plyr::arrange(
      transform(data, x = if(grp%%2==1) xminv else xmaxv), 
      if(grp%%2==1) y else -y
    )
    newdata <- rbind(newdata[1, ], newdata, newdata[nrow(newdata), ],
                     newdata[1, ])
    newdata[c(1,nrow(newdata)-1,nrow(newdata)), 'x'] <- round(newdata[1,
                                                                      'x']) 
    if (length(draw_quantiles) > 0 & !scales::zero_range(range(data$y))) {
      stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <= 1))
      quantiles <- ggplot2:::create_quantile_segment_frame(data,
                                                           draw_quantiles)
      aesthetics <- data[rep(1, nrow(quantiles)), setdiff(names(data),
                                                          c("x", "y")),
                         drop = FALSE]
      aesthetics$alpha <- rep(1, nrow(quantiles))
      both <- cbind(quantiles, aesthetics)
      quantile_grob <- GeomPath$draw_panel(both, ...)
      ggplot2:::ggname("geom_split_violin", 
                       grid::grobTree(GeomPolygon$draw_panel(newdata, ...),
                                      quantile_grob))
    } else {
      ggplot2:::ggname("geom_split_violin",
                       GeomPolygon$draw_panel(newdata, ...))
    }
  }
)

geom_split_violin <- function (mapping = NULL, 
                               data = NULL, 
                               stat = "ydensity", 
                               position = "identity", ..., 
                               draw_quantiles = NULL, 
                               trim = TRUE, 
                               scale = "area", 
                               na.rm = FALSE, 
                               show.legend = NA, 
                               inherit.aes = TRUE) {
  layer(data = data, 
        mapping = mapping, 
        stat = stat, 
        geom = GeomSplitViolin, 
        position = position, 
        show.legend = show.legend, 
        inherit.aes = inherit.aes, 
        params = list(trim = trim, 
                      scale = scale, 
                      draw_quantiles = draw_quantiles, 
                      na.rm = na.rm, ...)
        )
}

p-Value Rounding

We’ll also create a function to assess and print p-values in the comments of our script. If p >= .005, the function will display “p =” and the value rounded to two decimal places. If .0005 <= p < .005, the function will display “p =” and the value rounded to three decimal places. If p < .0005, the function will display “p < .001.”

p_round <- function(x){
  if(x > .005)
    {x1 = (paste("= ", round(x, digits = 2), sep = ''))
  }  
  else if(x == .005){x1 = (paste("= .01"))
  }
  else if(x > .0005 & x < .005)
    {x1 = (paste("= ", round(x, digits = 3), sep = ''))
  }  
  else if(x == .0005){x1 = (paste("= .001"))
  }
  else{x1 = (paste("< .001"))
  } 
  (x1)
}

Wilcoxon Effect Size

In some sections of our analysis, we will conduct Wilcoxon Signed-Rank tests. An effect size can be calculated for the Wilcoxon test via the following formula, which we will create a function for: \[r = \frac{Z}{\sqrt{N}}\]

WilcoxEff <- function(Z, N){
  return(Z / sqrt(N))
}

Note that, for independent tests, N represents the number of observations; for paired tests, N represents the number of pairs.

Cohen’s d

In some cases, we will want to calculate a Cohen’s d effect size using summary statistics rather than a full data set. The following formula can be used to calculate Cohen’s d for independent t-tests using a t-value and the n-values for each sample: \[d = t(\sqrt((\frac{1}{n_1}) + (\frac{1}{n_2}))\]

DInd <- function(t, nx, ny){
  return((t)*(sqrt((1/nx) + (1/ny))))
}

1. Changes Across All Three Time Points

Our first set of analyses will look at the effect of time and condition on self-report scores across all three time points.

Subsetting Data

For these analyses, we will want to focus exclusively on participants who provided responses to all three surveys and who actively participated in the meditation program. Before we begin, therefore, we will subset the data according to the Num_Surveys and Med_Week variables. We will also create a separate data set for scores on the FFMQ, DASS, and JEQ because one participant (in the control condition) failed to complete these scales in the T3 survey; this participant’s data will be included in the analyses for the scales that they completed but will be omitted for analyses involving the three scales that they failed to respond to.

Note: though we could also subset the data according to when participants completed each survey, the sample sizes in this study are already limited due to participant drop-out over time. Furthermore, a pilot study found no difference in results when analyses included versus excluded participants who responded outside of the response period. Consequently the Late_TX variables will not be considered in any of the subsequent analyses.

Subset A

This data set will encompass all of the variables excluding those related to the FFMQ, DASS, and JEQ.

# Select participants who responded to all three surveys and who meditated throughout the program:

Data1a = subset(AllData, Num_Surveys == "3" & Med_Week >= "1")

# Specify variables to exclude:

Data1aEx = names(Data1a) %in% c("T1_NR_FFMQ", "T1_OB_FFMQ", "T1_AA_FFMQ", "T1_DS_FFMQ", "T1_NJ_FFMQ", "T1_D_DASS", "T1_A_DASS", "T1_S_DASS", "T1_JEQ", "T2_NR_FFMQ", "T2_OB_FFMQ", "T2_AA_FFMQ", "T2_DS_FFMQ", "T2_NJ_FFMQ", "T2_D_DASS", "T2_A_DASS", "T2_S_DASS", "T2_JEQ", "T3_NR_FFMQ", "T3_OB_FFMQ", "T3_AA_FFMQ", "T3_DS_FFMQ", "T3_NJ_FFMQ", "T3_D_DASS", "T3_A_DASS", "T3_S_DASS", "T3_JEQ")

# Define the final subset:

Data1a = Data1a[!c(Data1aEx)]

We’ll also want to create a long version of the self-report scores in this data frame so that we can conduct mixed ANOVAs.

# Create a series of data frames that will specify the level of Time within our long data set:

T1Frame1a = data.frame(matrix("T1", nrow = (nrow(Data1a)), ncol = 1))

T2Frame1a = data.frame(matrix("T2", nrow = (nrow(Data1a)), ncol = 1))

T3Frame1a = data.frame(matrix("T3", nrow = (nrow(Data1a)), ncol = 1))

# T1 subset:

T1Data1a = data.frame(Data1a$Subject, Data1a$Condition, T1Frame1a, Data1a$T1_PSS, Data1a$T1_POS_PANAS, Data1a$T1_NEG_PANAS, Data1a$T1_BRS)

colnames(T1Data1a) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS")

# T2 subset:

T2Data1a = data.frame(Data1a$Subject, Data1a$Condition, T2Frame1a, Data1a$T2_PSS, Data1a$T2_POS_PANAS, Data1a$T2_NEG_PANAS, Data1a$T2_BRS)

colnames(T2Data1a) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS")

# T3 subset:

T3Data1a = data.frame(Data1a$Subject, Data1a$Condition, T3Frame1a, Data1a$T3_PSS, Data1a$T3_POS_PANAS, Data1a$T3_NEG_PANAS, Data1a$T3_BRS)

colnames(T3Data1a) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS")

# Combine the subsets into a full data frame: 

Long1a = rbind(T1Data1a, T2Data1a, T3Data1a)

Subset B

This data set will encompass only those variables related to the FFMQ, DASS, and JEQ.

# Select participants who responded to all three surveys and who meditated throughout the program:

Data1b = subset(AllData, Num_Surveys == "3" & Med_Week >= "1")

# Specify variables to include:

Data1bIn = names(Data1b) %in% c("Subject", "Condition", "T1_NR_FFMQ", "T1_OB_FFMQ", "T1_AA_FFMQ", "T1_DS_FFMQ", "T1_NJ_FFMQ", "T1_D_DASS", "T1_A_DASS", "T1_S_DASS", "T1_JEQ", "T2_NR_FFMQ", "T2_OB_FFMQ", "T2_AA_FFMQ", "T2_DS_FFMQ", "T2_NJ_FFMQ", "T2_D_DASS", "T2_A_DASS", "T2_S_DASS", "T2_JEQ", "T3_NR_FFMQ", "T3_OB_FFMQ", "T3_AA_FFMQ", "T3_DS_FFMQ", "T3_NJ_FFMQ", "T3_D_DASS", "T3_A_DASS", "T3_S_DASS", "T3_JEQ")

# Define the final subset:

Data1b = na.omit(Data1b[Data1bIn])

We’ll also want to create a long version of the self-report scores in this data frame so that we can conduct mixed ANOVAs.

# Create a series of data frames that will specify the level of Time within our long data set:

T1Frame1b = data.frame(matrix("T1", nrow = (nrow(Data1b)), ncol = 1))

T2Frame1b = data.frame(matrix("T2", nrow = (nrow(Data1b)), ncol = 1))

T3Frame1b = data.frame(matrix("T3", nrow = (nrow(Data1b)), ncol = 1))

# T1 subset:

T1Data1b = data.frame(Data1b$Subject, Data1b$Condition, T1Frame1b, Data1b$T1_NR_FFMQ, Data1b$T1_OB_FFMQ, Data1b$T1_AA_FFMQ, Data1b$T1_DS_FFMQ, Data1b$T1_NJ_FFMQ, Data1b$T1_D_DASS, Data1b$T1_A_DASS, Data1b$T1_S_DASS, Data1b$T1_JEQ)

colnames(T1Data1b) = c("Subject", "Condition", "Time", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# T2 subset:

T2Data1b = data.frame(Data1b$Subject, Data1b$Condition, T2Frame1b, Data1b$T2_NR_FFMQ, Data1b$T2_OB_FFMQ, Data1b$T2_AA_FFMQ, Data1b$T2_DS_FFMQ, Data1b$T2_NJ_FFMQ, Data1b$T2_D_DASS, Data1b$T2_A_DASS, Data1b$T2_S_DASS, Data1b$T2_JEQ)

colnames(T2Data1b) = c("Subject", "Condition", "Time", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# T3 subset:

T3Data1b = data.frame(Data1b$Subject, Data1b$Condition, T3Frame1b, Data1b$T3_NR_FFMQ, Data1b$T3_OB_FFMQ, Data1b$T3_AA_FFMQ, Data1b$T3_DS_FFMQ, Data1b$T3_NJ_FFMQ, Data1b$T3_D_DASS, Data1b$T3_A_DASS, Data1b$T3_S_DASS, Data1b$T3_JEQ)

colnames(T3Data1b) = c("Subject", "Condition", "Time", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# Combine the subsets into a full data frame: 

Long1b = rbind(T1Data1b, T2Data1b, T3Data1b)

Demographic Information

Now we’ll look at some basic demographic information for this subset of participants. We’ll begin by assessing the nominal variables in this data set. (Note that the Cont_Practice variable is NA for the Control condition.)

# Gender:

Gender1 = xtabs(data = Data1a, ~ Condition + Gender)

# Prior meditation experience:

Med_Prior1 = xtabs(data = Data1a, ~ Condition + Med_Prior)

# Prior yoga experience:

Yoga_Prior1 = xtabs(data = Data1a, ~ Condition + Yoga_Prior)

# Prior tai chi experience:

Tai_Prior1 = xtabs(data = Data1a, ~ Condition + Tai_Prior)

# Continuation of meditation practice:

Cont_Practice1 = xtabs(data = Data1a, ~ Condition + Cont_Practice)
Cont_Practice1[1,] = NA

# Combine these variables into a single data frame:

Demos1a = cbind(Gender1, Med_Prior1, Yoga_Prior1, Tai_Prior1, Cont_Practice1)

# Create a table to display the results:

kable(Demos1a, caption = "Table 1. Frequency-based demographic information (i.e. n) for participants who completed all three surveys.",  col.names = c("Male", "Female", "Yes", "No", "Yes", "No", "No", "Yes", "No"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c("", "Gender" = 2, "Meditation Exp." = 2, "Yoga Exp." = 2, "Tai Chi Exp." = 1, "Continued Practice" = 2)) %>%
  footnote(general = "A 'Yes' column is not provided for the Tai Chi Exp. variable because no participants responded 'yes' to this question.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 1. Frequency-based demographic information (i.e. n) for participants who completed all three surveys.
Gender
Meditation Exp.
Yoga Exp.
Tai Chi Exp.
Continued Practice
Male Female Yes No Yes No No Yes No
Control 6 14 8 12 4 16 19 NA NA
Experimental 6 11 6 11 5 12 16 8 9
Note: A ‘Yes’ column is not provided for the Tai Chi Exp. variable because no participants responded ‘yes’ to this question.

Next, we’ll look at some of the continuous variables in this data set.

# Age

Age1 = summarySE(data = Data1a, measurevar = "Age",
                    groupvars = c("Condition"), conf.interval = .95)

# Weekly hours:

Weekly_Hrs1 = summarySE(data = Data1a, measurevar = "Weekly_Hrs",
                    groupvars = c("Condition"), conf.interval = .95)

# Mins/Week spent meditating during the program:

Mins_Week1 = summarySE(data = Data1a, measurevar = "Mins_Week",
                    groupvars = c("Condition"), conf.interval = .95) 


# Mins/Week spent meditating by the experimental group after the program:

Cont_Mins_Week1 = summarySE(data = Data1a, measurevar = "Cont_Mins_Week",
                    groupvars = c("Condition"), conf.interval = .95)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(Age1)[colnames(Age1) == "Age"] = "M"
colnames(Weekly_Hrs1)[colnames(Weekly_Hrs1) == "Weekly_Hrs"] = "M"
colnames(Mins_Week1)[colnames(Mins_Week1) == "Mins_Week"] = "M"
colnames(Cont_Mins_Week1)[colnames(Cont_Mins_Week1) == "Cont_Mins_Week"] = "M"

# Combine these variables into a single data frame:

Demos1b = data.frame(rbind(Age1, Weekly_Hrs1, Mins_Week1, Cont_Mins_Week1))

# Create a table to display the results:

kable(Demos1b, digits = 4, caption = "Table 2. Demographic information for participants who completed all three surveys.",  col.names = c("Condition", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Age", 1, 2) %>%
  group_rows("Weekly Hours Worked", 3, 4) %>%
  group_rows("Meditation During the Program (Min/Week)", 5, 6) %>%
  group_rows("Meditation After the Program (Min/Week)", 7, 8)
Table 2. Demographic information for participants who completed all three surveys.
Condition n M SD SE CI
Age
Control 20 49.1500 10.9846 2.4562 5.1409
Experimental 17 53.0000 7.5581 1.8331 3.8860
Weekly Hours Worked
Control 20 51.3000 8.5045 1.9017 3.9802
Experimental 17 48.4118 7.3998 1.7947 3.8046
Meditation During the Program (Min/Week)
Control 20 38.5000 44.4481 9.9389 20.8023
Experimental 17 36.5882 17.4573 4.2340 8.9757
Meditation After the Program (Min/Week)
Control 20 NA NA NA NA
Experimental 17 17.2794 20.3112 4.9262 10.4431

Perceived Stress Scale

Descriptive Statistics

First, we’ll calculate some basic descriptive statistics (ns, Ms, SDs, SEs, and 95% CIs) for scores across both condition and time.

# Calculate summary statistics
PSSDesc1 = summarySE(data = Long1a, measurevar = "PSS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(PSSDesc1, digits = 4,
      caption = "Table 3. Scores on the Perceived Stress Scale by condition and time for participants who completed all three surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 3. Scores on the Perceived Stress Scale by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Control T1 20 41.5000 8.3572 1.8687 3.9113
Control T2 20 40.1000 10.8623 2.4289 5.0837
Control T3 20 37.2000 7.4594 1.6680 3.4911
Experimental T1 17 42.3529 6.9547 1.6868 3.5758
Experimental T2 17 36.1765 6.3859 1.5488 3.2833
Experimental T3 17 35.5294 7.2553 1.7597 3.7303

Plotting Scores

Now we’ll create a plot so that we can visualize the data.

Note: Figures in this document depict score distributions that are estimated based on the means and variances of scores that we measured in our sample. For all figures, time of testing (i.e. T1, T2, and/or T3) is displayed on the horizontal axis, scale scores are displayed on the vertical axis, and dots and whiskers represent the sample means and standard errors, respectively. The control group is depicted in orange and the experimental group is depicted in blue.

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

PSSMin1 = data.frame("PSSMin" = PSSDesc1$PSS - PSSDesc1$se)

# Calculate SE max:

PSSMax1 = data.frame("PSSMax" = PSSDesc1$PSS + PSSDesc1$se)

# Create data frame of values to be used:

PSSPlot1 = data.frame("Condition" = PSSDesc1$Condition, "Time" = PSSDesc1$Time,
                    "PSSMean" = PSSDesc1$PSS, "PSSMin" = PSSMin1, "PSSMax" = PSSMax1)
  1. Plot the data.
# Create a figure caption:

PSSCap1 = "Figure 1. Distributions of scores on the Perceived Stress Scale (PSS) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
PSSCap1 = paste0(strwrap(PSSCap1, width = 55), collapse = "\n")

# Create the plot:

PSSFig1 = (Long1a %>%
  ggplot(aes(Time, PSS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:
  
  geom_pointrange(data = PSSPlot1,
    aes(Time, PSSMean, ymin = PSSMin, ymax = PSSMax),
    color = "black", 
    shape = 20,
    position = position_dodge(width = 0.25)) +
  
  # Add labels:
  
  labs(x = "Time of Testing", y = "PSS Score",
       fill = "Condition", caption = PSSCap1) + 
  
  # Define variable colours and theme:
  
  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
PSSFig1

Mixed ANOVA

To assess if any score differences are statistically significant, we’ll conduct a 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor. Because we have unequal sample sizes between groups, we’ll use Type III sum of squares.

Assumptions

The mixed ANOVA makes four primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality

This assumption can be tested by visualizing and applying a Shapiro-Wilk test to the residuals (which can be extracted from the ANOVA output).

# Run the ANOVA:

PSS_ANOVA1 = ezANOVA(data = Long1a, dv = .(PSS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PSS_Res1 = data.frame("Residuals" = (proj(PSS_ANOVA1$aov)[[3]][, "Residuals"]))

Visualize the residuals with a q-q plot:

qqnorm(PSS_Res1$Residuals, main = "Q-Q Plot of PSS Residuals")
qqline(PSS_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

Visualize the residuals with a histogram:

qplot(PSS_Res1$Residuals, main = "Histogram of PSS Residuals", binwidth = .5)

The residuals appear to follow the shape of a normal distribution.

Conduct a Shapiro-Wilk test:

PSS_Shap1 = shapiro.test(PSS_Res1$Residuals)
PSS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res1$Residuals
## W = 0.98481, p-value = 0.2417

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.24.

  1. Homogeneity of Variance for Between-Group Factors

This assumption can be tested by implementing a Levene’s test on scores collapsed across the within-group factor (i.e. Time).

# Create a data frame of scores collapsed across time:

PSSAvg1 = data.frame("Condition" = Data1a$Condition, "PSS_Avg" = ((Data1a$T1_PSS + Data1a$T2_PSS + Data1a$T3_PSS)/3))

# Conduct the Levene's test:

PSS_Lev1 = leveneTest(data = PSSAvg1, PSS_Avg ~ Condition, center = median)
PSS_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  3.5076 0.06946 .
##       35                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 35) = 3.51, p = 0.07.

  1. Sphericity

This assumption can be tested using Mauchley’s sphericity test (provided as part of the ANOVA output).

# Extract the sphericity test from the ANOVA output:

PSS_Mau1 = PSS_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(PSS_Mau1, digits = 4,
      caption = "Table 4. Test of sphericity on Perceived Stress Scale scores for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"), row.names = FALSE,
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 4. Test of sphericity on Perceived Stress Scale scores for participants who completed all three surveys.
Effect W p sig
Time 0.9912 0.8606
Condition:Time 0.9912 0.8606

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.99, p = 0.86) and the condition x time interaction (W = 0.99, p = 0.86).

Interpretation of Main Effects

kable(PSS_ANOVA1$ANOVA, digits = 4,
      caption = "Table 5. Mixed ANOVA on Perceived Stress Scale scores for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 5. Mixed ANOVA on Perceived Stress Scale scores for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 35 166089.1782 5693.380 1021.0316 0.0000
0.9601
Condition 1 35 68.8538 5693.380 0.4233 0.5196 0.0099
Time 2 70 593.3687 1201.208 17.2892 0.0000
0.0792
Condition:Time 2 70 104.9363 1201.208 3.0576 0.0533 0.0150
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 70) = 3.06, p = 0.05, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 35) = 0.42, p = 0.52, \(\eta^2_{G}\) = 0.01.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 70) = 17.29, p < .001, \(\eta^2_{G}\) = 0.08.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment (as suggested by Maxwell & Delaney, 2003).

Main Effect of Time
PSST_Tuk1 = TukeyHSD(aov(Long1a$PSS ~ Long1a$Time))

# Extract the results table from the output:

PSST_Tuk1 = round(data.frame(PSST_Tuk1$`Long1a$Time`), 4)

# Format the results table so that significant p-values will be bolded:

PSST_TukB1 = PSST_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

PSST_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

PSST_TukB1 = cbind(PSST_TukL1, PSST_TukB1)

# Create a table to display the results:

kable(PSST_TukB1, digits = 4,
      caption = "Table 6. Post-hoc tests of Perceived Stress Scale scores across time for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 6. Post-hoc tests of Perceived Stress Scale scores across time for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 -3.5946 -8.0644 0.8752 0.1404
T3-T1 -5.4595 -9.9293 -0.9896 0.0124
T3-T2 -1.8649 -6.3347 2.6050 0.5838

These results indicate that T3 scores (MT3 = 36.43, SDT3 = 7.31) on the PSS were significantly lower than T1 scores (MT1 = 41.89, SDT1 = 7.65; p = 0.01). A significant score difference was not observed between T1 and T2 (MT2 = 38.3, SDT2 = 9.18; p = 0.14) or T2 and T3 (p = 0.58).

Positive and Negative Affect Schedule

Descriptive Statistics

# PANAS-Positive:

POS_PANAS1 = summarySE(data = Long1a, measurevar = "POS_PANAS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# PANAS-Negative:

NEG_PANAS1 = summarySE(data = Long1a, measurevar = "NEG_PANAS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(POS_PANAS1)[colnames(POS_PANAS1) == "POS_PANAS"] = "M"
colnames(NEG_PANAS1)[colnames(NEG_PANAS1) == "NEG_PANAS"] = "M"

# Combine these variables into a single data frame:

PANASDesc1 = data.frame(rbind(POS_PANAS1, NEG_PANAS1))

# Create a table to display the results:

kable(PANASDesc1, digits = 4, caption = "Table 7. Scores on the Positive and Negative Affect Schedule by condition and time for participants who completed all three surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Positive Affect", 1, 6) %>%
  group_rows("Negative Affect", 7, 12)
Table 7. Scores on the Positive and Negative Affect Schedule by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Positive Affect
Control T1 20 32.0500 6.1599 1.3774 2.8829
Control T2 20 31.5000 6.6531 1.4877 3.1137
Control T3 20 33.2000 5.9347 1.3270 2.7775
Experimental T1 17 31.7647 7.1461 1.7332 3.6742
Experimental T2 17 33.6471 7.5078 1.8209 3.8602
Experimental T3 17 34.0588 6.0153 1.4589 3.0928
Negative Affect
Control T1 20 25.3500 10.0067 2.2376 4.6833
Control T2 20 24.3500 9.6914 2.1671 4.5357
Control T3 20 21.9000 6.9502 1.5541 3.2528
Experimental T1 17 22.4118 7.8107 1.8944 4.0159
Experimental T2 17 18.7059 5.1692 1.2537 2.6578
Experimental T3 17 18.5882 7.1069 1.7237 3.6540

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the positive affect plot.
# Calculate SE min:

PANASPMin1 = data.frame("PANASPMin" = POS_PANAS1$M - POS_PANAS1$se)

# Calculate SE max:

PANASPMax1 = data.frame("PANASPMax" = POS_PANAS1$M + POS_PANAS1$se)

# Create data frame of values to be used:

PANASPPlot1 = data.frame("Condition" = POS_PANAS1$Condition, "Time" = POS_PANAS1$Time,
                    "PANASPMean" = POS_PANAS1$M, "PANASPMin" = PANASPMin1, "PANASPMax" = PANASPMax1)
  1. Create the positive affect plot.
# Create the plot:

PANASPFig1 = (Long1a %>%
  ggplot(aes(Time, POS_PANAS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASPPlot1,
    aes(Time, PANASPMean, ymin = PANASPMin, ymax = PANASPMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Positive Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the negative affect plot.
# Calculate SE min:

PANASNMin1 = data.frame("PANASNMin" = NEG_PANAS1$M - NEG_PANAS1$se)

# Calculate SE max:

PANASNMax1 = data.frame("PANASNMax" = NEG_PANAS1$M + NEG_PANAS1$se)

# Create data frame of values to be used:

PANASNPlot1 = data.frame("Condition" = NEG_PANAS1$Condition, "Time" = NEG_PANAS1$Time,
                    "PANASNMean" = NEG_PANAS1$M, "PANASNMin" = PANASNMin1, "PANASNMax" = PANASNMax1)
  1. Create the negative affect plot.
# Create the plot:

PANASNFig1 = (Long1a %>%
  ggplot(aes(Time, NEG_PANAS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASNPlot1,
    aes(Time, PANASNMean, ymin = PANASNMin, ymax = PANASNMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Negative Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  1. Create a caption and shared legend.
# Create a figure caption:

PANASCap1 = "Figure 2. Distributions of scores on the positive (a) and negative (b) affect subscales of the Positive And Negative Affect Schedule (PANAS) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
PANASCap1 = paste0(strwrap(PANASCap1, width = 100), collapse = "\n")

# Create a shared legend:

SharedLeg = g_legend(PANASPFig1 + theme(legend.position = "right"))
  1. Display the figure
PANASFig1 = grid.arrange(PANASPFig1 + theme(legend.position = "hidden"), PANASNFig1 + theme(legend.position = "hidden"), SharedLeg, nrow = 1, widths = c(1.1, 1.1, .5), bottom = textGrob(PANASCap1, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Positive Affect

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

PANASP_ANOVA1 = ezANOVA(data = Long1a, dv = .(POS_PANAS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PANASP_Res1 = data.frame("Residuals" = (proj(PANASP_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(PANASP_Res1$Residuals, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PANASP_Res1$Residuals, main = "Histogram of PANAS-P Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

PANASP_Shap1 = shapiro.test(PANASP_Res1$Residuals)
PANASP_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res1$Residuals
## W = 0.98072, p-value = 0.1089

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.11.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

PANASPAvg1 = data.frame("Condition" = Data1a$Condition, "PANASP_Avg" = ((Data1a$T1_POS_PANAS + Data1a$T2_POS_PANAS + Data1a$T3_POS_PANAS)/3))

# Conduct the Levene's test:

PANASP_Lev1 = leveneTest(data = PANASPAvg1, PANASP_Avg ~ Condition, center = median)
PANASP_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.3265 0.5714
##       35

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 35) = 0.33, p = 0.57.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

PANASP_Mau1 = PANASP_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(PANASP_Mau1, digits = 4,
      caption = "Table 8. Test of sphericity on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"), row.names = FALSE,
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 8. Test of sphericity on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.
Effect W p sig
Time 0.9836 0.7545
Condition:Time 0.9836 0.7545

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.98, p = 0.75) and the condition x time interaction (W = 0.98, p = 0.75).

Interpretation of Main Effects

kable(PANASP_ANOVA1$ANOVA, digits = 4,
      caption = "Table 9. Mixed ANOVA on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 9. Mixed ANOVA on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 35 117935.6445 3835.9951 1076.0565 0.0000
0.9630
Condition 1 35 22.6716 3835.9951 0.2069 0.6521 0.0050
Time 2 70 55.4312 693.0373 2.7994 0.0677 0.0121
Condition:Time 2 70 27.2150 693.0373 1.3744 0.2597 0.0060
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 70) = 1.37, p = 0.26, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 35) = 0.21, p = 0.65, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (2, 70) = 2.8, p = 0.07, \(\eta^2_{G}\) = 0.01.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Mixed ANOVA - Negative Affect

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

PANASN_ANOVA1 = ezANOVA(data = Long1a, dv = .(NEG_PANAS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PANASN_Res1 = data.frame("Residuals" = (proj(PANASN_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(PANASN_Res1$Residuals, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PANASN_Res1$Residuals, main = "Histogram of PANAS-N Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

PANASN_Shap1 = shapiro.test(PANASN_Res1$Residuals)
PANASN_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res1$Residuals
## W = 0.9892, p-value = 0.5246

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.52.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

PANASNAvg1 = data.frame("Condition" = Data1a$Condition, "PANASN_Avg" = ((Data1a$T1_NEG_PANAS + Data1a$T2_NEG_PANAS + Data1a$T3_NEG_PANAS)/3))

# Conduct the Levene's test:

PANASN_Lev1 = leveneTest(data = PANASNAvg1, PANASN_Avg ~ Condition, center = median)
PANASN_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  4.3153 0.04517 *
##       35                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is not met; F(1, 35) = 4.32, p = 0.05. Because sample sizes are unequal, a White-corrected F-test should be conducted if one is interested in assessing the main effect of condition. Note, however, that the ezANOVA function is only capable of performing White corrections on ANOVAs that are solely between-group-based. Therefore, we will conduct a separate between-group ANOVA to assess this effect.

PANASN_BANOVA1 = ezANOVA(data = Long1a, dv = .(NEG_PANAS), wid = .(Subject), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE, white.adjust = TRUE)

Also note that, when using a White correction, ezANOVA will not produce an effect size (or sum of squares values). Instead, an effect size can be calculated via the “EtaSq” function. To be consistent with our other tests, we will report the \(\eta^2_{G}\) which, for between-group designs, is equal to \(\eta^2_{p}\) (Bakeman, 2005).

PANASN_BEs1 = (EtaSq(PANASN_BANOVA1$aov, type = 3, anova = FALSE))[2]
  1. Sphericity
# Extract the sphericity test from the ANOVA output:

PANASN_Mau1 = PANASN_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(PANASN_Mau1, digits = 4,
      caption = "Table 10. Test of sphericity on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 10. Test of sphericity on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.
Effect W p sig
3 Time 0.6744 0.0012
4 Condition:Time 0.6744 0.0012

Based on an alpha level of .05, the assumption of sphericity is not met for either the main effect of time (W = 0.67, p = 0.001) or the condition x time interaction (W = 0.67, p = 0.001). We will now look at the potential epsilon corrections that we can use.

# Extract the corrections table from the ANOVA output:
PANASN_Eps1 = PANASN_ANOVA1$`Sphericity Corrections`

# Create a table to display the results:

kable(PANASN_Eps1, digits = 4,
      caption = "Table 11. Epsilon corrections for the test of scores on the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.",
      col.names = c("Effect", "GG Epsilon", "GG p", "GG sig", "HF Epsilon", "HF p", "HF sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 11. Epsilon corrections for the test of scores on the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.
Effect GG Epsilon GG p GG sig HF Epsilon HF p HF sig
3 Time 0.7544 0.0007
0.781 0.0006
4 Condition:Time 0.7544 0.2211 0.781 0.2208

Because \(\varepsilon_{GG}\) > .75, we will apply the Huynh-Feldt correction (\(\varepsilon\) = 0.78) to these tests (as suggested by Girden, 1992).

Interpretation of Main Effects

# Create a data frame for the epsilon corrected tests:

PANASNCorrC1 = (data.frame("Effect" = PANASN_BANOVA1$ANOVA$Effect[2], "DFn" = PANASN_BANOVA1$ANOVA$DFn[2], "DFd" = PANASN_BANOVA1$ANOVA$DFd[2], "F" = PANASN_BANOVA1$ANOVA$F[2], "p" = PANASN_BANOVA1$ANOVA$p[2], "sig" = PANASN_BANOVA1$ANOVA$`p<.05`[2], "ges" = PANASN_BEs1))

PANASNCorrTI1 = (data.frame("Effect" = PANASN_Eps1$Effect[1:2], "DFn" = PANASN_ANOVA1$ANOVA$DFn[3:4] * PANASN_Eps1$HFe, "DFd" = PANASN_ANOVA1$ANOVA$DFd[3:4] * PANASN_Eps1$HFe, "F" = PANASN_ANOVA1$ANOVA$F[3:4], "p" = PANASN_Eps1$`p[HF]`, "sig" = PANASN_Eps1$`p[HF]<.05`, "ges" = PANASN_ANOVA1$ANOVA$ges[3:4]))

# Combine into a single data frame:

PANASNCorr1 = rbind(PANASNCorrC1, PANASNCorrTI1)

# Create a table to display the results:

kable(PANASNCorr1, digits = 4,
      caption = "Table 12. Mixed ANOVA on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 12. Mixed ANOVA on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed all three surveys.
Effect DFn DFd F p sig ges
Condition 1.000 35.0000 2.5582 0.1187 0.0681
Time 1.562 54.6701 9.8875 0.0006
0.0354
Condition:Time 1.562 54.6701 1.5624 0.2208 0.0058
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1.56, 54.67) = 1.56, p = 0.22, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 35) = 2.56, p = 0.12, \(\eta^2_{G}\) = 0.07.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (1.56, 54.67) = 9.89, p = 0.001, \(\eta^2_{G}\) = 0.04.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because our data displayed a violation of the sphericity assumption, we will use the Holm adjustment.

Main Effect of Time
PANASNT_H1 = pairwise.t.test(Long1a$NEG_PANAS, Long1a$Time, p.adjust.method = "holm", paired = T)

# Round the results to 4 decimal places:

PANASNT_H1 = data.frame(round(PANASNT_H1$p.value, 4))

# Format the results table so that significant p-values will be bolded:

PANASNT_HB1 = PANASNT_H1 %>%
  mutate(
    T1 = text_spec(T1, bold = (ifelse(T1 < .05, "TRUE", "FALSE"))),
    T2 = text_spec(T2, bold = (ifelse(T2 < .05, "TRUE", "FALSE")))
  )

# Add row labels:

PANASNT_HL1 = data.frame("Comparison" = c("T2", "T3"))

PANASNT_HB1 = cbind(PANASNT_HL1, PANASNT_HB1)

# Create a table to display the results:

kable(PANASNT_HB1, digits = 4,
      caption = "Table 13. Post-hoc tests of scores on the negative affect subscale of the Positive And Negative Affect Schedule across time for participants who completed all three surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 13. Post-hoc tests of scores on the negative affect subscale of the Positive And Negative Affect Schedule across time for participants who completed all three surveys.
Comparison T1 T2
T2 0.0044 NA
T3 0.0032 0.0798

These results indicate that both T2 (MT2 = 21.76, SDT2 = 8.34) and T3 (MT3 = 20.38, SDT3 = 7.12) scores on the PANAS-Negative were significantly lower than T1 scores (MT1 = 24, SDT1 = 9.06; p = 0.004 and p = 0.003, respectively). A significant score difference was not observed between T2 and T3 (p = 0.08).

Brief Resilience Scale

Descriptive Statistics

# Calculate summary statistics
BRSDesc1 = summarySE(data = Long1a, measurevar = "BRS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(BRSDesc1, digits = 4,
      caption = "Table 14. Scores on the Brief Resilience Scale by condition and time for participants who completed all three surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 14. Scores on the Brief Resilience Scale by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Control T1 20 3.3833 0.7706 0.1723 0.3607
Control T2 20 3.4750 0.8116 0.1815 0.3798
Control T3 20 3.6083 0.5955 0.1332 0.2787
Experimental T1 17 3.4804 0.5948 0.1443 0.3058
Experimental T2 17 3.7353 0.7170 0.1739 0.3686
Experimental T3 17 3.8137 0.7214 0.1750 0.3709

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

BRSMin1 = data.frame("BRSMin" = BRSDesc1$BRS - BRSDesc1$se)

# Calculate SE max:

BRSMax1 = data.frame("BRSMax" = BRSDesc1$BRS + BRSDesc1$se)

# Create data frame of values to be used:

BRSPlot1 = data.frame("Condition" = BRSDesc1$Condition, "Time" = BRSDesc1$Time,
                    "BRSMean" = BRSDesc1$BRS, "BRSMin" = BRSMin1, "BRSMax" = BRSMax1)
  1. Plot the data.
# Create a figure caption:

BRSCap1 = "Figure 3. Distributions of scores on the Brief Resilience Scale (BRS) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
BRSCap1 = paste0(strwrap(BRSCap1, width = 60), collapse = "\n")

# Create the plot:

BRSFig1 = (Long1a %>%
  ggplot(aes(Time, BRS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = BRSPlot1,
    aes(Time, BRSMean, ymin = BRSMin, ymax = BRSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "BRS Score",
       fill = "Condition", caption = BRSCap1) +

  # Define variable colours and theme:
  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
BRSFig1

Mixed ANOVA

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

BRS_ANOVA1 = ezANOVA(data = Long1a, dv = .(BRS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

BRS_Res1 = data.frame("Residuals" = (proj(BRS_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(BRS_Res1$Residuals, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(BRS_Res1$Residuals, main = "Histogram of BRS Residuals", binwidth = .1)

The residuals appear to follow the shape of a normal distribution.

BRS_Shap1 = shapiro.test(BRS_Res1$Residuals)
BRS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res1$Residuals
## W = 0.98575, p-value = 0.2884

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.29.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

BRSAvg1 = data.frame("Condition" = Data1a$Condition, "BRS_Avg" = ((Data1a$T1_BRS + Data1a$T2_BRS + Data1a$T3_BRS)/3))

# Conduct the Levene's test:

BRS_Lev1 = leveneTest(data = BRSAvg1, BRS_Avg ~ Condition, center = median)
BRS_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0622 0.8045
##       35

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 35) = 0.06, p = 0.8.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

BRS_Mau1 = BRS_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(BRS_Mau1, digits = 4,
      caption = "Table 15. Test of sphericity on Brief Resilience Scale scores for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 15. Test of sphericity on Brief Resilience Scale scores for participants who completed all three surveys.
Effect W p sig
3 Time 0.9662 0.5578
4 Condition:Time 0.9662 0.5578

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.97, p = 0.56) and the condition x time interaction (W = 0.97, p = 0.56).

Interpretation of Main Effects

kable(BRS_ANOVA1$ANOVA, digits = 4,
      caption = "Table 16. Mixed ANOVA on Brief Resilience Scale scores for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 16. Mixed ANOVA on Brief Resilience Scale scores for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 35 1415.3844 44.0895 1123.5874 0.0000
0.9641
Condition 1 35 0.9700 44.0895 0.7700 0.3862 0.0181
Time 2 70 1.4601 8.6590 5.9019 0.0043
0.0269
Condition:Time 2 70 0.1268 8.6590 0.5125 0.6012 0.0024
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 70) = 0.51, p = 0.6, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 35) = 0.77, p = 0.39, \(\eta^2_{G}\) = 0.02.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 70) = 5.9, p = 0.004, \(\eta^2_{G}\) = 0.03.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
BRST_Tuk1 = TukeyHSD(aov(Long1a$BRS ~ Long1a$Time))

# Extract the results table from the output:

BRST_Tuk1 = round(data.frame(BRST_Tuk1$`Long1a$Time`), 4)

# Format the results table so that significant p-values will be bolded:

BRST_TukB1 = BRST_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

BRST_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

BRST_TukB1 = cbind(BRST_TukL1, BRST_TukB1)

# Create a table to display the results:

kable(BRST_TukB1, digits = 4,
      caption = "Table 17. Post-hoc tests of Brief Resilience Scale scores across time for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 17. Post-hoc tests of Brief Resilience Scale scores across time for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 0.1667 -0.2235 0.5568 0.5689
T3-T1 0.2748 -0.1154 0.6649 0.2199
T3-T2 0.1081 -0.2820 0.4982 0.7879

These results indicate that there were no significant differences in BRS scores across any of the time points (pT1-T2 = 0.57, pT1-T3 = 0.22, and pT2-T3 = 0.79).

Five Facet Mindfulness Questionnaire

Descriptive Statistics

# FFMQ-Non-Reactivity:

NR_FFMQ1 = summarySE(data = Long1b, measurevar = "NR_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Observing:

OB_FFMQ1 = summarySE(data = Long1b, measurevar = "OB_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Acting with Awareness:

AA_FFMQ1 = summarySE(data = Long1b, measurevar = "AA_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Describing:

DS_FFMQ1 = summarySE(data = Long1b, measurevar = "DS_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Non-Judging:

NJ_FFMQ1 = summarySE(data = Long1b, measurevar = "NJ_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(NR_FFMQ1)[colnames(NR_FFMQ1) == "NR_FFMQ"] = "M"
colnames(OB_FFMQ1)[colnames(OB_FFMQ1) == "OB_FFMQ"] = "M"
colnames(AA_FFMQ1)[colnames(AA_FFMQ1) == "AA_FFMQ"] = "M"
colnames(DS_FFMQ1)[colnames(DS_FFMQ1) == "DS_FFMQ"] = "M"
colnames(NJ_FFMQ1)[colnames(NJ_FFMQ1) == "NJ_FFMQ"] = "M"

# Combine these variables into a single data frame:

FFMQDesc1 = data.frame(rbind(NR_FFMQ1, OB_FFMQ1, AA_FFMQ1, DS_FFMQ1, NJ_FFMQ1))

# Create a table to display the results:

kable(FFMQDesc1, digits = 4, caption = "Table 18. Scores on the Five Facet Mindfulness Questionnaire by condition and time for participants who completed all three surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Non-Reactivity", 1, 6) %>%
  group_rows("Observing", 7, 12) %>%
  group_rows("Acting with Awareness", 13, 18) %>%
  group_rows("Describing", 19, 24) %>%
  group_rows("Non-Judging", 25, 30)
Table 18. Scores on the Five Facet Mindfulness Questionnaire by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Non-Reactivity
Control T1 19 13.3158 4.4228 1.0147 2.1317
Control T2 19 13.9474 3.6435 0.8359 1.7561
Control T3 19 15.2105 2.6369 0.6049 1.2709
Experimental T1 17 14.7647 3.4009 0.8248 1.7486
Experimental T2 17 16.4706 2.9816 0.7231 1.5330
Experimental T3 17 16.7647 2.8620 0.6941 1.4715
Observing
Control T1 19 12.9474 3.7338 0.8566 1.7997
Control T2 19 12.6316 3.3368 0.7655 1.6083
Control T3 19 13.3684 3.1484 0.7223 1.5175
Experimental T1 17 11.8824 3.1201 0.7567 1.6042
Experimental T2 17 13.5882 2.6234 0.6363 1.3488
Experimental T3 17 14.1176 2.9130 0.7065 1.4977
Acting with Awareness
Control T1 19 14.7368 4.2667 0.9788 2.0565
Control T2 19 15.4211 5.0146 1.1504 2.4170
Control T3 19 16.0000 3.5434 0.8129 1.7079
Experimental T1 17 13.7647 2.4117 0.5849 1.2400
Experimental T2 17 15.6471 3.0402 0.7374 1.5631
Experimental T3 17 16.5294 3.4481 0.8363 1.7729
Describing
Control T1 19 17.2105 4.4793 1.0276 2.1590
Control T2 19 17.3158 4.8882 1.1214 2.3560
Control T3 19 17.2632 4.2797 0.9818 2.0627
Experimental T1 17 18.4706 2.2394 0.5431 1.1514
Experimental T2 17 18.1765 3.2832 0.7963 1.6881
Experimental T3 17 18.6471 3.1012 0.7522 1.5945
Non-Judging
Control T1 19 15.6842 5.3960 1.2379 2.6008
Control T2 19 15.7895 5.5536 1.2741 2.6767
Control T3 19 17.7368 4.3823 1.0054 2.1122
Experimental T1 17 15.4118 3.4289 0.8316 1.7630
Experimental T2 17 17.4118 2.9593 0.7177 1.5215
Experimental T3 17 17.6471 3.5521 0.8615 1.8263

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-reactivity plot.
# Calculate SE min:

FFMQNRMin1 = data.frame("FFMQNRMin" = NR_FFMQ1$M - NR_FFMQ1$se)

# Calculate SE max:

FFMQNRMax1 = data.frame("FFMQNRMax" = NR_FFMQ1$M + NR_FFMQ1$se)

# Create data frame of values to be used:

FFMQNRPlot1 = data.frame("Condition" = NR_FFMQ1$Condition, "Time" = NR_FFMQ1$Time,
                    "FFMQNRMean" = NR_FFMQ1$M, "FFMQNRMin" = FFMQNRMin1, "FFMQNRMax" = FFMQNRMax1)
  1. Create the non-reactivity plot.
# Create the plot:

FFMQNRFig1 = (Long1b %>%
  ggplot(aes(Time, NR_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNRPlot1,
    aes(Time, FFMQNRMean, ymin = FFMQNRMin, ymax = FFMQNRMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Reactivity Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the observing plot.
# Calculate SE min:

FFMQOBMin1 = data.frame("FFMQOBMin" = OB_FFMQ1$M - OB_FFMQ1$se)

# Calculate SE max:

FFMQOBMax1 = data.frame("FFMQOBMax" = OB_FFMQ1$M + OB_FFMQ1$se)

# Create data frame of values to be used:

FFMQOBPlot1 = data.frame("Condition" = OB_FFMQ1$Condition, "Time" = OB_FFMQ1$Time,
                    "FFMQOBMean" = OB_FFMQ1$M, "FFMQOBMin" = FFMQOBMin1, "FFMQOBMax" = FFMQOBMax1)
  1. Create the observing plot.
# Create the plot:

FFMQOBFig1 = (Long1b %>%
  ggplot(aes(Time, OB_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQOBPlot1,
    aes(Time, FFMQOBMean, ymin = FFMQOBMin, ymax = FFMQOBMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Observing Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the awareness plot.
# Calculate SE min:

FFMQAAMin1 = data.frame("FFMQAAMin" = AA_FFMQ1$M - AA_FFMQ1$se)

# Calculate SE max:

FFMQAAMax1 = data.frame("FFMQAAMax" = AA_FFMQ1$M + AA_FFMQ1$se)

# Create data frame of values to be used:

FFMQAAPlot1 = data.frame("Condition" = AA_FFMQ1$Condition, "Time" = AA_FFMQ1$Time,
                    "FFMQAAMean" = AA_FFMQ1$M, "FFMQAAMin" = FFMQAAMin1, "FMQAAMax" = FFMQAAMax1)
  1. Create the awareness plot.
# Create the plot:

FFMQAAFig1 = (Long1b %>%
  ggplot(aes(Time, AA_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQAAPlot1,
    aes(Time, FFMQAAMean, ymin = FFMQAAMin, ymax = FFMQAAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Awareness Score",
       fill = "Condition") + ggtitle("c") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the describing plot.
# Calculate SE min:

FFMQDSMin1 = data.frame("FFMQDSMin" = DS_FFMQ1$M - DS_FFMQ1$se)

# Calculate SE max:

FFMQDSMax1 = data.frame("FFMQDSMax" = DS_FFMQ1$M + DS_FFMQ1$se)

# Create data frame of values to be used:

FFMQDSPlot1 = data.frame("Condition" = DS_FFMQ1$Condition, "Time" = DS_FFMQ1$Time,
                    "FFMQDSMean" = DS_FFMQ1$M, "FFMQDSMin" = FFMQDSMin1, "FFMQDSMax" = FFMQDSMax1)
  1. Create the describing plot.
# Create the plot:

FFMQDSFig1 = (Long1b %>%
  ggplot(aes(Time, DS_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQDSPlot1,
    aes(Time, FFMQDSMean, ymin = FFMQDSMin, ymax = FFMQDSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Describing Score",
       fill = "Condition") + ggtitle("d") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-judging plot.
# Calculate SE min:

FFMQNJMin1 = data.frame("FFMQNJMin" = NJ_FFMQ1$M - NJ_FFMQ1$se)

# Calculate SE max:

FFMQNJMax1 = data.frame("FFMQNJMax" = NJ_FFMQ1$M + NJ_FFMQ1$se)

# Create data frame of values to be used:

FFMQNJPlot1 = data.frame("Condition" = NJ_FFMQ1$Condition, "Time" = NJ_FFMQ1$Time,
                    "FFMQNJMean" = NJ_FFMQ1$M, "FFMQNJMin" = FFMQNJMin1, "FFMQNJMax" = FFMQNJMax1)
  1. Create the non-judging plot.
# Create the plot:

FFMQNJFig1 = (Long1b %>%
  ggplot(aes(Time, NJ_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNJPlot1,
    aes(Time, FFMQNJMean, ymin = FFMQNJMin, ymax = FFMQNJMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Judging Score",
       fill = "Condition") + ggtitle("e") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
FFMQCap1 = "Figure 4. Distributions of scores on the non-reactivity (a), observing (b), awareness (c), describing (d), and non-judging (e) subscales of the Five Facet Mindfulness Questionnaire (FFMQ) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
FFMQCap1 = paste0(strwrap(FFMQCap1, width = 100), collapse = "\n")
  1. Define the figure layout
FFMQLayout1 = rbind(c("FFMQAAFig1", "FFMQDSFig1"),
                        c("FFMQNJFig1", "FFMQNRFig1"),
                        c("FFMQOBFig1", "SharedLeg"))
  1. Display the figure.
FFMQFig1 = grid.arrange(FFMQNRFig1, FFMQOBFig1, FFMQAAFig1, FFMQDSFig1, FFMQNJFig1, SharedLeg, layout_matrix = FFMQLayout1, bottom = textGrob(FFMQCap1, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Non-Reactivity

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQNR_ANOVA1 = ezANOVA(data = Long1b, dv = .(NR_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQNR_Res1 = data.frame("Residuals" = (proj(FFMQNR_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQNR_Res1$Residuals, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNR_Res1$Residuals, main = "Histogram of FFMQ-NR Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQNR_Shap1 = shapiro.test(FFMQNR_Res1$Residuals)
FFMQNR_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res1$Residuals
## W = 0.985, p-value = 0.2675

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.27.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQNRAvg1 = data.frame("Condition" = Data1b$Condition, "FFMQNR_Avg" = ((Data1b$T1_NR_FFMQ + Data1b$T2_NR_FFMQ + Data1b$T3_NR_FFMQ)/3))

# Conduct the Levene's test:

FFMQNR_Lev1 = leveneTest(data = FFMQNRAvg1, FFMQNR_Avg ~ Condition, center = median)
FFMQNR_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.4572 0.1262
##       34

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 2.46, p = 0.13.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQNR_Mau1 = FFMQNR_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQNR_Mau1, digits = 4,
      caption = "Table 19. Test of sphericity on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 19. Test of sphericity on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect W p sig
3 Time 0.8451 0.0622
4 Condition:Time 0.8451 0.0622

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.85, p = 0.06) and the condition x time interaction (W = 0.85, p = 0.06).

Interpretation of Main Effects

kable(FFMQNR_ANOVA1$ANOVA, digits = 4,
      caption = "Table 20. Mixed ANOVA on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 20. Mixed ANOVA on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 34 24480.6711 850.2456 978.9440 0.0000
0.9542
Condition 1 34 91.3377 850.2456 3.6525 0.0644 0.0722
Time 2 68 68.9599 324.3179 7.2294 0.0014
0.0555
Condition:Time 2 68 6.2933 324.3179 0.6598 0.5203 0.0053
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 0.66, p = 0.52, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 3.65, p = 0.06, \(\eta^2_{G}\) = 0.07.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 68) = 7.23, p = 0.001, \(\eta^2_{G}\) = 0.06.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
FFMQNRT_Tuk1 = TukeyHSD(aov(Long1b$NR_FFMQ ~ Long1b$Time))

# Extract the results table from the output:

FFMQNRT_Tuk1 = round(data.frame(FFMQNRT_Tuk1$`Long1b$Time`), 4)

# Format the results table so that significant p-values will be bolded:

FFMQNRT_TukB1 = FFMQNRT_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

FFMQNRT_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

FFMQNRT_TukB1 = cbind(FFMQNRT_TukL1, FFMQNRT_TukB1)

# Create a table to display the results:

kable(FFMQNRT_TukB1, digits = 4,
      caption = "Table 21. Post-hoc tests of scores on the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 21. Post-hoc tests of scores on the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 1.1389 -0.8116 3.0894 0.3508
T3-T1 1.9444 -0.0061 3.8950 0.0509
T3-T2 0.8056 -1.1450 2.7561 0.5899

These results indicate that there were no significant differences in FFMQ-Non-Reactivity scores across any of the time points (pT1-T2 = 0.35, pT1-T3 = 0.05, and pT2-T3 = 0.59).

Mixed ANOVA - Observing

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQOB_ANOVA1 = ezANOVA(data = Long1b, dv = .(OB_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQOB_Res1 = data.frame("Residuals" = (proj(FFMQOB_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQOB_Res1$Residuals, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_Res1$Residuals, main = "Histogram of FFMQ-OB Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution, though they do seem to be slightly leptokurtic.

FFMQOB_Shap1 = shapiro.test(FFMQOB_Res1$Residuals)
FFMQOB_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res1$Residuals
## W = 0.96832, p-value = 0.01115

Based on an alpha level of .05, the assumption of normality is not met; W = 0.97, p = 0.01.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQOBAvg1 = data.frame("Condition" = Data1b$Condition, "FFMQOB_Avg" = ((Data1b$T1_OB_FFMQ + Data1b$T2_OB_FFMQ + Data1b$T3_OB_FFMQ)/3))

# Conduct the Levene's test:

FFMQOB_Lev1 = leveneTest(data = FFMQOBAvg1, FFMQOB_Avg ~ Condition, center = median)
FFMQOB_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.4602 0.5021
##       34

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 0.46, p = 0.5.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQOB_Mau1 = FFMQOB_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQOB_Mau1, digits = 4,
      caption = "Table 22. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 22. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect W p sig
3 Time 0.6356 0.0006
4 Condition:Time 0.6356 0.0006

Based on an alpha level of .05, the assumption of sphericity is not met for either the main effect of time (W = 0.64, p = 0.001) or the condition x time interaction (W = 0.64, p = 0.001). We will now look at the potential epsilon corrections that we can use.

# Extract the corrections table from the ANOVA output:
FFMQOB_Eps1 = FFMQOB_ANOVA1$`Sphericity Corrections`

# Create a table to display the results:

kable(FFMQOB_Eps1, digits = 4,
      caption = "Table 23. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "GG Epsilon", "GG p", "GG sig", "HF Epsilon", "HF p", "HF sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 23. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect GG Epsilon GG p GG sig HF Epsilon HF p HF sig
3 Time 0.7329 0.0133
0.7577 0.0124
4 Condition:Time 0.7329 0.0406
0.7577 0.0391

Because \(\varepsilon_{GG}\) < .75, we will apply the Greenhouse-Geisser correction (\(\varepsilon\) = 0.73) to these tests.

Interpretation of Main Effects

# Create a data frame for the epsilon corrected tests:

FFMQOBCorrC1 = (data.frame("Effect" = FFMQOB_ANOVA1$ANOVA$Effect[2], "DFn" = FFMQOB_ANOVA1$ANOVA$DFn[2], "DFd" = FFMQOB_ANOVA1$ANOVA$DFd[2], "SSn" = FFMQOB_ANOVA1$ANOVA$SSn[2], "SSd" = FFMQOB_ANOVA1$ANOVA$SSd[2], "F" = FFMQOB_ANOVA1$ANOVA$F[2], "p" = FFMQOB_ANOVA1$ANOVA$p[2], "sig" = FFMQOB_ANOVA1$ANOVA$`p<.05`[2], "ges" = FFMQOB_ANOVA1$ANOVA$ges[2]))

FFMQOBCorrTI1 = (data.frame("Effect" = FFMQOB_Eps1$Effect[1:2], "DFn" = FFMQOB_ANOVA1$ANOVA$DFn[3:4] * FFMQOB_Eps1$GGe, "DFd" = FFMQOB_ANOVA1$ANOVA$DFd[3:4] * FFMQOB_Eps1$GGe, "SSn" = FFMQOB_ANOVA1$ANOVA$SSn[3:4], "SSd" = FFMQOB_ANOVA1$ANOVA$SSd[3:4], "F" = FFMQOB_ANOVA1$ANOVA$F[3:4], "p" = FFMQOB_Eps1$`p[GG]`, "sig" = FFMQOB_Eps1$`p[GG]<.05`, "ges" = FFMQOB_ANOVA1$ANOVA$ges[3:4]))

# Combine into a single data frame:

FFMQOBCorr1 = rbind(FFMQOBCorrC1, FFMQOBCorrTI1)

# Create a table to display the results:

kable(FFMQOBCorr1, digits = 4,
      caption = "Table 24. Mixed ANOVA on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 24. Mixed ANOVA on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
Condition 1.0000 34.0000 1.2283 834.3550 0.0501 0.8243 0.0012
Time 1.4658 49.8388 31.6777 197.0815 5.4650 0.0133
0.0298
Condition:Time 1.4658 49.8388 22.1963 197.0815 3.8292 0.0406
0.0211
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1.47, 49.84) = 3.83, p = 0.04, \(\eta^2_{G}\) = 0.02.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct ANOVA analyses to assess the effect of time on FFMQ-Observing score for each condition separately.

Note that, in order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used when assessing the significance of main effects associated with these ANOVAs. The Holm-Bonferroni adjustment defines a corrected alpha level according to the following formula: \[\alpha_{corrected} = \frac{\alpha}{number\;of\;comparisons - rank\;of\;comparison + 1}\]

Before we begin, we’ll define control and experimental subsets:

# Control:

Con1b = subset(Long1b, Condition == "Control")

# Experimental:

Exp1b = subset(Long1b, Condition == "Experimental")
Control Assumptions

The repeated-measures ANOVA makes three primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQOB_C_ANOVA1 = ezANOVA(data = Con1b, dv = .(OB_FFMQ), wid = .(Subject), within = .(Time), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQOB_C_Res1 = data.frame("Residuals" = (proj(FFMQOB_C_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQOB_C_Res1$Residuals, main = "Q-Q Plot of FFMQ-OB Con. Residuals")
qqline(FFMQOB_C_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_C_Res1$Residuals, main = "Histogram of FFMQ-OB Con. Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_C_Shap1 = shapiro.test(FFMQOB_C_Res1$Residuals)
FFMQOB_C_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_C_Res1$Residuals
## W = 0.968, p-value = 0.1353

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.14.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQOB_C_Mau1 = FFMQOB_C_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQOB_C_Mau1, digits = 4,
      caption = "Table 25. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the control condition who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 25. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the control condition who completed all three surveys.
Effect W p sig
2 Time 0.6393 0.0223

Based on an alpha level of .05, the assumption of sphericity is not met for the main effect of time (W = 0.64, p = 0.02). We will now look at the potential epsilon corrections that we can use.

# Extract the corrections table from the ANOVA output:
FFMQOB_C_Eps1 = FFMQOB_C_ANOVA1$`Sphericity Corrections`

# Create a table to display the results:

kable(FFMQOB_C_Eps1, digits = 4,
      caption = "Table 26. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the control condition who completed all three surveys.",
      col.names = c("Effect", "GG Epsilon", "GG p", "GG sig", "HF Epsilon", "HF p", "HF sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 26. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the control condition who completed all three surveys.
Effect GG Epsilon GG p GG sig HF Epsilon HF p HF sig
2 Time 0.7349 0.4328 0.7843 0.44

Because \(\varepsilon_{GG}\) < .75, we will apply the Greenhouse-Geisser correction (\(\varepsilon\) = 0.73) to these tests.

Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQOB_E_ANOVA1 = ezANOVA(data = Exp1b, dv = .(OB_FFMQ), wid = .(Subject), within = .(Time), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQOB_E_Res1 = data.frame("Residuals" = (proj(FFMQOB_E_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQOB_E_Res1$Residuals, main = "Q-Q Plot of FFMQ-OB Exp. Residuals")
qqline(FFMQOB_E_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_E_Res1$Residuals, main = "Histogram of FFMQ-OB Exp. Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution, though they do seem to be slightly leptokurtic.

FFMQOB_E_Shap1 = shapiro.test(FFMQOB_E_Res1$Residuals)
FFMQOB_E_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_E_Res1$Residuals
## W = 0.90467, p-value = 0.0006042

Based on an alpha level of .05, the assumption of normality is not met; W = 0.9, p = 0.001.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQOB_E_Mau1 = FFMQOB_E_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQOB_E_Mau1, digits = 4,
      caption = "Table 27. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the experimental condition who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 27. Test of sphericity on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the experimental condition who completed all three surveys.
Effect W p sig
2 Time 0.4998 0.0055

Based on an alpha level of .05, the assumption of sphericity is not met for the main effect of time (W = 0.5, p = 0.01). We will now look at the potential epsilon corrections that we can use.

# Extract the corrections table from the ANOVA output:

FFMQOB_E_Eps1 = FFMQOB_E_ANOVA1$`Sphericity Corrections`

# Create a table to display the results:

kable(FFMQOB_E_Eps1, digits = 4,
      caption = "Table 28. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the experimental condition who completed all three surveys.",
      col.names = c("Effect", "GG Epsilon", "GG p", "GG sig", "HF Epsilon", "HF p", "HF sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 28. Epsilon corrections for the test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire for participants in the experimental condition who completed all three surveys.
Effect GG Epsilon GG p GG sig HF Epsilon HF p HF sig
2 Time 0.6666 0.0029
0.7045 0.0024

Because \(\varepsilon_{GG}\) < .75, we will apply the Greenhouse-Geisser correction (\(\varepsilon\) = 0.67) to these tests.

Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

FFMQOB_Corr_ps1a = data.frame("p" = c(FFMQOB_C_Eps1$`p[HF]`, FFMQOB_E_Eps1$`p[HF]`))

# Perform p-adjustment:

FFMQOB_Corr_ps1b = p.adjust(FFMQOB_Corr_ps1a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

FFMQOB_C_Corr1 = data.frame("Condition" = "Control", "DFn" = FFMQOB_C_ANOVA1$ANOVA$DFn[2] * FFMQOB_C_Eps1$HFe, "DFd" = FFMQOB_C_ANOVA1$ANOVA$DFd[2] * FFMQOB_C_Eps1$HFe, "SSn" = FFMQOB_C_ANOVA1$ANOVA$SSn[2], "SSd" = FFMQOB_C_ANOVA1$ANOVA$SSd[2], "F" = FFMQOB_C_ANOVA1$ANOVA$F[2], "p" = round(FFMQOB_Corr_ps1b[1], 4), "ges" = FFMQOB_C_ANOVA1$ANOVA$ges[2])

# Create a data frame for the experimental condition:

FFMQOB_E_Corr1 = data.frame("Condition" = "Experimental", "DFn" = FFMQOB_E_ANOVA1$ANOVA$DFn[2] * FFMQOB_E_Eps1$HFe, "DFd" = FFMQOB_E_ANOVA1$ANOVA$DFd[2] * FFMQOB_E_Eps1$HFe, "SSn" = FFMQOB_E_ANOVA1$ANOVA$SSn[2], "SSd" = FFMQOB_E_ANOVA1$ANOVA$SSd[2], "F" = FFMQOB_E_ANOVA1$ANOVA$F[2], "p" = round(FFMQOB_Corr_ps1b[2], 4), "ges" = FFMQOB_E_ANOVA1$ANOVA$ges[2])

# Combine both data frames into one:

FFMQOB_CE_Corr1 = rbind(FFMQOB_C_Corr1, FFMQOB_E_Corr1)

# Format the results table so that significant p-values will be bolded:

FFMQOB_CE_CorrB1 = FFMQOB_CE_Corr1 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(FFMQOB_CE_CorrB1, digits = 4,
      caption = "Table 29. Tests of simple main effects on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",

      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 29. Tests of simple main effects on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Condition DFn DFd SSn SSd F p ges
Control 1.5685 28.2332 5.1930 120.1404 0.7780 0.44 0.0082
Experimental 1.4089 22.5427 46.3922 76.9412 9.6473 0.0047 0.1035

The main effect of time was not found to be statistically significant for participants in the control condition; F (1.57, 28.23) = 0.78, p = 0.44, \(\eta^2_{G}\) = 0.01. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; F (1.41, 22.54) = 9.65, p = 0.005, \(\eta^2_{G}\) = 0.1.

Post-hoc Test

The significant main effect of time on experimental FFMQ-Observing scores will be further assessed via a post-hoc test. Because our data displayed a violation of the sphericity assumption, we will use the Holm adjustment.

FFMQOB_E_H1 = pairwise.t.test(Exp1b$OB_FFMQ, Exp1b$Time, p.adjust.method = "holm", paired = T)

# Round the results to 4 decimal places:

FFMQOB_E_H1 = data.frame(round(FFMQOB_E_H1$p.value, 4))

# Format the results table so that significant p-values will be bolded:

FFMQOB_E_HB1 = FFMQOB_E_H1 %>%
  mutate(
    T1 = text_spec(T1, bold = (ifelse(T1 < .05, "TRUE", "FALSE"))),
    T2 = text_spec(T2, bold = (ifelse(T2 < .05, "TRUE", "FALSE")))
  )

# Add row labels:

FFMQOB_E_HL1 = data.frame("Comparison" = c("T2", "T3"))

FFMQOB_E_HB1 = cbind(FFMQOB_E_HL1, FFMQOB_E_HB1)


# Create a table to display the results:

kable(FFMQOB_E_HB1, digits = 4,
      caption = "Table 30. Post-hoc test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire across time for participants in the experimental condition who completed all three surveys.",

      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 30. Post-hoc test of scores on the observing subscale of the Five Facet Mindfulness Questionnaire across time for participants in the experimental condition who completed all three surveys.
Comparison T1 T2
T2 0.0005 NA
T3 0.0096 0.313

These results indicate that, for participants in the experimental condition, both T2 (MT2 = 13.59, SDT2 = 2.62) and T3 (MT3 = 14.12, SDT3 = 2.91) scores on the FFMQ-Observing were significantly higher than T1 scores (MT1 = 11.88, SDT1 = 3.12; p = .001 and p = 0.01, respectively). A significant score difference was not observed between T2 and T3 (p = 0.31).

Mixed ANOVA - Acting with Awareness

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQAA_ANOVA1 = ezANOVA(data = Long1b, dv = .(AA_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQAA_Res1 = data.frame("Residuals" = (proj(FFMQAA_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQAA_Res1$Residuals, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQAA_Res1$Residuals, main = "Histogram of FFMQ-AA Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_Shap1 = shapiro.test(FFMQAA_Res1$Residuals)
FFMQAA_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res1$Residuals
## W = 0.98645, p-value = 0.3473

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.35.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQAAAvg1 = data.frame("Condition" = Data1b$Condition, "FFMQAA_Avg" = ((Data1b$T1_AA_FFMQ + Data1b$T2_AA_FFMQ + Data1b$T3_AA_FFMQ)/3))

# Conduct the Levene's test:

FFMQAA_Lev1 = leveneTest(data = FFMQAAAvg1, FFMQAA_Avg ~ Condition, center = median)
FFMQAA_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1   3.074 0.08857 .
##       34                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 3.07, p = 0.09.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQAA_Mau1 = FFMQAA_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQAA_Mau1, digits = 4,
      caption = "Table 31. Test of sphericity on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 31. Test of sphericity on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect W p sig
3 Time 0.9424 0.3757
4 Condition:Time 0.9424 0.3757

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.94, p = 0.38) and the condition x time interaction (W = 0.94, p = 0.38).

Interpretation of Main Effects

kable(FFMQAA_ANOVA1$ANOVA, digits = 4,
      caption = "Table 32. Mixed ANOVA on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 32. Mixed ANOVA on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 34 25368.1775 1151.8225 748.8290 0.0000
0.9464
Condition 1 34 0.1405 1151.8225 0.0041 0.9490 0.0001
Time 2 68 74.6080 285.6698 8.8797 0.0004
0.0493
Condition:Time 2 68 11.3117 285.6698 1.3463 0.2670 0.0078
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 1.35, p = 0.27, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 0, p = 0.95, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 68) = 8.88, p < .001, \(\eta^2_{G}\) = 0.05.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
FFMQAAT_Tuk1 = TukeyHSD(aov(Long1b$AA_FFMQ ~ Long1b$Time))

# Extract the results table from the output:

FFMQAAT_Tuk1 = round(data.frame(FFMQAAT_Tuk1$`Long1b$Time`), 4)

# Format the results table so that significant p-values will be bolded:

FFMQAAT_TukB1 = FFMQAAT_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

FFMQAAT_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

FFMQAAT_TukB1 = cbind(FFMQAAT_TukL1, FFMQAAT_TukB1)

# Create a table to display the results:

kable(FFMQAAT_TukB1, digits = 4,
      caption = "Table 33. Post-hoc tests of scores on the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 33. Post-hoc tests of scores on the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 1.2500 -0.8316 3.3316 0.3305
T3-T1 1.9722 -0.1094 4.0538 0.0672
T3-T2 0.7222 -1.3594 2.8038 0.6885

These results indicate that there were no significant differences in FFMQ-Awareness scores across any of the time points (pT1-T2 = 0.33, pT1-T3 = 0.07, and p T2-T3 = 0.69).

Mixed ANOVA - Describing

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQDS_ANOVA1 = ezANOVA(data = Long1b, dv = .(DS_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQDS_Res1 = data.frame("Residuals" = (proj(FFMQDS_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQDS_Res1$Residuals, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQDS_Res1$Residuals, main = "Histogram of FFMQ-DS Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQDS_Shap1 = shapiro.test(FFMQDS_Res1$Residuals)
FFMQDS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res1$Residuals
## W = 0.98739, p-value = 0.4077

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.41.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQDSAvg1 = data.frame("Condition" = Data1b$Condition, "FFMQDS_Avg" = ((Data1b$T1_DS_FFMQ + Data1b$T2_DS_FFMQ + Data1b$T3_DS_FFMQ)/3))

# Conduct the Levene's test:

FFMQDS_Lev1 = leveneTest(data = FFMQDSAvg1, FFMQDS_Avg ~ Condition, center = median)
FFMQDS_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  3.1532 0.08473 .
##       34                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 3.15, p = 0.08.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQDS_Mau1 = FFMQDS_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQDS_Mau1, digits = 4,
      caption = "Table 34. Test of sphericity on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 34. Test of sphericity on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect W p sig
3 Time 0.8894 0.1446
4 Condition:Time 0.8894 0.1446

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.89, p = 0.14) and the condition x time interaction (W = 0.89, p = 0.14).

Interpretation of Main Effects

kable(FFMQDS_ANOVA1$ANOVA, digits = 4,
      caption = "Table 35. Mixed ANOVA on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 35. Mixed ANOVA on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 34 34294.5116 1240.8958 939.6546 0.0000
0.9574
Condition 1 34 36.7339 1240.8958 1.0065 0.3228 0.0235
Time 2 68 0.7861 286.6398 0.0932 0.9111 0.0005
Condition:Time 2 68 1.3416 286.6398 0.1591 0.8532 0.0009
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 0.16, p = 0.85, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 1.01, p = 0.32, \(\eta^2_{G}\) = 0.02.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (2, 68) = 0.09, p = 0.91, \(\eta^2_{G}\) = 0.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Mixed ANOVA - Non-Judging

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQNJ_ANOVA1 = ezANOVA(data = Long1b, dv = .(NJ_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQNJ_Res1 = data.frame("Residuals" = (proj(FFMQNJ_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(FFMQNJ_Res1$Residuals, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNJ_Res1$Residuals, main = "Histogram of FFMQ-NJ Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQNJ_Shap1 = shapiro.test(FFMQNJ_Res1$Residuals)
FFMQNJ_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res1$Residuals
## W = 0.99102, p-value = 0.6993

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.7.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQNJAvg1 = data.frame("Condition" = Data1b$Condition, "FFMQNJ_Avg" = ((Data1b$T1_NJ_FFMQ + Data1b$T2_NJ_FFMQ + Data1b$T3_NJ_FFMQ)/3))

# Conduct the Levene's test:

FFMQNJ_Lev1 = leveneTest(data = FFMQNJAvg1, FFMQNJ_Avg ~ Condition, center = median)
FFMQNJ_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  4.9806 0.03233 *
##       34                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is not met; F(1, 34) = 4.98, p = 0.03. Because sample sizes are unequal, a White-corrected F-test should be conducted if one is interested in assessing the main effect of condition.

# Run the ANOVA:

FFMQNJ_BANOVA1 = ezANOVA(data = Long1b, dv = .(NJ_FFMQ), wid = .(Subject), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE, white.adjust = TRUE)

# Calculate effect size:

FFMQNJ_BEs1 = (EtaSq(FFMQNJ_BANOVA1$aov, type = 3, anova = FALSE))[2]
  1. Sphericity
# Extract the sphericity test from the ANOVA output:

FFMQNJ_Mau1 = FFMQNJ_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(FFMQNJ_Mau1, digits = 4,
      caption = "Table 36. Test of sphericity on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 36. Test of sphericity on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect W p sig
3 Time 0.8953 0.1611
4 Condition:Time 0.8953 0.1611

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.9, p = 0.16) and the condition x time interaction (W = 0.9, p = 0.16).

Interpretation of Main Effects

# Create a data frame to include the adjusted results:

FFMQNJCorrC1 = (data.frame("Effect" = FFMQNJ_BANOVA1$ANOVA$Effect[2], "DFn" = FFMQNJ_BANOVA1$ANOVA$DFn[2], "DFd" = FFMQNJ_BANOVA1$ANOVA$DFd[2], "F" = FFMQNJ_BANOVA1$ANOVA$F[2], "p" = FFMQNJ_BANOVA1$ANOVA$p[2], "sig" = FFMQNJ_BANOVA1$ANOVA$`p<.05`[2], "ges" = FFMQNJ_BEs1))

FFMQNJCorrTI1 = (data.frame("Effect" = FFMQNJ_ANOVA1$ANOVA$Effect[3:4], "DFn" = FFMQNJ_ANOVA1$ANOVA$DFn[3:4], "DFd" = FFMQNJ_ANOVA1$ANOVA$DFd[3:4], "F" = FFMQNJ_ANOVA1$ANOVA$F[3:4], "p" = FFMQNJ_ANOVA1$ANOVA$p[3:4], "sig" = FFMQNJ_ANOVA1$ANOVA$`p<.05`[3:4], "ges" = FFMQNJ_ANOVA1$ANOVA$ges[3:4]))

# Combine into a single data frame:

FFMQNJCorr1 = rbind(FFMQNJCorrC1, FFMQNJCorrTI1)

# Create a table to display the results:

kable(FFMQNJCorr1, digits = 4,
      caption = "Table 37. Mixed ANOVA on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 37. Mixed ANOVA on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Effect DFn DFd F p sig ges
Condition 1 34 0.0973 0.7571 0.0029
Time 2 68 9.1082 0.0003
0.0405
Condition:Time 2 68 2.1644 0.1227 0.0099
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 2.16, p = 0.12, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 0.1, p = 0.76, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 68) = 9.11, p < .001, \(\eta^2_{G}\) = 0.04.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
FFMQNJT_Tuk1 = TukeyHSD(aov(Long1b$NJ_FFMQ ~ Long1b$Time))

# Extract the results table from the output:

FFMQNJT_Tuk1 = round(data.frame(FFMQNJT_Tuk1$`Long1b$Time`), 4)

# Format the results table so that significant p-values will be bolded:

FFMQNJT_TukB1 = FFMQNJT_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

FFMQNJT_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

FFMQNJT_TukB1 = cbind(FFMQNJT_TukL1, FFMQNJT_TukB1)

# Create a table to display the results:

kable(FFMQNJT_TukB1, digits = 4,
      caption = "Table 38. Post-hoc tests of scores on the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 38. Post-hoc tests of scores on the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 1.0000 -1.4330 3.4330 0.5929
T3-T1 2.1389 -0.2941 4.5719 0.0968
T3-T2 1.1389 -1.2941 3.5719 0.5083

These results indicate that there were no significant differences in FFMQ-Non-Judging scores across any of the time points (pT1-T2 = 0.59, pT1-T3 = 0.1, and pT2-T3 = 0.51).

Depression, Anxiety, and Stress Scale

Descriptive Statistics

# DASS-Depression:

D_DASS1 = summarySE(data = Long1b, measurevar = "D_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Anxiety:

A_DASS1 = summarySE(data = Long1b, measurevar = "A_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Stress:

S_DASS1 = summarySE(data = Long1b, measurevar = "S_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(D_DASS1)[colnames(D_DASS1) == "D_DASS"] = "M"
colnames(A_DASS1)[colnames(A_DASS1) == "A_DASS"] = "M"
colnames(S_DASS1)[colnames(S_DASS1) == "S_DASS"] = "M"

# Combine these variables into a single data frame:

DASSDesc1 = data.frame(rbind(D_DASS1, A_DASS1, S_DASS1))

# Create a table to display the results:

kable(DASSDesc1, digits = 4, caption = "Table 39. Scores on the Depression, Anxiety, and Stress Scale by condition and time for participants who completed all three surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Depression", 1, 6) %>%
  group_rows("Anxiety", 7, 12) %>%
  group_rows("Stress", 13, 18)
Table 39. Scores on the Depression, Anxiety, and Stress Scale by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Depression
Control T1 19 10.1053 10.3596 2.3767 4.9932
Control T2 19 7.5789 7.8480 1.8004 3.7826
Control T3 19 5.6842 5.1753 1.1873 2.4944
Experimental T1 17 10.4706 10.9208 2.6487 5.6150
Experimental T2 17 5.6471 4.7029 1.1406 2.4180
Experimental T3 17 5.5294 5.6802 1.3777 2.9205
Anxiety
Control T1 19 8.7368 10.7333 2.4624 5.1733
Control T2 19 7.2632 8.3056 1.9054 4.0032
Control T3 19 6.5263 6.3190 1.4497 3.0457
Experimental T1 17 4.9412 4.1903 1.0163 2.1545
Experimental T2 17 3.5294 2.6009 0.6308 1.3373
Experimental T3 17 3.6471 2.8491 0.6910 1.4649
Stress
Control T1 19 17.3684 9.8444 2.2585 4.7449
Control T2 19 13.8947 8.4452 1.9375 4.0705
Control T3 19 11.8947 6.0175 1.3805 2.9004
Experimental T1 17 14.0000 7.3824 1.7905 3.7957
Experimental T2 17 9.4118 6.0731 1.4729 3.1225
Experimental T3 17 8.5882 4.4025 1.0678 2.2636

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the depression plot.
# Calculate SE min:

DASSDMin1 = data.frame("DASSDMin" = D_DASS1$M - D_DASS1$se)

# Calculate SE max:

DASSDMax1 = data.frame("DASSDMax" = D_DASS1$M + D_DASS1$se)

# Create data frame of values to be used:

DASSDPlot1 = data.frame("Condition" = D_DASS1$Condition, "Time" = D_DASS1$Time,
                    "DASSDMean" = D_DASS1$M, "DASSDMin" = DASSDMin1, "DASSDMax" = DASSDMax1)
  1. Create the depression plot.
# Create the plot:

DASSDFig1 = (Long1b %>%
  ggplot(aes(Time, D_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSDPlot1,
    aes(Time, DASSDMean, ymin = DASSDMin, ymax = DASSDMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Depression Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the anxiety plot.
# Calculate SE min:

DASSAMin1 = data.frame("DASSAMin" = A_DASS1$M - A_DASS1$se)

# Calculate SE max:

DASSAMax1 = data.frame("DASSAMax" = A_DASS1$M + A_DASS1$se)

# Create data frame of values to be used:

DASSAPlot1 = data.frame("Condition" = A_DASS1$Condition, "Time" = A_DASS1$Time,
                    "DASSAMean" = A_DASS1$M, "DASSAMin" = DASSAMin1, "DASSAMax" = DASSAMax1)
  1. Create the anxiety plot.
# Create the plot:

DASSAFig1 = (Long1b %>%
  ggplot(aes(Time, A_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSAPlot1,
    aes(Time, DASSAMean, ymin = DASSAMin, ymax = DASSAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Anxiety Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the stress plot.
# Calculate SE min:

DASSSMin1 = data.frame("DASSSMin" = S_DASS1$M - S_DASS1$se)

# Calculate SE max:

DASSSMax1 = data.frame("DASSSMax" = S_DASS1$M + S_DASS1$se)

# Create data frame of values to be used:

DASSSPlot1 = data.frame("Condition" = S_DASS1$Condition, "Time" = S_DASS1$Time,
                    "DASSSMean" = S_DASS1$M, "DASSSMin" = DASSSMin1, "DASSSMax" = DASSSMax1)
  1. Create the stress plot.
# Create the plot:

DASSSFig1 = (Long1b %>%
  ggplot(aes(Time, S_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSSPlot1,
    aes(Time, DASSSMean, ymin = DASSSMin, ymax = DASSSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Stress Score",
       fill = "Condition") + ggtitle("c") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
DASSCap1 = "Figure 5. Distributions of scores on the depression (a), anxiety (b), and stress (c) subscales of the Depression, Anxiety, and Stress Scale (DASS) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
DASSCap1 = paste0(strwrap(DASSCap1, width = 100), collapse = "\n")
  1. Define the figure layout
DASSLayout1 = rbind(c("DASSAFig1", "DASSDFig1"),
                        c("DASSSFig1", "SharedLeg"))
  1. Display the figure.
DASSFig1 = grid.arrange(DASSDFig1, DASSAFig1, DASSSFig1, SharedLeg, layout_matrix = DASSLayout1, bottom = textGrob(DASSCap1, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Depression

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSD_ANOVA1 = ezANOVA(data = Long1b, dv = .(D_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSD_Res1 = data.frame("Residuals" = (proj(DASSD_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(DASSD_Res1$Residuals, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res1$Residuals)

The residuals appear to be slightly leptokurtic.

qplot(DASSD_Res1$Residuals, main = "Histogram of DASS-D Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

DASSD_Shap1 = shapiro.test(DASSD_Res1$Residuals)
DASSD_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res1$Residuals
## W = 0.93053, p-value = 0.00002733

Based on an alpha level of .05, the assumption of normality is not met; W = 0.93, p < .001.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSDAvg1 = data.frame("Condition" = Data1b$Condition, "DASSD_Avg" = ((Data1b$T1_D_DASS + Data1b$T2_D_DASS + Data1b$T3_D_DASS)/3))

# Conduct the Levene's test:

DASSD_Lev1 = leveneTest(data = DASSDAvg1, DASSD_Avg ~ Condition, center = median)
DASSD_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0349  0.853
##       34

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 0.03, p = 0.85.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

DASSD_Mau1 = DASSD_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(DASSD_Mau1, digits = 4,
      caption = "Table 40. Test of sphericity on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 40. Test of sphericity on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect W p sig
3 Time 0.8104 0.0312
4 Condition:Time 0.8104 0.0312

Based on an alpha level of .05, the assumption of sphericity is not met for either the main effect of time (W = 0.81, p = 0.03) or the condition x time interaction (W = 0.81, p = 0.03). We will now look at the potential epsilon corrections that we can use.

# Extract the corrections table from the ANOVA output:

DASSD_Eps1 = DASSD_ANOVA1$`Sphericity Corrections`

# Create a table to display the results:

kable(DASSD_Eps1, digits = 4,
      caption = "Table 41. Epsilon corrections for the test of scores on the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "GG Epsilon", "GG p", "GG sig", "HF Epsilon", "HF p", "HF sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 41. Epsilon corrections for the test of scores on the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect GG Epsilon GG p GG sig HF Epsilon HF p HF sig
3 Time 0.8407 0.0010
0.8795 0.0008
4 Condition:Time 0.8407 0.5662 0.8795 0.5741

Because \(\varepsilon_{GG}\) > .75, we will apply the Huynh-Feldt correction (\(\varepsilon\) = 0.88) to these tests (as suggested by Girden, 1992).

Interpretation of Main Effects

# Create a data frame for the epsilon corrected tests:

DASSDCorrC1 = (data.frame("Effect" = DASSD_ANOVA1$ANOVA$Effect[2], "DFn" = DASSD_ANOVA1$ANOVA$DFn[2], "DFd" = DASSD_ANOVA1$ANOVA$DFd[2], "SSn" = DASSD_ANOVA1$ANOVA$SSn[2], "SSd" = DASSD_ANOVA1$ANOVA$SSd[2], "F" = DASSD_ANOVA1$ANOVA$F[2], "p" = DASSD_ANOVA1$ANOVA$p[2], "sig" = DASSD_ANOVA1$ANOVA$`p<.05`[2], "ges" = DASSD_ANOVA1$ANOVA$ges[2]))

DASSDCorrTI1 = (data.frame("Effect" = DASSD_Eps1$Effect[1:2], "DFn" = DASSD_ANOVA1$ANOVA$DFn[3:4] * DASSD_Eps1$HFe, "DFd" = DASSD_ANOVA1$ANOVA$DFd[3:4] * DASSD_Eps1$HFe, "SSn" = DASSD_ANOVA1$ANOVA$SSn[3:4], "SSd" = DASSD_ANOVA1$ANOVA$SSd[3:4], "F" = DASSD_ANOVA1$ANOVA$F[3:4], "p" = DASSD_Eps1$`p[HF]`, "sig" = DASSD_Eps1$`p[HF]<.05`, "ges" = DASSD_ANOVA1$ANOVA$ges[3:4]))

# Combine into a single data frame:

DASSDCorr1 = rbind(DASSDCorrC1, DASSDCorrTI1)

# Create a table to display the results:

kable(DASSDCorr1, digits = 4,
      caption = "Table 42. Mixed ANOVA on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 42. Mixed ANOVA on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
Condition 1.0000 34.0000 8.8618 4598.101 0.0655 0.7995 0.0014
Time 1.7589 59.8029 435.8145 1702.778 8.7021 0.0008
0.0647
Condition:Time 1.7589 59.8029 26.0367 1702.778 0.5199 0.5741 0.0041
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1.76, 59.8) = 0.52, p = 0.57, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 0.07, p = 0.8, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (1.76, 59.8) = 8.7, p = 0.001, \(\eta^2_{G}\) = 0.06.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because our data displayed a violation of the sphericity assumption, we will use the Holm adjustment.

Main Effect of Time
DASSDT_H1 = pairwise.t.test(Long1b$D_DASS, Long1b$Time, p.adjust.method = "holm", paired = T)

# Round the results to 4 decimal places:

DASSDT_H1 = data.frame(round(DASSDT_H1$p.value, 4))

# Format the results table so that significant p-values will be bolded:

DASSDT_HB1 = DASSDT_H1 %>%
  mutate(
    T1 = text_spec(T1, bold = (ifelse(T1 < .05, "TRUE", "FALSE"))),
    T2 = text_spec(T2, bold = (ifelse(T2 < .05, "TRUE", "FALSE")))
  )

# Add row labels:

DASSDT_HL1 = data.frame("Comparison" = c("T2", "T3"))

DASSDT_HB1 = cbind(DASSDT_HL1, DASSDT_HB1)


# Create a table to display the results:

kable(DASSDT_HB1, digits = 4,
      caption = "Table 43. Post-hoc tests of scores on the depression subscale of the Depression, Anxiety, and Stress Scale across time for participants who completed all three surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 43. Post-hoc tests of scores on the depression subscale of the Depression, Anxiety, and Stress Scale across time for participants who completed all three surveys.
Comparison T1 T2
T2 0.0238 NA
T3 0.0013 0.254

These results indicate that both T2 (MT2 = 6.67, SDT2 = 6.54) and T3 (MT3 = 5.61, SDT3 = 5.34) scores on the DASS-Depression were significantly lower than T1 scores (MT1 = 10.28, SDT1 = 10.48; p = 0.02 and p = 0.001, respectively). A significant score difference was not observed between T2 and T3 (p = 0.25).

Mixed ANOVA - Anxiety

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSA_ANOVA1 = ezANOVA(data = Long1b, dv = .(A_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSA_Res1 = data.frame("Residuals" = (proj(DASSA_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(DASSA_Res1$Residuals, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res1$Residuals)

The residuals appear to be slightly leptokurtic.

qplot(DASSA_Res1$Residuals, main = "Histogram of DASS-A Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

DASSA_Shap1 = shapiro.test(DASSA_Res1$Residuals)
DASSA_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res1$Residuals
## W = 0.91522, p-value = 0.000003763

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p < .001.

Based on the figures, however, the residuals appear to be fairly normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSAAvg1 = data.frame("Condition" = Data1b$Condition, "DASSA_Avg" = ((Data1b$T1_A_DASS + Data1b$T2_A_DASS + Data1b$T3_A_DASS)/3))

# Conduct the Levene's test:

DASSA_Lev1 = leveneTest(data = DASSAAvg1, DASSA_Avg ~ Condition, center = median)
DASSA_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  7.0156 0.01217 *
##       34                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is not met; F(1, 34) = 7.02, p = 0.01. Because sample sizes are unequal, a White-corrected F-test should be conducted if one is interested in assessing the main effect of condition.

# Run the ANOVA:

DASSA_BANOVA1 = ezANOVA(data = Long1b, dv = .(A_DASS), wid = .(Subject), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE, white.adjust = TRUE)

# Calculate effect size:

DASSA_BEs1 = (EtaSq(DASSA_BANOVA1$aov, type = 3, anova = FALSE))[2]
  1. Sphericity
# Extract the sphericity test from the ANOVA output:

DASSA_Mau1 = DASSA_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(DASSA_Mau1, digits = 4,
      caption = "Table 44. Test of sphericity on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 44. Test of sphericity on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect W p sig
3 Time 0.9726 0.6323
4 Condition:Time 0.9726 0.6323

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.97, p = 0.63) and the condition x time interaction (W = 0.97, p = 0.63).

Interpretation of Main Effects

# Create a data frame to include the calculated effect size:

DASSACorrC1 = (data.frame("Effect" = DASSA_BANOVA1$ANOVA$Effect[2], "DFn" = DASSA_BANOVA1$ANOVA$DFn[2], "DFd" = DASSA_BANOVA1$ANOVA$DFd[2], "F" = DASSA_BANOVA1$ANOVA$F[2], "p" = DASSA_BANOVA1$ANOVA$p[2], "sig" = DASSA_BANOVA1$ANOVA$`p<.05`[2], "ges" = DASSA_BEs1))

DASSACorrTI1 = (data.frame("Effect" = DASSA_ANOVA1$ANOVA$Effect[3:4], "DFn" = DASSA_ANOVA1$ANOVA$DFn[3:4], "DFd" = DASSA_ANOVA1$ANOVA$DFd[3:4], "F" = DASSA_ANOVA1$ANOVA$F[3:4], "p" = DASSA_ANOVA1$ANOVA$p[3:4], "sig" = DASSA_ANOVA1$ANOVA$`p<.05`[3:4], "ges" = DASSA_ANOVA1$ANOVA$ges[3:4]))

# Combine into a single data frame:

DASSACorr1 = rbind(DASSACorrC1, DASSACorrTI1)

# Create a table to display the results:

kable(DASSACorr1, digits = 4,
      caption = "Table 45. Mixed ANOVA on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 45. Mixed ANOVA on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect DFn DFd F p sig ges
Condition 1 34 3.2069 0.0822 0.0838
Time 2 68 2.1169 0.1283 0.0136
Condition:Time 2 68 0.1587 0.8536 0.0010
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 0.16, p = 0.85, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 3.21, p = 0.08, \(\eta^2_{G}\) = 0.08.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (2, 68) = 2.12, p = 0.13, \(\eta^2_{G}\) = 0.01.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Mixed ANOVA - Stress

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSS_ANOVA1 = ezANOVA(data = Long1b, dv = .(S_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSS_Res1 = data.frame("Residuals" = (proj(DASSS_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(DASSS_Res1$Residuals, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res1$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(DASSS_Res1$Residuals, main = "Histogram of DASS-S Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

DASSS_Shap1 = shapiro.test(DASSS_Res1$Residuals)
DASSS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res1$Residuals
## W = 0.99275, p-value = 0.8411

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.84.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSSAvg1 = data.frame("Condition" = Data1b$Condition, "DASSS_Avg" = ((Data1b$T1_S_DASS + Data1b$T2_S_DASS + Data1b$T3_S_DASS)/3))

# Conduct the Levene's test:

DASSS_Lev1 = leveneTest(data = DASSSAvg1, DASSS_Avg ~ Condition, center = median)
DASSS_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.7349 0.1074
##       34

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 2.73, p = 0.11.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

DASSS_Mau1 = DASSS_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(DASSS_Mau1, digits = 4,
      caption = "Table 46. Test of sphericity on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 46. Test of sphericity on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect W p sig
3 Time 0.9527 0.4495
4 Condition:Time 0.9527 0.4495

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.95, p = 0.45) and the condition x time interaction (W = 0.95, p = 0.45).

Interpretation of Main Effects

kable(DASSS_ANOVA1$ANOVA, digits = 4,
      caption = "Table 47. Mixed ANOVA on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 47. Mixed ANOVA on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 34 16893.8246 4315.509 133.0990 0.0000
0.7560
Condition 1 34 372.3431 4315.509 2.9335 0.0959 0.0639
Time 2 68 572.6068 1136.726 17.1269 0.0000
0.0950
Condition:Time 2 68 7.8661 1136.726 0.2353 0.7910 0.0014
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 0.24, p = 0.79, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 2.93, p = 0.1, \(\eta^2_{G}\) = 0.06.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 68) = 17.13, p < .001, \(\eta^2_{G}\) = 0.1.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
DASSST_Tuk1 = TukeyHSD(aov(Long1b$S_DASS ~ Long1b$Time))

# Extract the results table from the output:

DASSST_Tuk1 = round(data.frame(DASSST_Tuk1$`Long1b$Time`), 4)

# Format the results table so that significant p-values will be bolded:

DASSST_TukB1 = DASSST_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

DASSST_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

DASSST_TukB1 = cbind(DASSST_TukL1, DASSST_TukB1)

# Create a table to display the results:

kable(DASSST_TukB1, digits = 4,
      caption = "Table 48. Post-hoc tests of scores on the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 48. Post-hoc tests of scores on the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 -4.0000 -8.1764 0.1764 0.0635
T3-T1 -5.4444 -9.6208 -1.2681 0.007
T3-T2 -1.4444 -5.6208 2.7319 0.6901

These results indicate that T3 scores (MT3 = 10.33, SDT3 = 5.5) on the DASS-Stress were significantly lower than T1 scores (MT1 = 15.78, SDT1 = 8.81; p = 0.01). A significant score difference was not observed between T1 and T2 (MT2 = 11.78, SDT2 = 7.66; p = 0.06) or T2 and T3 (p = 0.69).

Job Effectiveness Questionnaire

Descriptive Statistics

# Calculate summary statistics
JEQDesc1 = summarySE(data = Long1b, measurevar = "JEQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(JEQDesc1, digits = 4,
      caption = "Table 49. Scores on the Job Effectiveness Questionnaire by condition and time for participants who completed all three surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 49. Scores on the Job Effectiveness Questionnaire by condition and time for participants who completed all three surveys.
Condition Time n M SD SE CI
Control T1 19 5.1372 0.7767 0.1782 0.3744
Control T2 19 5.1383 0.9855 0.2261 0.4750
Control T3 19 5.4489 0.8748 0.2007 0.4216
Experimental T1 17 5.2919 0.3740 0.0907 0.1923
Experimental T2 17 5.2881 0.5770 0.1399 0.2966
Experimental T3 17 5.3798 0.6870 0.1666 0.3532

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

JEQMin1 = data.frame("JEQMin" = JEQDesc1$JEQ - JEQDesc1$se)

# Calculate SE max:

JEQMax1 = data.frame("JEQMax" = JEQDesc1$JEQ + JEQDesc1$se)

# Create data frame of values to be used:

JEQPlot1 = data.frame("Condition" = JEQDesc1$Condition, "Time" = JEQDesc1$Time,
                    "JEQMean" = JEQDesc1$JEQ, "JEQMin" = JEQMin1,
                    "JEQMax" = JEQMax1)
  1. Plot the data.
# Create a figure caption:

JEQCap1 = "Figure 6. Distributions of scores on the Job Effectiveness Questionnaire (JEQ) for participants who completed all three surveys. Dots and whiskers represent means and standard errors, respectively."
JEQCap1 = paste0(strwrap(JEQCap1, width = 59), collapse = "\n")

# Create the plot:

JEQFig1 = (Long1b %>%
  ggplot(aes(Time, JEQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = JEQPlot1,
    aes(Time, JEQMean, ymin = JEQMin, ymax = JEQMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "JEQ Score",
       fill = "Condition", caption = JEQCap1) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
JEQFig1

Mixed ANOVA

As before, we’ll conduct a Type III, 2 x 3 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

JEQ_ANOVA1 = ezANOVA(data = Long1b, dv = .(JEQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

JEQ_Res1 = data.frame("Residuals" = (proj(JEQ_ANOVA1$aov)[[3]][, "Residuals"]))
qqnorm(JEQ_Res1$Residuals, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res1$Residuals)

The residuals appear to be slightly leptokurtic.

qplot(JEQ_Res1$Residuals, main = "Histogram of JEQ Residuals", binwidth = .1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

JEQ_Shap1 = shapiro.test(JEQ_Res1$Residuals)
JEQ_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res1$Residuals
## W = 0.97444, p-value = 0.03536

Based on an alpha level of .05, the assumption of normality is not met; W = 0.97, p = 0.04.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

JEQAvg1 = data.frame("Condition" = Data1b$Condition, "JEQ_Avg" = ((Data1b$T1_JEQ + Data1b$T2_JEQ + Data1b$T3_JEQ)/3))

# Conduct the Levene's test:

JEQ_Lev1 = leveneTest(data = JEQAvg1, JEQ_Avg ~ Condition, center = median)
JEQ_Lev1
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.7647 0.1929
##       34

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 34) = 1.76, p = 0.19.

  1. Sphericity
# Extract the sphericity test from the ANOVA output:

JEQ_Mau1 = JEQ_ANOVA1$`Mauchly's Test for Sphericity`

# Create a table to display the results:

kable(JEQ_Mau1, digits = 4,
      caption = "Table 50. Test of sphericity on Job Effectiveness Questionnaire scores for participants who completed all three surveys.",
      col.names = c("Effect", "W", "p", "sig"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 50. Test of sphericity on Job Effectiveness Questionnaire scores for participants who completed all three surveys.
Effect W p sig
3 Time 0.8867 0.1375
4 Condition:Time 0.8867 0.1375

Based on an alpha level of .05, the assumption of sphericity is met for both the main effect of time (W = 0.89, p = 0.14) and the condition x time interaction (W = 0.89, p = 0.14).

Interpretation of Main Effects

kable(JEQ_ANOVA1$ANOVA, digits = 4,
      caption = "Table 51. Mixed ANOVA on Job Effectiveness Questionnaire scores for participants who completed all three surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 51. Mixed ANOVA on Job Effectiveness Questionnaire scores for participants who completed all three surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 34 3002.3809 47.2295 2161.3828 0.0000
0.9813
Condition 1 34 0.1656 47.2295 0.1192 0.7320 0.0029
Time 2 68 0.9612 10.0002 3.2679 0.0441
0.0165
Condition:Time 2 68 0.2932 10.0002 0.9970 0.3743 0.0051
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (2, 68) = 1, p = 0.37, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 34) = 0.12, p = 0.73, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (2, 68) = 3.27, p = 0.04, \(\eta^2_{G}\) = 0.02.

Post-hoc Tests

The significant main effect of time will be further assessed via post-hoc tests. Because we are planning on completing all possible pairwise comparisons, we will use the Tukey HSD adjustment.

Main Effect of Time
JEQT_Tuk1 = TukeyHSD(aov(Long1b$JEQ ~ Long1b$Time))

# Extract the results table from the output:

JEQT_Tuk1 = round(data.frame(JEQT_Tuk1$`Long1b$Time`), 4)

# Format the results table so that significant p-values will be bolded:

JEQT_TukB1 = JEQT_Tuk1 %>%
  mutate(
    p.adj = cell_spec(p.adj, bold = (ifelse(p.adj < .05, "TRUE", "FALSE")))
  )

# Add row labels:

JEQT_TukL1 = data.frame("Comparison" = c("T2-T1", "T3-T1", "T3-T2"))

JEQT_TukB1 = cbind(JEQT_TukL1, JEQT_TukB1)

# Create a table to display the results:

kable(JEQT_TukB1, digits = 4,
      caption = "Table 52. Post-hoc tests of scores on the Job Effectiveness Questionnaire for participants who completed all three surveys.",
      col.names = c("Comparison", "Difference", "Lower", "Upper", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 52. Post-hoc tests of scores on the Job Effectiveness Questionnaire for participants who completed all three surveys.
Comparison Difference Lower Upper p
T2-T1 -0.0013 -0.4166 0.4141 1
T3-T1 0.2060 -0.2094 0.6213 0.4684
T3-T2 0.2072 -0.2081 0.6226 0.4641

These results indicate that there were no significant differences in JEQ scores across any of the time points (pT1-T2 = 1, pT1-T3 = 0.47, and pT2-T3 = 0.46).

Summary of Results

The following results were found to be statistically significant:

  • Perceived Stress Scale

    • a decrease in perceived stress from T1 to T3 (p = 0.01)
  • Positive and Negative Affect Schedule

    • a reduction in negative affect from T1 to both T2 and T3 (p = 0.004 and p = 0.003, respectively)
  • Five Facet Mindfulness Questionnaire

    • an increase in observing abilities from T1 to both T2 and T3 for participants in the experimental condition (p = .001 and p = 0.01, respectively)
  • Depression, Anxiety, and Stress Scale

    • a reduction in depression from T1 to both T2 and T3 (p = 0.02 and p = 0.001, respectively)

    • a reduction in stress from T1 to T3 (p = 0.01)

Conclusion

Initial analyses revealed changes in many of the variables considered. Although these changes were all found to occur in the predicted direction (e.g. a decrease in things like stress and depression and an increase in mindful cognition), the majority of them seem to have occurred over time regardless of condition. The only significant condition-related finding was an increase in observing from T1 to both T2 and T3 for participants in the experimental condition but not for those in the control condition. It seems, therefore, that the meditation program enhanced experimental participants’ observing from T1 to T2 and these improvements were maintained through to T3. If the meditation program was, in fact, responsible for such a change though, it is unclear why a similar increase in observing did not occur between T2 and T3 for participants in the control condition. One possibility is that these effects (or lack thereof) were influenced or obscured by small sample sizes (nControl = 19 and nExperimental = 17. Small sample sizes could also be responsible for the nearly significant interaction effects and effects of condition that were revealed in these analyses. In particular, the following results were found to be close to significance:

  • Perceived Stress Scale

    • an interaction between condition and time with respect to perceived stress (p = 0.05)
  • Positive and Negative Affect Schedule

    • an effect of time on positive affect (p = 0.07)
  • Five Facet Mindfulness Questionnaire

    • an increase in non-reactivity, acting with awareness, and non-judging from T1 to T3 (p = 0.05, p = 0.07, and p = 0.1, respectively)

    • an effect of condition on non-reactivity (p = 0.06)

  • Depression, Anxiety, and Stress Scale

    • a decrease in stress from T1 to T2 (p = 0.06)

    • an effect of condition on anxiety and stress (p = 0.08 and p = 0.1, respectively)

Had we considered a larger sample size, these effects may have been found to be statistically significant. We will assess this possibility through a series of exploratory follow-up analyses looking at the effects of time and condition on self-report scores across T1 and T2. Between T1 and T2, participants in the experimental condition completed the meditation program while participants in the control condition did nothing. The rate of participant drop-out between these two time points was also smaller than between T1 and T3. Consequently, a secondary analysis with a larger sample size focusing on changes exclusively between T1 and T2 may help to clarify which effects can be attributed to the meditation program and which are due primarily to the passage of time.


2. Changes Across the First Two Time Points

Our second set of analyses will look at the effect of time and condition on self-report scores across the first two time points (i.e. T1 and T2).

Subsetting Data

For these analyses, we will focus on participants who provided responses to the first two surveys and, for the experimental group, those who actively participated in the meditation program. Before we begin, therefore, we will subset the data according to the T1,T2 and Med_Week variables. This data set will encompass all variables for those who completed both the T1 and T2 surveys.

# Select participants who responded to the first two surveys:

Data2 = subset(AllData, T1 == "1" & T2 == "1")

# Exclude experimental participants who didn't meditate:

Data2 = subset(Data2, !(Condition == "Experimental" & Med_Week < "1"))

We’ll also want to create a long version of the self-report scores in this data frame so that we can conduct mixed ANOVAs.

# Create a series of data frames that will specify the level of Time within our long data set:

T1Frame2 = data.frame(matrix("T1", nrow = (nrow(Data2)), ncol = 1))

T2Frame2 = data.frame(matrix("T2", nrow = (nrow(Data2)), ncol = 1))

# T1 subset:

T1Data2 = data.frame(Data2$Subject, Data2$Condition, T1Frame2, Data2$T1_PSS, Data2$T1_POS_PANAS, Data2$T1_NEG_PANAS, Data2$T1_BRS, Data2$T1_NR_FFMQ, Data2$T1_OB_FFMQ, Data2$T1_AA_FFMQ, Data2$T1_DS_FFMQ, Data2$T1_NJ_FFMQ, Data2$T1_D_DASS, Data2$T1_A_DASS, Data2$T1_S_DASS, Data2$T1_JEQ)

colnames(T1Data2) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# T2 subset:

T2Data2 = data.frame(Data2$Subject, Data2$Condition, T2Frame2, Data2$T2_PSS, Data2$T2_POS_PANAS, Data2$T2_NEG_PANAS, Data2$T2_BRS, Data2$T2_NR_FFMQ, Data2$T2_OB_FFMQ, Data2$T2_AA_FFMQ, Data2$T2_DS_FFMQ, Data2$T2_NJ_FFMQ, Data2$T2_D_DASS, Data2$T2_A_DASS, Data2$T2_S_DASS, Data2$T2_JEQ)

colnames(T2Data2) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# Combine the subsets into a full data frame:

Long2 = rbind(T1Data2, T2Data2)

Demographic Information

Now we’ll look at some basic demographic information for this subset of participants. We’ll begin by assessing the nominal variables in this data set.

# Gender:

Gender2 = xtabs(data = Data2, ~ Condition + Gender)

# Prior meditation experience:

Med_Prior2 = xtabs(data = Data2, ~ Condition + Med_Prior)

# Prior yoga experience:

Yoga_Prior2 = xtabs(data = Data2, ~ Condition + Yoga_Prior)

# Prior tai chi experience:

Tai_Prior2 = xtabs(data = Data2, ~ Condition + Tai_Prior)

# Combine these variables into a single data frame:

Demos2a = cbind(Gender2, Med_Prior2, Yoga_Prior2, Tai_Prior2)

# Create a table to display the results:

kable(Demos2a, caption = "Table 53. Frequency-based demographic information (i.e. n) for participants who completed the first two surveys.",  col.names = c("Male", "Female", "Yes", "No", "Yes", "No", "No"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c("", "Gender" = 2, "Meditation Exp." = 2, "Yoga Exp." = 2, "Tai Chi Exp." = 1)) %>%
  footnote(general = "A 'Yes' column is not provided for the Tai Chi Exp. variable because no participants responded 'yes' to this question.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 53. Frequency-based demographic information (i.e. n) for participants who completed the first two surveys.
Gender
Meditation Exp.
Yoga Exp.
Tai Chi Exp.
Male Female Yes No Yes No No
Control 11 28 17 22 13 26 36
Experimental 11 13 11 13 8 16 22
Note: A ‘Yes’ column is not provided for the Tai Chi Exp. variable because no participants responded ‘yes’ to this question.

Next, we’ll look at some of the continuous variables in this data set.

# Age

Age2 = summarySE(data = Data2, measurevar = "Age",
                    groupvars = c("Condition"), conf.interval = .95)

# Weekly hours:

Weekly_Hrs2 = summarySE(data = Data2, measurevar = "Weekly_Hrs",
                    groupvars = c("Condition"), conf.interval = .95)

# Mins/Week spent meditating during the program:

Mins_Week2 = summarySE(data = Data2, measurevar = "Mins_Week",
                    groupvars = c("Condition"), conf.interval = .95)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(Age2)[colnames(Age2) == "Age"] = "M"
colnames(Weekly_Hrs2)[colnames(Weekly_Hrs2) == "Weekly_Hrs"] = "M"
colnames(Mins_Week2)[colnames(Mins_Week2) == "Mins_Week"] = "M"

# Combine these variables into a single data frame:

Demos2b = data.frame(rbind(Age2, Weekly_Hrs2, Mins_Week2))

# Create a table to display the results:

kable(Demos2b, digits = 4, caption = "Table 54. Demographic information for participants who completed the first two surveys.",  col.names = c("Condition", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Age", 1, 2) %>%
  group_rows("Weekly Hours Worked", 3, 4) %>%
  group_rows("Meditation During the Program (Min/Week)", 5, 6)
Table 54. Demographic information for participants who completed the first two surveys.
Condition n M SD SE CI
Age
Control 39 48.0000 10.2803 1.6462 3.3325
Experimental 24 50.1667 9.3514 1.9089 3.9488
Weekly Hours Worked
Control 39 50.8590 10.7428 1.7202 3.4824
Experimental 24 49.7083 8.5133 1.7378 3.5949
Meditation During the Program (Min/Week)
Control 39 NA NA NA NA
Experimental 24 37.0625 17.9082 3.6555 7.5620

Perceived Stress Scale

Descriptive Statistics

First, we’ll calculate some basic descriptive statistics (ns, Ms, SDs, SEs, and 95% CIs) for scores across both condition and time.

# Calculate summary statistics
PSSDesc2 = summarySE(data = Long2, measurevar = "PSS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(PSSDesc2, digits = 4,
      caption = "Table 55. Scores on the Perceived Stress Scale by condition and time for participants who completed the first two surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 55. Scores on the Perceived Stress Scale by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Control T1 39 41.0513 7.6569 1.2261 2.4821
Control T2 39 39.7949 8.9507 1.4333 2.9015
Experimental T1 24 42.6250 7.0822 1.4456 2.9906
Experimental T2 24 35.9167 7.0644 1.4420 2.9830

Plotting Scores

Now we’ll create a plot so that we can visualize the data.

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

PSSMin2 = data.frame("PSSMin" = PSSDesc2$PSS - PSSDesc2$se)

# Calculate SE max:

PSSMax2 = data.frame("PSSMax" = PSSDesc2$PSS + PSSDesc2$se)

# Create data frame of values to be used:

PSSPlot2 = data.frame("Condition" = PSSDesc2$Condition, "Time" = PSSDesc2$Time,
                    "PSSMean" = PSSDesc2$PSS, "PSSMin" = PSSMin2, "PSSMax" = PSSMax2)
  1. Plot the data.
# Create a figure caption:

PSSCap2 = "Figure 7. Distributions of scores on the Perceived Stress Scale (PSS) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
PSSCap2 = paste0(strwrap(PSSCap2, width = 55), collapse = "\n")

# Create the plot:

PSSFig2 = (Long2 %>%
  ggplot(aes(Time, PSS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = PSSPlot2,
    aes(Time, PSSMean, ymin = PSSMin, ymax = PSSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "PSS Score",
       fill = "Condition", caption = PSSCap2) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
PSSFig2

Mixed ANOVA

To assess if any score differences are statistically significant, we’ll conduct a 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor. Because we have unequal sample sizes between groups, we’ll use Type III sum of squares.

Assumptions

The mixed ANOVA makes four primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality

This assumption can be tested by visualizing and applying a Shapiro-Wilk test to the residuals (which can be extracted from the ANOVA output).

# Run the ANOVA:

PSS_ANOVA2 = ezANOVA(data = Long2, dv = .(PSS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PSS_Res2 = data.frame("Residuals" = (proj(PSS_ANOVA2$aov)[[3]][, "Residuals"]))

Visualize the residuals with a q-q plot:

qqnorm(PSS_Res2$Residuals, main = "Q-Q Plot of PSS Residuals")
qqline(PSS_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

Visualize the residuals with a histogram:

qplot(PSS_Res2$Residuals, main = "Histogram of PSS Residuals", binwidth = .5)

The residuals appear to follow the shape of a normal distribution.

Conduct a Shapiro-Wilk test:

PSS_Shap2 = shapiro.test(PSS_Res2$Residuals)
PSS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res2$Residuals
## W = 0.99669, p-value = 0.9933

Based on an alpha level of .05, the assumption of normality is met; W = 1, p = 0.99.

  1. Homogeneity of Variance for Between-Group Factors

This assumption can be tested by implementing a Levene’s test on scores collapsed across the within-group factor (i.e. Time).

# Create a data frame of scores collapsed across time:

PSSAvg2 = data.frame("Condition" = Data2$Condition, "PSS_Avg" = ((Data2$T1_PSS + Data2$T2_PSS)/2))

# Conduct the Levene's test:

PSS_Lev2 = leveneTest(data = PSSAvg2, PSS_Avg ~ Condition, center = median)
PSS_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.7131 0.1955
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 1.71, p = 0.2.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(PSS_ANOVA2$ANOVA, digits = 4,
      caption = "Table 56. Mixed ANOVA on Perceived Stress Scale scores for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 56. Mixed ANOVA on Perceived Stress Scale scores for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 188718.9744 6589.5176 1746.9955 0.0000
0.9614
Condition 1 61 39.4506 6589.5176 0.3652 0.5479 0.0052
Time 1 61 471.2473 984.1971 29.2077 0.0000
0.0586
Condition:Time 1 61 220.8029 984.1971 13.6852 0.0005
0.0283
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 13.69, p < .001, \(\eta^2_{G}\) = 0.03.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of time across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on PSS score for each condition separately. (Note that a t-test is used in this case instead of an ANOVA because we are comparing across only two within-group levels rather than three.) Note that, in order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

Before we begin, we’ll define control and experimental subsets:

# Control:

Con2 = subset(Long2, Condition == "Control")

# Experimental:

Exp2 = subset(Long2, Condition == "Experimental")
Control Assumptions

The paired t-test makes two primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality

This assumption can be tested by visualizing and applying a Shapiro-Wilk test to the residuals (which can be calculated from the model that is being tested).

# Define the model:

PSS_C_Mod2 = lm(Con2$PSS ~ Con2$Time) 

# Calculate residuals:

PSS_C_Res2 = resid(PSS_C_Mod2)

Visualize the residuals with a q-q plot:

qqnorm(PSS_C_Res2, main = "Q-Q Plot of PSS Con. Residuals")
qqline(PSS_C_Res2)

The residuals appear to be slightly skewed on each end.

Visualize the residuals with a histogram:

qplot(PSS_C_Res2, main = "Histogram of PSS Con. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

Conduct a Shapiro-Wilk test:

PSS_C_Shap2 = shapiro.test(PSS_C_Res2)
PSS_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_C_Res2
## W = 0.97783, p-value = 0.1914

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.19.

Control T-Test
# Run the t-test:

PSS_C_T2 = t.test(data = Con2, PSS ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

PSS_C_d2 = cohen.d(data = Con2, PSS ~ Time, paired = TRUE)
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PSS_E_Mod2 = lm(Exp2$PSS ~ Exp2$Time) 

# Calculate residuals:

PSS_E_Res2 = resid(PSS_E_Mod2)
qqnorm(PSS_E_Res2, main = "Q-Q Plot of PSS Exp. Residuals")
qqline(PSS_E_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PSS_E_Res2, main = "Histogram of PSS Exp. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

Conduct a Shapiro-Wilk test:

PSS_E_Shap2 = shapiro.test(PSS_E_Res2)
PSS_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_E_Res2
## W = 0.95923, p-value = 0.09395

Based on an alpha level of .05, the assumption of normality is met; W = 0.96, p = 0.09.

Experimental T-Test
# Run the t-test:

PSS_E_T2 = t.test(data = Exp2, PSS ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

PSS_E_d2 = cohen.d(data = Exp2, PSS ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

PSS_Corr_ps2a = data.frame("p" = c(PSS_C_T2$p.value, PSS_E_T2$p.value))

# Perform p-adjustment:

PSS_Corr_ps2b = p.adjust(PSS_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

PSS_C_Corr2 = data.frame("Condition" = "Control", "DF" = PSS_C_T2$parameter, "T" = PSS_C_T2$statistic, "p" = round(PSS_Corr_ps2b[1], 4), "d" = PSS_C_d2$estimate)

# Create a data frame for the experimental condition:

PSS_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = PSS_E_T2$parameter, "T" = PSS_E_T2$statistic, "p" = round(PSS_Corr_ps2b[2], 4), "d" = PSS_E_d2$estimate)

# Combine both data frames into one:

PSS_CE_Corr2 = rbind(PSS_C_Corr2, PSS_E_Corr2)

# Format the results table so that significant p-values will be bolded:

PSS_CE_CorrB2 = PSS_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(PSS_CE_CorrB2, digits = 4,
      caption = "Table 57. Tests of simple main effects on Perceived Stress Scale scores for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 57. Tests of simple main effects on Perceived Stress Scale scores for participants who completed the first two surveys.
Condition DF T p d
Control 38 1.4304 0.1608 0.2290
Experimental 23 5.4874 0 1.1201

The main effect of time was not found to be statistically significant for participants in the control condition; t (38) = 1.43, p = 0.16, d = 0.23. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t (23) = 5.49, p < .001, d = 1.12. In particular, for those in the experimental condition, T2 scores (MT2 = 35.92, SDT2 = 7.06) on the PSS were significantly lower than T1 scores (MT1 = 42.62, SDT1 = 7.08).

Positive and Negative Affect Schedule

Descriptive Statistics

# PANAS-Positive:

POS_PANAS2 = summarySE(data = Long2, measurevar = "POS_PANAS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# PANAS-Negative:

NEG_PANAS2 = summarySE(data = Long2, measurevar = "NEG_PANAS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(POS_PANAS2)[colnames(POS_PANAS2) == "POS_PANAS"] = "M"
colnames(NEG_PANAS2)[colnames(NEG_PANAS2) == "NEG_PANAS"] = "M"

# Combine these variables into a single data frame:

PANASDesc2 = data.frame(rbind(POS_PANAS2, NEG_PANAS2))

# Create a table to display the results:

kable(PANASDesc2, digits = 4, caption = "Table 58. Scores on the Positive and Negative Affect Schedule by condition and time for participants who completed the first two surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Positive Affect", 1, 4) %>%
  group_rows("Negative Affect", 5, 8)
Table 58. Scores on the Positive and Negative Affect Schedule by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Positive Affect
Control T1 39 32.8718 6.3253 1.0129 2.0504
Control T2 39 32.2821 5.8487 0.9365 1.8959
Experimental T1 24 31.3750 7.6886 1.5694 3.2466
Experimental T2 24 34.2083 7.9945 1.6319 3.3758
Negative Affect
Control T1 39 24.0256 8.9103 1.4268 2.8884
Control T2 39 23.1795 8.0944 1.2961 2.6239
Experimental T1 24 24.7500 8.6941 1.7747 3.6712
Experimental T2 24 20.5000 7.4949 1.5299 3.1648

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the positive affect plot.
# Calculate SE min:

PANASPMin2 = data.frame("PANASPMin" = POS_PANAS2$M - POS_PANAS2$se)

# Calculate SE max:

PANASPMax2 = data.frame("PANASPMax" = POS_PANAS2$M + POS_PANAS2$se)

# Create data frame of values to be used:

PANASPlot2 = data.frame("Condition" = POS_PANAS2$Condition, "Time" = POS_PANAS2$Time,
                    "PANASPMean" = POS_PANAS2$M, "PANASPMin" = PANASPMin2, "PANASPMax" = PANASPMax2)
  1. Create the positive affect plot.
# Create the plot:

PANASPFig2 = (Long2 %>%
  ggplot(aes(Time, POS_PANAS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASPlot2,
    aes(Time, PANASPMean, ymin = PANASPMin, ymax = PANASPMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Positive Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the negative affect plot.
# Calculate SE min:

PANASNMin2 = data.frame("PANASNMin" = NEG_PANAS2$M - NEG_PANAS2$se)

# Calculate SE max:

PANASNMax2 = data.frame("PANASNMax" = NEG_PANAS2$M + NEG_PANAS2$se)

# Create data frame of values to be used:

PANASNPlot2 = data.frame("Condition" = NEG_PANAS2$Condition, "Time" = NEG_PANAS2$Time,
                    "PANASNMean" = NEG_PANAS2$M, "PANASNMin" = PANASNMin2, "PANASNMax" = PANASNMax2)
  1. Create the negative affect plot.
# Create the plot:

PANASNFig2 = (Long2 %>%
  ggplot(aes(Time, NEG_PANAS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASNPlot2,
    aes(Time, PANASNMean, ymin = PANASNMin, ymax = PANASNMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Negative Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  1. Create a caption.
PANASCap2 = "Figure 8. Distributions of scores on the positive (a) and negative (b) affect subscales of the Positive And Negative Affect Schedule (PANAS) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
PANASCap2 = paste0(strwrap(PANASCap2, width = 105), collapse = "\n")
  1. Display the figure.
PANASFig2 = grid.arrange(PANASPFig2 + theme(legend.position = "hidden"), PANASNFig2 + theme(legend.position = "hidden"), SharedLeg, nrow = 1, widths = c(1.1, 1.1, .5), bottom = textGrob(PANASCap2, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Positive Affect

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

PANASP_ANOVA2 = ezANOVA(data = Long2, dv = .(POS_PANAS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PANASP_Res2 = data.frame("Residuals" = (proj(PANASP_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(PANASP_Res2$Residuals, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PANASP_Res2$Residuals, main = "Histogram of PANAS-P Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

PANASP_Shap2 = shapiro.test(PANASP_Res2$Residuals)
PANASP_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res2$Residuals
## W = 0.99281, p-value = 0.7684

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.77.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

PANASPAvg2 = data.frame("Condition" = Data2$Condition, "PANASP_Avg" = ((Data2$T1_POS_PANAS + Data2$T2_POS_PANAS)/2))

# Conduct the Levene's test:

PANASP_Lev2 = leveneTest(data = PANASPAvg2, PANASP_Avg ~ Condition, center = median)
PANASP_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.6242 0.2073
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 1.62, p = 0.21.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(PANASP_ANOVA2$ANOVA, digits = 4,
      caption = "Table 59. Mixed ANOVA on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 59. Mixed ANOVA on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 126970.7036 4970.4551 1558.2502 0.0000
0.9574
Condition 1 61 1.3703 4970.4551 0.0168 0.8972 0.0002
Time 1 61 37.3932 679.3846 3.3574 0.0718 0.0066
Condition:Time 1 61 87.0440 679.3846 7.8154 0.0069
0.0152
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 7.82, p = 0.01, \(\eta^2_{G}\) = 0.02.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on PANAS-Positive score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASP_C_Mod2 = lm(Con2$POS_PANAS ~ Con2$Time) 

# Calculate residuals:

PANASP_C_Res2 = resid(PANASP_C_Mod2)
qqnorm(PANASP_C_Res2, main = "Q-Q Plot of PANAS-P Con. Residuals")
qqline(PANASP_C_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PANASP_C_Res2, main = "Histogram of PANAS-P Con. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

PANASP_C_Shap2 = shapiro.test(PANASP_C_Res2)
PANASP_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_C_Res2
## W = 0.98719, p-value = 0.6279

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.63.

Control T-Test
# Run the t-test:

PANASP_C_T2 = t.test(data = Con2, POS_PANAS ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

PANASP_C_d2 = cohen.d(data = Con2, POS_PANAS ~ Time, paired = TRUE)
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASP_E_Mod2 = lm(Exp2$POS_PANAS ~ Exp2$Time) 

# Calculate residuals:

PANASP_E_Res2 = resid(PANASP_E_Mod2)
qqnorm(PANASP_E_Res2, main = "Q-Q Plot of PANAS-P Exp. Residuals")
qqline(PANASP_E_Res2)

The residuals appear to be slightly skewed to the left.

qplot(PANASP_E_Res2, main = "Histogram of PANAS-P Exp. Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the left.

PANASP_E_Shap2 = shapiro.test(PANASP_E_Res2)
PANASP_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_E_Res2
## W = 0.93435, p-value = 0.009896

Based on an alpha level of .05, the assumption of normality is not met; W = 0.93, p = 0.01. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Experimental Test
PANASP_E_W2 = wilcoxsign_test(data = Exp2, POS_PANAS ~ Time | (as.factor(Subject)), distribution = "exact")
PANASP_E_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -2.5094, p-value = 0.01042
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASP_E_r2 = WilcoxEff(abs(unname(PANASP_E_W2@statistic@teststatistic)), (length(Exp2$POS_PANAS)/2))
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

PANASP_Corr_ps2a = data.frame("p" = c(PANASP_C_T2$p.value, PANASP_E_W2@distribution@pvalue(PANASP_E_W2@statistic@teststatistic)))

# Perform p-adjustment:

PANASP_Corr_ps2b = p.adjust(PANASP_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

PANASP_C_Corr2 = data.frame("Condition" = "Control", "DF" = PANASP_C_T2$parameter, "Test Stat" = round(PANASP_C_T2$statistic, 4), "p" = round(PANASP_Corr_ps2b[1], 4), "Effect Size" = PANASP_C_d2$estimate)

# Create a data frame for the experimental condition:

PANASP_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = as.numeric(""), "Test Stat" = PANASP_E_W2@statistic@teststatistic, "p" = round(PANASP_Corr_ps2b[2], 4), "Effect Size" = PANASP_E_r2)

# Combine both data frames into one:

PANASP_CE_Corr2 = rbind(PANASP_C_Corr2, PANASP_E_Corr2)

# Format the results table so that significant p-values will be bolded:

PANASP_CE_CorrB2 = PANASP_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(PANASP_CE_CorrB2, digits = 4,
      caption = "Table 60. Tests of simple main effects on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 60. Tests of simple main effects on scores of the positive affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.
Condition DF Test.Stat p Effect.Size
Control 38 0.7902 0.4343 0.1265
Experimental NA -2.5094 0.0208 0.5122

The main effect of time was not found to be statistically significant for participants in the control condition; t (38) = 0.79, p = 0.43, d = 0.13. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; Z = -2.51, p = 0.02, r = 0.51. In particular, for those in the experimental condition, T2 scores (MT2 = 34.21, SDT2 = 7.99) on the PANAS-Positive were significantly higher than T1 scores (MT1 = 31.38, SDT1 = 7.69).

Mixed ANOVA - Negative Affect

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

PANASN_ANOVA2 = ezANOVA(data = Long2, dv = .(NEG_PANAS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

PANASN_Res2 = data.frame("Residuals" = (proj(PANASN_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(PANASN_Res2$Residuals, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(PANASN_Res2$Residuals, main = "Histogram of PANAS-N Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

PANASN_Shap2 = shapiro.test(PANASN_Res2$Residuals)
PANASN_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res2$Residuals
## W = 0.98121, p-value = 0.07738

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.08.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

PANASNAvg2 = data.frame("Condition" = Data2$Condition, "PANASN_Avg" = ((Data2$T1_NEG_PANAS + Data2$T2_NEG_PANAS)/2))

# Conduct the Levene's test:

PANASN_Lev2 = leveneTest(data = PANASNAvg2, PANASN_Avg ~ Condition, center = median)
PANASN_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.1064 0.7454
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.11, p = 0.75.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(PANASN_ANOVA2$ANOVA, digits = 4,
      caption = "Table 61. Mixed ANOVA on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 61. Mixed ANOVA on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 63499.0626 7846.4295 493.6567 0.0000
0.8815
Condition 1 61 28.3959 7846.4295 0.2208 0.6401 0.0033
Time 1 61 192.9258 690.7885 17.0363 0.0001
0.0221
Condition:Time 1 61 86.0687 690.7885 7.6003 0.0077
0.0100
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 7.6, p = 0.01, \(\eta^2_{G}\) = 0.01.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on PANAS-Negative score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASN_C_Mod2 = lm(Con2$NEG_PANAS ~ Con2$Time) 

# Calculate residuals:

PANASN_C_Res2 = resid(PANASN_C_Mod2)
qqnorm(PANASN_C_Res2, main = "Q-Q Plot of PANAS-N Con. Residuals")
qqline(PANASN_C_Res2)

The residuals appear to be slightly skewed to the right.

qplot(PANASN_C_Res2, main = "Histogram of PANAS-N Con. Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the right.

PANASN_C_Shap2 = shapiro.test(PANASN_C_Res2)
PANASN_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_C_Res2
## W = 0.92168, p-value = 0.0001392

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Control Test
PANASN_C_W2 = wilcoxsign_test(data = Con2, NEG_PANAS ~ Time | (as.factor(Subject)), distribution = "exact")
PANASN_C_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 0.55403, p-value = 0.5859
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASN_C_r2 = WilcoxEff(abs(unname(PANASN_C_W2@statistic@teststatistic)), (length(Con2$NEG_PANAS)/2))
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASN_E_Mod2 = lm(Exp2$NEG_PANAS ~ Exp2$Time) 

# Calculate residuals:

PANASN_E_Res2 = resid(PANASN_E_Mod2)
qqnorm(PANASN_E_Res2, main = "Q-Q Plot of PANAS-N Exp. Residuals")
qqline(PANASN_E_Res2)

The residuals appear to be slightly skewed to the right.

qplot(PANASN_E_Res2, main = "Histogram of PANAS-N Exp. Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the right.

PANASN_E_Shap2 = shapiro.test(PANASN_E_Res2)
PANASN_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_E_Res2
## W = 0.91673, p-value = 0.002284

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p = 0.002. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Experimental Test
PANASN_E_W2 = wilcoxsign_test(data = Exp2, NEG_PANAS ~ Time | (as.factor(Subject)), distribution = "exact")
PANASN_E_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 3.6098, p-value = 0.00008869
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASN_E_r2 = WilcoxEff(abs(unname(PANASN_E_W2@statistic@teststatistic)), (length(Exp2$NEG_PANAS)/2))
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

PANASN_Corr_ps2a = data.frame("p" = c(PANASN_C_W2@distribution@pvalue(PANASN_C_W2@statistic@teststatistic), PANASN_E_W2@distribution@pvalue(PANASN_E_W2@statistic@teststatistic)))

# Perform p-adjustment:

PANASN_Corr_ps2b = p.adjust(PANASN_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

PANASN_C_Corr2 = data.frame("Condition" = "Control", "Z" = PANASN_C_W2@statistic@teststatistic, "p" = round(PANASN_Corr_ps2b[1], 4), "r" = PANASN_C_r2)

# Create a data frame for the experimental condition:

PANASN_E_Corr2 = data.frame("Condition" = "Experimental", "Z" = PANASN_E_W2@statistic@teststatistic, "p" = round(PANASN_Corr_ps2b[2], 4), "r" = PANASN_E_r2)

# Combine both data frames into one:

PANASN_CE_Corr2 = rbind(PANASN_C_Corr2, PANASN_E_Corr2)

# Format the results table so that significant p-values will be bolded:

PANASN_CE_CorrB2 = PANASN_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(PANASN_CE_CorrB2, digits = 4,
      caption = "Table 62. Tests of simple main effects on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 62. Tests of simple main effects on scores of the negative affect subscale of the Positive And Negative Affect Schedule for participants who completed the first two surveys.
Condition Z p r
Control 0.5540 0.5859 0.0887
Experimental 3.6098 0.0002 0.7368

The main effect of time was not found to be statistically significant for participants in the control condition; Z = 0.55, p = 0.59, r = 0.09. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; Z = 3.61, p < .001, r = 0.74. In particular, for those in the experimental condition, T2 scores (MT2 = 20.5, SDT2 = 7.49) on the PANAS-Negative were significantly lower than T1 scores (MT1 = 24.75, SDT1 = 8.69).

Brief Resilience Scale

Descriptive Statistics

# Calculate summary statistics
BRSDesc2 = summarySE(data = Long2, measurevar = "BRS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(BRSDesc2, digits = 4,
      caption = "Table 63. Scores on the Brief Resilience Scale by condition and time for participants who completed the first two surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 63. Scores on the Brief Resilience Scale by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Control T1 39 3.4402 0.7585 0.1215 0.2459
Control T2 39 3.5214 0.8309 0.1330 0.2693
Experimental T1 24 3.2986 0.8090 0.1651 0.3416
Experimental T2 24 3.5833 0.8498 0.1735 0.3589

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

BRSMin2 = data.frame("BRSMin" = BRSDesc2$BRS - BRSDesc2$se)

# Calculate SE max:

BRSMax2 = data.frame("BRSMax" = BRSDesc2$BRS + BRSDesc2$se)

# Create data frame of values to be used:

BRSPlot2 = data.frame("Condition" = BRSDesc2$Condition, "Time" = BRSDesc2$Time,
                    "BRSMean" = BRSDesc2$BRS, "BRSMin" = BRSMin2, "BRSMax" = BRSMax2)
  1. Plot the data.
# Create a figure caption:

BRSCap2 = "Figure 9. Distributions of scores on the Brief Resilience Scale (BRS) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
BRSCap2 = paste0(strwrap(BRSCap2, width = 60), collapse = "\n")

# Create the plot:

BRSFig2 = (Long2 %>%
  ggplot(aes(Time, BRS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = BRSPlot2,
    aes(Time, BRSMean, ymin = BRSMin, ymax = BRSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "BRS Score",
       fill = "Condition", caption = BRSCap2) +

  # Define variable colours and theme:
  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
BRSFig2

Mixed ANOVA

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

BRS_ANOVA2 = ezANOVA(data = Long2, dv = .(BRS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

BRS_Res2 = data.frame("Residuals" = (proj(BRS_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(BRS_Res2$Residuals, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(BRS_Res2$Residuals, main = "Histogram of BRS Residuals", binwidth = .1)

The residuals appear to follow the shape of a normal distribution.

BRS_Shap2 = shapiro.test(BRS_Res2$Residuals)
BRS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res2$Residuals
## W = 0.98943, p-value = 0.4483

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.45.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

BRSAvg2 = data.frame("Condition" = Data2$Condition, "BRS_Avg" = ((Data2$T1_BRS + Data2$T2_BRS)/2))

# Conduct the Levene's test:

BRS_Lev2 = leveneTest(data = BRSAvg2, BRS_Avg ~ Condition, center = median)
BRS_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0368 0.8485
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.04, p = 0.85.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(BRS_ANOVA2$ANOVA, digits = 4,
      caption = "Table 64. Mixed ANOVA on Brief Resilience Scale scores for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 64. Mixed ANOVA on Brief Resilience Scale scores for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 1423.6264 73.2761 1185.1228 0.0000
0.9469
Condition 1 61 0.0471 73.2761 0.0392 0.8438 0.0006
Time 1 61 0.9947 6.4820 9.3605 0.0033
0.0123
Condition:Time 1 61 0.3077 6.4820 2.8958 0.0939 0.0038
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1, 61) = 2.9, p = 0.09, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 61) = 0.04, p = 0.84, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was found to be statistically significant; F (1, 61) = 9.36, p = 0.003, \(\eta^2_{G}\) = 0.01. In particular, T2 scores (MT2 = 3.54, SDT2 = 0.83) on the BRS were significantly higher than T1 scores (MT1 = 3.39, SDT1 = 0.77).

Five Facet Mindfulness Questionnaire

Descriptive Statistics

# FFMQ-Non-Reactivity:

NR_FFMQ2 = summarySE(data = Long2, measurevar = "NR_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Observing:

OB_FFMQ2 = summarySE(data = Long2, measurevar = "OB_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Acting with Awareness:

AA_FFMQ2 = summarySE(data = Long2, measurevar = "AA_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Describing:

DS_FFMQ2 = summarySE(data = Long2, measurevar = "DS_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Non-Judging:

NJ_FFMQ2 = summarySE(data = Long2, measurevar = "NJ_FFMQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(NR_FFMQ2)[colnames(NR_FFMQ2) == "NR_FFMQ"] = "M"
colnames(OB_FFMQ2)[colnames(OB_FFMQ2) == "OB_FFMQ"] = "M"
colnames(AA_FFMQ2)[colnames(AA_FFMQ2) == "AA_FFMQ"] = "M"
colnames(DS_FFMQ2)[colnames(DS_FFMQ2) == "DS_FFMQ"] = "M"
colnames(NJ_FFMQ2)[colnames(NJ_FFMQ2) == "NJ_FFMQ"] = "M"

# Combine these variables into a single data frame:

FFMQDesc2 = data.frame(rbind(NR_FFMQ2, OB_FFMQ2, AA_FFMQ2, DS_FFMQ2, NJ_FFMQ2))

# Create a table to display the results:

kable(FFMQDesc2, digits = 4, caption = "Table 65. Scores on the Five Facet Mindfulness Questionnaire by condition and time for participants who completed the first two surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Non-Reactivity", 1, 4) %>%
  group_rows("Observing", 5, 8) %>%
  group_rows("Acting with Awareness", 9, 12) %>%
  group_rows("Describing", 13, 16) %>%
  group_rows("Non-Judging", 17, 20)
Table 65. Scores on the Five Facet Mindfulness Questionnaire by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Non-Reactivity
Control T1 39 14.1795 3.5973 0.5760 1.1661
Control T2 39 14.6923 3.5626 0.5705 1.1549
Experimental T1 24 13.7917 3.7298 0.7613 1.5749
Experimental T2 24 15.9583 3.9506 0.8064 1.6682
Observing
Control T1 39 13.4872 3.3077 0.5296 1.0722
Control T2 39 13.1282 2.9663 0.4750 0.9616
Experimental T1 24 11.8750 3.3273 0.6792 1.4050
Experimental T2 24 13.7500 2.7067 0.5525 1.1429
Acting with Awareness
Control T1 39 15.3846 3.8362 0.6143 1.2436
Control T2 39 15.9744 4.1453 0.6638 1.3438
Experimental T1 24 13.4583 3.1344 0.6398 1.3235
Experimental T2 24 15.6250 3.2143 0.6561 1.3573
Describing
Control T1 39 17.8974 3.6259 0.5806 1.1754
Control T2 39 18.1538 4.2211 0.6759 1.3683
Experimental T1 24 17.9583 2.4931 0.5089 1.0527
Experimental T2 24 18.3750 3.3468 0.6832 1.4132
Non-Judging
Control T1 39 16.9487 4.7237 0.7564 1.5312
Control T2 39 17.3077 5.0218 0.8041 1.6279
Experimental T1 24 15.2917 4.2064 0.8586 1.7762
Experimental T2 24 17.0833 3.5376 0.7221 1.4938

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-reactivity plot.
# Calculate SE min:

FFMQNRMin2 = data.frame("FFMQNRMin" = NR_FFMQ2$M - NR_FFMQ2$se)

# Calculate SE max:

FFMQNRMax2 = data.frame("FFMQNRMax" = NR_FFMQ2$M + NR_FFMQ2$se)

# Create data frame of values to be used:

FFMQNRPlot2 = data.frame("Condition" = NR_FFMQ2$Condition, "Time" = NR_FFMQ2$Time,
                    "FFMQNRMean" = NR_FFMQ2$M, "FFMQNRMin" = FFMQNRMin2, "FFMQNRMax" = FFMQNRMax2)
  1. Create the non-reactivity plot.
# Create the plot:

FFMQNRFig2 = (Long2 %>%
  ggplot(aes(Time, NR_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNRPlot2,
    aes(Time, FFMQNRMean, ymin = FFMQNRMin, ymax = FFMQNRMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Reactivity Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the observing plot.
# Calculate SE min:

FFMQOBMin2 = data.frame("FFMQOBMin" = OB_FFMQ2$M - OB_FFMQ2$se)

# Calculate SE max:

FFMQOBMax2 = data.frame("FFMQOBMax" = OB_FFMQ2$M + OB_FFMQ2$se)

# Create data frame of values to be used:

FFMQOBPlot2 = data.frame("Condition" = OB_FFMQ2$Condition, "Time" = OB_FFMQ2$Time,
                    "FFMQOBMean" = OB_FFMQ2$M, "FFMQOBMin" = FFMQOBMin2, "FFMQOBMax" = FFMQOBMax2)
  1. Create the observing plot.
# Create the plot:

FFMQOBFig2 = (Long2 %>%
  ggplot(aes(Time, OB_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQOBPlot2,
    aes(Time, FFMQOBMean, ymin = FFMQOBMin, ymax = FFMQOBMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Observing Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the awareness plot.
# Calculate SE min:

FFMQAAMin2 = data.frame("FFMQAAMin" = AA_FFMQ2$M - AA_FFMQ2$se)

# Calculate SE max:

FFMQAAMax2 = data.frame("FFMQAAMax" = AA_FFMQ2$M + AA_FFMQ2$se)

# Create data frame of values to be used:

FFMQAAPlot2 = data.frame("Condition" = AA_FFMQ2$Condition, "Time" = AA_FFMQ2$Time,
                    "FFMQAAMean" = AA_FFMQ2$M, "FFMQAAMin" = FFMQAAMin2, "FFMQAAMax" = FFMQAAMax2)
  1. Create the awareness plot.
# Create the plot:

FFMQAAFig2 = (Long2 %>%
  ggplot(aes(Time, AA_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQAAPlot2,
    aes(Time, FFMQAAMean, ymin = FFMQAAMin, ymax = FFMQAAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Awareness Score",
       fill = "Condition") + ggtitle("c") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the describing plot.
# Calculate SE min:

FFMQDSMin2 = data.frame("FFMQDSMin" = DS_FFMQ2$M - DS_FFMQ2$se)

# Calculate SE max:

FFMQDSMax2 = data.frame("FFMQDSMax" = DS_FFMQ2$M + DS_FFMQ2$se)

# Create data frame of values to be used:

FFMQDSPlot2 = data.frame("Condition" = DS_FFMQ2$Condition, "Time" = DS_FFMQ2$Time,
                    "FFMQDSMean" = DS_FFMQ2$M, "FFMQDSMin" = FFMQDSMin2, "FFMQDSMax" = FFMQDSMax2)
  1. Create the describing plot.
# Create the plot:

FFMQDSFig2 = (Long2 %>%
  ggplot(aes(Time, DS_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQDSPlot2,
    aes(Time, FFMQDSMean, ymin = FFMQDSMin, ymax = FFMQDSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Describing Score",
       fill = "Condition") + ggtitle("d") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-judging plot.
# Calculate SE min:

FFMQNJMin2 = data.frame("FFMQNJMin" = NJ_FFMQ2$M - NJ_FFMQ2$se)

# Calculate SE max:

FFMQNJMax2 = data.frame("FFMQNJMax" = NJ_FFMQ2$M + NJ_FFMQ2$se)

# Create data frame of values to be used:

FFMQNJPlot2 = data.frame("Condition" = NJ_FFMQ2$Condition, "Time" = NJ_FFMQ2$Time,
                    "FFMQNJMean" = NJ_FFMQ2$M, "FFMQNJMin" = FFMQNJMin2, "FFMQNJMax" = FFMQNJMax2)
  1. Create the non-judging plot.
# Create the plot:

FFMQNJFig2 = (Long2 %>%
  ggplot(aes(Time, NJ_FFMQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNJPlot2,
    aes(Time, FFMQNJMean, ymin = FFMQNJMin, ymax = FFMQNJMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Judging Score",
       fill = "Condition") + ggtitle("e") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
FFMQCap2 = "Figure 10. Distributions of scores on the non-reactivity (a), observing (b), awareness (c), describing (d), and non-judging (e) subscales of the Five Facet Mindfulness Questionnaire (FFMQ) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
FFMQCap2 = paste0(strwrap(FFMQCap2, width = 95), collapse = "\n")
  1. Define the figure layout
FFMQLayout2 = rbind(c("FFMQAAFig2", "FFMQDSFig2"),
                      c("FFMQNJFig2", "FFMQNRFig2"),
                      c("FFMQOBFig2", "SharedLeg"))
  1. Display the figure.
FFMQFig2 = grid.arrange(FFMQNRFig2, FFMQOBFig2, FFMQAAFig2, FFMQDSFig2, FFMQNJFig2, SharedLeg, layout_matrix = FFMQLayout2, bottom = textGrob(FFMQCap2, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Non-Reactivity

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQNR_ANOVA2 = ezANOVA(data = Long2, dv = .(NR_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQNR_Res2 = data.frame("Residuals" = (proj(FFMQNR_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(FFMQNR_Res2$Residuals, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res2$Residuals)

The residuals appear to be slightly skewed.

qplot(FFMQNR_Res2$Residuals, main = "Histogram of FFMQ-NR Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

FFMQNR_Shap2 = shapiro.test(FFMQNR_Res2$Residuals)
FFMQNR_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res2$Residuals
## W = 0.96888, p-value = 0.005289

Based on an alpha level of .05, the assumption of normality is not met; W = 0.97, p = 0.01.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQNRAvg2 = data.frame("Condition" = Data2$Condition, "FFMQNR_Avg" = ((Data2$T1_NR_FFMQ + Data2$T2_NR_FFMQ)/2))

# Conduct the Levene's test:

FFMQNR_Lev2 = leveneTest(data = FFMQNRAvg2, FFMQNR_Avg ~ Condition, center = median)
FFMQNR_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1    0.02 0.8879
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.02, p = 0.89.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(FFMQNR_ANOVA2$ANOVA, digits = 4,
      caption = "Table 66. Mixed ANOVA on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 66. Mixed ANOVA on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 25528.3959 1348.4295 1154.8488 0.0000
0.9392
Condition 1 61 5.7292 1348.4295 0.2592 0.6125 0.0035
Time 1 61 53.3346 304.5385 10.6831 0.0018
0.0313
Condition:Time 1 61 20.3187 304.5385 4.0699 0.0481
0.0121
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 4.07, p = 0.05, \(\eta^2_{G}\) = 0.01.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on FFMQ-Non-Reactivity score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNR_C_Mod2 = lm(Con2$NR_FFMQ ~ Con2$Time) 

# Calculate residuals:

FFMQNR_C_Res2 = resid(FFMQNR_C_Mod2)
qqnorm(FFMQNR_C_Res2, main = "Q-Q Plot of FFMQ-NR Con. Residuals")
qqline(FFMQNR_C_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNR_C_Res2, main = "Histogram of FFMQ-NR Con. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNR_C_Shap2 = shapiro.test(FFMQNR_C_Res2)
FFMQNR_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_C_Res2
## W = 0.97324, p-value = 0.09941

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.1.

Control T-Test
# Run the t-test:

FFMQNR_C_T2 = t.test(data = Con2, NR_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQNR_C_d2 = cohen.d(data = Con2, NR_FFMQ ~ Time, paired = TRUE)
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNR_E_Mod2 = lm(Exp2$NR_FFMQ ~ Exp2$Time) 

# Calculate residuals:

FFMQNR_E_Res2 = resid(FFMQNR_E_Mod2)
qqnorm(FFMQNR_E_Res2, main = "Q-Q Plot of FFMQ-NR Exp. Residuals")
qqline(FFMQNR_E_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNR_E_Res2, main = "Histogram of FFMQ-NR Exp. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNR_E_Shap2 = shapiro.test(FFMQNR_E_Res2)
FFMQNR_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_E_Res2
## W = 0.97348, p-value = 0.3441

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.34.

Experimental T-Test
# Run the t-test:

FFMQNR_E_T2 = t.test(data = Exp2, NR_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQNR_E_d2 = cohen.d(data = Exp2, NR_FFMQ ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

FFMQNR_Corr_ps2a = data.frame("p" = c(FFMQNR_C_T2$p.value, FFMQNR_E_T2$p.value))

# Perform p-adjustment:

FFMQNR_Corr_ps2b = p.adjust(FFMQNR_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

FFMQNR_C_Corr2 = data.frame("Condition" = "Control", "DF" = FFMQNR_C_T2$parameter, "T" = FFMQNR_C_T2$statistic, "p" = round(FFMQNR_Corr_ps2b[1], 4), "d" = FFMQNR_C_d2$estimate)

# Create a data frame for the experimental condition:

FFMQNR_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = FFMQNR_E_T2$parameter, "T" = FFMQNR_E_T2$statistic, "p" = round(FFMQNR_Corr_ps2b[2], 4), "d" = FFMQNR_E_d2$estimate)

# Combine both data frames into one:

FFMQNR_CE_Corr2 = rbind(FFMQNR_C_Corr2, FFMQNR_E_Corr2)

# Format the results table so that significant p-values will be bolded:

FFMQNR_CE_CorrB2 = FFMQNR_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(FFMQNR_CE_CorrB2, digits = 4,
      caption = "Table 67. Tests of simple main effects on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 67. Tests of simple main effects on scores of the non-reactivity subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Condition DF T p d
Control 38 -1.2645 0.2137 -0.2025
Experimental 23 -2.6633 0.0278 -0.5436

The main effect of time was not found to be statistically significant for participants in the control condition; t (38) = -1.26, p = 0.21, d = -0.2. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t (23) = -2.66, p = 0.03, d = -0.54. In particular, for those in the experimental condition, T2 scores (MT2 = 15.96, SDT2 = 3.95) on the FFMQ-Non-Reactivity were significantly higher than T1 scores (MT1 = 13.79, SDT1 = 3.73).

Mixed ANOVA - Observing

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQOB_ANOVA2 = ezANOVA(data = Long2, dv = .(OB_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQOB_Res2 = data.frame("Residuals" = (proj(FFMQOB_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(FFMQOB_Res2$Residuals, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_Res2$Residuals, main = "Histogram of FFMQ-OB Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_Shap2 = shapiro.test(FFMQOB_Res2$Residuals)
FFMQOB_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res2$Residuals
## W = 0.99376, p-value = 0.8537

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.85.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQOBAvg2 = data.frame("Condition" = Data2$Condition, "FFMQOB_Avg" = ((Data2$T1_OB_FFMQ + Data2$T2_OB_FFMQ)/2))

# Conduct the Levene's test:

FFMQOB_Lev2 = leveneTest(data = FFMQOBAvg2, FFMQOB_Avg ~ Condition, center = median)
FFMQOB_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.1643 0.6866
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.16, p = 0.69.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(FFMQOB_ANOVA2$ANOVA, digits = 4,
      caption = "Table 68. Mixed ANOVA on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 68. Mixed ANOVA on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 20273.0007 1088.4279 1136.1828 0.0000
0.9453
Condition 1 61 7.2864 1088.4279 0.4084 0.5252 0.0062
Time 1 61 17.0733 84.7997 12.2816 0.0009
0.0143
Condition:Time 1 61 37.0733 84.7997 26.6684 0.0000
0.0306
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 26.67, p < .001, \(\eta^2_{G}\) = 0.03.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on FFMQ-Observing score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQOB_C_Mod2 = lm(Con2$OB_FFMQ ~ Con2$Time) 

# Calculate residuals:

FFMQOB_C_Res2 = resid(FFMQOB_C_Mod2)
qqnorm(FFMQOB_C_Res2, main = "Q-Q Plot of FFMQ-OB Con. Residuals")
qqline(FFMQOB_C_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_C_Res2, main = "Histogram of FFMQ-OB Con. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_C_Shap2 = shapiro.test(FFMQOB_C_Res2)
FFMQOB_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_C_Res2
## W = 0.97409, p-value = 0.1124

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.11.

Control T-Test
# Run the t-test:

FFMQOB_C_T2 = t.test(data = Con2, OB_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQOB_C_d2 = cohen.d(data = Con2, OB_FFMQ ~ Time, paired = TRUE)
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQOB_E_Mod2 = lm(Exp2$OB_FFMQ ~ Exp2$Time) 

# Calculate residuals:

FFMQOB_E_Res2 = resid(FFMQOB_E_Mod2)
qqnorm(FFMQOB_E_Res2, main = "Q-Q Plot of FFMQ-OB Exp. Residuals")
qqline(FFMQOB_E_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_E_Res2, main = "Histogram of FFMQ-OB Exp. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_E_Shap2 = shapiro.test(FFMQOB_E_Res2)
FFMQOB_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_E_Res2
## W = 0.96609, p-value = 0.1776

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.18.

Experimental T-Test
# Run the t-test:

FFMQOB_E_T2 = t.test(data = Exp2, OB_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQOB_E_d2 = cohen.d(data = Exp2, OB_FFMQ ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

FFMQOB_Corr_ps2a = data.frame("p" = c(FFMQOB_C_T2$p.value, FFMQOB_E_T2$p.value))

# Perform p-adjustment:

FFMQOB_Corr_ps2b = p.adjust(FFMQOB_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

FFMQOB_C_Corr2 = data.frame("Condition" = "Control", "DF" = FFMQOB_C_T2$parameter, "T" = FFMQOB_C_T2$statistic, "p" = round(FFMQOB_Corr_ps2b[1], 4), "d" = FFMQOB_C_d2$estimate)

# Create a data frame for the experimental condition:

FFMQOB_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = FFMQOB_E_T2$parameter, "T" = FFMQOB_E_T2$statistic, "p" = round(FFMQOB_Corr_ps2b[2], 4), "d" = FFMQOB_E_d2$estimate)

# Combine both data frames into one:

FFMQOB_CE_Corr2 = rbind(FFMQOB_C_Corr2, FFMQOB_E_Corr2)

# Format the results table so that significant p-values will be bolded:

FFMQOB_CE_CorrB2 = FFMQOB_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(FFMQOB_CE_CorrB2, digits = 4, row.names = TRUE,
      caption = "Table 69. Tests of simple main effects on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 69. Tests of simple main effects on scores of the observing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Condition DF T p d
1 Control 38 1.2888 0.2053 0.2064
2 Experimental 23 -5.9604 0 -1.2167

The main effect of time was not found to be statistically significant for participants in the control condition; t (38) = 1.29, p = 0.21, d = 0.21. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t (23) = -5.96, p < .001, d = -1.22. In particular, for those in the experimental condition, T2 scores (MT2 = 13.75, SDT2 = 2.71) on the FFMQ-Observing were significantly higher than T1 scores (MT1 = 11.88, SDT1 = 3.33).

Mixed ANOVA - Acting with Awareness

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQAA_ANOVA2 = ezANOVA(data = Long2, dv = .(AA_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQAA_Res2 = data.frame("Residuals" = (proj(FFMQAA_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(FFMQAA_Res2$Residuals, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQAA_Res2$Residuals, main = "Histogram of FFMQ-AA Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_Shap2 = shapiro.test(FFMQAA_Res2$Residuals)
FFMQAA_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res2$Residuals
## W = 0.99338, p-value = 0.8212

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.82.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQAAAvg2 = data.frame("Condition" = Data2$Condition, "FFMQAA_Avg" = ((Data2$T1_AA_FFMQ + Data2$T2_AA_FFMQ)/2))

# Conduct the Levene's test:

FFMQAA_Lev2 = leveneTest(data = FFMQAAAvg2, FFMQAA_Avg ~ Condition, center = median)
FFMQAA_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.8129 0.1831
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 1.81, p = 0.18.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(FFMQAA_ANOVA2$ANOVA, digits = 4,
      caption = "Table 70. Mixed ANOVA on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 70. Mixed ANOVA on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 27138.5962 1490.4038 1110.7421 0.0000
0.9418
Condition 1 61 38.4692 1490.4038 1.5745 0.2143 0.0224
Time 1 61 56.4408 185.3846 18.5716 0.0001
0.0326
Condition:Time 1 61 18.4725 185.3846 6.0783 0.0165
0.0109
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 6.08, p = 0.02, \(\eta^2_{G}\) = 0.01.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on FFMQ-Awareness score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQAA_C_Mod2 = lm(Con2$AA_FFMQ ~ Con2$Time) 

# Calculate residuals:

FFMQAA_C_Res2 = resid(FFMQAA_C_Mod2)
qqnorm(FFMQAA_C_Res2, main = "Q-Q Plot of FFMQ-AA Con. Residuals")
qqline(FFMQAA_C_Res2)

The residuals appear to be slightly skewed at one end.

qplot(FFMQAA_C_Res2, main = "Histogram of FFMQ-AA Con. Residuals", binwidth = 1)

The residuals appear to be follow the shape of a normal distribution.

FFMQAA_C_Shap2 = shapiro.test(FFMQAA_C_Res2)
FFMQAA_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_C_Res2
## W = 0.96835, p-value = 0.04925

Based on an alpha level of .05, the assumption of normality is not met; W = 0.97, p = 0.05. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Control Test
FFMQAA_C_W2 = wilcoxsign_test(data = Con2, AA_FFMQ ~ Time | (as.factor(Subject)), distribution = "exact")
FFMQAA_C_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -1.7826, p-value = 0.07467
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQAA_C_r2 = WilcoxEff(abs(unname(FFMQAA_C_W2@statistic@teststatistic)), (length(Con2$AA_FFMQ)/2))
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQAA_E_Mod2 = lm(Exp2$AA_FFMQ ~ Exp2$Time) 

# Calculate residuals:

FFMQAA_E_Res2 = resid(FFMQAA_E_Mod2)
qqnorm(FFMQAA_E_Res2, main = "Q-Q Plot of FFMQ-AA Exp. Residuals")
qqline(FFMQAA_E_Res2)

The residuals appear to be slightly skewed at one end.

qplot(FFMQAA_E_Res2, main = "Histogram of FFMQ-AA Exp. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_E_Shap2 = shapiro.test(FFMQAA_E_Res2)
FFMQAA_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_E_Res2
## W = 0.96386, p-value = 0.1445

Based on an alpha level of .05, the assumption of normality is met; W = 0.96, p = 0.14.

Experimental T-Test
# Run the t-test:

FFMQAA_E_T2 = t.test(data = Exp2, AA_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQAA_E_d2 = cohen.d(data = Exp2, AA_FFMQ ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

FFMQAA_Corr_ps2a = data.frame("p" = c(FFMQAA_C_W2@distribution@pvalue(FFMQAA_C_W2@statistic@teststatistic), FFMQAA_E_T2$p.value))

# Perform p-adjustment:

FFMQAA_Corr_ps2b = p.adjust(FFMQAA_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

FFMQAA_C_Corr2 = data.frame("Condition" = "Control", "DF" = as.numeric(""), "Test Stat" = FFMQAA_C_W2@statistic@teststatistic, "p" = round(FFMQAA_Corr_ps2b[1], 4), "Effect Size" = FFMQAA_C_r2)

# Create a data frame for the experimental condition:

FFMQAA_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = FFMQAA_E_T2$parameter, "Test Stat" = round(FFMQAA_E_T2$statistic, 4), "p" = round(FFMQAA_Corr_ps2b[2], 4), "Effect Size" = FFMQAA_E_d2$estimate)

# Combine both data frames into one:

FFMQAA_CE_Corr2 = rbind(FFMQAA_C_Corr2, FFMQAA_E_Corr2)

# Format the results table so that significant p-values will be bolded:

FFMQAA_CE_CorrB2 = FFMQAA_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(FFMQAA_CE_CorrB2, digits = 4,
      caption = "Table 71. Tests of simple main effects on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 71. Tests of simple main effects on scores of the awareness subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Condition DF Test.Stat p Effect.Size
Control NA -1.7826 0.0747 0.2855
Experimental 23 -3.5525 0.0034 -0.7251

The main effect of time was not found to be statistically significant for participants in the control condition; Z = -1.78, p = 0.07, r = 0.29. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t (23) = -3.55, p = 0.003, d = -0.73. In particular, for those in the experimental condition, T2 scores (MT2 = 15.62, SDT2 = 3.21) on the FFMQ-Awareness were significantly higher than T1 scores (MT1 = 13.46, SDT1 = 3.13).

Mixed ANOVA - Describing

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQDS_ANOVA2 = ezANOVA(data = Long2, dv = .(DS_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQDS_Res2 = data.frame("Residuals" = (proj(FFMQDS_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(FFMQDS_Res2$Residuals, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQDS_Res2$Residuals, main = "Histogram of FFMQ-DS Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQDS_Shap2 = shapiro.test(FFMQDS_Res2$Residuals)
FFMQDS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res2$Residuals
## W = 0.9895, p-value = 0.4535

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.45.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQDSAvg2 = data.frame("Condition" = Data2$Condition, "FFMQDS_Avg" = ((Data2$T1_DS_FFMQ + Data2$T2_DS_FFMQ)/2))

# Conduct the Levene's test:

FFMQDS_Lev2 = leveneTest(data = FFMQDSAvg2, FFMQDS_Avg ~ Condition, center = median)
FFMQDS_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.9077 0.1723
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 1.91, p = 0.17.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(FFMQDS_ANOVA2$ANOVA, digits = 4,
      caption = "Table 72. Mixed ANOVA on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 72. Mixed ANOVA on scores of the describing subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 38922.2418 1406.6154 1687.9218 0.0000
0.9611
Condition 1 61 0.5910 1406.6154 0.0256 0.8733 0.0004
Time 1 61 3.3654 170.6346 1.2031 0.2770 0.0021
Condition:Time 1 61 0.1908 170.6346 0.0682 0.7949 0.0001
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1, 61) = 0.07, p = 0.79, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 61) = 0.03, p = 0.87, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (1, 61) = 1.2, p = 0.28, \(\eta^2_{G}\) = 0.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Mixed ANOVA - Non-Judging

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

FFMQNJ_ANOVA2 = ezANOVA(data = Long2, dv = .(NJ_FFMQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

FFMQNJ_Res2 = data.frame("Residuals" = (proj(FFMQNJ_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(FFMQNJ_Res2$Residuals, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNJ_Res2$Residuals, main = "Histogram of FFMQ-NJ Residuals", binwidth = .4)

The residuals appear to follow the shape of a normal distribution.

FFMQNJ_Shap2 = shapiro.test(FFMQNJ_Res2$Residuals)
FFMQNJ_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res2$Residuals
## W = 0.99225, p-value = 0.7146

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.71.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

FFMQNJAvg2 = data.frame("Condition" = Data2$Condition, "FFMQNJ_Avg" = ((Data2$T1_NJ_FFMQ + Data2$T2_NJ_FFMQ)/2))

# Conduct the Levene's test:

FFMQNJ_Lev2 = leveneTest(data = FFMQNJAvg2, FFMQNJ_Avg ~ Condition, center = median)
FFMQNJ_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.6135 0.1111
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 2.61, p = 0.11.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(FFMQNJ_ANOVA2$ANOVA, digits = 4,
      caption = "Table 73. Mixed ANOVA on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 73. Mixed ANOVA on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 32980.9616 2311.5304 870.3492 0.0000
0.9295
Condition 1 61 26.2949 2311.5304 0.6939 0.4081 0.0104
Time 1 61 34.3591 189.4663 11.0621 0.0015
0.0136
Condition:Time 1 61 15.2479 189.4663 4.9092 0.0305
0.0061
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 4.91, p = 0.03, \(\eta^2_{G}\) = 0.01.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on FFMQ-Non-Judging score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNJ_C_Mod2 = lm(Con2$NJ_FFMQ ~ Con2$Time) 

# Calculate residuals:

FFMQNJ_C_Res2 = resid(FFMQNJ_C_Mod2)
qqnorm(FFMQNJ_C_Res2, main = "Q-Q Plot of FFMQ-NJ Con. Residuals")
qqline(FFMQNJ_C_Res2)

The residuals seem to be slightly skewed to the left.

qplot(FFMQNJ_C_Res2, main = "Histogram of FFMQ-NJ Con. Residuals", binwidth = 1)

The residuals seem to be slightly skewed to the left.

FFMQNJ_C_Shap2 = shapiro.test(FFMQNJ_C_Res2)
FFMQNJ_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_C_Res2
## W = 0.96696, p-value = 0.04036

Based on an alpha level of .05, the assumption of normality is not met; W = 0.97, p = 0.04. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Control Test
FFMQNJ_C_W2 = wilcoxsign_test(data = Con2, NJ_FFMQ ~ Time | (as.factor(Subject)), distribution = "exact")
FFMQNJ_C_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -0.71077, p-value = 0.4862
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQNJ_C_r2 = WilcoxEff(abs(unname(FFMQNJ_C_W2@statistic@teststatistic)), (length(Con2$NJ_FFMQ)/2))
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNJ_E_Mod2 = lm(Exp2$NJ_FFMQ ~ Exp2$Time) 

# Calculate residuals:

FFMQNJ_E_Res2 = resid(FFMQNJ_E_Mod2)
qqnorm(FFMQNJ_E_Res2, main = "Q-Q Plot of FFMQ-NJ Exp. Residuals")
qqline(FFMQNJ_E_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNJ_E_Res2, main = "Histogram of FFMQ-NJ Exp. Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNJ_E_Shap2 = shapiro.test(FFMQNJ_E_Res2)
FFMQNJ_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_E_Res2
## W = 0.98365, p-value = 0.7347

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.73.

Experimental T-Test
# Run the t-test:

FFMQNJ_E_T2 = t.test(data = Exp2, NJ_FFMQ ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

FFMQNJ_E_d2 = cohen.d(data = Exp2, NJ_FFMQ ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

FFMQNJ_Corr_ps2a = data.frame("p" = c(FFMQNJ_C_W2@distribution@pvalue(FFMQNJ_C_W2@statistic@teststatistic), FFMQNJ_E_T2$p.value))

# Perform p-adjustment:

FFMQNJ_Corr_ps2b = p.adjust(FFMQNJ_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

FFMQNJ_C_Corr2 = data.frame("Condition" = "Control", "DF" = as.numeric(""), "Test Stat" = FFMQNJ_C_W2@statistic@teststatistic, "p" = round(FFMQNJ_Corr_ps2b[1], 4), "Effect Size" = FFMQNJ_C_r2)

# Create a data frame for the experimental condition:

FFMQNJ_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = FFMQNJ_E_T2$parameter, "Test Stat" = round(FFMQNJ_E_T2$statistic, 4), "p" = round(FFMQNJ_Corr_ps2b[2], 4), "Effect Size" = FFMQNJ_E_d2$estimate)

# Combine both data frames into one:

FFMQNJ_CE_Corr2 = rbind(FFMQNJ_C_Corr2, FFMQNJ_E_Corr2)

# Format the results table so that significant p-values will be bolded:

FFMQNJ_CE_CorrB2 = FFMQNJ_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(FFMQNJ_CE_CorrB2, digits = 4,
      caption = "Table 74. Tests of simple main effects on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 74. Tests of simple main effects on scores of the non-judging subscale of the Five Facet Mindfulness Questionnaire for participants who completed the first two surveys.
Condition DF Test.Stat p Effect.Size
Control NA -0.7108 0.4862 0.1138
Experimental 23 -3.2101 0.0078 -0.6553

The main effect of time was not found to be statistically significant for participants in the control condition; Z = -0.71, p = 0.49, r = 0.11. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t (23) = -3.21, p = 0.01, d = -0.66. In particular, for those in the experimental condition, T2 scores (MT2 = 17.08, SDT2 = 3.54) on the FFMQ-Non-Judging were significantly higher than T1 scores (MT1 = 15.29, SDT1 = 4.21).

Depression, Anxiety, and Stress Scale

Descriptive Statistics

# DASS-Depression:

D_DASS2 = summarySE(data = Long2, measurevar = "D_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Anxiety:

A_DASS2 = summarySE(data = Long2, measurevar = "A_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Stress:

S_DASS2 = summarySE(data = Long2, measurevar = "S_DASS", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(D_DASS2)[colnames(D_DASS2) == "D_DASS"] = "M"
colnames(A_DASS2)[colnames(A_DASS2) == "A_DASS"] = "M"
colnames(S_DASS2)[colnames(S_DASS2) == "S_DASS"] = "M"

# Combine these variables into a single data frame:

DASSDesc2 = data.frame(rbind(D_DASS2, A_DASS2, S_DASS2))

# Create a table to display the results:

kable(DASSDesc2, digits = 4, caption = "Table 75. Scores on the Depression, Anxiety, and Stress Scale by condition and time for participants who completed the first two surveys.",  col.names = c("Condition", "Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Depression", 1, 4) %>%
  group_rows("Anxiety", 5, 8) %>%
  group_rows("Stress", 9, 12)
Table 75. Scores on the Depression, Anxiety, and Stress Scale by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Depression
Control T1 39 7.5385 8.2393 1.3193 2.6709
Control T2 39 6.4615 6.7972 1.0884 2.2034
Experimental T1 24 10.9167 11.2363 2.2936 4.7447
Experimental T2 24 5.7500 5.8477 1.1937 2.4693
Anxiety
Control T1 39 6.3077 8.2913 1.3277 2.6877
Control T2 39 6.2051 6.8793 1.1016 2.2300
Experimental T1 24 6.8333 6.6963 1.3669 2.8276
Experimental T2 24 4.3333 3.5712 0.7290 1.5080
Stress
Control T1 39 14.9744 8.7764 1.4054 2.8450
Control T2 39 13.8974 7.6220 1.2205 2.4708
Experimental T1 24 14.5000 7.8961 1.6118 3.3342
Experimental T2 24 9.5833 5.9558 1.2157 2.5149

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the depression plot.
# Calculate SE min:

DASSDMin2 = data.frame("DASSDMin" = D_DASS2$M - D_DASS2$se)

# Calculate SE max:

DASSDMax2 = data.frame("DASSDMax" = D_DASS2$M + D_DASS2$se)

# Create data frame of values to be used:

DASSDPlot2 = data.frame("Condition" = D_DASS2$Condition, "Time" = D_DASS2$Time,
                    "DASSDMean" = D_DASS2$M, "DASSDMin" = DASSDMin2, "DASSDMax" = DASSDMax2)
  1. Create the depression plot.
# Create the plot:

DASSDFig2 = (Long2 %>%
  ggplot(aes(Time, D_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSDPlot2,
    aes(Time, DASSDMean, ymin = DASSDMin, ymax = DASSDMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Depression Score",
       fill = "Condition") + ggtitle("a") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the anxiety plot.
# Calculate SE min:

DASSAMin2 = data.frame("DASSAMin" = A_DASS2$M - A_DASS2$se)

# Calculate SE max:

DASSAMax2 = data.frame("DASSAMax" = A_DASS2$M + A_DASS2$se)

# Create data frame of values to be used:

DASSAPlot2 = data.frame("Condition" = A_DASS2$Condition, "Time" = A_DASS2$Time,
                    "DASSAMean" = A_DASS2$M, "DASSAMin" = DASSAMin2, "DASSAMax" = DASSAMax2)
  1. Create the anxiety plot.
# Create the plot:

DASSAFig2 = (Long2 %>%
  ggplot(aes(Time, A_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSAPlot2,
    aes(Time, DASSAMean, ymin = DASSAMin, ymax = DASSAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Anxiety Score",
       fill = "Condition") + ggtitle("b") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the stress plot.
# Calculate SE min:

DASSSMin2 = data.frame("DASSSMin" = S_DASS2$M - S_DASS2$se)

# Calculate SE max:

DASSSMax2 = data.frame("DASSSMax" = S_DASS2$M + S_DASS2$se)

# Create data frame of values to be used:

DASSSPlot2 = data.frame("Condition" = S_DASS2$Condition, "Time" = S_DASS2$Time,
                    "DASSSMean" = S_DASS2$M, "DASSSMin" = DASSSMin2, "DASSSMax" = DASSSMax2)
  1. Create the stress plot.
# Create the plot:

DASSSFig2 = (Long2 %>%
  ggplot(aes(Time, S_DASS, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSSPlot2,
    aes(Time, DASSSMean, ymin = DASSSMin, ymax = DASSSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Stress Score",
       fill = "Condition") + ggtitle("c") +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
DASSCap2 = "Figure 11. Distributions of scores on the depression (a), anxiety (b), and stress (c) subscales of the Depression, Anxiety, and Stress Scale (DASS) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
DASSCap2 = paste0(strwrap(DASSCap2, width = 100), collapse = "\n")
  1. Define the figure layout
DASSLayout2 = rbind(c("DASSAFig2", "DASSDFig2"),
                      c("DASSSFig2", "SharedLeg"))
  1. Display the figure.
DASSFig2 = grid.arrange(DASSDFig2, DASSAFig2, DASSSFig2, SharedLeg, layout_matrix = DASSLayout2, bottom = textGrob(DASSCap2, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

Mixed ANOVA - Depression

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSD_ANOVA2 = ezANOVA(data = Long2, dv = .(D_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSD_Res2 = data.frame("Residuals" = (proj(DASSD_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(DASSD_Res2$Residuals, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res2$Residuals)

The residuals seem to be slightly leptokurtic.

qplot(DASSD_Res2$Residuals, main = "Histogram of DASS-D Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

DASSD_Shap2 = shapiro.test(DASSD_Res2$Residuals)
DASSD_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res2$Residuals
## W = 0.93752, p-value = 0.00001877

Based on an alpha level of .05, the assumption of normality is not met; W = 0.94, p < .001.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSDAvg2 = data.frame("Condition" = Data2$Condition, "DASSD_Avg" = ((Data2$T1_D_DASS + Data2$T2_D_DASS)/2))

# Conduct the Levene's test:

DASSD_Lev2 = leveneTest(data = DASSDAvg2, DASSD_Avg ~ Condition, center = median)
DASSD_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.7859 0.3788
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.79, p = 0.38.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(DASSD_ANOVA2$ANOVA, digits = 4,
      caption = "Table 76. Mixed ANOVA on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 76. Mixed ANOVA on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 6986.1587 6550.667 65.0553 0.0000
0.4654
Condition 1 61 52.8254 6550.667 0.4919 0.4857 0.0065
Time 1 61 289.5836 1475.051 11.9756 0.0010
0.0348
Condition:Time 1 61 124.2503 1475.051 5.1383 0.0270
0.0152
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 5.14, p = 0.03, \(\eta^2_{G}\) = 0.02.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on DASS-Depression score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSD_C_Mod2 = lm(Con2$D_DASS ~ Con2$Time) 

# Calculate residuals:

DASSD_C_Res2 = resid(DASSD_C_Mod2)
qqnorm(DASSD_C_Res2, main = "Q-Q Plot of DASS-D Con. Residuals")
qqline(DASSD_C_Res2)

The residuals seem to be slightly skewed to the right.

qplot(DASSD_C_Res2, main = "Histogram of DASS-D Con. Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSD_C_Shap2 = shapiro.test(DASSD_C_Res2)
DASSD_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_C_Res2
## W = 0.77103, p-value = 0.000000001103

Based on an alpha level of .05, the assumption of normality is not met; W = 0.77, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Control Test
DASSD_C_W2 = wilcoxsign_test(data = Con2, D_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSD_C_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 0.52839, p-value = 0.6042
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_C_r2 = WilcoxEff(abs(unname(DASSD_C_W2@statistic@teststatistic)), (length(Con2$D_DASS)/2))
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSD_E_Mod2 = lm(Exp2$D_DASS ~ Exp2$Time) 

# Calculate residuals:

DASSD_E_Res2 = resid(DASSD_E_Mod2)
qqnorm(DASSD_E_Res2, main = "Q-Q Plot of DASS-D Exp. Residuals")
qqline(DASSD_E_Res2)

The residuals seem to be slightly skewed to the right.

qplot(DASSD_E_Res2, main = "Histogram of DASS-D Exp. Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSD_E_Shap2 = shapiro.test(DASSD_E_Res2)
DASSD_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_E_Res2
## W = 0.84953, p-value = 0.00002112

Based on an alpha level of .05, the assumption of normality is not met; W = 0.85, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Experimental Test
DASSD_E_W2 = wilcoxsign_test(data = Exp2, D_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSD_E_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 3.3476, p-value = 0.0003548
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_E_r2 = WilcoxEff(abs(unname(DASSD_E_W2@statistic@teststatistic)), (length(Exp2$D_DASS)/2))
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

DASSD_Corr_ps2a = data.frame("p" = c(DASSD_C_W2@distribution@pvalue(DASSD_C_W2@statistic@teststatistic), DASSD_E_W2@distribution@pvalue(DASSD_E_W2@statistic@teststatistic)))

# Perform p-adjustment:

DASSD_Corr_ps2b = p.adjust(DASSD_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

DASSD_C_Corr2 = data.frame("Condition" = "Control", "Z" = DASSD_C_W2@statistic@teststatistic, "p" = round(DASSD_Corr_ps2b[1], 4), "r" = DASSD_C_r2)

# Create a data frame for the experimental condition:

DASSD_E_Corr2 = data.frame("Condition" = "Experimental", "Z" = DASSD_E_W2@statistic@teststatistic, "p" = round(DASSD_Corr_ps2b[2], 4), "r" = DASSD_E_r2)

# Combine both data frames into one:

DASSD_CE_Corr2 = rbind(DASSD_C_Corr2, DASSD_E_Corr2)

# Format the results table so that significant p-values will be bolded:

DASSD_CE_CorrB2 = DASSD_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(DASSD_CE_CorrB2, digits = 4,
      caption = "Table 77. Tests of simple main effects on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 77. Tests of simple main effects on scores of the depression subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.
Condition Z p r
Control 0.5284 0.6042 0.0846
Experimental 3.3476 0.0007 0.6833

The main effect of time was not found to be statistically significant for participants in the control condition; Z = 0.53, p = 0.6, r = 0.08. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; Z = 3.35, p = 0.001, r = 0.68. In particular, for those in the experimental condition, T2 scores (MT2 = 5.75, SDT2 = 5.85) on the DASS-Depression were significantly lower than T1 scores (MT1 = 10.92, SDT1 = 11.24).

Mixed ANOVA - Anxiety

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSA_ANOVA2 = ezANOVA(data = Long2, dv = .(A_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSA_Res2 = data.frame("Residuals" = (proj(DASSA_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(DASSA_Res2$Residuals, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res2$Residuals)

The residuals seem to be slightly leptokurtic.

qplot(DASSA_Res2$Residuals, main = "Histogram of DASS-A Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

DASSA_Shap2 = shapiro.test(DASSA_Res2$Residuals)
DASSA_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res2$Residuals
## W = 0.91927, p-value = 0.000001316

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p < .001.

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSAAvg2 = data.frame("Condition" = Data2$Condition, "DASSA_Avg" = ((Data2$T1_A_DASS + Data2$T2_A_DASS)/2))

# Conduct the Levene's test:

DASSA_Lev2 = leveneTest(data = DASSAAvg2, DASSA_Avg ~ Condition, center = median)
DASSA_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1   0.718 0.4001
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.72, p = 0.4.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(DASSA_ANOVA2$ANOVA, digits = 4,
      caption = "Table 78. Mixed ANOVA on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 78. Mixed ANOVA on scores of the anxiety subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 4165.3346 4926.5385 51.5748 0.0000
0.4207
Condition 1 61 13.4615 4926.5385 0.1667 0.6845 0.0023
Time 1 61 50.3162 808.7949 3.7949 0.0560 0.0087
Condition:Time 1 61 42.6972 808.7949 3.2203 0.0777 0.0074
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1, 61) = 3.22, p = 0.08, \(\eta^2_{G}\) = 0.01.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 61) = 0.17, p = 0.68, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (1, 61) = 3.79, p = 0.06, \(\eta^2_{G}\) = 0.01.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Mixed ANOVA - Stress

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

DASSS_ANOVA2 = ezANOVA(data = Long2, dv = .(S_DASS), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

DASSS_Res2 = data.frame("Residuals" = (proj(DASSS_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(DASSS_Res2$Residuals, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(DASSS_Res2$Residuals, main = "Histogram of DASS-S Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

DASSS_Shap2 = shapiro.test(DASSS_Res2$Residuals)
DASSS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res2$Residuals
## W = 0.98732, p-value = 0.2947

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.29.

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

DASSSAvg2 = data.frame("Condition" = Data2$Condition, "DASSS_Avg" = ((Data2$T1_S_DASS + Data2$T2_S_DASS)/2))

# Conduct the Levene's test:

DASSS_Lev2 = leveneTest(data = DASSSAvg2, DASSS_Avg ~ Condition, center = median)
DASSS_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.5525 0.4601
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.55, p = 0.46.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(DASSS_ANOVA2$ANOVA, digits = 4,
      caption = "Table 79. Mixed ANOVA on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 79. Mixed ANOVA on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 20831.5388 6201.096 204.9192 0.0000
0.7383
Condition 1 61 170.3324 6201.096 1.6756 0.2004 0.0225
Time 1 61 266.8574 1183.301 13.7567 0.0005
0.0349
Condition:Time 1 61 109.5241 1183.301 5.6460 0.0207
0.0146
Interaction

Based on an alpha level of .05, the condition x time interaction was found to be statistically significant; F (1, 61) = 5.65, p = 0.02, \(\eta^2_{G}\) = 0.01.

Because the interaction effect was found to be significant, we don’t need to consider either of the other main effects.

Post-hoc Tests

The significant interaction will be further assessed via a test of simple main effects of block across levels of condition. To do so, we will conduct paired t-test analyses to assess the effect of time on DASS-Stress score for each condition separately. A Holm-Bonferroni adjustment will be used.

Control Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSS_C_Mod2 = lm(Con2$S_DASS ~ Con2$Time) 

# Calculate residuals:

DASSS_C_Res2 = resid(DASSS_C_Mod2)
qqnorm(DASSS_C_Res2, main = "Q-Q Plot of DASS-S Con. Residuals")
qqline(DASSS_C_Res2)

The residuals seem to be slightly skewed to the right.

qplot(DASSS_C_Res2, main = "Histogram of DASS-S Con. Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSS_C_Shap2 = shapiro.test(DASSS_C_Res2)
DASSS_C_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_C_Res2
## W = 0.94283, p-value = 0.001609

Based on an alpha level of .05, the assumption of normality is not met; W = 0.94, p = 0.002. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Control Test
DASSS_C_W2 = wilcoxsign_test(data = Con2, S_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSS_C_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 0.82094, p-value = 0.418
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSS_C_r2 = WilcoxEff(abs(unname(DASSS_C_W2@statistic@teststatistic)), (length(Con2$S_DASS)/2))
Experimental Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSS_E_Mod2 = lm(Exp2$S_DASS ~ Exp2$Time) 

# Calculate residuals:

DASSS_E_Res2 = resid(DASSS_E_Mod2)
qqnorm(DASSS_E_Res2, main = "Q-Q Plot of DASS-S Exp. Residuals")
qqline(DASSS_E_Res2)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(DASSS_E_Res2, main = "Histogram of DASS-S Exp. Residuals", binwidth = 1.2)

The residuals appear to follow the shape of a normal distribution.

DASSS_E_Shap2 = shapiro.test(DASSS_E_Res2)
DASSS_E_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_E_Res2
## W = 0.97405, p-value = 0.361

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.36.

Experimental T-Test
# Run the t-test:

DASSS_E_T2 = t.test(data = Exp2, S_DASS ~ Time, paired = TRUE)

# Calculate Cohen's d effect size:

DASSS_E_d2 = cohen.d(data = Exp2, S_DASS ~ Time, paired = TRUE)
Interpretation of Main Effects

We will now employ the Holm-Bonferroni adjustment to assess the main effects of these tests.

# Create a data frame of the p-values being assessed:

DASSS_Corr_ps2a = data.frame("p" = c(DASSS_C_W2@distribution@pvalue(DASSS_C_W2@statistic@teststatistic), DASSS_E_T2$p.value))

# Perform p-adjustment:

DASSS_Corr_ps2b = p.adjust(DASSS_Corr_ps2a$p, method = c("holm"), n = 2)

# Create a data frame for the control condition:

DASSS_C_Corr2 = data.frame("Condition" = "Control", "DF" = as.numeric(""), "Test Stat" = DASSS_C_W2@statistic@teststatistic, "p" = round(DASSS_Corr_ps2b[1], 4), "Effect Size" = DASSS_C_r2)

# Create a data frame for the experimental condition:

DASSS_E_Corr2 = data.frame("Condition" = "Experimental", "DF" = DASSS_E_T2$parameter,  "Test Stat" = round(DASSS_E_T2$statistic, 4), "p" = round(DASSS_Corr_ps2b[2], 4), "Effect Size" = DASSS_E_d2$estimate)

# Combine both data frames into one:

DASSS_CE_Corr2 = rbind(DASSS_C_Corr2, DASSS_E_Corr2)

# Format the results table so that significant p-values will be bolded:

DASSS_CE_CorrB2 = DASSS_CE_Corr2 %>%
  mutate(
    p = text_spec(p, bold = (ifelse(p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(DASSS_CE_CorrB2, digits = 4,
      caption = "Table 80. Tests of simple main effects on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.",
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 80. Tests of simple main effects on scores of the stress subscale of the Depression, Anxiety, and Stress Scale for participants who completed the first two surveys.
Condition DF Test.Stat p Effect.Size
Control NA 0.8209 0.418 0.1315
Experimental 23 4.9174 0.0001 1.0038

The main effect of time was not found to be statistically significant for participants in the control condition; Z = 0.82, p = 0.42, r = 0.13. The main effect of time was, however, found to be statistically significant for participants in the experimental condition; t(23) = 4.92, p < .001, d = 1. In particular, for those in the experimental condition, T2 scores (MT2 = 9.58, SDT2 = 5.96) on the DASS-Stress were significantly lower than T1 scores (MT1 = 14.5, SDT1 = 7.9).

Job Effectiveness Questionnaire

Descriptive Statistics

# Calculate summary statistics
JEQDesc2 = summarySE(data = Long2, measurevar = "JEQ", groupvars = c("Condition", "Time"), conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(JEQDesc2, digits = 4,
      caption = "Table 81. Scores on the Job Effectiveness Questionnaire by condition and time for participants who completed the first two surveys.",
      col.names = c("Condition", "Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 81. Scores on the Job Effectiveness Questionnaire by condition and time for participants who completed the first two surveys.
Condition Time n M SD SE CI
Control T1 39 5.2957 0.6477 0.1037 0.2100
Control T2 39 5.2367 0.8591 0.1376 0.2785
Experimental T1 24 5.1847 0.6226 0.1271 0.2629
Experimental T2 24 5.2550 0.7189 0.1467 0.3036

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

JEQMin2 = data.frame("JEQMin" = JEQDesc2$JEQ - JEQDesc2$se)

# Calculate SE max:

JEQMax2 = data.frame("JEQMax" = JEQDesc2$JEQ + JEQDesc2$se)

# Create data frame of values to be used:

JEQPlot2 = data.frame("Condition" = JEQDesc2$Condition, "Time" = JEQDesc2$Time,
                    "JEQMean" = JEQDesc2$JEQ, "JEQMin" = JEQMin2, "JEQMax" = JEQMax2)
  1. Plot the data.
# Create a figure caption:

JEQCap2 = "Figure 12. Distributions of scores on the Job Effectiveness Questionnaire (JEQ) for participants who completed the first two surveys. Dots and whiskers represent means and standard errors, respectively."
JEQCap2 = paste0(strwrap(JEQCap2, width = 55), collapse = "\n")

# Create the plot:

JEQFig2 = (Long2 %>%
  ggplot(aes(Time, JEQ, fill = Condition)) +
  geom_split_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = JEQPlot2,
    aes(Time, JEQMean, ymin = JEQMin, ymax = JEQMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "JEQ Score",
       fill = "Condition", caption = JEQCap2) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("orangered2", "lightseagreen")) +
  scale_color_manual(values = c("orangered2", "lightseagreen")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
JEQFig2

Mixed ANOVA

As before, we’ll conduct a Type III, 2 x 2 mixed ANOVA with Condition as a between-group factor and Time as a within-group factor.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Run the ANOVA:

JEQ_ANOVA2 = ezANOVA(data = Long2, dv = .(JEQ), wid = .(Subject), within = .(Time), between = .(Condition), detailed = TRUE, type = "III", return_aov = TRUE) 

# Calculate and extract residuals:

JEQ_Res2 = data.frame("Residuals" = (proj(JEQ_ANOVA2$aov)[[3]][, "Residuals"]))
qqnorm(JEQ_Res2$Residuals, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res2$Residuals)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(JEQ_Res2$Residuals, main = "Histogram of JEQ Residuals", binwidth = .1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

JEQ_Shap2 = shapiro.test(JEQ_Res2$Residuals)
JEQ_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res2$Residuals
## W = 0.97799, p-value = 0.03764

Based on an alpha level of .05, the assumption of normality is not met; W = 0.98, p = 0.04. However, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

Based on the figures, however, the residuals appear to be normally distributed but slightly leptokurtic. Ultimately though, ANOVA tests are typically robust to violations of normality (Gardner & Tremblay, 2007).

  1. Homogeneity of Variance for Between-Group Factors
# Create a data frame of scores collapsed across time:

JEQAvg2 = data.frame("Condition" = Data2$Condition, "JEQ_Avg" = ((Data2$T1_JEQ + Data2$T2_JEQ)/2))

# Conduct the Levene's test:

JEQ_Lev2 = leveneTest(data = JEQAvg2, JEQ_Avg ~ Condition, center = median)
JEQ_Lev2
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0095 0.9227
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.01, p = 0.92.

  1. Sphericity

This assumption does not need to be tested with two or fewer within-group levels.

Interpretation of Main Effects

kable(JEQ_ANOVA2$ANOVA, digits = 4,
      caption = "Table 82. Mixed ANOVA on Job Effectiveness Questionnaire scores for participants who completed the first two surveys.",
      col.names = c("Effect", "DFn", "DFd", "SSn", "SSd", "F", "p", "sig", "ges"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 82. Mixed ANOVA on Job Effectiveness Questionnaire scores for participants who completed the first two surveys.
Effect DFn DFd SSn SSd F p sig ges
(Intercept) 1 61 3267.2988 56.3041 3539.8016 0.0000
0.9806
Condition 1 61 0.0638 56.3041 0.0692 0.7934 0.0010
Time 1 61 0.0009 8.4831 0.0067 0.9350 0.0000
Condition:Time 1 61 0.1243 8.4831 0.8937 0.3482 0.0019
Interaction

Based on an alpha level of .05, the condition x time interaction was not found to be statistically significant; F (1, 61) = 0.89, p = 0.35, \(\eta^2_{G}\) = 0.

Main Effect of Condition

Based on an alpha level of .05, the main effect of condition was not found to be statistically significant; F (1, 61) = 0.07, p = 0.79, \(\eta^2_{G}\) = 0.

Main Effect of Time

Based on an alpha level of .05, the main effect of time was not found to be statistically significant; F (1, 61) = 0.01, p = 0.94, \(\eta^2_{G}\) = 0.

Post-hoc Tests

Because none of the main effects were found to be statistically significant, post-hoc tests will not be conducted.

Summary of Results

The following results were found to be statistically significant:

  • Perceived Stress Scale

    • a decrease in perceived stress from T1 to T2 for participants in the experimental condition (p < .001)
  • Positive and Negative Affect Schedule

    • an increase in positive affect from T1 to T2 for participants in the experimental condition (p = 0.02)

    • a reduction in negative affect from T1 to T2 for participants in the experimental condition (p < .001)

  • Brief Resilience Scale

    • an increase in psychological resilience from T1 to T2 (p = 0.003)
  • Five Facet Mindfulness Questionnaire

    • an increase in non-reactivity, observing, acting with awareness, and non-judging from T1 to T2 for participants in the experimental condition (p = 0.03, p < .001, p = 0.003, and p = 0.01, respectively)
  • Depression, Anxiety, and Stress Scale

    • a reduction in depression and stress from T1 to T2 for participants in the experimental condition (p = 0.001 and p < .001, respectively)

Conclusion

A second set of analyses provided support for most of the hypotheses made in this study. In particular, participants in the experimental condition reported a decrease in stress (measured by both the PSS and the DASS), negative affect, and depression, as well as an increase in positive affect, non-reactivity, observing, acting with awareness, and non-judgmentalness following the completion of the mindfulness intervention. In contrast, participants in the control condition reported no change from T1 to T2 in any of the variables considered. These results, therefore, suggest that the meditation program was effective in enhancing mindful cognition (measured by the FFMQ) and improving participants’ psychological well-being, though it had no impact on their perceived competency at work (as measured by the JEQ). Another possibility, however, is that participants in the control condition were significantly different at T1 from those in the experimental condition. By this logic, T1 to T2 changes may not have been observed in control participants simply because they were initially low/high in things like stress/positive affect. This next set of analyses will investigate this possibility by assessing between-group differences at T1.


3. Between-Group Differences During the First Testing Period

Our third set of analyses will look at the effect of condition on T1 scores. Because we are specifically interested in testing an alternate interpretation of the results from the previous section, we will limit the present analysis to the participants included in the previous analysis (i.e. those in the Data2 data set).

Perceived Stress Scale

T-Test

To assess if any condition-related score differences are statistically significant, we’ll conduct an independent samples t-test.

Assumptions

The independent samples t-test makes three primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality

This assumption can be tested by visualizing and applying a Shapiro-Wilk test to the residuals (which can be calculated from the model that is being tested).

# Define the model:

PSS_Mod3 = lm(Data2$T1_PSS ~ Data2$Condition) 

# Calculate residuals:

PSS_Res3 = resid(PSS_Mod3)

Visualize the residuals with a q-q plot:

qqnorm(PSS_Res3, main = "Q-Q Plot of PSS Residuals")
qqline(PSS_Res3)

The residuals appear to be slightly platykurtic.

Visualize the residuals with a histogram:

qplot(PSS_Res3, main = "Histogram of PSS Residuals", binwidth = 1)

The residuals appear to be slightly platykurtic.

Conduct a Shapiro-Wilk test:

PSS_Shap3 = shapiro.test(PSS_Res3)
PSS_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res3
## W = 0.94732, p-value = 0.009169

Based on an alpha level of .05, the assumption of normality is not met; W = 0.95, p = 0.01. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test. (As we are no longer performing a t-test, the third assumption of homogeneity of variance does not need to be tested.)

Interpretation of Main Effects

PSS_W3 = wilcox_test(data = Data2, T1_PSS ~ Condition, distribution = "exact")
PSS_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_PSS by Condition (Control, Experimental)
## Z = -0.85046, p-value = 0.3999
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PSS_r3 = WilcoxEff(abs(unname(PSS_W3@statistic@teststatistic)), length(Data2$T1_PSS))
PSS_r3
## [1] 0.1071484

A significant difference in T1 PSS scores was not observed between the control (MC = 41.05, SDC = 7.66) and experimental (ME = 42.62, SDE = 7.08) conditions; Z = -0.85, p = 0.4, r = 0.11.

Positive and Negative Affect Schedule

T-Test - Positive Affect

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASP_Mod3 = lm(Data2$T1_POS_PANAS ~ Data2$Condition) 

# Calculate residuals:

PANASP_Res3 = resid(PANASP_Mod3)
qqnorm(PANASP_Res3, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res3)

The residuals seem to lie in a straight line, which suggests normality.

qplot(PANASP_Res3, main = "Histogram of PANAS-P Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

PANASP_Shap3 = shapiro.test(PANASP_Res3)
PANASP_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res3
## W = 0.99032, p-value = 0.9038

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.9.

  1. Homogeneity of Variance

This assumption can be tested by implementing a Levene’s test on scores.

PANASP_Lev3 = leveneTest(data = Data2, T1_POS_PANAS ~ Condition, center = median)
PANASP_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.9624 0.3305
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.96, p = 0.33.

Interpretation of Main Effects

Run the t-test.

PANASP_T3 = t.test(data = Data2, T1_POS_PANAS ~ Condition, paired = FALSE, var.equal = TRUE)
PANASP_T3
## 
##  Two Sample t-test
## 
## data:  T1_POS_PANAS by Condition
## t = 0.83965, df = 61, p-value = 0.4044
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.067804  5.061394
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   32.87179                   31.37500

Calculate Cohen’s d effect size.

PANASP_d3 = cohen.d(data = Data2, T1_POS_PANAS ~ Condition, paired = FALSE)
PANASP_d3
## 
## Cohen's d
## 
## d estimate: 0.2178373 (small)
## 95 percent confidence interval:
##        inf        sup 
## -0.3023890  0.7380635

A significant difference in T1 PANAS-Positive scores was not observed between the control (MC = 32.87, SDC = 6.33) and experimental (ME = 31.38, SDE = 7.69) conditions; t (61) = 0.84, p = 0.4, d = 0.22.

T-Test - Negative Affect

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASN_Mod3 = lm(Data2$T1_NEG_PANAS ~ Data2$Condition) 

# Calculate residuals:

PANASN_Res3 = resid(PANASN_Mod3)
qqnorm(PANASN_Res3, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res3)

The residuals seem to be slightly skewed to the right.

qplot(PANASN_Res3, main = "Histogram of PANAS-N Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the right.

PANASN_Shap3 = shapiro.test(PANASN_Res3)
PANASN_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res3
## W = 0.91056, p-value = 0.0002302

Based on an alpha level of .05, the assumption of normality is not met; W = 0.91, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

PANASN_W3 = wilcox_test(data = Data2, T1_NEG_PANAS ~ Condition, distribution = "exact")
PANASN_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_NEG_PANAS by Condition (Control, Experimental)
## Z = -0.21269, p-value = 0.8356
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASN_r3 = WilcoxEff(abs(unname(PANASN_W3@statistic@teststatistic)), length(Data2$T1_NEG_PANAS))
PANASN_r3
## [1] 0.02679581

A significant difference in T1 PANAS-Negative scores was not observed between the control (MC = 24.03, SDC = 8.91) and experimental (ME = 24.75, SDE = 8.69) conditions; Z = -0.21, p = 0.84, r = 0.03.

Brief Resilience Scale

T-Test

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

BRS_Mod3 = lm(Data2$T1_BRS ~ Data2$Condition) 

# Calculate residuals:

BRS_Res3 = resid(BRS_Mod3)
qqnorm(BRS_Res3, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res3)

The residuals seem to lie in a straight line, which suggests normality.

qplot(BRS_Res3, main = "Histogram of BRS Residuals", binwidth = .2)

The residuals appear to follow the shape of a normal distribution.

BRS_Shap3 = shapiro.test(BRS_Res3)
BRS_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res3
## W = 0.96881, p-value = 0.1102

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.11.

  1. Homogeneity of Variance
BRS_Lev3 = leveneTest(data = Data2, T1_BRS ~ Condition, center = median)
BRS_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0025 0.9603
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0, p = 0.96.

Interpretation of Main Effects

Run the t-test.

BRS_T3 = t.test(data = Data2, T1_BRS ~ Condition, paired = FALSE, var.equal = TRUE)
BRS_T3
## 
##  Two Sample t-test
## 
## data:  T1_BRS by Condition
## t = 0.70141, df = 61, p-value = 0.4857
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.2620074  0.5451271
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   3.440171                   3.298611

Calculate Cohen’s d effect size.

BRS_d3 = cohen.d(data = Data2, T1_BRS ~ Condition, paired = FALSE)
BRS_d3
## 
## Cohen's d
## 
## d estimate: 0.1819721 (negligible)
## 95 percent confidence interval:
##        inf        sup 
## -0.3378166  0.7017607

A significant difference in T1 BRS scores was not observed between the control (MC = 3.44, SDC = 0.76) and experimental (ME = 3.3, SDE = 0.81) conditions; t (61) = 0.7, p = 0.49, d = 0.18.

Five Facet Mindfulness Questionnaire

T-Test - Non-Reactivity

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNR_Mod3 = lm(Data2$T1_NR_FFMQ ~ Data2$Condition) 

# Calculate residuals:

FFMQNR_Res3 = resid(FFMQNR_Mod3)
qqnorm(FFMQNR_Res3, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res3)

The residuals seem to lie in a straight line, which suggests normality.

qplot(FFMQNR_Res3, main = "Histogram of FFMQ-NR Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNR_Shap3 = shapiro.test(FFMQNR_Res3)
FFMQNR_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res3
## W = 0.98267, p-value = 0.5175

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.52.

  1. Homogeneity of Variance
FFMQNR_Lev3 = leveneTest(data = Data2, T1_NR_FFMQ ~ Condition, center = median)
FFMQNR_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0187 0.8916
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.02, p = 0.89.

Interpretation of Main Effects

Run the t-test.

FFMQNR_T3 = t.test(data = Data2, T1_NR_FFMQ ~ Condition, paired = FALSE, var.equal = TRUE)
FFMQNR_T3
## 
##  Two Sample t-test
## 
## data:  T1_NR_FFMQ by Condition
## t = 0.40979, df = 61, p-value = 0.6834
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.504584  2.280225
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   14.17949                   13.79167

Calculate Cohen’s d effect size.

FFMQNR_d3 = cohen.d(data = Data2, T1_NR_FFMQ ~ Condition, paired = FALSE)
FFMQNR_d3
## 
## Cohen's d
## 
## d estimate: 0.1063157 (negligible)
## 95 percent confidence interval:
##        inf        sup 
## -0.4128068  0.6254382

A significant difference in T1 FFMQ-Non-Reactivity scores was not observed between the control (MC = 14.18, SDC = 3.6) and experimental (ME = 13.79, SDE = 3.73) conditions; t (61) = 0.41, p = 0.68, d = 0.11.

T-Test - Observing

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQOB_Mod3 = lm(Data2$T1_OB_FFMQ ~ Data2$Condition) 

# Calculate residuals:

FFMQOB_Res3 = resid(FFMQOB_Mod3)
qqnorm(FFMQOB_Res3, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res3)

The residuals seem to lie in a straight line, which suggests normality.

qplot(FFMQOB_Res3, main = "Histogram of FFMQ-OB Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_Shap3 = shapiro.test(FFMQOB_Res3)
FFMQOB_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res3
## W = 0.98544, p-value = 0.6632

Based on an alpha level of .05, the assumption of normality is met; W = 0.99, p = 0.66.

  1. Homogeneity of Variance
FFMQOB_Lev3 = leveneTest(data = Data2, T1_OB_FFMQ ~ Condition, center = median)
FFMQOB_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.0205 0.8866
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.02, p = 0.89.

Interpretation of Main Effects

Run the t-test.

FFMQOB_T3 = t.test(data = Data2, T1_OB_FFMQ ~ Condition, paired = FALSE, var.equal = TRUE)
FFMQOB_T3
## 
##  Two Sample t-test
## 
## data:  T1_OB_FFMQ by Condition
## t = 1.8745, df = 61, p-value = 0.06565
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.107599  3.331958
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   13.48718                   11.87500

Calculate Cohen’s d effect size.

FFMQOB_d3 = cohen.d(data = Data2, T1_OB_FFMQ ~ Condition, paired = FALSE)
FFMQOB_d3
## 
## Cohen's d
## 
## d estimate: 0.4863193 (small)
## 95 percent confidence interval:
##         inf         sup 
## -0.03964152  1.01228006

A significant difference in T1 FFMQ-Observing scores was not observed between the control (MC = 13.49, SDC = 3.31) and experimental (ME = 11.88, SDE = 3.33) conditions; t (61) = 1.87, p = 0.07, d = 0.49.

T-Test - Acting with Awareness

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQAA_Mod3 = lm(Data2$T1_AA_FFMQ ~ Data2$Condition) 

# Calculate residuals:

FFMQAA_Res3 = resid(FFMQAA_Mod3)
qqnorm(FFMQAA_Res3, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res3)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQAA_Res3, main = "Histogram of FFMQ-AA Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_Shap3 = shapiro.test(FFMQAA_Res3)
FFMQAA_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res3
## W = 0.97088, p-value = 0.1407

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.14.

  1. Homogeneity of Variance
FFMQAA_Lev3 = leveneTest(data = Data2, T1_AA_FFMQ ~ Condition, center = median)
FFMQAA_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  2.7861 0.1002
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 2.79, p = 0.1.

Interpretation of Main Effects

Run the t-test.

FFMQAA_T3 = t.test(data = Data2, T1_AA_FFMQ ~ Condition, paired = FALSE, var.equal = TRUE)
FFMQAA_T3
## 
##  Two Sample t-test
## 
## data:  T1_AA_FFMQ by Condition
## t = 2.0695, df = 61, p-value = 0.04274
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.06504018 3.78752393
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   15.38462                   13.45833

Calculate Cohen’s d effect size.

FFMQAA_d3 = cohen.d(data = Data2, T1_AA_FFMQ ~ Condition, paired = FALSE)
FFMQAA_d3
## 
## Cohen's d
## 
## d estimate: 0.5369053 (medium)
## 95 percent confidence interval:
##         inf         sup 
## 0.009385282 1.064425250

Control participants (MC = 15.38, SDC = 3.84) scored significantly higher on the FFMQ-Awareness at T1 than did experimental participants (ME = 13.46, SDE = 3.13); t (61) = 2.07, p = 0.04, d = 0.54

Follow-Up Analysis

Because T1 control scores on the FFMQ-Awareness were found to be significantly higher than T1 experimental scores, we will conduct a follow-up analysis to assess if the T1 control scores on this measure are as high as T2 experimental scores.

Before we begin, we’ll define a data set that combines T1 control and T2 experimental data:

# Control:

T1_Con = subset(T1Data2, Condition == "Control")

# Experimental:

T2_Exp = subset(T2Data2, Condition == "Experimental")

# Combine the subsets into a full data frame:

Long3 = rbind(T1_Con, T2_Exp)
Assumptions
  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQAA_Mod3a = lm(Long3$AA_FFMQ ~ Long3$Condition) 

# Calculate residuals:

FFMQAA_Res3a = resid(FFMQAA_Mod3a)
qqnorm(FFMQAA_Res3a, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res3a)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQAA_Res3a, main = "Histogram of FFMQ-AA Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_Shap3a = shapiro.test(FFMQAA_Res3a)
FFMQAA_Shap3a
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res3a
## W = 0.97584, p-value = 0.2503

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.25.

  1. Homogeneity of Variance
FFMQAA_Lev3a = leveneTest(data = Long3, AA_FFMQ ~ Condition, center = median)
FFMQAA_Lev3a
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.6347 0.4287
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.63, p = 0.43.

Interpretation of Main Effects

Run the t-test.

FFMQAA_T3a = t.test(data = Long3, AA_FFMQ ~ Condition, paired = FALSE, var.equal = TRUE)
FFMQAA_T3a
## 
##  Two Sample t-test
## 
## data:  AA_FFMQ by Condition
## t = -0.25636, df = 61, p-value = 0.7985
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.115403  1.634634
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   15.38462                   15.62500

Calculate Cohen’s d effect size.

FFMQAA_d3a = cohen.d(data = Long3, AA_FFMQ ~ Condition, paired = FALSE)
FFMQAA_d3a
## 
## Cohen's d
## 
## d estimate: -0.0665092 (negligible)
## 95 percent confidence interval:
##        inf        sup 
## -0.5854213  0.4524029

With respect to the FFMQ-Awareness, a significant difference in T1 control scores (MC = 15.38, SDC = 3.84) and T2 experimental scores (ME = 15.62, SDE = 3.21) was not observed; t (61) = -0.26, p = 0.8, d = -0.07.

T-Test - Describing

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQDS_Mod3 = lm(Data2$T1_DS_FFMQ ~ Data2$Condition) 

# Calculate residuals:

FFMQDS_Res3 = resid(FFMQDS_Mod3)
qqnorm(FFMQDS_Res3, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res3)

The residuals seem to be slightly skewed.

qplot(FFMQDS_Res3, main = "Histogram of FFMQ-DS Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

FFMQDS_Shap3 = shapiro.test(FFMQDS_Res3)
FFMQDS_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res3
## W = 0.9546, p-value = 0.02081

Based on an alpha level of .05, the assumption of normality is not met; W = 0.95, p = 0.02. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

FFMQDS_W3 = wilcox_test(data = Data2, T1_DS_FFMQ ~ Condition, distribution = "exact")
FFMQDS_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_DS_FFMQ by Condition (Control, Experimental)
## Z = 0.085572, p-value = 0.9351
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQDS_r3 = WilcoxEff(abs(unname(FFMQDS_W3@statistic@teststatistic)), length(Data2$T1_DS_FFMQ))
FFMQDS_r3
## [1] 0.01078109

A significant difference in T1 FFMQ-Describing scores was not observed between the control (MC = 17.9, SDC = 3.63) and experimental (ME = 17.96, SDE = 2.49) conditions; Z = 0.09, p = 0.94, r = 0.01.

T-Test - Non-Judging

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNJ_Mod3 = lm(Data2$T1_NJ_FFMQ ~ Data2$Condition) 

# Calculate residuals:

FFMQNJ_Res3 = resid(FFMQNJ_Mod3)
qqnorm(FFMQNJ_Res3, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res3)

The residuals appear to lie in a fairly straight line, which suggests normality.

qplot(FFMQNJ_Res3, main = "Histogram of FFMQ-NJ Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNJ_Shap3 = shapiro.test(FFMQNJ_Res3)
FFMQNJ_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res3
## W = 0.97582, p-value = 0.2497

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.25.

  1. Homogeneity of Variance
FFMQNJ_Lev3 = leveneTest(data = Data2, T1_NJ_FFMQ ~ Condition, center = median)
FFMQNJ_Lev3
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  0.4912  0.486
##       61

Based on an alpha level of .05, the assumption of homogeneity of between-group variances is met; F(1, 61) = 0.49, p = 0.49.

Interpretation of Main Effects

Run the t-test.

FFMQNJ_T3 = t.test(data = Data2, T1_NJ_FFMQ ~ Condition, paired = FALSE, var.equal = TRUE)
FFMQNJ_T3
## 
##  Two Sample t-test
## 
## data:  T1_NJ_FFMQ by Condition
## t = 1.4082, df = 61, p-value = 0.1641
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.6958981  4.0100007
## sample estimates:
##      mean in group Control mean in group Experimental 
##                   16.94872                   15.29167

Calculate Cohen’s d effect size.

FFMQNJ_d3 = cohen.d(data = Data2, T1_NJ_FFMQ ~ Condition, paired = FALSE)
FFMQNJ_d3
## 
## Cohen's d
## 
## d estimate: 0.3653457 (small)
## 95 percent confidence interval:
##        inf        sup 
## -0.1574977  0.8881891

A significant difference in T1 FFMQ-Non-Judging scores was not observed between the control (MC = 16.95, SDC = 4.72) and experimental (ME = 15.29, SDE = 4.21) conditions; t (61) = 1.41, p = 0.16, d = 0.37.

Depression, Anxiety, and Stress Scale

T-Test - Depression

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSD_Mod3 = lm(Data2$T1_D_DASS ~ Data2$Condition) 

# Calculate residuals:

DASSD_Res3 = resid(DASSD_Mod3)
qqnorm(DASSD_Res3, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res3)

The residuals seem to be slightly skewed to the right.

qplot(DASSD_Res3, main = "Histogram of DASS-D Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSD_Shap3 = shapiro.test(DASSD_Res3)
DASSD_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res3
## W = 0.79725, p-value = 0.00000006748

Based on an alpha level of .05, the assumption of normality is not met; W = 0.8, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

DASSD_W3 = wilcox_test(data = Data2, T1_D_DASS ~ Condition, distribution = "exact")
DASSD_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_D_DASS by Condition (Control, Experimental)
## Z = -1.0373, p-value = 0.3037
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_r3 = WilcoxEff(abs(unname(DASSD_W3@statistic@teststatistic)), length(Data2$T1_D_DASS))
DASSD_r3
## [1] 0.1306863

A significant difference in T1 DASS-Depression scores was not observed between the control (MC = 7.54, SDC = 8.24) and experimental (ME = 10.92, SDE = 11.24) conditions; Z = -1.04, p = 0.3, r = 0.13.

T-Test - Anxiety

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSA_Mod3 = lm(Data2$T1_A_DASS ~ Data2$Condition) 

# Calculate residuals:

DASSA_Res3 = resid(DASSA_Mod3)
qqnorm(DASSA_Res3, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res3)

The residuals seem to be slightly skewed to the right.

qplot(DASSA_Res3, main = "Histogram of DASS-A Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSA_Shap3 = shapiro.test(DASSA_Res3)
DASSA_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res3
## W = 0.79038, p-value = 0.00000004548

Based on an alpha level of .05, the assumption of normality is not met; W = 0.79, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

DASSA_W3 = wilcox_test(data = Data2, T1_A_DASS ~ Condition, distribution = "exact")
DASSA_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_A_DASS by Condition (Control, Experimental)
## Z = -0.88959, p-value = 0.3783
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSA_r3 = WilcoxEff(abs(unname(DASSA_W3@statistic@teststatistic)), length(Data2$T1_A_DASS))
DASSA_r3
## [1] 0.1120772

A significant difference in T1 DASS-Anxiety scores was not observed between the control (MC = 6.31, SDC = 8.29) and experimental (ME = 6.83, SDE = 6.7) conditions; Z = -0.89, p = 0.38, r = 0.11.

T-Test - Stress

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSS_Mod3 = lm(Data2$T1_S_DASS ~ Data2$Condition) 

# Calculate residuals:

DASSS_Res3 = resid(DASSS_Mod3)
qqnorm(DASSS_Res3, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res3)

The residuals seem to be slightly skewed to the right.

qplot(DASSS_Res3, main = "Histogram of DASS-S Residuals", binwidth = 1.2)

The residuals seem to be slightly skewed to the right.

DASSS_Shap3 = shapiro.test(DASSS_Res3)
DASSS_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res3
## W = 0.94189, p-value = 0.005073

Based on an alpha level of .05, the assumption of normality is not met; W = 0.94, p = 0.01. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

DASSS_W3 = wilcox_test(data = Data2, T1_S_DASS ~ Condition, distribution = "exact")
DASSS_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_S_DASS by Condition (Control, Experimental)
## Z = -0.042663, p-value = 0.9691
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSS_r3 = WilcoxEff(abs(unname(DASSS_W3@statistic@teststatistic)), length(Data2$T1_S_DASS))
DASSS_r3
## [1] 0.005374981

A significant difference in T1 DASS-Stress scores was not observed between the control (MC = 14.97, SDC = 8.78) and experimental (ME = 14.5, SDE = 7.9) conditions; Z = -0.04, p = 0.97, r = 0.01.

Job Effectiveness Questionnaire

T-Test

As before, we’ll conduct an independent samples t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

JEQ_Mod3 = lm(Data2$T1_JEQ ~ Data2$Condition) 

# Calculate residuals:

JEQ_Res3 = resid(JEQ_Mod3)
qqnorm(JEQ_Res3, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res3)

The residuals seem to be slightly skewed to the left.

qplot(JEQ_Res3, main = "Histogram of JEQ Residuals", binwidth = .2)

The residuals seem to be slightly skewed to the left.

JEQ_Shap3 = shapiro.test(JEQ_Res3)
JEQ_Shap3
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res3
## W = 0.95386, p-value = 0.01913

Based on an alpha level of .05, the assumption of normality is not met; W = 0.95, p = 0.02. As a result, rather than perform a t-test, we will use the non-parametric Wilcox-Mann-Whitney Test.

Interpretation of Main Effects

JEQ_W3 = wilcox_test(data = Data2, T1_JEQ ~ Condition, distribution = "exact")
JEQ_W3
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  T1_JEQ by Condition (Control, Experimental)
## Z = 0.4461, p-value = 0.6604
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

JEQ_r3 = WilcoxEff(abs(unname(JEQ_W3@statistic@teststatistic)), length(Data2$T1_JEQ))
JEQ_r3
## [1] 0.05620355

A significant difference in T1 JEQ scores was not observed between the control (MC = 5.3, SDC = 0.65) and experimental (ME = 5.18, SDE = 0.62) conditions; Z = 0.45, p = 0.66, r = 0.06.

Summary of Results

The following results were found to be statistically significant:

  • Five Facet Mindfulness Questionnaire

    • control participants displayed a greater degree of acting with awareness at T1 than did experimental participants (p = 0.01) and, in fact, displayed levels at T1 that were similar to the levels displayed by the experimental group at T2 (p = 0.8)

Conclusion

This third set of analyses revealed that control participants displayed a level of acting with awareness at T1 that was greater than the level displayed at T1 by those in the experimental condition; in fact, T1 control scores on the FFMQ-Awareness were similar to T2 experimental scores on this measure. This suggests that, for some reason, participants in the experimental condition began the study with a lower level of awareness than those in the control condition. Following the intervention, experimental participants’ level of awareness increased to that of the control condition. We cannot, however, state with certainty that this increase in awareness was due solely to the mindfulness intervention because:

  1. there may be some innate between-group difference that both effects trait awareness and moderates how effective the program is in altering this characteristic at a state level, and/or

  2. the observed T1-T2 change in experimental group awareness may have been caused by the passage of time, the effects of which were not found to be significant for those in the control condition simply because the control group began the study with a higher degree of awareness.

With respect to the FFMQ-Awareness, therefore, it is unclear if the effects observed in the previous set of analyses are attributable to the mindfulness intervention, the passage of time, or some other unknown factor.

With the exception of the FFMQ-Awareness though, participants in both groups scored similarly at T1 on all of the measures considered. These results, in combination with the results from the previous section, suggest that all participants began at similar levels of stress, affect, etc., and that something occurred between T1 and T2 to drive a change in these variables for participants in the experimental condition but not for those in the control condition. These results, therefore, provide additional support for the efficacy of the mindfulness intervention in improving psychological well-being.

We will now assess this conclusion further through another series of exploratory analyses looking at the effects of time on self-report scores across T2 and T3. If the mindfulness intervention is effective in altering the outcome measures considered in this study, participants in the control condition should have experienced changes between T2 and T3 (following their completion of the mindfulness intervention) that were similar to those observed between T1 and T2 for those in the experimental condition. Note, however, that there is a major caveat to this next analysis, namely that there is no control group with which the control group may be adequately compared to. Although we have T2-T3 data for participants in the experimental condition, experimental participants may have continued to practice the meditations from the mindfulness intervention throughout this period of time and/or their T3 responses may have been influenced by long-term carry-over effects of the program. (Recall, for instance, that the first set of analyses revealed a condition-specific increase in observing across all three time points, indicating that experimental participants may have experienced intervention-related changes that were subsequently maintained following the end of the mindfulness program.) Consequently, the experimental condition will be excluded from the next set of analyses but any results obtained should be interpreted with caution.


4. Control Changes Across the Last Two Time Points

Our fourth set of analyses will look at the effect of time on control participant self-report scores across the last two time points (i.e. T2 and T3).

Subsetting Data

For these analyses, we will focus on control participants who provided responses to the last two surveys and who actively participated in the meditation program. Before we begin, therefore, we will subset the data according to the Condition, T2,T3 and Med_Week variables. We will also create a separate data set for scores on the FFMQ, DASS, and JEQ because one participant in the control condition failed to complete these scales in the T3 survey; this participant’s data will be included in the analyses for the scales that they completed but will be omitted for analyses involving the three scales that they failed to respond to.

Subset 1

Begin by selecting control participants who completed the last two surveys and who meditated throughout the program.

Data4a = subset(AllData, Condition == "Control" & T2 == "1" & T3 == "1" & Med_Week >= "1")

We’ll also want to create a long version of the self-report scores in this data frame (excluding those related to the FFMQ, DASS, and JEQ) so that we can conduct paired t-tests.

# Create a series of data frames that will specify the level of Time within our long data set:

T2Frame4a = data.frame(matrix("T2", nrow = (nrow(Data4a)), ncol = 1))

T3Frame4a = data.frame(matrix("T3", nrow = (nrow(Data4a)), ncol = 1))

# T2 subset:

T2Data4a = data.frame(Data4a$Subject, Data4a$Condition, T2Frame4a, Data4a$T2_PSS, Data4a$T2_POS_PANAS, Data4a$T2_NEG_PANAS, Data4a$T2_BRS)

colnames(T2Data4a) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS")

# T3 subset:

T3Data4a = data.frame(Data4a$Subject, Data4a$Condition, T3Frame4a, Data4a$T3_PSS, Data4a$T3_POS_PANAS, Data4a$T3_NEG_PANAS, Data4a$T3_BRS)

colnames(T3Data4a) = c("Subject", "Condition", "Time", "PSS", "POS_PANAS", "NEG_PANAS", "BRS")

# Combine the subsets into a full data frame:

Long4a = rbind(T2Data4a, T3Data4a)

Subset 2

This data set will encompass only those variables related to the FFMQ, DASS, and JEQ.

# Specify variables to include:

Data4bIn = names(Data4a) %in% c("Subject", "Condition", "T2_NR_FFMQ", "T2_OB_FFMQ", "T2_AA_FFMQ", "T2_DS_FFMQ", "T2_NJ_FFMQ", "T2_D_DASS", "T2_A_DASS", "T2_S_DASS", "T2_JEQ", "T3_NR_FFMQ", "T3_OB_FFMQ", "T3_AA_FFMQ", "T3_DS_FFMQ", "T3_NJ_FFMQ", "T3_D_DASS", "T3_A_DASS", "T3_S_DASS", "T3_JEQ")

# Define the final subset:

Data4b = na.omit(Data4a[Data4bIn])

We’ll also want to create a long version of the self-report scores in this data frame so that we can conduct paired t-tests.

# Create a series of data frames that will specify the level of Time within our long data set:

T2Frame4b = data.frame(matrix("T2", nrow = (nrow(Data4b)), ncol = 1))

T3Frame4b = data.frame(matrix("T3", nrow = (nrow(Data4b)), ncol = 1))

# T2 subset:

T2Data4b = data.frame(Data4b$Subject, Data4b$Condition, T2Frame4b, Data4b$T2_NR_FFMQ, Data4b$T2_OB_FFMQ, Data4b$T2_AA_FFMQ, Data4b$T2_DS_FFMQ, Data4b$T2_NJ_FFMQ, Data4b$T2_D_DASS, Data4b$T2_A_DASS, Data4b$T2_S_DASS, Data4b$T2_JEQ)

colnames(T2Data4b) = c("Subject", "Condition", "Time", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# T3 subset:

T3Data4b = data.frame(Data4b$Subject, Data4b$Condition, T3Frame4b, Data4b$T3_NR_FFMQ, Data4b$T3_OB_FFMQ, Data4b$T3_AA_FFMQ, Data4b$T3_DS_FFMQ, Data4b$T3_NJ_FFMQ, Data4b$T3_D_DASS, Data4b$T3_A_DASS, Data4b$T3_S_DASS, Data4b$T3_JEQ)

colnames(T3Data4b) = c("Subject", "Condition", "Time", "NR_FFMQ", "OB_FFMQ", "AA_FFMQ", "DS_FFMQ", "NJ_FFMQ", "D_DASS", "A_DASS", "S_DASS", "JEQ")

# Combine the subsets into a full data frame:

Long4b = rbind(T2Data4b, T3Data4b)

Demographic Information

Now we’ll look at some basic demographic information for this subset of participants. We’ll begin by assessing the nominal variables in this data set.

# Gender:

Gender4 = ftable(Data4a$Gender)

# Prior meditation experience:

Med_Prior4 = ftable(Data4a$Med_Prior)

# Prior yoga experience:

Yoga_Prior4 = ftable(Data4a$Yoga_Prior)

# Prior tai chi experience:

Tai_Prior4 = ftable(Data4a$Tai_Prior)

# Combine these variables into a single data frame:

Demos4a = cbind(Gender4, Med_Prior4, Yoga_Prior4, Tai_Prior4)

# Create a table to display the results:

kable(Demos4a, caption = "Table 83. Frequency-based demographic information (i.e. n) for control participants who completed the last two surveys.",  col.names = c("Male", "Female", "Yes", "No", "Yes", "No", "Yes", "No"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c("Gender" = 2, "Meditation Exp." = 2, "Yoga Exp." = 2, "Tai Chi Exp." = 2))
Table 83. Frequency-based demographic information (i.e. n) for control participants who completed the last two surveys.
Gender
Meditation Exp.
Yoga Exp.
Tai Chi Exp.
Male Female Yes No Yes No Yes No
7 14 9 12 4 17 1 19

Next, we’ll look at some of the continuous variables in this data set.

# Age

Age4 = summarySE(data = Data4a, measurevar = "Age", conf.interval = .95)

# Weekly hours:

Weekly_Hrs4 = summarySE(data = Data4a, measurevar = "Weekly_Hrs", conf.interval = .95)

# Mins/Week spent meditating during the program:

Mins_Week4 = summarySE(data = Data4a, measurevar = "Mins_Week", conf.interval = .95)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(Age4)[colnames(Age4) == "Age"] = "M"
colnames(Weekly_Hrs4)[colnames(Weekly_Hrs4) == "Weekly_Hrs"] = "M"
colnames(Mins_Week4)[colnames(Mins_Week4) == "Mins_Week"] = "M"

# Combine these variables into a single data frame:

Demos4b = data.frame(rbind(Age4, Weekly_Hrs4, Mins_Week4))

# Create a table to display the results:

kable(Demos4b[,2:6], digits = 4, caption = "Table 84. Demographic information for control participants who completed the last two surveys.",  col.names = c("n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Age", 1,1) %>%
  group_rows("Weekly Hours Worked", 2,2) %>%
  group_rows("Meditation During the Program (Min/Week)", 3,3)
Table 84. Demographic information for control participants who completed the last two surveys.
n M SD SE CI
Age
21 48.5238 11.0843 2.4188 5.0455
Weekly Hours Worked
21 51.7143 8.5038 1.8557 3.8709
Meditation During the Program (Min/Week)
21 40.9524 44.7565 9.7667 20.3729

Perceived Stress Scale

Descriptive Statistics

First, we’ll calculate some basic descriptive statistics (ns, Ms, SDs, SEs, and 95% CIs) for scores across time.

# Calculate summary statistics
PSSDesc4 = summarySE(data = Long4a, measurevar = "PSS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(PSSDesc4, digits = 4,
      caption = "Table 85. Scores on the Perceived Stress Scale across time for control participants who completed the last two surveys.",
      col.names = c("Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 85. Scores on the Perceived Stress Scale across time for control participants who completed the last two surveys.
Time n M SD SE CI
T2 21 39.6667 10.7719 2.3506 4.9033
T3 21 36.5714 7.8203 1.7065 3.5598

Plotting Scores

Now we’ll create a plot so that we can visualize the data.

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

PSSMin4 = data.frame("PSSMin" = PSSDesc4$PSS - PSSDesc4$se)

# Calculate SE max:

PSSMax4 = data.frame("PSSMax" = PSSDesc4$PSS + PSSDesc4$se)

# Create data frame of values to be used:

PSSPlot4 = data.frame("Time" = PSSDesc4$Time, "PSSMean" = PSSDesc4$PSS,
                         "PSSMin" = PSSMin4, "PSSMax" = PSSMax4)
  1. Plot the data.
# Create a figure caption:

PSSCap4 = "Figure 13. Distributions of scores on the Perceived Stress Scale (PSS) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
PSSCap4 = paste0(strwrap(PSSCap4, width = 40), collapse = "\n")

# Create the plot:

PSSFig4 = (Long4a %>%
  ggplot(aes(Time, PSS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = .7) +

  # Add in dots and lines:

  geom_pointrange(data = PSSPlot4,
    aes(Time, PSSMean, ymin = PSSMin, ymax = PSSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "PSS Score", caption = PSSCap4) +

  # Define variable colours and theme:

  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10), legend.position = "none")
PSSFig4

T-Test

To assess if any time-related score differences are statistically significant, we’ll conduct a paired t-test.

Assumptions

The paired t-test makes two primary assumptions:

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality

This assumption can be tested by visualizing and applying a Shapiro-Wilk test to the residuals (which can be calculated from the model that is being tested).

# Define the model:

PSS_Mod4 = lm(Long4a$PSS ~ Long4a$Time) 

# Calculate residuals:

PSS_Res4 = resid(PSS_Mod4)

Visualize the residuals with a q-q plot:

qqnorm(PSS_Res4, main = "Q-Q Plot of PSS Residuals")
qqline(PSS_Res4)

The residuals appear to be slightly skewed.

Visualize the residuals with a histogram:

qplot(PSS_Res4, main = "Histogram of PSS Residuals", binwidth = 1.5)

The residuals appear to follow the shape of a normal distribution.

Conduct a Shapiro-Wilk test:

PSS_Shap4 = shapiro.test(PSS_Res4)
PSS_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res4
## W = 0.96558, p-value = 0.2329

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.23.

Interpretation of Main Effects

Run the t-test.

PSS_T4 = t.test(data = Long4a, PSS ~ Time, paired = TRUE)
PSS_T4
## 
##  Paired t-test
## 
## data:  PSS by Time
## t = 2.3043, df = 20, p-value = 0.03206
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  0.2932771 5.8971990
## sample estimates:
## mean of the differences 
##                3.095238

Calculate Cohen’s d effect size.

PSS_d4 = cohen.d(data = Long4a, PSS ~ Time, paired = TRUE)
PSS_d4
## 
## Cohen's d
## 
## d estimate: 0.5028391 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -0.1306582  1.1363364

For those in the control condition, T3 scores (MT3 = 36.57, SDT3 = 7.82) on the PSS were found to be significantly lower than T2 scores (MT2 = 39.67, SDT2 = 10.77); t (20) = 2.3, p = 0.03, d = 0.5.

Positive and Negative Affect Schedule

Descriptive Statistics

# PANAS-Positive:

POS_PANAS4 = summarySE(data = Long4a, measurevar = "POS_PANAS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# PANAS-Negative:

NEG_PANAS4 = summarySE(data = Long4a, measurevar = "NEG_PANAS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(POS_PANAS4)[colnames(POS_PANAS4) == "POS_PANAS"] = "M"
colnames(NEG_PANAS4)[colnames(NEG_PANAS4) == "NEG_PANAS"] = "M"

# Combine these variables into a single data frame:

PANASDesc4 = data.frame(rbind(POS_PANAS4, NEG_PANAS4))

# Create a table to display the results:

kable(PANASDesc4, digits = 4, caption = "Table 86. Scores on the Positive and Negative Affect Schedule across time for control participants who completed the last two surveys.",  col.names = c("Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Positive Affect", 1, 2) %>%
  group_rows("Negative Affect", 3, 4)
Table 86. Scores on the Positive and Negative Affect Schedule across time for control participants who completed the last two surveys.
Time n M SD SE CI
Positive Affect
T2 21 31.6190 6.5075 1.4201 2.9622
T3 21 33.2381 5.7871 1.2628 2.6343
Negative Affect
T2 21 23.8571 9.7123 2.1194 4.4210
T3 21 21.4286 7.1104 1.5516 3.2366

Plotting Scores

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the positive affect plot.
# Calculate SE min:

PANASPMin4 = data.frame("PANASPMin" = POS_PANAS4$M - POS_PANAS4$se)

# Calculate SE max:

PANASPMax4 = data.frame("PANASPMax" = POS_PANAS4$M + POS_PANAS4$se)

# Create data frame of values to be used:

PANASPPlot4 = data.frame("Time" = POS_PANAS4$Time, "PANASPMean" = POS_PANAS4$M,
                            "PANASPMin" = PANASPMin4, "PANASPMax" = PANASPMax4)
  1. Create the positive affect plot.
# Create the plot:

PANASPFig4 = (Long4a %>%
  ggplot(aes(Time, POS_PANAS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = .7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASPPlot4,
    aes(Time, PANASPMean, ymin = PANASPMin, ymax = PANASPMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Positive Score") +
    ggtitle("a") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the negative affect plot.
# Calculate SE min:

PANASNMin4 = data.frame("PANASNMin" = NEG_PANAS4$M - NEG_PANAS4$se)

# Calculate SE max:

PANASNMax4 = data.frame("PANASNMax" = NEG_PANAS4$M + NEG_PANAS4$se)

# Create data frame of values to be used:

PANASNPlot4 = data.frame("Time" = NEG_PANAS4$Time, "PANASNMean" = NEG_PANAS4$M,
                            "PANASNMin" = PANASNMin4, "PANASNMax" = PANASNMax4)
  1. Create the negative affect plot.
# Create the plot:

PANASNFig4 = (Long4a %>%
  ggplot(aes(Time, NEG_PANAS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = .7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASNPlot4,
    aes(Time, PANASNMean, ymin = PANASNMin, ymax = PANASNMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 60) +

  # Add labels:

  labs(x = "Time of Testing", y = "PANAS-Negative Score") +
    ggtitle("b") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
PANASCap4 = "Figure 14. Distributions of scores on the positive (a) and negative (b) affect subscales of the Positive And Negative Affect Schedule (PANAS) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
PANASCap4 = paste0(strwrap(PANASCap4, width = 75), collapse = "\n")
  1. Display the figure.
PANASFig4 = grid.arrange(PANASPFig4 + theme(legend.position = "hidden"), PANASNFig4 + theme(legend.position = "hidden"), nrow = 1, widths = c(1.1, 1.1), bottom = textGrob(PANASCap4, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

T-Test - Positive Affect

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASP_Mod4 = lm(Long4a$POS_PANAS ~ Long4a$Time) 

# Calculate residuals:

PANASP_Res4 = resid(PANASP_Mod4)
qqnorm(PANASP_Res4, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res4)

The residuals appear to be slightly leptokurtic.

qplot(PANASP_Res4, main = "Histogram of PANAS-P Residuals", binwidth = 1.4)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly leptokurtic.

PANASP_Shap4 = shapiro.test(PANASP_Res4)
PANASP_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res4
## W = 0.92445, p-value = 0.008459

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p = 0.01. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

PANASP_W4 = wilcoxsign_test(data = Long4a, POS_PANAS ~ Time | (as.factor(Subject)), distribution = "exact")
PANASP_W4
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -1.6571, p-value = 0.09901
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASP_r4 = WilcoxEff(abs(unname(PANASP_W4@statistic@teststatistic)), (length(Long4a$POS_PANAS)/2))
PANASP_r4
## [1] 0.3616156

For those in the control condition, a significant difference in PANAS-Positive score was not observed between T2 (MT2 = 31.62, SDT2 = 6.51) and T3 (MT3 = 33.24, SDT3 = 5.79); Z = -1.66, p = 0.1, r = 0.36.

T-Test - Negative Affect

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

PANASN_Mod4 = lm(Long4a$NEG_PANAS ~ Long4a$Time) 

# Calculate residuals:

PANASN_Res4 = resid(PANASN_Mod4)
qqnorm(PANASN_Res4, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res4)

The residuals appear to be slightly platykurtic.

qplot(PANASN_Res4, main = "Histogram of PANAS-N Residuals", binwidth = 1.4)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly platykurtic.

PANASN_Shap4 = shapiro.test(PANASN_Res4)
PANASN_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res4
## W = 0.94211, p-value = 0.03388

Based on an alpha level of .05, the assumption of normality is not met; W = 0.94, p = 0.03. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

PANASN_W4 = wilcoxsign_test(data = Long4a, NEG_PANAS ~ Time | (as.factor(Subject)), distribution = "exact")
PANASN_W4
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 2.2296, p-value = 0.02344
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

PANASN_r4 = WilcoxEff(abs(unname(PANASN_W4@statistic@teststatistic)), (length(Long4a$NEG_PANAS)/2))
PANASN_r4
## [1] 0.4865418

For those in the control condition, T3 scores (MT3 = 21.43, SDT3 = 7.11) on the PANAS-Negative were found to be significantly lower than T2 scores (MT2 = 23.86, SDT2 = 9.71); Z = 2.23, p = 0.02, r = 0.49.

Brief Resilience Scale

Descriptive Statistics

# Calculate summary statistics
BRSDesc4 = summarySE(data = Long4a, measurevar = "BRS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(BRSDesc4, digits = 4,
      caption = "Table 87. Scores on the Brief Resilience Scale across time for control participants who completed the last two surveys.",
      col.names = c("Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 87. Scores on the Brief Resilience Scale across time for control participants who completed the last two surveys.
Time n M SD SE CI
T2 21 3.5476 0.8582 0.1873 0.3906
T3 21 3.6746 0.6551 0.1429 0.2982

Plotting Scores

Now we’ll create a plot so that we can visualize the data.

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

BRSMin4 = data.frame("BRSMin" = BRSDesc4$BRS - BRSDesc4$se)

# Calculate SE max:

BRSMax4 = data.frame("BRSMax" = BRSDesc4$BRS + BRSDesc4$se)

# Create data frame of values to be used:

BRSPlot4 = data.frame("Time" = BRSDesc4$Time, "BRSMean" = BRSDesc4$BRS,
                         "BRSMin" = BRSMin4, "BRSMax" = BRSMax4)
  1. Plot the data.
# Create a figure caption:

BRSCap4 = "Figure 15. Distributions of scores on the Brief Resilience Scale (BRS) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
BRSCap4 = paste0(strwrap(BRSCap4, width = 40), collapse = "\n")

# Create the plot:

BRSFig4 = (Long4a %>%
  ggplot(aes(Time, BRS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = .7) +

  # Add in dots and lines:

  geom_pointrange(data = BRSPlot4,
    aes(Time, BRSMean, ymin = BRSMin, ymax = BRSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "BRS Score", caption = BRSCap4) +

  # Define variable colours and theme:

  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10), legend.position = "none")
BRSFig4

T-Test

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

BRS_Mod4 = lm(Long4a$BRS ~ Long4a$Time) 

# Calculate residuals:

BRS_Res4 = resid(BRS_Mod4)
qqnorm(BRS_Res4, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res4)

The residuals appear to be slightly skewed.

qplot(BRS_Res4, main = "Histogram of BRS Residuals", binwidth = .2)

The residuals appear to follow the shape of a normal distribution.

BRS_Shap4 = shapiro.test(BRS_Res4)
BRS_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res4
## W = 0.97115, p-value = 0.3605

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.36.

Interpretation of Main Effects

Run the t-test.

BRS_T4 = t.test(data = Long4a, BRS ~ Time, paired = TRUE)
BRS_T4
## 
##  Paired t-test
## 
## data:  BRS by Time
## t = -1.1159, df = 20, p-value = 0.2777
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.3643661  0.1103978
## sample estimates:
## mean of the differences 
##              -0.1269841

Calculate Cohen’s d effect size.

BRS_d4 = cohen.d(data = Long4a, BRS ~ Time, paired = TRUE)
BRS_d4
## 
## Cohen's d
## 
## d estimate: -0.2434999 (small)
## 95 percent confidence interval:
##        inf        sup 
## -0.8695244  0.3825246

For those in the control condition, a significant difference in BRS score was not observed between T2 (MT2 = 3.55, SDT2 = 0.86) and T3 (MT3 = 3.67, SDT3 = 0.66); t (20) = -1.12, p = 0.28, d = -0.24.

Five Facet Mindfulness Questionnaire

Descriptive Statistics

# FFMQ-Non-Reactivity:

NR_FFMQ4 = summarySE(data = Long4b, measurevar = "NR_FFMQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# FFMQ-Observing:

OB_FFMQ4 = summarySE(data = Long4b, measurevar = "OB_FFMQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# FFMQ-Acting with Awareness:

AA_FFMQ4 = summarySE(data = Long4b, measurevar = "AA_FFMQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# FFMQ-Describing:

DS_FFMQ4 = summarySE(data = Long4b, measurevar = "DS_FFMQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# FFMQ-Non-Judging:

NJ_FFMQ4 = summarySE(data = Long4b, measurevar = "NJ_FFMQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(NR_FFMQ4)[colnames(NR_FFMQ4) == "NR_FFMQ"] = "M"
colnames(OB_FFMQ4)[colnames(OB_FFMQ4) == "OB_FFMQ"] = "M"
colnames(AA_FFMQ4)[colnames(AA_FFMQ4) == "AA_FFMQ"] = "M"
colnames(DS_FFMQ4)[colnames(DS_FFMQ4) == "DS_FFMQ"] = "M"
colnames(NJ_FFMQ4)[colnames(NJ_FFMQ4) == "NJ_FFMQ"] = "M"

# Combine these variables into a single data frame:

FFMQDesc4 = data.frame(rbind(NR_FFMQ4, OB_FFMQ4, AA_FFMQ4, DS_FFMQ4, NJ_FFMQ4))

# Create a table to display the results:

kable(FFMQDesc4, digits = 4, caption = "Table 88. Scores on the Five Facet Mindfulness Questionnaire across time for control participants who completed the last two surveys.",  col.names = c("Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Non-Reactivity", 1, 2) %>%
  group_rows("Observing", 3, 4) %>%
  group_rows("Acting with Awareness", 5, 6) %>%
  group_rows("Describing", 7, 8) %>%
  group_rows("Non-Judging", 9, 10)
Table 88. Scores on the Five Facet Mindfulness Questionnaire across time for control participants who completed the last two surveys.
Time n M SD SE CI
Non-Reactivity
T2 20 14.50 4.3225 0.9665 2.0230
T3 20 15.65 3.2326 0.7228 1.5129
Observing
T2 20 12.80 3.3340 0.7455 1.5604
T3 20 13.50 3.1204 0.6977 1.4604
Acting with Awareness
T2 20 15.35 4.8912 1.0937 2.2891
T3 20 16.05 3.4561 0.7728 1.6175
Describing
T2 20 17.30 4.7584 1.0640 2.2270
T3 20 17.25 4.1660 0.9315 1.9497
Non-Judging
T2 20 15.95 5.4529 1.2193 2.5520
T3 20 18.05 4.4895 1.0039 2.1011

Plotting Performance

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-reactivity plot.
# Calculate SE min:

FFMQNRMin4 = data.frame("FFMQNRMin" = NR_FFMQ4$M - NR_FFMQ4$se)

# Calculate SE max:

FFMQNRMax4 = data.frame("FFMQNRMax" = NR_FFMQ4$M + NR_FFMQ4$se)

# Create data frame of values to be used:

FFMQNRPlot4 = data.frame("Time" = NR_FFMQ4$Time, "FFMQNRMean" = NR_FFMQ4$M,
                            "FFMQNRMin" = FFMQNRMin4, "FFMQNRMax" = FFMQNRMax4)
  1. Create the non-reactivity plot.
# Create the plot:

FFMQNRFig4 = (Long4b %>%
  ggplot(aes(Time, NR_FFMQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNRPlot4,
    aes(Time, FFMQNRMean, ymin = FFMQNRMin, ymax = FFMQNRMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Reactivity Score") +
    ggtitle("a") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the observing plot.
# Calculate SE min:

FFMQOBMin4 = data.frame("FFMQOBMin" = OB_FFMQ4$M - OB_FFMQ4$se)

# Calculate SE max:

FFMQOBMax4 = data.frame("FFMQOBMax" = OB_FFMQ4$M + OB_FFMQ4$se)

# Create data frame of values to be used:

FFMQOBPlot4 = data.frame("Time" = OB_FFMQ4$Time, "FFMQOBMean" = OB_FFMQ4$M,
                            "FFMQOBMin" = FFMQOBMin4, "FFMQOBMax" = FFMQOBMax4)
  1. Create the observing plot.
# Create the plot:

FFMQOBFig4 = (Long4b %>%
  ggplot(aes(Time, OB_FFMQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQOBPlot4,
    aes(Time, FFMQOBMean, ymin = FFMQOBMin, ymax = FFMQOBMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Observing Score") +
    ggtitle("b") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the awareness plot.
# Calculate SE min:

FFMQAAMin4 = data.frame("FFMQAAMin" = AA_FFMQ4$M - AA_FFMQ4$se)

# Calculate SE max:

FFMQAAMax4 = data.frame("FFMQAAMax" = AA_FFMQ4$M + AA_FFMQ4$se)

# Create data frame of values to be used:

FFMQAAPlot4 = data.frame("Time" = AA_FFMQ4$Time, "FFMQAAMean" = AA_FFMQ4$M,
                            "FFMQAAMin" = FFMQAAMin4, "FFMQAAMax" = FFMQAAMax4)
  1. Create the awareness plot.
# Create the plot:

FFMQAAFig4 = (Long4b %>%
  ggplot(aes(Time, AA_FFMQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQAAPlot4,
    aes(Time, FFMQAAMean, ymin = FFMQAAMin, ymax = FFMQAAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Awareness Score") +
    ggtitle("c") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the describing plot.
# Calculate SE min:

FFMQDSMin4 = data.frame("FFMQDSMin" = DS_FFMQ4$M - DS_FFMQ4$se)

# Calculate SE max:

FFMQDSMax4 = data.frame("FFMQDSMax" = DS_FFMQ4$M + DS_FFMQ4$se)

# Create data frame of values to be used:

FFMQDSPlot4 = data.frame("Time" = DS_FFMQ4$Time, "FFMQDSMean" = DS_FFMQ4$M,
                            "FFMQDSMin" = FFMQDSMin4, "FFMQDSMax" = FFMQDSMax4)
  1. Create the describing plot.
# Create the plot:

FFMQDSFig4 = (Long4b %>%
  ggplot(aes(Time, DS_FFMQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQDSPlot4,
    aes(Time, FFMQDSMean, ymin = FFMQDSMin, ymax = FFMQDSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Describing Score") +
    ggtitle("d") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the non-judging plot.
# Calculate SE min:

FFMQNJMin4 = data.frame("FFMQNJMin" = NJ_FFMQ4$M - NJ_FFMQ4$se)

# Calculate SE max:

FFMQNJMax4 = data.frame("FFMQNJMax" = NJ_FFMQ4$M + NJ_FFMQ4$se)

# Create data frame of values to be used:

FFMQNJPlot4 = data.frame("Time" = NJ_FFMQ4$Time, "FFMQNJMean" = NJ_FFMQ4$M,
                            "FFMQNJMin" = FFMQNJMin4, "FFMQNJMax" = FFMQNJMax4)
  1. Create the non-judging plot.
# Create the plot:

FFMQNJFig4 = (Long4b %>%
  ggplot(aes(Time, NJ_FFMQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = FFMQNJPlot4,
    aes(Time, FFMQNJMean, ymin = FFMQNJMin, ymax = FFMQNJMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-5, 35) +

  # Add labels:

  labs(x = "Time of Testing", y = "FFMQ-Non-Judging Score") +
    ggtitle("e") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
FFMQCap4 = "Figure 16. Distributions of scores on the non-reactivity (a), observing (b), awareness (c), describing (d), and non-judging (e) subscales of the Five Facet Mindfulness Questionnaire (FFMQ) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
FFMQCap4 = paste0(strwrap(FFMQCap4, width = 100), collapse = "\n")
  1. Define the figure layout
FFMQLayout4 = rbind(c("FFMQAAFig4", "FFMQDSFig4"),
                       c("FFMQNJFig4", "FFMQNRFig4"),
                       c("FFMQOBFig4", NA))
  1. Display the figure.
FFMQFig4 = grid.arrange(FFMQNRFig4, FFMQOBFig4, FFMQAAFig4, FFMQDSFig4, FFMQNJFig4, layout_matrix = FFMQLayout4, bottom = textGrob(FFMQCap4, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

T-Test - Non-Reactivity

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNR_Mod4 = lm(Long4b$NR_FFMQ ~ Long4b$Time) 

# Calculate residuals:

FFMQNR_Res4 = resid(FFMQNR_Mod4)
qqnorm(FFMQNR_Res4, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res4)

The residuals seem to lie in a fairly straight line, which suggests normality.

qplot(FFMQNR_Res4, main = "Histogram of FFMQ-NR Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQNR_Shap4 = shapiro.test(FFMQNR_Res4)
FFMQNR_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res4
## W = 0.97372, p-value = 0.4681

Based on an alpha level of .05, the assumption of normality is met; W = 0.97, p = 0.47.

Interpretation of Main Effects

Run the t-test.

FFMQNR_T4 = t.test(data = Long4b, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_T4
## 
##  Paired t-test
## 
## data:  NR_FFMQ by Time
## t = -1.9928, df = 19, p-value = 0.06085
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.35785137  0.05785137
## sample estimates:
## mean of the differences 
##                   -1.15

Calculate Cohen’s d effect size.

FFMQNR_d4 = cohen.d(data = Long4b, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_d4
## 
## Cohen's d
## 
## d estimate: -0.4455983 (small)
## 95 percent confidence interval:
##       inf       sup 
## -1.093664  0.202467

For those in the control condition, a significant difference in FFMQ-Non-Reactivity score was not observed between T2 (MT2 = 14.5, SDT2 = 4.32) and T3 (MT3 = 15.65, SDT3 = 3.23); t (19) = -1.99, p = 0.06, d = -0.45.

T-Test - Observing

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQOB_Mod4 = lm(Long4b$OB_FFMQ ~ Long4b$Time) 

# Calculate residuals:

FFMQOB_Res4 = resid(FFMQOB_Mod4)
qqnorm(FFMQOB_Res4, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res4)

The residuals seem to lie in a fairly straight line, which suggests normality.

qplot(FFMQOB_Res4, main = "Histogram of FFMQ-OB Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQOB_Shap4 = shapiro.test(FFMQOB_Res4)
FFMQOB_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res4
## W = 0.97533, p-value = 0.5211

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.52.

Interpretation of Main Effects

Run the t-test.

FFMQOB_T4 = t.test(data = Long4b, OB_FFMQ ~ Time, paired = TRUE)
FFMQOB_T4
## 
##  Paired t-test
## 
## data:  OB_FFMQ by Time
## t = -1.0781, df = 19, p-value = 0.2945
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.0589819  0.6589819
## sample estimates:
## mean of the differences 
##                    -0.7

Calculate Cohen’s d effect size.

FFMQOB_d4 = cohen.d(data = Long4b, OB_FFMQ ~ Time, paired = TRUE)
FFMQOB_d4
## 
## Cohen's d
## 
## d estimate: -0.2410702 (small)
## 95 percent confidence interval:
##        inf        sup 
## -0.8835609  0.4014204

For those in the control condition, a significant difference in FFMQ-Observing score was not observed between T2 (MT2 = 12.8, SDT2 = 3.33) and T3 (MT3 = 13.5, SDT3 = 3.12); t (19) = -1.08, p = 0.29, d = -0.24.

T-Test - Acting with Awareness

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQAA_Mod4 = lm(Long4b$AA_FFMQ ~ Long4b$Time) 

# Calculate residuals:

FFMQAA_Res4 = resid(FFMQAA_Mod4)
qqnorm(FFMQAA_Res4, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res4)

The residuals seem to lie in a fairly straight line, which suggests normality.

qplot(FFMQAA_Res4, main = "Histogram of FFMQ-AA Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQAA_Shap4 = shapiro.test(FFMQAA_Res4)
FFMQAA_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res4
## W = 0.97964, p-value = 0.6763

Based on an alpha level of .05, the assumption of normality is met; W = 0.98, p = 0.68.

Interpretation of Main Effects

Run the t-test.

FFMQAA_T4 = t.test(data = Long4b, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_T4
## 
##  Paired t-test
## 
## data:  AA_FFMQ by Time
## t = -0.86614, df = 19, p-value = 0.3972
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.391544  0.991544
## sample estimates:
## mean of the differences 
##                    -0.7

Calculate Cohen’s d effect size.

FFMQAA_d4 = cohen.d(data = Long4b, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_d4
## 
## Cohen's d
## 
## d estimate: -0.1936752 (negligible)
## 95 percent confidence interval:
##        inf        sup 
## -0.8353439  0.4479935

For those in the control condition, a significant difference in FFMQ-Awareness score was not observed between T2 (MT2 = 15.35, SDT2 = 4.89) and T3 (MT3 = 16.05, SDT3 = 3.46); t (19) = -0.87, p = 0.4, d = -0.19.

T-Test - Describing

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQDS_Mod4 = lm(Long4b$DS_FFMQ ~ Long4b$Time) 

# Calculate residuals:

FFMQDS_Res4 = resid(FFMQDS_Mod4)
qqnorm(FFMQDS_Res4, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res4)

The residuals seem to lie in a fairly straight line, which suggests normality.

qplot(FFMQDS_Res4, main = "Histogram of FFMQ-DS Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

FFMQDS_Shap4 = shapiro.test(FFMQDS_Res4)
FFMQDS_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res4
## W = 0.95196, p-value = 0.08857

Based on an alpha level of .05, the assumption of normality is met; W = 0.95, p = 0.09.

Interpretation of Main Effects

Run the t-test.

FFMQDS_T4 = t.test(data = Long4b, DS_FFMQ ~ Time, paired = TRUE)
FFMQDS_T4
## 
##  Paired t-test
## 
## data:  DS_FFMQ by Time
## t = 0.076827, df = 19, p-value = 0.9396
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.312159  1.412159
## sample estimates:
## mean of the differences 
##                    0.05

Calculate Cohen’s d effect size.

FFMQDS_d4 = cohen.d(data = Long4b, DS_FFMQ ~ Time, paired = TRUE)
FFMQDS_d4
## 
## Cohen's d
## 
## d estimate: 0.01717914 (negligible)
## 95 percent confidence interval:
##        inf        sup 
## -0.6230023  0.6573606

For those in the control condition, a significant difference in FFMQ-Describing score was not observed between T2 (MT2 = 17.3, SDT2 = 4.76) and T3 (MT3 = 17.25, SDT3 = 4.17); t (19) = 0.08, p = 0.94, d = 0.02.

T-Test - Non-Judging

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

FFMQNJ_Mod4 = lm(Long4b$NJ_FFMQ ~ Long4b$Time) 

# Calculate residuals:

FFMQNJ_Res4 = resid(FFMQNJ_Mod4)
qqnorm(FFMQNJ_Res4, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res4)

The residuals appear to be slightly platykurtic.

qplot(FFMQNJ_Res4, main = "Histogram of FFMQ-NJ Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution, though they seem to be slightly platykurtic.

FFMQNJ_Shap4 = shapiro.test(FFMQNJ_Res4)
FFMQNJ_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res4
## W = 0.95108, p-value = 0.08262

Based on an alpha level of .05, the assumption of normality is met; W = 0.95, p = 0.08.

Interpretation of Main Effects

Run the t-test.

FFMQNJ_T4 = t.test(data = Long4b, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_T4
## 
##  Paired t-test
## 
## data:  NJ_FFMQ by Time
## t = -2.43, df = 19, p-value = 0.02518
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.908792 -0.291208
## sample estimates:
## mean of the differences 
##                    -2.1

Calculate Cohen’s d effect size.

FFMQNJ_d4 = cohen.d(data = Long4b, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_d4
## 
## Cohen's d
## 
## d estimate: -0.5433628 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -1.1952383  0.1085127

For those in the control condition, T3 scores (MT3 = 18.05, SDT3 = 4.49) on the FFMQ-Non-Judging were found to be significantly higher than T2 scores (MT2 = 15.95, SDT2 = 5.45); t (19) = -2.43, p = 0.03, d = -0.54.

Depression, Anxiety, and Stress Scale

Descriptive Statistics

# DASS-Depression:

D_DASS4 = summarySE(data = Long4b, measurevar = "D_DASS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# DASS-Anxiety:

A_DASS4 = summarySE(data = Long4b, measurevar = "A_DASS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# DASS-Stress:

S_DASS4 = summarySE(data = Long4b, measurevar = "S_DASS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Change the name of the Means columns so they're consistent across summary tables:

colnames(D_DASS4)[colnames(D_DASS4) == "D_DASS"] = "M"
colnames(A_DASS4)[colnames(A_DASS4) == "A_DASS"] = "M"
colnames(S_DASS4)[colnames(S_DASS4) == "S_DASS"] = "M"

# Combine these variables into a single data frame:

DASSDesc4 = data.frame(rbind(D_DASS4, A_DASS4, S_DASS4))

# Create a table to display the results:

kable(DASSDesc4, digits = 4, caption = "Table 89. Scores on the Depression, Anxiety, and Stress Scale across time for control participants who completed the last two surveys.",  col.names = c("Time", "n", "M", "SD", "SE", "CI"), align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"), latex_options = c("repeat_header"),
                full_width = F, position = "center") %>%
  group_rows("Depression", 1, 2) %>%
  group_rows("Anxiety", 3, 4) %>%
  group_rows("Stress", 5, 6)
Table 89. Scores on the Depression, Anxiety, and Stress Scale across time for control participants who completed the last two surveys.
Time n M SD SE CI
Depression
T2 20 7.4 7.6805 1.7174 3.5946
T3 20 5.5 5.1042 1.1413 2.3888
Anxiety
T2 20 6.9 8.2456 1.8438 3.8590
T3 20 6.3 6.2332 1.3938 2.9172
Stress
T2 20 13.5 8.4074 1.8799 3.9348
T3 20 11.5 6.1173 1.3679 2.8630

Plotting Performance

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the depression plot.
# Calculate SE min:

DASSDMin4 = data.frame("DASSDMin" = D_DASS4$M - D_DASS4$se)

# Calculate SE max:

DASSDMax4 = data.frame("DASSDMax" = D_DASS4$M + D_DASS4$se)

# Create data frame of values to be used:

DASSDPlot4 = data.frame("Time" = D_DASS4$Time, "DASSDMean" = D_DASS4$M,
                           "DASSDMin" = DASSDMin4, "DASSDMax" = DASSDMax4)
  1. Create the depression plot.
# Create the plot:

DASSDFig4 = (Long4b %>%
  ggplot(aes(Time, D_DASS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSDPlot4,
    aes(Time, DASSDMean, ymin = DASSDMin, ymax = DASSDMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Depression Score") +
    ggtitle("a") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the anxiety plot.
# Calculate SE min:

DASSAMin4 = data.frame("DASSAMin" = A_DASS4$M - A_DASS4$se)

# Calculate SE max:

DASSAMax4 = data.frame("DASSAMax" = A_DASS4$M + A_DASS4$se)

# Create data frame of values to be used:

DASSAPlot4 = data.frame("Time" = A_DASS4$Time, "DASSAMean" = A_DASS4$M,
                           "DASSAMin" = DASSAMin4, "DASSAMax" = DASSAMax4)
  1. Create the anxiety plot.
# Create the plot:

DASSAFig4 = (Long4b %>%
  ggplot(aes(Time, A_DASS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSAPlot4,
    aes(Time, DASSAMean, ymin = DASSAMin, ymax = DASSAMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Anxiety Score") +
    ggtitle("b") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Define the values to be used for the dots (Ms) and lines (SEs) in the stress plot.
# Calculate SE min:

DASSSMin4 = data.frame("DASSSMin" = S_DASS4$M - S_DASS4$se)

# Calculate SE max:

DASSSMax4 = data.frame("DASSSMax" = S_DASS4$M + S_DASS4$se)

# Create data frame of values to be used:

DASSSPlot4 = data.frame("Time" = S_DASS4$Time, "DASSSMean" = S_DASS4$M,
                           "DASSSMin" = DASSSMin4, "DASSSMax" = DASSSMax4)
  1. Create the stress plot.
# Create the plot:

DASSSFig4 = (Long4b %>%
  ggplot(aes(Time, S_DASS, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = DASSSPlot4,
    aes(Time, DASSSMean, ymin = DASSSMin, ymax = DASSSMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Define the vertical size of the plot:

  ylim(-15, 50) +

  # Add labels:

  labs(x = "Time of Testing", y = "DASS-Stress Score") +
    ggtitle("c") +

  # Define variable colours and theme:

  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  1. Create a caption.
DASSCap4 = "Figure 17. Distributions of scores on the depression (a), anxiety (b), and stress (c) subscales of the Depression, Anxiety, and Stress Scale (DASS) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
DASSCap4 = paste0(strwrap(DASSCap4, width = 105), collapse = "\n")
  1. Define the figure layout
DASSLayout4 = rbind(c("DASSAFig4", "DASSDFig4"),
                      c("DASSSFig4", NA))
  1. Display the figure.
DASSFig4 = grid.arrange(DASSDFig4, DASSAFig4, DASSSFig4, layout_matrix = DASSLayout4, bottom = textGrob(DASSCap4, hjust = 0, x = 0.05, gp = gpar(fontsize = 10)))

T-Test - Depression

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSD_Mod4 = lm(Long4b$D_DASS ~ Long4b$Time) 

# Calculate residuals:

DASSD_Res4 = resid(DASSD_Mod4)
qqnorm(DASSD_Res4, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res4)

The residuals appear to be slightly skewed to the right.

qplot(DASSD_Res4, main = "Histogram of DASS-D Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the right.

DASSD_Shap4 = shapiro.test(DASSD_Res4)
DASSD_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res4
## W = 0.82869, p-value = 0.00002847

Based on an alpha level of .05, the assumption of normality is not met; W = 0.83, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

DASSD_W4 = wilcoxsign_test(data = Long4b, D_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSD_W4
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 1.325, p-value = 0.1923
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_r4 = WilcoxEff(abs(unname(DASSD_W4@statistic@teststatistic)), (length(Long4b$D_DASS)/2))
DASSD_r4
## [1] 0.2962805

For those in the control condition, a significant difference in DASS-Depression score was not observed between T2 (MT2 = 7.4, SDT2 = 7.68) and T3 (MT3 = 5.5, SDT3 = 5.1); Z = 1.33, p = 0.19, r = 0.3.

T-Test - Anxiety

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSA_Mod4 = lm(Long4b$A_DASS ~ Long4b$Time) 

# Calculate residuals:

DASSA_Res4 = resid(DASSA_Mod4)
qqnorm(DASSA_Res4, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res4)

The residuals appear to be slightly skewed to the right.

qplot(DASSA_Res4, main = "Histogram of DASS-A Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the right.

DASSA_Shap4 = shapiro.test(DASSA_Res4)
DASSA_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res4
## W = 0.84262, p-value = 0.00005987

Based on an alpha level of .05, the assumption of normality is not met; W = 0.84, p < .001. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

DASSA_W4 = wilcoxsign_test(data = Long4b, A_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSA_W4
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 0, p-value = 1
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSA_r4 = WilcoxEff(abs(unname(DASSA_W4@statistic@teststatistic)), (length(Long4b$A_DASS)/2))
DASSA_r4
## [1] 0

For those in the control condition, a significant difference in DASS-Anxiety score was not observed between T2 (MT2 = 6.9, SDT2 = 8.25) and T3 (MT3 = 6.3, SDT3 = 6.23); Z = 0, p = 1, r = 0.

T-Test - Stress

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

DASSS_Mod4 = lm(Long4b$S_DASS ~ Long4b$Time) 

# Calculate residuals:

DASSS_Res4 = resid(DASSS_Mod4)
qqnorm(DASSS_Res4, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res4)

The residuals appear to be slightly skewed.

qplot(DASSS_Res4, main = "Histogram of DASS-S Residuals", binwidth = 1)

The residuals appear to follow the shape of a normal distribution.

DASSS_Shap4 = shapiro.test(DASSS_Res4)
DASSS_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res4
## W = 0.95235, p-value = 0.09135

Based on an alpha level of .05, the assumption of normality is met; W = 0.95, p = 0.09.

Interpretation of Main Effects

Run the t-test.

DASSS_T4 = t.test(data = Long4b, S_DASS ~ Time, paired = TRUE)
DASSS_T4
## 
##  Paired t-test
## 
## data:  S_DASS by Time
## t = 1.453, df = 19, p-value = 0.1625
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.8810359  4.8810359
## sample estimates:
## mean of the differences 
##                       2

Calculate Cohen’s d effect size.

DASSS_d4 = cohen.d(data = Long4b, S_DASS ~ Time, paired = TRUE)
DASSS_d4
## 
## Cohen's d
## 
## d estimate: 0.3248931 (small)
## 95 percent confidence interval:
##        inf        sup 
## -0.3194860  0.9692723

For those in the control condition, a significant difference in DASS-Stress score was not observed between T2 (MT2 = 13.5, SDT2 = 8.41) and T3 (MT3 = 11.5, SDT3 = 6.12); t(19) = 1.45, p = 0.16, d = 0.32.

Job Effectiveness Questionnaire

Descriptive Statistics

# Calculate summary statistics
JEQDesc4 = summarySE(data = Long4b, measurevar = "JEQ", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(JEQDesc4, digits = 4,
      caption = "Table 90. Scores on the Job Effectiveness Questionnaire across time for control participants who completed the last two surveys.",
      col.names = c("Time", "n", "M","SD", "SE", "CI"),
      align = 'c') %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center")
Table 90. Scores on the Job Effectiveness Questionnaire across time for control participants who completed the last two surveys.
Time n M SD SE CI
T2 20 5.1703 0.9698 0.2169 0.4539
T3 20 5.4709 0.8571 0.1917 0.4011

Plotting Performance

  1. Define the values to be used for the dots (Ms) and lines (SEs) in the plot.
# Calculate SE min:

JEQMin4 = data.frame("JEQMin" = JEQDesc4$JEQ - JEQDesc4$se)

# Calculate SE max:

JEQMax4 = data.frame("JEQMax" = JEQDesc4$JEQ + JEQDesc4$se)

# Create data frame of values to be used:

JEQPlot4 = data.frame("Time" = JEQDesc4$Time, "JEQMean" = JEQDesc4$JEQ,
                         "JEQMin" = JEQMin4, "JEQMax" = JEQMax4)
  1. Plot the data.
# Create a figure caption:

JEQCap4 = "Figure 18. Distributions of scores on the Job Effectiveness Questionnaire (JEQ) for control participants who completed the last two surveys. Dots and whiskers represent means and standard errors, respectively."
JEQCap4 = paste0(strwrap(JEQCap4, width = 40), collapse = "\n")

# Create the plot:

JEQFig4 = (Long4b %>%
  ggplot(aes(Time, JEQ, fill = "orangered2")) +
  geom_violin(color="black", trim=FALSE, alpha = 0.7) +

  # Add in dots and lines:

  geom_pointrange(data = JEQPlot4,
    aes(Time, JEQMean, ymin = JEQMin, ymax = JEQMax),
    color = "black",
    shape = 20,
    position = position_dodge(width = 0.25)) +

  # Add labels:

  labs(x = "Time of Testing", y = "JEQ Score", caption = JEQCap4) +

  # Define variable colours and theme:

  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10), legend.position = "none")
JEQFig4

T-Test

As before, we’ll conduct a paired t-test.

Assumptions

  1. Independent Random Sampling

This assumption was met during testing.

  1. Normality
# Define the model:

JEQ_Mod4 = lm(Long4b$JEQ ~ Long4b$Time) 

# Calculate residuals:

JEQ_Res4 = resid(JEQ_Mod4)
qqnorm(JEQ_Res4, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res4)

The residuals seem to be slightly skewed to the left.

qplot(JEQ_Res4, main = "Histogram of JEQ Residuals", binwidth = .2)

The residuals seem to be slightly skewed to the left.

JEQ_Shap4 = shapiro.test(JEQ_Res4)
JEQ_Shap4
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res4
## W = 0.91963, p-value = 0.007499

Based on an alpha level of .05, the assumption of normality is not met; W = 0.92, p = 0.01. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

JEQ_W4 = wilcoxsign_test(data = Long4b, JEQ ~ Time | (as.factor(Subject)), distribution = "exact")
JEQ_W4
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -2.3897, p-value = 0.01487
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

JEQ_r4 = WilcoxEff(abs(unname(JEQ_W4@statistic@teststatistic)), (length(Long4b$JEQ)/2))
JEQ_r4
## [1] 0.5343548

For those in the control condition, T3 scores (MT3 = 5.47, SDT3 = 0.86) on the JEQ were found to be significantly higher than T2 scores (MT2 = 5.17, SDT2 = 0.97); Z = -2.39, p = 0.01, r = 0.53.

Summary of Results

The following results were found to be statistically significant with respect to the control group:

  • Perceived Stress Scale

    • a decrease in perceived stress from T2 to T3 (p = 0.03)
  • Positive and Negative Affect Schedule

    • a reduction in negative affect from T2 to T3 (p = 0.02)
  • Five Facet Mindfulness Questionnaire

    • an increase in non-judging from T2 to T3 (p = 0.03
  • Job Effectiveness Questionnaire

    • an increase in perceived job effectiveness from T2 to T3 (p = 0.01)

Conclusion

This fourth set of analyses provided some additional support for the conclusion that the mindfulness intervention was effective in improving participants’ well-being. Additionally, the intervention seems to have had a positive effect on control participants’ perceived competency on the job. As previously discussed, however, the results from this set of analyses should be interpreted with caution, as the lack of a comparison group means that we cannot account for factors such as the passage of time or time of assessment. Furthermore, the size of the sample considered here is fairly small. As in the first set of analyses, a small sample size may explain why, compared to the second set of analyses, these fourth tests revealed fewer significant findings. Related to the previous set of analyses, another interesting possibility is that the effectiveness of the mindfulness intervention is moderated by factors measured by the FFMQ-Awareness or by a third variable that also influences trait awareness; this could explain why those in the experimental condition (lower in initial awareness) seem to have been affected more by the program than those in the control condition (higher in initial awareness). Nevertheless, all effects, whether significant or not, were found to occur in the expected direction (i.e. an increase in positive affect, psychological resilience, and mindful cognition, and a decrease in stress, depression, anxiety, and negative affect, over time). In our next set of analyses, we will assess if any of the pre- to post-intervention changes are related to the length of previous meditation experience or the degree of intervention participation.

5. Relationship with Other Variables - All Participants

Our fifth set of analyses will assess the potential relationship between changes in the outcome scores and both level of participation and length of previous meditation experience.

Subsetting Data

Before we begin, we will create a dataset that includes the Mins_Week variable and a measure of the amount of change that occurred from T1 to T2 for the experimental condition and from T2 to T3 for the control condition. We will also create a variable to represent the length of previous meditation experience. To do so, we will combine the Med_Length and Med_Length_Other variables. Med_Length responses will be coded to represent the midpoint of each response option and all responses will be considered in years (e.g. “1” responses, which correspond to “1-3 months,” will be re-coded as “2/12”).

We will only include data from participants who actively participated in the meditation program and who completed the appropriate surveys (i.e. the experimental and control participants from the second and fourth set of analyses, respectively).

# Create an experimental group subset:

ExpData5 = subset(AllData, Condition == "Experimental" & T1 == "1" & T2 == "1" & Med_Week >= "1")

# Copy "Med_Length_Other" values into a new variable for the experimental group:

ExpData5$Avg_Exp = as.numeric(as.character(ExpData5$Med_Length_Other))

# Re-code "Length" responses and insert into the new variable:

ExpData5$Avg_Exp[is.na(ExpData5$Med_Length)] = 0
ExpData5$Avg_Exp[ExpData5$Med_Length == 1] = (2/12)
ExpData5$Avg_Exp[ExpData5$Med_Length == 2] = (4.5/12)
ExpData5$Avg_Exp[ExpData5$Med_Length == 3] = (9/12)
ExpData5$Avg_Exp[ExpData5$Med_Length == 4] = 2

# Create a data set of the relevant experimental variables:

ExpChange = data.frame("Subject" = ExpData5$Subject, "Avg_Exp" = ExpData5$Avg_Exp, "Mins_Week" = ExpData5$Mins_Week, "PSS_Change" = (ExpData5$T2_PSS - ExpData5$T1_PSS), "PANASP_Change" = (ExpData5$T2_POS_PANAS - ExpData5$T1_POS_PANAS), "PANASN_Change" = (ExpData5$T2_NEG_PANAS - ExpData5$T1_NEG_PANAS), "BRS_Change" = (ExpData5$T2_BRS - ExpData5$T1_BRS), "FFMQNR_Change" = (ExpData5$T2_NR_FFMQ - ExpData5$T1_NR_FFMQ), "FFMQOB_Change" = (ExpData5$T2_OB_FFMQ - ExpData5$T1_OB_FFMQ), "FFMQAA_Change" = (ExpData5$T2_AA_FFMQ - ExpData5$T1_AA_FFMQ), "FFMQDS_Change" = (ExpData5$T2_DS_FFMQ - ExpData5$T1_DS_FFMQ), "FFMQNJ_Change" = (ExpData5$T2_NJ_FFMQ - ExpData5$T1_NJ_FFMQ), "DASSD_Change" = (ExpData5$T2_D_DASS - ExpData5$T1_D_DASS), "DASSA_Change" = (ExpData5$T2_A_DASS - ExpData5$T1_A_DASS), "DASSS_Change" = (ExpData5$T2_S_DASS - ExpData5$T1_S_DASS), "JEQ_Change" = (ExpData5$T2_JEQ - ExpData5$T1_JEQ))

# Create a control group subset:

ConData5 = subset(AllData, Condition == "Control" & T2 == "1" & T3 == "1" & Med_Week >= "1")

# Copy "Med_Length_Other" values into a new variable for the control group:

ConData5$Avg_Exp = as.numeric(as.character(ConData5$Med_Length_Other))

# Re-code "Length" responses and insert into the new variable:

ConData5$Avg_Exp[is.na(ConData5$Med_Length)] = 0
ConData5$Avg_Exp[ConData5$Med_Length == 1] = (2/12)
ConData5$Avg_Exp[ConData5$Med_Length == 2] = (4.5/12)
ConData5$Avg_Exp[ConData5$Med_Length == 3] = (9/12)
ConData5$Avg_Exp[ConData5$Med_Length == 4] = 2

# Create a data set of the relevant variables:

ConChange = data.frame("Subject" = ConData5$Subject, "Avg_Exp" = ConData5$Avg_Exp, "Mins_Week" = ConData5$Mins_Week, "PSS_Change" = (ConData5$T3_PSS - ConData5$T2_PSS), "PANASP_Change" = (ConData5$T3_POS_PANAS - ConData5$T2_POS_PANAS), "PANASN_Change" = (ConData5$T3_NEG_PANAS - ConData5$T2_NEG_PANAS), "BRS_Change" = (ConData5$T3_BRS - ConData5$T2_BRS), "FFMQNR_Change" = (ConData5$T3_NR_FFMQ - ConData5$T2_NR_FFMQ), "FFMQOB_Change" = (ConData5$T3_OB_FFMQ - ConData5$T2_OB_FFMQ), "FFMQAA_Change" = (ConData5$T3_AA_FFMQ - ConData5$T2_AA_FFMQ), "FFMQDS_Change" = (ConData5$T3_DS_FFMQ - ConData5$T2_DS_FFMQ), "FFMQNJ_Change" = (ConData5$T3_NJ_FFMQ - ConData5$T2_NJ_FFMQ), "DASSD_Change" = (ConData5$T3_D_DASS - ConData5$T2_D_DASS), "DASSA_Change" = (ConData5$T3_A_DASS - ConData5$T2_A_DASS), "DASSS_Change" = (ConData5$T3_S_DASS - ConData5$T2_S_DASS), "JEQ_Change" = (ConData5$T3_JEQ - ConData5$T2_JEQ))

# Combine into a single dataset:

Data5 = rbind(ExpChange, ConChange)

Correlation

To test for basic relationships between the variables, we will calculate two-tailed Pearson correlations to assess the relationship between pre- to post-intervention changes in self report scores and (1) years of previous experience and (2) number of minutes per week that participants reported meditating for. To correct the family-wise error rate within each set of comparisons, a Holm-Bonferroni adjustment will be used.

# Calculate correlations:

Change_Corrs5 = rcorr(as.matrix(Data5), type = c("pearson"))

# Perform p-adjustment for previous experience:

Exp_Corrs_p5 = p.adjust(Change_Corrs5$P[4:16, 2], method = c("holm"), n = 13)

# Perform p-adjustment for degree of participation:

Part_Corrs_p5 = p.adjust(Change_Corrs5$P[4:16, 3], method = c("holm"), n = 13)

# Create a list of the subscales:

Corr_Subscales = c("", "Positive Affect", "Negative Affect", "", "Non-Reactivity", "Observing", "Awareness", "Describing", "Non-Judging", "Depression", "Anxiety", "Stress", "")

# Create lists of the experience values:

Exp_Corrs_r5 = round(Change_Corrs5$r[4:16, 2], 4)
Exp_Corrs_n5 = Change_Corrs5$n[4:16, 2]
Exp_Corrs_p5 = round(Exp_Corrs_p5, 4)

# Create lists of the participation values:

Part_Corrs_r5 = round(Change_Corrs5$r[4:16, 3], 4)
Part_Corrs_n5 = Change_Corrs5$n[4:16, 3]
Part_Corrs_p5 = round(Part_Corrs_p5, 4)

# Combine into a single data frame:

Corrs5 = data.frame("Measure" = Corr_Subscales, "Exp_r" = Exp_Corrs_r5, "Exp_n" = Exp_Corrs_n5, "Exp_p" = Exp_Corrs_p5, "Part_r" = Part_Corrs_r5, "Part_n" = Part_Corrs_n5, "Part_p" = Part_Corrs_p5)

# Format the results so that significant p-values will be bolded:

CorrsB5 = Corrs5 %>%
  mutate(
    Exp_p = cell_spec(Exp_p, bold = (ifelse(Exp_p < .05, "TRUE", "FALSE"))),
    Part_p = cell_spec(Part_p, bold = (ifelse(Part_p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(CorrsB5, digits = 4,
      caption = "Table 91. Two-tailed Pearson correlations between pre to post-intervention changes in self report scores and both years of previous experience and number of minutes per week spent meditating.",
      col.names = c("Measure", "r", "n", "p", "r", "n", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c("", "Previous Experience (yrs)" = 3, "Program Participation (mins/wk)" = 3)) %>%
  group_rows("Perceived Stress Scale", 1, 1) %>%
  group_rows("Positive and Negative Affect Schedule", 2, 3) %>%
  group_rows("Brief Resilience Scale", 4, 4) %>%
  group_rows("Five Facet Mindfulness Questionnaire", 5, 9) %>%
  group_rows("Depression, Anxiety, and Stress Scale", 10, 12) %>%
  group_rows("Job Effectiveness Questionnaire", 13, 13) %>%
  footnote(general = "Changes were calculated as post-test minus pre-test. For each set of comparisons (i.e. changes/previous experience and changes/program participation), a Holm-Bonferroni adjustment has been applied to correct the family-wise error rate. Values in bold are significant at the p < .05 level.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 91. Two-tailed Pearson correlations between pre to post-intervention changes in self report scores and both years of previous experience and number of minutes per week spent meditating.
Previous Experience (yrs)
Program Participation (mins/wk)
Measure r n p r n p
Perceived Stress Scale
-0.1361 43 1 -0.2855 45 0.6877
Positive and Negative Affect Schedule
Positive Affect 0.2004 43 1 0.0874 45 1
Negative Affect 0.1664 43 1 -0.2241 45 1
Brief Resilience Scale
-0.1474 43 1 -0.2122 45 1
Five Facet Mindfulness Questionnaire
Non-Reactivity -0.0978 42 1 -0.0536 44 1
Observing 0.1370 42 1 0.1212 44 1
Awareness -0.0528 42 1 0.0035 44 1
Describing -0.0718 42 1 0.1596 44 1
Non-Judging -0.1649 42 1 0.4067 44 0.08
Depression, Anxiety, and Stress Scale
Depression 0.1284 42 1 -0.2163 44 1
Anxiety 0.0847 42 1 -0.2026 44 1
Stress -0.0276 42 1 -0.1507 44 1
Job Effectiveness Questionnaire
-0.0074 42 1 0.1396 44 1
Note: Changes were calculated as post-test minus pre-test. For each set of comparisons (i.e. changes/previous experience and changes/program participation), a Holm-Bonferroni adjustment has been applied to correct the family-wise error rate. Values in bold are significant at the p < .05 level.

None of the pre to post-intervention changes for either condition were found to be significantly correlated with years of previous experience or with minutes per week spent meditating (all p’s > .05).

Moderation

To test for moderation, we will adopt the method suggested by Judd et al. (2001). Because level of participation and length of previous meditation experience are stable values that were measured once throughout the study, Judd et al.’s Case 2 is applicable. This example proposes that moderation in a within-subject design can be estimated by performing a regression analysis with T1-T2 changes as the dependent variable and the suspected moderator as the independent variable. In this case, a significant independent variable coefficient indicates moderation.

Perceived Stress Scale

  1. Previous Experience
PSS_E5 = summary(lm(data = Data5, PSS_Change ~ Avg_Exp))
PSS_E5
## 
## Call:
## lm(formula = PSS_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -16.113  -3.613   1.153   4.887   9.887 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  -4.8874     1.0225   -4.78 0.0000227 ***
## Avg_Exp      -0.2531     0.2877   -0.88     0.384    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.383 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.01852,    Adjusted R-squared:  -0.005416 
## F-statistic: 0.7738 on 1 and 41 DF,  p-value: 0.3842

Previous experience was found to explain 1.85% of the change in PSS scores; R2 = 0.02, F(1, 41 ) = 0.77, p = 0.38. Length of previous experience is not a significant moderator of PSS change; \(\beta\) = -0.25, t = -0.88, p = 0.38.

  1. Program Participation
PSS_P5 = summary(lm(data = Data5, PSS_Change ~ Mins_Week))
PSS_P5
## 
## Call:
## lm(formula = PSS_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.9167  -3.1343   0.2335   4.9874  10.1921 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.90710    1.41181  -2.059   0.0456 *
## Mins_Week   -0.05440    0.02785  -1.953   0.0573 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.077 on 43 degrees of freedom
## Multiple R-squared:  0.0815, Adjusted R-squared:  0.06014 
## F-statistic: 3.816 on 1 and 43 DF,  p-value: 0.05731

Program participation was found to explain 8.15% of the change in PSS scores; R2 = 0.08, F(1, 43 ) = 3.82, p = 0.06. Time spent meditating is not a significant moderator of PSS change; \(\beta\) = -0.05, t = -1.95, p = 0.06.

Positive and Negative Affect Schedule

Positive Affect

  1. Previous Experience
PANASP_E5 = summary(lm(data = Data5, PANASP_Change ~ Avg_Exp))
PANASP_E5
## 
## Call:
## lm(formula = PANASP_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.8865 -2.1908  0.0676  2.1135 10.1135 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   1.8865     0.7469   2.526   0.0155 *
## Avg_Exp       0.2753     0.2102   1.310   0.1976  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.662 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.04016,    Adjusted R-squared:  0.01675 
## F-statistic: 1.715 on 1 and 41 DF,  p-value: 0.1976

Previous experience was found to explain 4.02% of the change in PANAS-Positive scores; R2 = 0.04, F(1, 41 ) = 1.72, p = 0.2. Length of previous experience is not a significant moderator of PANAS-Positive change; \(\beta\) = 0.28, t = 1.31, p = 0.2.

  1. Program Participation
PANASP_P5 = summary(lm(data = Data5, PANASP_Change ~ Mins_Week))
PANASP_P5
## 
## Call:
## lm(formula = PANASP_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.974 -2.158 -0.077  2.732  9.720 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  1.79020    1.08020   1.657    0.105
## Mins_Week    0.01226    0.02131   0.575    0.568
## 
## Residual standard error: 4.65 on 43 degrees of freedom
## Multiple R-squared:  0.007633,   Adjusted R-squared:  -0.01545 
## F-statistic: 0.3307 on 1 and 43 DF,  p-value: 0.5682

Program participation was found to explain 0.76% of the change in PANAS-Positive scores; R2 = 0.01, F(1, 43 ) = 0.33, p = 0.57. Time spent meditating is not a significant moderator of PANAS-Positive change; \(\beta\) = 0.01, t = 0.58, p = 0.57.

Negative Affect

  1. Previous Experience
PANASN_E5 = summary(lm(data = Data5, PANASN_Change ~ Avg_Exp))
PANASN_E5
## 
## Call:
## lm(formula = PANASN_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.2331 -3.4219  0.8047  2.7858  9.7669 
## 
## Coefficients:
##             Estimate Std. Error t value   Pr(>|t|)    
## (Intercept)  -3.8047     0.7452  -5.105 0.00000799 ***
## Avg_Exp       0.2266     0.2097   1.080      0.286    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.652 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.02768,    Adjusted R-squared:  0.003963 
## F-statistic: 1.167 on 1 and 41 DF,  p-value: 0.2863

Previous experience was found to explain 2.77% of the change in PANAS-Negative scores; R2 = 0.03, F(1, 41 ) = 1.17, p = 0.29. Length of previous experience is not a significant moderator of PANAS-Negative change; \(\beta\) = 0.23, t = 1.08, p = 0.29.

  1. Program Participation
PANASN_P5 = summary(lm(data = Data5, PANASN_Change ~ Mins_Week))
PANASN_P5
## 
## Call:
## lm(formula = PANASN_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.5009 -2.9298 -0.3577  3.0702  9.3087 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.16634    1.06688  -2.031   0.0485 *
## Mins_Week   -0.03173    0.02105  -1.508   0.1390  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.592 on 43 degrees of freedom
## Multiple R-squared:  0.05021,    Adjusted R-squared:  0.02812 
## F-statistic: 2.273 on 1 and 43 DF,  p-value: 0.139

Program participation was found to explain 5.02% of the change in PANAS-Negative scores; R2 = 0.05, F(1, 43 ) = 2.27, p = 0.14. Time spent meditating is not a significant moderator of PANAS-Negative change; \(\beta\) = -0.03, t = -1.51, p = 0.14.

Brief Resilience Scale

  1. Previous Experience
BRS_E5 = summary(lm(data = Data5, BRS_Change ~ Avg_Exp))
BRS_E5
## 
## Call:
## lm(formula = BRS_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.23898 -0.31147 -0.06836  0.42768  1.09435 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.23898    0.08832   2.706  0.00988 **
## Avg_Exp     -0.02371    0.02485  -0.954  0.34563   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5514 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.02172,    Adjusted R-squared:  -0.00214 
## F-statistic: 0.9103 on 1 and 41 DF,  p-value: 0.3456

Previous experience was found to explain 2.17% of the change in BRS scores; R2 = 0.02, F(1, 41 ) = 0.91, p = 0.35. Length of previous experience is not a significant moderator of BRS change; \(\beta\) = -0.02, t = -0.95, p = 0.35.

  1. Program Participation
BRS_P5 = summary(lm(data = Data5, BRS_Change ~ Mins_Week))
BRS_P5
## 
## Call:
## lm(formula = BRS_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.28424 -0.34028 -0.05452  0.42446  1.19621 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.347286   0.124666   2.786  0.00791 **
## Mins_Week   -0.003503   0.002459  -1.424  0.16161   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5366 on 43 degrees of freedom
## Multiple R-squared:  0.04505,    Adjusted R-squared:  0.02284 
## F-statistic: 2.028 on 1 and 43 DF,  p-value: 0.1616

Program participation was found to explain 4.5% of the change in BRS scores; R2 = 0.05, F(1, 43 ) = 2.03, p = 0.16. Time spent meditating is not a significant moderator of BRS change; \(\beta\) = 0, t = -1.42, p = 0.16.

Five Facet Mindfulness Questionnaire

Non-Reactivity

  1. Previous Experience
FFMQNR_E5 = summary(lm(data = Data5, FFMQNR_Change ~ Avg_Exp))
FFMQNR_E5
## 
## Call:
## lm(formula = FFMQNR_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.8507 -2.5894 -0.2685  2.1329  8.1329 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  1.86711    0.56850   3.284  0.00213 **
## Avg_Exp     -0.09865    0.15869  -0.622  0.53771   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.517 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.009568,   Adjusted R-squared:  -0.01519 
## F-statistic: 0.3864 on 1 and 40 DF,  p-value: 0.5377

Previous experience was found to explain 0.96% of the change in FFMQ-Non-Reactivity scores; R2 = 0.01, F(1, 40 ) = 0.39, p = 0.54. Length of previous experience is not a significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = -0.1, t = -0.62, p = 0.54.

  1. Program Participation
FFMQNR_P5 = summary(lm(data = Data5, FFMQNR_Change ~ Mins_Week))
FFMQNR_P5
## 
## Call:
## lm(formula = FFMQNR_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.7582 -2.0082 -0.4236  2.1163  8.2975 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  1.925557   0.821475   2.344   0.0239 *
## Mins_Week   -0.005578   0.016027  -0.348   0.7296  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.456 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.002875,   Adjusted R-squared:  -0.02087 
## F-statistic: 0.1211 on 1 and 42 DF,  p-value: 0.7296

Program participation was found to explain 0.29% of the change in FFMQ-Non-Reactivity scores; R2 = 0, F(1, 42 ) = 0.12, p = 0.73. Time spent meditating is not a significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = -0.01, t = -0.35, p = 0.73.

Observing

  1. Previous Experience
FFMQOB_E5 = summary(lm(data = Data5, FFMQOB_Change ~ Avg_Exp))
FFMQOB_E5
## 
## Call:
## lm(formula = FFMQOB_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.3303 -1.3303 -0.3303  1.6543  4.6543 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  1.33031    0.37743   3.525  0.00108 **
## Avg_Exp      0.09214    0.10536   0.875  0.38706   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.335 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.01876,    Adjusted R-squared:  -0.00577 
## F-statistic: 0.7648 on 1 and 40 DF,  p-value: 0.3871

Previous experience was found to explain 1.88% of the change in FFMQ-Observing scores; R2 = 0.02, F(1, 40 ) = 0.76, p = 0.39. Length of previous experience is not a significant moderator of FFMQ-Observing change; \(\beta\) = 0.09, t = 0.87, p = 0.39.

  1. Program Participation
FFMQOB_P5 = summary(lm(data = Data5, FFMQOB_Change ~ Mins_Week))
FFMQOB_P5
## 
## Call:
## lm(formula = FFMQOB_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.0460 -1.3228 -0.2504  1.6644  4.2811 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 1.003373   0.551966   1.818   0.0762 .
## Mins_Week   0.008518   0.010769   0.791   0.4334  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.322 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.01468,    Adjusted R-squared:  -0.008782 
## F-statistic: 0.6257 on 1 and 42 DF,  p-value: 0.4334

Program participation was found to explain 1.47% of the change in FFMQ-Observing scores; R2 = 0.01, F(1, 42 ) = 0.63, p = 0.43. Time spent meditating is not a significant moderator of FFMQ-Observing change; \(\beta\) = 0.01, t = 0.79, p = 0.43.

Acting with Awareness

  1. Previous Experience
FFMQAA_E5 = summary(lm(data = Data5, FFMQAA_Change ~ Avg_Exp))
FFMQAA_E5
## 
## Call:
## lm(formula = FFMQAA_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.6404 -1.6467 -0.5797  1.5442  7.3512 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   1.6488     0.5378   3.066  0.00388 **
## Avg_Exp      -0.0502     0.1501  -0.334  0.73983   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.327 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.002788,   Adjusted R-squared:  -0.02214 
## F-statistic: 0.1118 on 1 and 40 DF,  p-value: 0.7398

Previous experience was found to explain 0.28% of the change in FFMQ-Awareness scores; R2 = 0, F(1, 40 ) = 0.11, p = 0.74. Length of previous experience is not a significant moderator of FFMQ-Awareness change; \(\beta\) = -0.05, t = -0.33, p = 0.74.

  1. Program Participation
FFMQAA_P5 = summary(lm(data = Data5, FFMQAA_Change ~ Mins_Week))
FFMQAA_P5
## 
## Call:
## lm(formula = FFMQAA_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.4914 -1.4935 -0.4888  1.5067  7.5117 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 1.4861535  0.8009835   1.855   0.0706 .
## Mins_Week   0.0003494  0.0156276   0.022   0.9823  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.37 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  1.19e-05,   Adjusted R-squared:  -0.0238 
## F-statistic: 0.0005 on 1 and 42 DF,  p-value: 0.9823

Program participation was found to explain 0% of the change in FFMQ-Awareness scores; R2 = 0, F(1, 42 ) = 0, p = 0.98. Time spent meditating is not a significant moderator of FFMQ-Awareness change; \(\beta\) = 0, t = 0.02, p = 0.98.

Describing

  1. Previous Experience
FFMQDS_E5 = summary(lm(data = Data5, FFMQDS_Change ~ Avg_Exp))
FFMQDS_E5
## 
## Call:
## lm(formula = FFMQDS_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.2515 -1.2515 -0.1577  0.9917  5.7485 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.25151    0.45059   0.558    0.580
## Avg_Exp     -0.05723    0.12578  -0.455    0.652
## 
## Residual standard error: 2.788 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.005149,   Adjusted R-squared:  -0.01972 
## F-statistic: 0.207 on 1 and 40 DF,  p-value: 0.6516

Previous experience was found to explain 0.51% of the change in FFMQ-Describing scores; R2 = 0.01, F(1, 40 ) = 0.21, p = 0.65. Length of previous experience is not a significant moderator of FFMQ-Describing change; \(\beta\) = -0.06, t = -0.46, p = 0.65.

  1. Program Participation
FFMQDS_P5 = summary(lm(data = Data5, FFMQDS_Change ~ Mins_Week))
FFMQDS_P5
## 
## Call:
## lm(formula = FFMQDS_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.7512 -1.6820  0.2161  1.1342  5.7905 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.31427    0.64069  -0.491    0.626
## Mins_Week    0.01309    0.01250   1.047    0.301
## 
## Residual standard error: 2.696 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.02546,    Adjusted R-squared:  0.002254 
## F-statistic: 1.097 on 1 and 42 DF,  p-value: 0.3009

Program participation was found to explain 2.55% of the change in FFMQ-Describing scores; R2 = 0.03, F(1, 42 ) = 1.1, p = 0.3. Time spent meditating is not a significant moderator of FFMQ-Describing change; \(\beta\) = 0.01, t = 1.05, p = 0.3.

Non-Judging

  1. Previous Experience
FFMQNJ_E5 = summary(lm(data = Data5, FFMQNJ_Change ~ Avg_Exp))
FFMQNJ_E5
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -9.0486 -2.0224 -0.0486  1.9711  5.9514 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   2.0486     0.5326   3.847 0.000421 ***
## Avg_Exp      -0.1572     0.1487  -1.057 0.296753    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.295 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.02718,    Adjusted R-squared:  0.002863 
## F-statistic: 1.118 on 1 and 40 DF,  p-value: 0.2968

Previous experience was found to explain 2.72% of the change in FFMQ-Non-Judging scores; R2 = 0.03, F(1, 40 ) = 1.12, p = 0.3. Length of previous experience is not a significant moderator of FFMQ-Non-Judging change; \(\beta\) = -0.16, t = -1.06, p = 0.3.

  1. Program Participation
FFMQNJ_P5 = summary(lm(data = Data5, FFMQNJ_Change ~ Mins_Week))
FFMQNJ_P5
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.5362 -1.5554  0.2546  1.4580  7.4235 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.33467    0.71609   0.467  0.64266   
## Mins_Week    0.04031    0.01397   2.885  0.00615 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.013 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1654, Adjusted R-squared:  0.1455 
## F-statistic: 8.323 on 1 and 42 DF,  p-value: 0.006154

Program participation was found to explain 16.54% of the change in FFMQ-Non-Judging scores; R2 = 0.17, F(1, 42 ) = 8.32, p = 0.01. Time spent meditating is a significant moderator of FFMQ-Non-Judging change, meaning that participants who meditated more demonstrated more positive change over time; \(\beta\) = 0.04, t = 2.88, p = 0.01. This relationship is plotted below.

# Create a figure caption:

FFMQNJCap5 = "Figure 19. Linear relationship between FFMQ-Non- Judging change over time and time spent meditating throughout the program. Shaded area represents a 95% confidence region."
FFMQNJCap5 = paste0(strwrap(FFMQNJCap5, width = 56), collapse = "\n")

# Create the plot:

FFMQNJFig5 = (Data5 %>%
  ggplot(aes(Mins_Week, FFMQNJ_Change)) + 
  geom_point(shape = 16) +

# Add linear regression line:                
                            
  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 FFMQ-NJ Change", caption = FFMQNJCap5) + 
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10))) 
FFMQNJFig5

Depression, Anxiety, and Stress Scale

Depression

  1. Previous Experience
DASSD_E5 = summary(lm(data = Data5, DASSD_Change ~ Avg_Exp))
DASSD_E5
## 
## Call:
## lm(formula = DASSD_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.006  -2.156   1.892   4.037  14.037 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -4.0367     1.1271  -3.582 0.000915 ***
## Avg_Exp       0.2577     0.3146   0.819 0.417622    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.973 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.01649,    Adjusted R-squared:  -0.008094 
## F-statistic: 0.6708 on 1 and 40 DF,  p-value: 0.4176

Previous experience was found to explain 1.65% of the change in DASS-Depression scores; R2 = 0.02, F(1, 40 ) = 0.67, p = 0.42. Length of previous experience is not a significant moderator of DASS-Depression change; \(\beta\) = 0.26, t = 0.82, p = 0.42.

  1. Program Participation
DASSD_P5 = summary(lm(data = Data5, DASSD_Change ~ Mins_Week))
DASSD_P5
## 
## Call:
## lm(formula = DASSD_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.286  -2.021   1.758   3.944  12.132 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.90797    1.59792  -1.194    0.239
## Mins_Week   -0.04477    0.03118  -1.436    0.158
## 
## Residual standard error: 6.723 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.04679,    Adjusted R-squared:  0.0241 
## F-statistic: 2.062 on 1 and 42 DF,  p-value: 0.1584

Program participation was found to explain 4.68% of the change in DASS-Depression scores; R2 = 0.05, F(1, 42 ) = 2.06, p = 0.16. Time spent meditating is not a significant moderator of DASS-Depression change; \(\beta\) = -0.04, t = -1.44, p = 0.16.

Anxiety

  1. Previous Experience
DASSA_E5 = summary(lm(data = Data5, DASSA_Change ~ Avg_Exp))
DASSA_E5
## 
## Call:
## lm(formula = DASSA_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -17.9355  -1.9542   0.9147   2.4413  14.0645 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  -2.0645     0.9979  -2.069   0.0451 *
## Avg_Exp       0.1498     0.2785   0.538   0.5938  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.174 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.007174,   Adjusted R-squared:  -0.01765 
## F-statistic: 0.289 on 1 and 40 DF,  p-value: 0.5938

Previous experience was found to explain 0.72% of the change in DASS-Anxiety scores; R2 = 0.01, F(1, 40 ) = 0.29, p = 0.59. Length of previous experience is not a significant moderator of DASS-Anxiety change; \(\beta\) = 0.15, t = 0.54, p = 0.59.

  1. Program Participation
DASSA_P5 = summary(lm(data = Data5, DASSA_Change ~ Mins_Week))
DASSA_P5
## 
## Call:
## lm(formula = DASSA_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -18.1610  -3.0092   0.8212   2.9892  12.3311 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.14264    1.44114  -0.099    0.922
## Mins_Week   -0.03770    0.02812  -1.341    0.187
## 
## Residual standard error: 6.063 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.04104,    Adjusted R-squared:  0.01821 
## F-statistic: 1.797 on 1 and 42 DF,  p-value: 0.1872

Program participation was found to explain 4.1% of the change in DASS-Anxiety scores; R2 = 0.04, F(1, 42 ) = 1.8, p = 0.19. Time spent meditating is not a significant moderator of DASS-Anxiety change; \(\beta\) = -0.04, t = -1.34, p = 0.19.

Stress

  1. Previous Experience
DASSS_E5 = summary(lm(data = Data5, DASSS_Change ~ Avg_Exp))
DASSS_E5
## 
## Call:
## lm(formula = DASSS_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -16.286  -3.786   1.714   3.714  13.714 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -3.71397    0.92308  -4.023 0.000248 ***
## Avg_Exp     -0.04495    0.25767  -0.174 0.862395    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.711 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.0007602,  Adjusted R-squared:  -0.02422 
## F-statistic: 0.03043 on 1 and 40 DF,  p-value: 0.8624

Previous experience was found to explain 0.08% of the change in DASS-Stress scores; R2 = 0, F(1, 40 ) = 0.03, p = 0.86. Length of previous experience is not a significant moderator of DASS-Stress change; \(\beta\) = -0.04, t = -0.17, p = 0.86.

  1. Program Participation
DASSS_P5 = summary(lm(data = Data5, DASSS_Change ~ Mins_Week))
DASSS_P5
## 
## Call:
## lm(formula = DASSS_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.625  -2.964   1.033   2.975  12.697 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.56818    1.33933  -1.918    0.062 .
## Mins_Week   -0.02581    0.02613  -0.988    0.329  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.635 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.0227, Adjusted R-squared:  -0.000568 
## F-statistic: 0.9756 on 1 and 42 DF,  p-value: 0.3289

Program participation was found to explain 2.27% of the change in DASS-Stress scores; R2 = 0.02, F(1, 42 ) = 0.98, p = 0.33. Time spent meditating is not a significant moderator of DASS-Stress change; \(\beta\) = -0.03, t = -0.99, p = 0.33.

Job Effectiveness Questionnaire

  1. Previous Experience
JEQ_E5 = summary(lm(data = Data5, JEQ_Change ~ Avg_Exp))
JEQ_E5
## 
## Call:
## lm(formula = JEQ_Change ~ Avg_Exp, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.57885 -0.30873 -0.04123  0.37678  1.97692 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.171445   0.097839   1.752   0.0874 .
## Avg_Exp     -0.001286   0.027311  -0.047   0.9627  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6053 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  5.543e-05,  Adjusted R-squared:  -0.02494 
## F-statistic: 0.002217 on 1 and 40 DF,  p-value: 0.9627

Previous experience was found to explain 0.01% of the change in JEQ scores; R2 = 0, F(1, 40 ) = 0, p = 0.96. Length of previous experience is not a significant moderator of JEQ change; \(\beta\) = 0, t = -0.05, p = 0.96.

  1. Program Participation
JEQ_P5 = summary(lm(data = Data5, JEQ_Change ~ Mins_Week))
JEQ_P5
## 
## Call:
## lm(formula = JEQ_Change ~ Mins_Week, data = Data5)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.49631 -0.26010 -0.01147  0.33951  1.86288 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.076472   0.139402   0.549    0.586
## Mins_Week   0.002486   0.002720   0.914    0.366
## 
## Residual standard error: 0.5865 on 42 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.0195, Adjusted R-squared:  -0.003845 
## F-statistic: 0.8353 on 1 and 42 DF,  p-value: 0.366

Program participation was found to explain 1.95% of the change in JEQ scores; R2 = 0.02, F(1, 42 ) = 0.84, p = 0.37. Time spent meditating is not a significant moderator of JEQ change; \(\beta\) = 0, t = 0.91, p = 0.37.

Summary of Results

The following results were found to be statistically significant:

  • Five Facet Mindfulness Questionnaire

    • non-judging changes were moderated by time spent meditating (p = 0.01)

Conclusion

Correlational analyses suggest that intervention-related changes were unrelated to both the length of previous experience and the degree to which an individual participated in the program. This conclusion is generally supported by moderation analyses, though changes in non-judging were found to be moderated by the degree of program participation, such that more participation led to greater change across time. It’s important to note, however, that this relationship may have been unduly influenced by two exceptional participants who reported meditating for 100+ minutes per week. In the next set of analyses, therefore, we will repeat the previous analyses after removing outliers.


6. Relationship with Other Variables - Outliers Removed

Our sixth set of analyses will assess the potential relationship between changes in the outcome scores and both level of participation and length of previous meditation experience for those deemed to be non-outliers.

Outlier Identification

Before we begin, we will identify participants with extreme values on the Avg_Exp and Mins_Week variables:

  1. Previous Experience
# Create boxplot:

EBox6 = boxplot(Data5$Avg_Exp, ylab = "Years of Experience")

# Identify outlier values:

OutE6 = EBox6$out

The outlier values correspond to participants 66, 87, and 14, who reported 0.75 years of meditation experience; 53, 71, 88, and 29, who reported 2 years of meditation experience; 70, who reported 5 years of meditation experience; 61, who reported 10 years of meditation experience; and 82, who reported 20 years of meditation experience.

  1. Program Participation
# Create boxplot:

PBox6 = boxplot(Data5$Mins_Week, ylab = "Mins / Week")

# Identify outlier values:

OutP6 = PBox6$out

The outlier values correspond to participants 14 and 42. These participants reported meditating for 180 and 105 minutes per week, respectively.

Subsetting Data

We will now create a dataset for the present set of analyses by removing the outlier values from the Analysis 5 dataset.

Data6 = Data5

# Set Experience outliers to NA:

Data6 = replace_with_na(data = Data6, replace = list(Avg_Exp = c(OutE6[1],  OutE6[2],  OutE6[3],  OutE6[4],  OutE6[5],  OutE6[6],  OutE6[7],  OutE6[8],  OutE6[9], OutE6[10])))

# Set Participation outliers to NA:

Data6 = replace_with_na(data = Data6, replace = list(Mins_Week = c(OutP6[1], OutP6[2])))

Correlation

As before, we will calculate two-tailed Pearson correlations between pre- to post-intervention changes in self report scores and (1) years of previous experience and (2) number of minutes per week that participants reported meditating for. To correct the family-wise error rate within each set of comparisons, a Holm-Bonferroni adjustment will be used.

# Calculate correlations:

Change_Corrs6 = rcorr(as.matrix(Data6), type = c("pearson"))

# Perform p-adjustment for previous experience:

Exp_Corrs_p6 = p.adjust(Change_Corrs6$P[4:16, 2], method = c("holm"), n = 13)

# Perform p-adjustment for degree of participation:

Part_Corrs_p6 = p.adjust(Change_Corrs6$P[4:16, 3], method = c("holm"), n = 13)

# Create a list of the subscales:

Corr_Subscales = c("", "Positive Affect", "Negative Affect", "", "Non-Reactivity", "Observing", "Awareness", "Describing", "Non-Judging", "Depression", "Anxiety", "Stress", "")

# Create lists of the experience values:

Exp_Corrs_r6 = round(Change_Corrs6$r[4:16, 2], 4)
Exp_Corrs_n6 = Change_Corrs6$n[4:16, 2]
Exp_Corrs_p6 = round(Exp_Corrs_p6, 4)

# Create lists of the participation values:

Part_Corrs_r6 = round(Change_Corrs6$r[4:16, 3], 4)
Part_Corrs_n6 = Change_Corrs6$n[4:16, 3]
Part_Corrs_p6 = round(Part_Corrs_p6, 4)

# Combine into a single data frame:

Corrs6 = data.frame("Measure" = Corr_Subscales, "Exp_r" = Exp_Corrs_r6, "Exp_n" = Exp_Corrs_n6, "Exp_p" = Exp_Corrs_p6, "Part_r" = Part_Corrs_r6, "Part_n" = Part_Corrs_n6, "Part_p" = Part_Corrs_p6)

# Format the results so that significant p-values will be bolded:

CorrsB6 = Corrs6 %>%
  mutate(
    Exp_p = cell_spec(Exp_p, bold = (ifelse(Exp_p < .05, "TRUE", "FALSE"))),
    Part_p = cell_spec(Part_p, bold = (ifelse(Part_p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(CorrsB6, digits = 4,
      caption = "Table 92. Two-tailed Pearson correlations between pre to post-intervention changes in self report scores and both years of previous experience and number of minutes per week spent meditating.",
      col.names = c("Measure", "r", "n", "p", "r", "n", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c("", "Previous Experience (yrs)" = 3, "Program Participation (mins/wk)" = 3)) %>%
  group_rows("Perceived Stress Scale", 1, 1) %>%
  group_rows("Positive and Negative Affect Schedule", 2, 3) %>%
  group_rows("Brief Resilience Scale", 4, 4) %>%
  group_rows("Five Facet Mindfulness Questionnaire", 5, 9) %>%
  group_rows("Depression, Anxiety, and Stress Scale", 10, 12) %>%
  group_rows("Job Effectiveness Questionnaire", 13, 13) %>%
  footnote(general = "Changes were calculated as post-test minus pre-test. For each set of comparisons (i.e. changes/previous experience and changes/program participation), a Holm-Bonferroni adjustment has been applied to correct the family-wise error rate. Values in bold are significant at the p < .05 level.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 92. Two-tailed Pearson correlations between pre to post-intervention changes in self report scores and both years of previous experience and number of minutes per week spent meditating.
Previous Experience (yrs)
Program Participation (mins/wk)
Measure r n p r n p
Perceived Stress Scale
-0.0507 33 1 -0.2719 43 0.7004
Positive and Negative Affect Schedule
Positive Affect 0.0146 33 1 0.0610 43 1
Negative Affect 0.0165 33 1 -0.1957 43 1
Brief Resilience Scale
-0.1688 33 1 0.0733 43 1
Five Facet Mindfulness Questionnaire
Non-Reactivity -0.0325 33 1 0.0115 42 1
Observing -0.0201 33 1 0.2118 42 1
Awareness 0.0126 33 1 0.1066 42 1
Describing -0.0139 33 1 0.2516 42 0.756
Non-Judging 0.0625 33 1 0.3512 42 0.2484
Depression, Anxiety, and Stress Scale
Depression -0.1939 33 1 -0.2635 42 0.7339
Anxiety -0.0004 33 1 -0.3836 42 0.1458
Stress -0.0172 33 1 -0.4279 42 0.0611
Job Effectiveness Questionnaire
0.2076 33 1 0.2862 42 0.6609
Note: Changes were calculated as post-test minus pre-test. For each set of comparisons (i.e. changes/previous experience and changes/program participation), a Holm-Bonferroni adjustment has been applied to correct the family-wise error rate. Values in bold are significant at the p < .05 level.

None of the pre to post-intervention changes for either condition were found to be significantly correlated with years of previous experience or with minutes per week spent meditating (all p’s > .05).

Moderation

As before, we will assess moderation by performing regression analyses with T1-T2 changes as the dependent variables and the suspected moderators as the independent variables.

Perceived Stress Scale

  1. Previous Experience
PSS_E6 = summary(lm(data = Data6, PSS_Change ~ Avg_Exp))
PSS_E6
## 
## Call:
## lm(formula = PSS_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -16.873  -4.873   1.755   5.127   9.127 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   -4.127      1.344  -3.070  0.00442 **
## Avg_Exp       -3.768     13.340  -0.282  0.77948   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.842 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.002567,   Adjusted R-squared:  -0.02961 
## F-statistic: 0.07978 on 1 and 31 DF,  p-value: 0.7795

After removing outliers, previous experience was found to explain 0.26% of the change in PSS scores; R2 = 0, F(1, 31 ) = 0.08, p = 0.78. Length of previous experience, therefore, remains a non-significant moderator of PSS change; \(\beta\) = -3.77, t = -0.28, p = 0.78.

  1. Program Participation
PSS_P6 = summary(lm(data = Data6, PSS_Change ~ Mins_Week))
PSS_P6
## 
## Call:
## lm(formula = PSS_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.6342  -3.1473   0.0726   4.7165  10.5124 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.43383    1.66049  -1.466   0.1503  
## Mins_Week   -0.07330    0.04052  -1.809   0.0778 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.054 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.0739, Adjusted R-squared:  0.05132 
## F-statistic: 3.272 on 1 and 41 DF,  p-value: 0.07782

After removing outliers, program participation was found to explain 7.39% of the change in PSS scores; R2 = 0.07, F(1, 41 ) = 3.27, p = 0.08. Time spent meditating, therefore, remains a non-significant moderator of PSS change; \(\beta\) = -0.07, t = -1.81, p = 0.08.

Positive and Negative Affect Schedule

Positive Affect

  1. Previous Experience
PANASP_E6 = summary(lm(data = Data6, PANASP_Change ~ Avg_Exp))
PANASP_E6
## 
## Call:
## lm(formula = PANASP_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.4474 -2.4474 -0.4474  2.5526 10.5526 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)   1.4474     0.9931   1.457    0.155
## Avg_Exp       0.8016     9.8556   0.081    0.936
## 
## Residual standard error: 5.055 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0002133,  Adjusted R-squared:  -0.03204 
## F-statistic: 0.006615 on 1 and 31 DF,  p-value: 0.9357

After removing outliers, previous experience was found to explain 0.02% of the change in PANAS-Positive scores; R2 = 0, F(1, 31 ) = 0.01, p = 0.94. Length of previous experience, therefore, remains a non-significant moderator of PANAS-Positive change; \(\beta\) = 0.8, t = 0.08, p = 0.94.

  1. Program Participation
PANASP_P6 = summary(lm(data = Data6, PANASP_Change ~ Mins_Week))
PANASP_P6
## 
## Call:
## lm(formula = PANASP_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.9715 -2.3458 -0.0838  2.9099  9.7166 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  1.78441    1.30597   1.366    0.179
## Mins_Week    0.01248    0.03187   0.391    0.698
## 
## Residual standard error: 4.762 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.003723,   Adjusted R-squared:  -0.02058 
## F-statistic: 0.1532 on 1 and 41 DF,  p-value: 0.6975

After removing outliers, program participation was found to explain 0.37% of the change in PANAS-Positive scores; R2 = 0, F(1, 41 ) = 0.15, p = 0.7. Time spent meditating, therefore, remains a non-significant moderator of PANAS-Positive change; \(\beta\) = 0.01, t = 0.39, p = 0.7.

Negative Affect

  1. Previous Experience
PANASN_E6 = summary(lm(data = Data6, PANASN_Change ~ Avg_Exp))
PANASN_E6
## 
## Call:
## lm(formula = PANASN_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.880 -0.752  0.248  2.248  9.120 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -3.2480     0.8405  -3.864 0.000532 ***
## Avg_Exp       0.7680     8.3413   0.092 0.927233    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.278 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0002734,  Adjusted R-squared:  -0.03198 
## F-statistic: 0.008477 on 1 and 31 DF,  p-value: 0.9272

After removing outliers, previous experience was found to explain 0.03% of the change in PANAS-Negative scores; R2 = 0, F(1, 31 ) = 0.01, p = 0.93. Length of previous experience, therefore, remains a non-significant moderator of PANAS-Negative change; \(\beta\) = 0.77, t = 0.09, p = 0.93.

  1. Program Participation
PANASN_P6 = summary(lm(data = Data6, PANASN_Change ~ Mins_Week))
PANASN_P6
## 
## Call:
## lm(formula = PANASN_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.3235 -2.7085 -0.3584  3.1800  9.4465 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.06670    1.22897  -1.682    0.100
## Mins_Week   -0.03833    0.02999  -1.278    0.208
## 
## Residual standard error: 4.481 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.03831,    Adjusted R-squared:  0.01485 
## F-statistic: 1.633 on 1 and 41 DF,  p-value: 0.2085

After removing outliers, program participation was found to explain 3.83% of the change in PANAS-Negative scores; R2 = 0.04, F(1, 41 ) = 1.63, p = 0.21. Time spent meditating, therefore, remains a non-significant moderator of PANAS-Negative change; \(\beta\) = -0.04, t = -1.28, p = 0.21.

Brief Resilience Scale

  1. Previous Experience
BRS_E6 = summary(lm(data = Data6, BRS_Change ~ Avg_Exp))
BRS_E6
## 
## Call:
## lm(formula = BRS_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.30343 -0.30343  0.02683  0.36323  1.02990 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   0.3034     0.1037   2.925  0.00638 **
## Avg_Exp      -0.9816     1.0294  -0.954  0.34767   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5279 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0285, Adjusted R-squared:  -0.002841 
## F-statistic: 0.9093 on 1 and 31 DF,  p-value: 0.3477

After removing outliers, previous experience was found to explain 2.85% of the change in BRS scores; R2 = 0.03, F(1, 31 ) = 0.91, p = 0.35. Length of previous experience, therefore, remains a non-significant moderator of BRS change; \(\beta\) = -0.98, t = -0.95, p = 0.35.

  1. Program Participation
BRS_P6 = summary(lm(data = Data6, BRS_Change ~ Mins_Week))
BRS_P6
## 
## Call:
## lm(formula = BRS_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.22159 -0.35355 -0.05822  0.40551  1.04251 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.191919   0.143587   1.337    0.189
## Mins_Week   0.001648   0.003504   0.470    0.641
## 
## Residual standard error: 0.5235 on 41 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.005369,   Adjusted R-squared:  -0.01889 
## F-statistic: 0.2213 on 1 and 41 DF,  p-value: 0.6405

After removing outliers, program participation was found to explain 0.54% of the change in BRS scores; R2 = 0.01, F(1, 41 ) = 0.22, p = 0.64. Time spent meditating, therefore, remains a non-significant moderator of BRS change; \(\beta\) = 0, t = 0.47, p = 0.64.

Five Facet Mindfulness Questionnaire

Non-Reactivity

  1. Previous Experience
FFMQNR_E6 = summary(lm(data = Data6, FFMQNR_Change ~ Avg_Exp))
FFMQNR_E6
## 
## Call:
## lm(formula = FFMQNR_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.6610 -2.8794 -0.8794  2.3390  8.1206 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   1.8794     0.7287   2.579   0.0149 *
## Avg_Exp      -1.3104     7.2317  -0.181   0.8574  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.709 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.001058,   Adjusted R-squared:  -0.03117 
## F-statistic: 0.03283 on 1 and 31 DF,  p-value: 0.8574

After removing outliers, previous experience was found to explain 0.11% of the change in FFMQ-Non-Reactivity scores; R2 = 0, F(1, 31 ) = 0.03, p = 0.86. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = -1.31, t = -0.18, p = 0.86.

  1. Program Participation
FFMQNR_P6 = summary(lm(data = Data6, FFMQNR_Change ~ Mins_Week))
FFMQNR_P6
## 
## Call:
## lm(formula = FFMQNR_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.7536 -2.4883 -0.2782  2.2411  8.2288 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 1.700958   0.998655   1.703   0.0963 .
## Mins_Week   0.001755   0.024092   0.073   0.9423  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.534 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.0001326,  Adjusted R-squared:  -0.02486 
## F-statistic: 0.005307 on 1 and 40 DF,  p-value: 0.9423

After removing outliers, program participation was found to explain 0.01% of the change in FFMQ-Non-Reactivity scores; R2 = 0, F(1, 40 ) = 0.01, p = 0.94. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = 0, t = 0.07, p = 0.94.

Observing

  1. Previous Experience
FFMQOB_E6 = summary(lm(data = Data6, FFMQOB_Change ~ Avg_Exp))
FFMQOB_E6
## 
## Call:
## lm(formula = FFMQOB_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.420 -1.420 -0.326  1.674  4.674 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   1.4204     0.5087   2.792  0.00888 **
## Avg_Exp      -0.5664     5.0480  -0.112  0.91139   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.589 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0004059,  Adjusted R-squared:  -0.03184 
## F-statistic: 0.01259 on 1 and 31 DF,  p-value: 0.9114

After removing outliers, previous experience was found to explain 0.04% of the change in FFMQ-Observing scores; R2 = 0, F(1, 31 ) = 0.01, p = 0.91. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Observing change; \(\beta\) = -0.57, t = -0.11, p = 0.91.

  1. Program Participation
FFMQOB_P6 = summary(lm(data = Data6, FFMQOB_Change ~ Mins_Week))
FFMQOB_P6
## 
## Call:
## lm(formula = FFMQOB_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.7387 -1.2950 -0.2434  1.6563  4.1101 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.63065    0.65342   0.965    0.340
## Mins_Week    0.02161    0.01576   1.371    0.178
## 
## Residual standard error: 2.312 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.04486,    Adjusted R-squared:  0.02098 
## F-statistic: 1.879 on 1 and 40 DF,  p-value: 0.1781

After removing outliers, program participation was found to explain 4.49% of the change in FFMQ-Observing scores; R2 = 0.04, F(1, 40 ) = 1.88, p = 0.18. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Observing change; \(\beta\) = 0.02, t = 1.37, p = 0.18.

Acting with Awareness

  1. Previous Experience
FFMQAA_E6 = summary(lm(data = Data6, FFMQAA_Change ~ Avg_Exp))
FFMQAA_E6
## 
## Call:
## lm(formula = FFMQAA_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7860 -1.7044 -0.7044  2.2140  7.2956 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   1.7044     0.7009   2.432    0.021 *
## Avg_Exp       0.4896     6.9553   0.070    0.944  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.567 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0001598,  Adjusted R-squared:  -0.03209 
## F-statistic: 0.004955 on 1 and 31 DF,  p-value: 0.9443

After removing outliers, previous experience was found to explain 0.02% of the change in FFMQ-Awareness scores; R2 = 0, F(1, 31 ) = 0, p = 0.94. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Awareness change; \(\beta\) = 0.49, t = 0.07, p = 0.94.

  1. Program Participation
FFMQAA_P6 = summary(lm(data = Data6, FFMQAA_Change ~ Mins_Week))
FFMQAA_P6
## 
## Call:
## lm(formula = FFMQAA_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.3164 -1.3624 -0.2013  1.6051  7.8217 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  1.08625    0.93813   1.158    0.254
## Mins_Week    0.01534    0.02263   0.678    0.502
## 
## Residual standard error: 3.32 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.01136,    Adjusted R-squared:  -0.01336 
## F-statistic: 0.4596 on 1 and 40 DF,  p-value: 0.5017

After removing outliers, program participation was found to explain 1.14% of the change in FFMQ-Awareness scores; R2 = 0.01, F(1, 40 ) = 0.46, p = 0.5. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Awareness change; \(\beta\) = 0.02, t = 0.68, p = 0.5.

Describing

  1. Previous Experience
FFMQDS_E6 = summary(lm(data = Data6, FFMQDS_Change ~ Avg_Exp))
FFMQDS_E6
## 
## Call:
## lm(formula = FFMQDS_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.202 -2.202 -0.130  0.870  5.798 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)   0.2020     0.5633   0.359    0.722
## Avg_Exp      -0.4320     5.5905  -0.077    0.939
## 
## Residual standard error: 2.867 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0001926,  Adjusted R-squared:  -0.03206 
## F-statistic: 0.005971 on 1 and 31 DF,  p-value: 0.9389

After removing outliers, previous experience was found to explain 0.02% of the change in FFMQ-Describing scores; R2 = 0, F(1, 31 ) = 0.01, p = 0.94. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Describing change; \(\beta\) = -0.43, t = -0.08, p = 0.94.

  1. Program Participation
FFMQDS_P6 = summary(lm(data = Data6, FFMQDS_Change ~ Mins_Week))
FFMQDS_P6
## 
## Call:
## lm(formula = FFMQDS_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.3122 -1.8455 -0.1467  1.3616  5.6257 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.83957    0.76515  -1.097    0.279
## Mins_Week    0.03035    0.01846   1.644    0.108
## 
## Residual standard error: 2.708 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.0633, Adjusted R-squared:  0.03988 
## F-statistic: 2.703 on 1 and 40 DF,  p-value: 0.108

After removing outliers, program participation was found to explain 6.33% of the change in FFMQ-Describing scores; R2 = 0.06, F(1, 40 ) = 2.7, p = 0.11. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Describing change; \(\beta\) = 0.03, t = 1.64, p = 0.11.

Non-Judging

  1. Previous Experience
FFMQNJ_E6 = summary(lm(data = Data6, FFMQNJ_Change ~ Avg_Exp))
FFMQNJ_E6
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.8028 -2.1820  0.1972  2.1972  6.1972 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   1.8028     0.6577   2.741   0.0101 *
## Avg_Exp       2.2752     6.5267   0.349   0.7297  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.347 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.003905,   Adjusted R-squared:  -0.02823 
## F-statistic: 0.1215 on 1 and 31 DF,  p-value: 0.7297

After removing outliers, previous experience was found to explain 0.39% of the change in FFMQ-Non-Judging scores; R2 = 0, F(1, 31 ) = 0.12, p = 0.73. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Non-Judging change; \(\beta\) = 2.28, t = 0.35, p = 0.73.

  1. Program Participation
FFMQNJ_P6 = summary(lm(data = Data6, FFMQNJ_Change ~ Mins_Week))
FFMQNJ_P6
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.2867 -1.4529  0.2245  1.6531  7.6637 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.03858    0.86713   0.044   0.9647  
## Mins_Week    0.04963    0.02092   2.372   0.0226 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.069 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.1233, Adjusted R-squared:  0.1014 
## F-statistic: 5.628 on 1 and 40 DF,  p-value: 0.02258

After removing outliers, program participation was found to explain 12.33% of the change in FFMQ-Non-Judging scores; R2 = 0.12, F(1, 40 ) = 5.63, p = 0.02. Time spent meditating, therefore, remains a significant moderator of FFMQ-Non-Judging change, meaning that participants who meditated more demonstrated more positive change over time; \(\beta\) = 0.05, t = 2.37, p = 0.02. This relationship is plotted below.

# Create a figure caption:

FFMQNJCaP6 = "Figure 20. Linear relationship between FFMQ-Non- Judging change over time and time spent meditating throughout the program after outliers have been removed. Shaded area represents a 95% confidence region."
FFMQNJCaP6 = paste0(strwrap(FFMQNJCaP6, width = 56), collapse = "\n")

# Create the plot:

FFMQNJFig6 = (Data6 %>%
  ggplot(aes(Mins_Week, FFMQNJ_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 FFMQ-NJ Change", caption = FFMQNJCaP6) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
FFMQNJFig6

Depression, Anxiety, and Stress Scale

Depression

  1. Previous Experience
DASSD_E6 = summary(lm(data = Data6, DASSD_Change ~ Avg_Exp))
DASSD_E6
## 
## Call:
## lm(formula = DASSD_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -19.1948  -1.1948   0.8052   4.8052  12.8052 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   -2.805      1.392  -2.016   0.0526 .
## Avg_Exp      -15.197     13.811  -1.100   0.2797  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.084 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.03759,    Adjusted R-squared:  0.006541 
## F-statistic: 1.211 on 1 and 31 DF,  p-value: 0.2797

After removing outliers, previous experience was found to explain 3.76% of the change in DASS-Depression scores; R2 = 0.04, F(1, 31 ) = 1.21, p = 0.28. Length of previous experience, therefore, remains a non-significant moderator of DASS-Depression change; \(\beta\) = -15.2, t = -1.1, p = 0.28.

  1. Program Participation
DASSD_P6 = summary(lm(data = Data6, DASSD_Change ~ Mins_Week))
DASSD_P6
## 
## Call:
## lm(formula = DASSD_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.720  -2.639   1.639   4.161  11.239 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -0.83880    1.92077  -0.437   0.6647  
## Mins_Week   -0.08006    0.04634  -1.728   0.0917 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.797 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.06945,    Adjusted R-squared:  0.04618 
## F-statistic: 2.985 on 1 and 40 DF,  p-value: 0.09174

After removing outliers, program participation was found to explain 6.94% of the change in DASS-Depression scores; R2 = 0.07, F(1, 40 ) = 2.99, p = 0.09. Time spent meditating, therefore, remains a non-significant moderator of DASS-Depression change; \(\beta\) = -0.08, t = -1.73, p = 0.09.

Anxiety

  1. Previous Experience
DASSA_E6 = summary(lm(data = Data6, DASSA_Change ~ Avg_Exp))
DASSA_E6
## 
## Call:
## lm(formula = DASSA_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -18.547  -2.547   1.453   3.453  13.453 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  -1.4532     1.2071  -1.204    0.238
## Avg_Exp      -0.0288    11.9792  -0.002    0.998
## 
## Residual standard error: 6.144 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  1.865e-07,  Adjusted R-squared:  -0.03226 
## F-statistic: 5.78e-06 on 1 and 31 DF,  p-value: 0.9981

After removing outliers, previous experience was found to explain 0% of the change in DASS-Anxiety scores; R2 = 0, F(1, 31 ) = 0, p = 1. Length of previous experience, therefore, remains a non-significant moderator of DASS-Anxiety change; \(\beta\) = -0.03, t = 0, p = 1.

  1. Program Participation
DASSA_P6 = summary(lm(data = Data6, DASSA_Change ~ Mins_Week))
DASSA_P6
## 
## Call:
## lm(formula = DASSA_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -17.1655  -2.7315   0.1641   2.6119  10.6585 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  1.86348    1.64722   1.131   0.2647  
## Mins_Week   -0.10440    0.03974  -2.627   0.0121 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.829 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.1472, Adjusted R-squared:  0.1258 
## F-statistic: 6.902 on 1 and 40 DF,  p-value: 0.01215

After removing outliers, program participation was found to explain 14.72% of the change in DASS-Anxiety scores; R2 = 0.15, F(1, 40 ) = 6.9, p = 0.01. Time spent meditating, therefore, was found to be a significant moderator of DASS-Anxiety change, meaning that participants who meditated more demonstrated more negative change over time; \(\beta\) = -0.1, t = -2.63, p = 0.01. This relationship is plotted blow.

# Create a figure caption:

DASSACaP6 = "Figure 21. Linear relationship between DASS-Anxiety change over time and time spent meditating throughout the program after outliers have been removed. Shaded area represents a 95% confidence region."
DASSACaP6 = paste0(strwrap(DASSACaP6, width = 56), collapse = "\n")

# Create the plot:

DASSAFig6 = (Data6 %>%
  ggplot(aes(Mins_Week, DASSA_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 DASS-A Change", caption = DASSACaP6) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
DASSAFig6

For comparison’s-sake, this relationship with all participants included is plotted below.

# Create a figure caption:

DASSACaP5 = "Figure 22. Linear relationship between DASS-Anxiety change over time and time spent meditating throughout the program. Shaded area represents a 95% confidence region."
DASSACaP5 = paste0(strwrap(DASSACaP5, width = 56), collapse = "\n")

# Create the plot:

DASSAFig5 = (Data5 %>%
  ggplot(aes(Mins_Week, DASSA_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 DASS-A Change", caption = DASSACaP5) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
DASSAFig5

Stress

  1. Previous Experience
DASSS_E6 = summary(lm(data = Data6, DASSS_Change ~ Avg_Exp))
DASSS_E6
## 
## Call:
## lm(formula = DASSS_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -16.294  -4.294   1.706   3.706  13.706 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   -3.706      1.158  -3.199  0.00317 **
## Avg_Exp       -1.104     11.496  -0.096  0.92411   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.896 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0002974,  Adjusted R-squared:  -0.03195 
## F-statistic: 0.009222 on 1 and 31 DF,  p-value: 0.9241

After removing outliers, previous experience was found to explain 0.03% of the change in DASS-Stress scores; R2 = 0, F(1, 31 ) = 0.01, p = 0.92. Length of previous experience, therefore, remains a non-significant moderator of DASS-Stress change; \(\beta\) = -1.1, t = -0.1, p = 0.92.

  1. Program Participation
DASSS_P6 = summary(lm(data = Data6, DASSS_Change ~ Mins_Week))
DASSS_P6
## 
## Call:
## lm(formula = DASSS_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -12.445  -2.711   0.737   2.676  10.741 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -0.21708    1.45109  -0.150   0.8818   
## Mins_Week   -0.10482    0.03501  -2.994   0.0047 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.135 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.1831, Adjusted R-squared:  0.1627 
## F-statistic: 8.966 on 1 and 40 DF,  p-value: 0.004701

After removing outliers, program participation was found to explain 18.31% of the change in DASS-Stress scores; R2 = 0.18, F(1, 40 ) = 8.97, p = 0.005. Time spent meditating, therefore, was found to be a significant moderator of DASS-Stress change, meaning that participants who meditated more demonstrated more negative change over time; \(\beta\) = -0.1, t = -2.99, p = 0.005.

# Create a figure caption:

DASSSCaP6 = "Figure 23. Linear relationship between DASS-Stress change over time and time spent meditating throughout the program after outliers have been removed. Shaded area represents a 95% confidence region."
DASSSCaP6 = paste0(strwrap(DASSSCaP6, width = 56), collapse = "\n")

# Create the plot:

DASSSFig6 = (Data6 %>%
  ggplot(aes(Mins_Week, DASSS_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 DASS-S Change", caption = DASSSCaP6) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
DASSSFig6

For comparison’s-sake, this relationship with all participants included is plotted below.

# Create a figure caption:

DASSSCaP5 = "Figure 24. Linear relationship between DASS-Stress change over time and time spent meditating throughout the program. Shaded area represents a 95% confidence region."
DASSSCaP5 = paste0(strwrap(DASSSCaP5, width = 56), collapse = "\n")

# Create the plot:

DASSSFig5 = (Data5 %>%
  ggplot(aes(Mins_Week, DASSS_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Time Spent Meditating (mins/week)", y = "T1 to T2 DASS-S Change", caption = DASSSCaP5) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
DASSSFig5

Job Effectiveness Questionnaire

  1. Previous Experience
JEQ_E6 = summary(lm(data = Data6, JEQ_Change ~ Avg_Exp))
JEQ_E6
## 
## Call:
## lm(formula = JEQ_Change ~ Avg_Exp, data = Data6)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.5535 -0.2942 -0.1090  0.3354  1.7639 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)   0.1461     0.1219   1.198    0.240
## Avg_Exp       1.4292     1.2095   1.182    0.246
## 
## Residual standard error: 0.6203 on 31 degrees of freedom
##   (12 observations deleted due to missingness)
## Multiple R-squared:  0.0431, Adjusted R-squared:  0.01223 
## F-statistic: 1.396 on 1 and 31 DF,  p-value: 0.2463

After removing outliers, previous experience was found to explain 4.31% of the change in JEQ scores; R2 = 0.04, F(1, 31 ) = 1.4, p = 0.25. Length of previous experience, therefore, remains a non-significant moderator of JEQ change; \(\beta\) = 1.43, t = 1.18, p = 0.25.

  1. Program Participation
JEQ_P6 = summary(lm(data = Data6, JEQ_Change ~ Mins_Week))
JEQ_P6
## 
## Call:
## lm(formula = JEQ_Change ~ Mins_Week, data = Data6)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.36561 -0.29208  0.05355  0.34902  1.60344 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -0.078921   0.162871  -0.485   0.6306  
## Mins_Week    0.007424   0.003929   1.889   0.0661 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5764 on 40 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.08194,    Adjusted R-squared:  0.05899 
## F-statistic:  3.57 on 1 and 40 DF,  p-value: 0.06609

After removing outliers, program participation was found to explain 8.19% of the change in JEQ scores; R2 = 0.08, F(1, 40 ) = 3.57, p = 0.07. Time spent meditating, therefore, remains a non-significant moderator of JEQ change; \(\beta\) = 0.01, t = 1.89, p = 0.07.

Summary of Results

The following results were found to be statistically significant:

  • Five Facet Mindfulness Questionnaire

    • non-judging changes were moderated by time spent meditating (p = 0.02)
  • Depression, Anxiety, and Stress Scale

    • anxiety changes were moderated by time spent meditating (p = 0.01)

    • stress changes were moderated by time spent meditating (p = 0.005)

Conclusion

As before, correlation analyses suggest that intervention-related changes were unrelated to both the length of previous experience and the degree to which an individual participated in the program. This conclusion is partially supported by moderation analyses, which suggest that length of previous meditation experience is not a significant moderator of the changes that were observed throughout the program. The removal of outliers, however, revealed that time spent meditating was a significant moderator of non-judging and the prevalence of symptoms associated with anxiety and stress. As the inclusion of outlier values initially resulted in smaller slopes and non-significant relationships between time spent meditating and anxiety and stress, it is possible that changes on these measures are tempered by unusually high levels of participation; moderate levels of participation, however, seem to be positively related to decreases in anxiety and stress over time. Increases in non-judging, on the other hand, seem to be positively related to all degrees of participation, as the relationship between these variables was significant with and without outliers. Our seventh and final set of analyses will assess the pre- to post-intervention changes that were observed within the context of the general population. In particular, we will compare participants’ self-report scores with norming data for each measure.


7. Comparison Between Participants and Norming Data

In this final set of analyses, we will compare participants’ immediate pre- and immediate post-intervention scores with norming data for each measure. Note that, for participants in the experimental condition, “immediate pre” refers to T1 and “immediate post” refers to T2; for those in the control condition, “immediate pre” and “immediate post” refer to T2 and T3, respectively. We will only include data from participants who actively participated in the meditation program and who completed the appropriate surveys (i.e. the participants from the fifth set of analyses).

Because the JEQ was designed specifically for this study, norming data is not available for this scale and it will be excluded from this analysis. With respect to the other scales, norming data was obtained from the following sources:

Subsetting Data

Norming Data

Before we begin, we’ll create a dataset of the norming values to be used in this analysis.

# Create lists of the subscales and the relevant norming sources:

Norm_Sources = c("Cohen & Williamson, 1988", "Watson et al., 1988", "", "Smith et al., 2013", "Bohlmeijer et al., 2011", "", "", "", "", "Sinclair et al., 2012", "", "")

Norm_Subscales = c("", "Positive Affect", "Negative Affect", "", "Non-Reactivity", "Observing", "Awareness", "Describing", "Non-Judging", "Depression", "Anxiety", "Stress")

# Create lists of the norming values:

Norm_ns = c(2387, 586, 586, 844, 376, 376, 376, 376, 376, 499, 499, 499)

Norm_Means = c(19.62, 32.00, 19.50, 3.70, 13.47, 13.86, 13.19, 16.28, 14.09, 5.70, 3.99, 8.12)

Norm_SDs = c(7.49, 7.00, 7.00, .68, 3.07, 3.21, 3.32, 3.91, 3.63, 8.20, 6.27, 7.62)

# Combine the subsets into a full data frame:

Norm_Data = data.frame("Source" = Norm_Sources, "Subscale" = Norm_Subscales, "n" = Norm_ns, "M" = Norm_Means, "SD" = Norm_SDs)

# Create a table to display the results:

kable(Norm_Data, digits = 4,
      caption = "Table 93. Norming values to be compared with pre- and post-intervention self-report scores .",
      col.names = c("Source", "Measure", "n", "M", "SD"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options = c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  group_rows("Perceived Stress Scale", 1, 1) %>%
  group_rows("Positive and Negative Affect Schedule", 2, 3) %>%
  group_rows("Brief Resilience Scale", 4, 4) %>%
  group_rows("Five Facet Mindfulness Questionnaire", 5, 9) %>%
  group_rows("Depression, Anxiety, and Stress Scale", 10, 12)
Table 93. Norming values to be compared with pre- and post-intervention self-report scores .
Source Measure n M SD
Perceived Stress Scale
Cohen & Williamson, 1988 2387 19.62 7.49
Positive and Negative Affect Schedule
Watson et al., 1988 Positive Affect 586 32.00 7.00
Negative Affect 586 19.50 7.00
Brief Resilience Scale
Smith et al., 2013 844 3.70 0.68
Five Facet Mindfulness Questionnaire
Bohlmeijer et al., 2011 Non-Reactivity 376 13.47 3.07
Observing 376 13.86 3.21
Awareness 376 13.19 3.32
Describing 376 16.28 3.91
Non-Judging 376 14.09 3.63
Depression, Anxiety, and Stress Scale
Sinclair et al., 2012 Depression 499 5.70 8.20
Anxiety 499 3.99 6.27
Stress 499 8.12 7.62

Pre- and Post-Intervention Data

We’ll also create a data set of the pre- and post-intervention data for each condition:

# Create a data set of the relevant variables from the ExpData dataset:

Exp_PrePost = data.frame("Subject" = ExpData5$Subject, "Condition" = ExpData5$Condition, "Pre_PSS" = ExpData5$T1_PSS, "Pre_PANASP" = ExpData5$T1_POS_PANAS, "Pre_PANASN" = ExpData5$T1_NEG_PANAS, "Pre_BRS" = ExpData5$T1_BRS, "Pre_FFMQNR" = ExpData5$T1_NR_FFMQ, "Pre_FFMQOB" = ExpData5$T1_OB_FFMQ, "Pre_FFMQAA" = ExpData5$T1_AA_FFMQ, "Pre_FFMQDS" = ExpData5$T1_DS_FFMQ, "Pre_FFMQNJ" = ExpData5$T1_NJ_FFMQ, "Pre_DASSD" = ExpData5$T1_D_DASS, "Pre_DASSA" = ExpData5$T1_A_DASS, "Pre_DASSS" = ExpData5$T1_S_DASS, "Post_PSS" = ExpData5$T2_PSS, "Post_PANASP" = ExpData5$T2_POS_PANAS, "Post_PANASN" = ExpData5$T2_NEG_PANAS, "Post_BRS" = ExpData5$T2_BRS, "Post_FFMQNR" = ExpData5$T2_NR_FFMQ, "Post_FFMQOB" = ExpData5$T2_OB_FFMQ, "Post_FFMQAA" = ExpData5$T2_AA_FFMQ, "Post_FFMQDS" = ExpData5$T2_DS_FFMQ, "Post_FFMQNJ" = ExpData5$T2_NJ_FFMQ, "Post_DASSD" = ExpData5$T2_D_DASS, "Post_DASSA" = ExpData5$T2_A_DASS, "Post_DASSS" = ExpData5$T2_S_DASS)

# Create a data set of the relevant variables from the ConData dataset:

Con_PrePost = data.frame("Subject" = ConData5$Subject, "Condition" = ConData5$Condition, "Pre_PSS" = ConData5$T2_PSS, "Pre_PANASP" = ConData5$T2_POS_PANAS, "Pre_PANASN" = ConData5$T2_NEG_PANAS, "Pre_BRS" = ConData5$T2_BRS, "Pre_FFMQNR" = ConData5$T2_NR_FFMQ, "Pre_FFMQOB" = ConData5$T2_OB_FFMQ, "Pre_FFMQAA" = ConData5$T2_AA_FFMQ, "Pre_FFMQDS" = ConData5$T2_DS_FFMQ, "Pre_FFMQNJ" = ConData5$T2_NJ_FFMQ, "Pre_DASSD" = ConData5$T2_D_DASS, "Pre_DASSA" = ConData5$T2_A_DASS, "Pre_DASSS" = ConData5$T2_S_DASS, "Post_PSS" = ConData5$T3_PSS, "Post_PANASP" = ConData5$T3_POS_PANAS, "Post_PANASN" = ConData5$T3_NEG_PANAS, "Post_BRS" = ConData5$T3_BRS, "Post_FFMQNR" = ConData5$T3_NR_FFMQ, "Post_FFMQOB" = ConData5$T3_OB_FFMQ, "Post_FFMQAA" = ConData5$T3_AA_FFMQ, "Post_FFMQDS" = ConData5$T3_DS_FFMQ, "Post_FFMQNJ" = ConData5$T3_NJ_FFMQ, "Post_DASSD" = ConData5$T3_D_DASS, "Post_DASSA" = ConData5$T3_A_DASS, "Post_DASSS" = ConData5$T3_S_DASS)

# Combine into a single data frame:

Data7 = rbind(Exp_PrePost, Con_PrePost)

Perceived Stress Scale

T-Tests

We’ll begin by conducting a series of mean comparisons between self-report scores and the appropriate norming measure. Note that, because we don’t have access to the full set of norming data and, therefore, can’t test the homogeneity of variance assumption, we’ll perform Welch’s t-tests. The Welch’s t-test is more reliable than the standard t-test when variances are unequal and, when variances are equal, the Welch’s test is similar in power to the standard test. Also note that each norming mean will be compared against two other means: the pre-test mean and the post-test mean. For each set of two-way comparisons, therefore, a Holm-Bonferroni adjustment will be applied to correct the family-wise error rate.

Pre-Intervention

Run the t-test.

PSS_Pre = tsum.test(mean.x = Norm_Data$M[1], s.x = Norm_Data$SD[1], n.x = Norm_Data$n[1], mean.y = mean(Data7$Pre_PSS), s.y = sd(Data7$Pre_PSS), n.y = length(Data7$Pre_PSS))

Calculate Cohen’s d effect size.

PSS_PreD = DInd(t = PSS_Pre$statistic, nx = Norm_Data$n[1], ny = length(Data7$Pre_PSS))

Post-Intervention

Run the t-test.

PSS_Post = tsum.test(mean.x = Norm_Data$M[1], s.x = Norm_Data$SD[1], n.x = Norm_Data$n[1], mean.y = mean(Data7$Post_PSS), s.y = sd(Data7$Post_PSS), n.y = length(Data7$Post_PSS))

Calculate Cohen’s d effect size.

PSS_PostD = DInd(t = PSS_Post$statistic, nx = Norm_Data$n[1], ny = length(Data7$Post_PSS))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

PSS_PrePost_p = p.adjust(c(PSS_Pre$p.value, PSS_Post$p.value), method = c("holm"), n = 2)

Positive and Negative Affect Schedule

T-Tests - Positive Affect

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

PANASP_Pre = tsum.test(mean.x = Norm_Data$M[2], s.x = Norm_Data$SD[2], n.x = Norm_Data$n[2], mean.y = mean(Data7$Pre_PANASP), s.y = sd(Data7$Pre_PANASP), n.y = length(Data7$Pre_PANASP))

Calculate Cohen’s d effect size.

PANASP_PreD = DInd(t = PANASP_Pre$statistic, nx = Norm_Data$n[2], ny = length(Data7$Pre_PANASP))

Post-Intervention

Run the t-test.

PANASP_Post = tsum.test(mean.x = Norm_Data$M[2], s.x = Norm_Data$SD[2], n.x = Norm_Data$n[2], mean.y = mean(Data7$Post_PANASP), s.y = sd(Data7$Post_PANASP), n.y = length(Data7$Post_PANASP))

Calculate Cohen’s d effect size.

PANASP_PostD = DInd(t = PANASP_Post$statistic, nx = Norm_Data$n[2], ny = length(Data7$Post_PANASP))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

PANASP_PrePost_p = p.adjust(c(PANASP_Pre$p.value, PANASP_Post$p.value), method = c("holm"), n = 2)

T-Tests - Negative Affect

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

PANASN_Pre = tsum.test(mean.x = Norm_Data$M[3], s.x = Norm_Data$SD[3], n.x = Norm_Data$n[3], mean.y = mean(Data7$Pre_PANASN), s.y = sd(Data7$Pre_PANASN), n.y = length(Data7$Pre_PANASN))

Calculate Cohen’s d effect size.

PANASN_PreD = DInd(t = PANASN_Pre$statistic, nx = Norm_Data$n[3], ny = length(Data7$Pre_PANASN))

Post-Intervention

Run the t-test.

PANASN_Post = tsum.test(mean.x = Norm_Data$M[3], s.x = Norm_Data$SD[3], n.x = Norm_Data$n[3], mean.y = mean(Data7$Post_PANASN), s.y = sd(Data7$Post_PANASN), n.y = length(Data7$Post_PANASN))

Calculate Cohen’s d effect size.

PANASN_PostD = DInd(t = PANASN_Post$statistic, nx = Norm_Data$n[3], ny = length(Data7$Post_PANASN))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

PANASN_PrePost_p = p.adjust(c(PANASN_Pre$p.value, PANASN_Post$p.value), method = c("holm"), n = 2)

Brief Resilience Scale

T-Tests

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

BRS_Pre = tsum.test(mean.x = Norm_Data$M[4], s.x = Norm_Data$SD[4], n.x = Norm_Data$n[4], mean.y = mean(Data7$Pre_BRS), s.y = sd(Data7$Pre_BRS), n.y = length(Data7$Pre_BRS))

Calculate Cohen’s d effect size.

BRS_PreD = DInd(t = BRS_Pre$statistic, nx = Norm_Data$n[4], ny = length(Data7$Pre_BRS))

Post-Intervention

Run the t-test.

BRS_Post = tsum.test(mean.x = Norm_Data$M[4], s.x = Norm_Data$SD[4], n.x = Norm_Data$n[4], mean.y = mean(Data7$Post_BRS), s.y = sd(Data7$Post_BRS), n.y = length(Data7$Post_BRS))

Calculate Cohen’s d effect size.

BRS_PostD = DInd(t = BRS_Post$statistic, nx = Norm_Data$n[4], ny = length(Data7$Post_BRS))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

BRS_PrePost_p = p.adjust(c(BRS_Pre$p.value, BRS_Post$p.value), method = c("holm"), n = 2)

Five Facet Mindfulness Questionnaire

T-Tests - Non-Reactivity

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

FFMQNR_Pre = tsum.test(mean.x = Norm_Data$M[5], s.x = Norm_Data$SD[5], n.x = Norm_Data$n[5], mean.y = mean(Data7$Pre_FFMQNR), s.y = sd(Data7$Pre_FFMQNR), n.y = length(Data7$Pre_FFMQNR))

Calculate Cohen’s d effect size.

FFMQNR_PreD = DInd(t = FFMQNR_Pre$statistic, nx = Norm_Data$n[5], ny = length(Data7$Pre_FFMQNR))

Post-Intervention

Run the t-test.

FFMQNR_Post = tsum.test(mean.x = Norm_Data$M[5], s.x = Norm_Data$SD[5], n.x = Norm_Data$n[5], mean.y = mean(Data7$Post_FFMQNR, na.rm = TRUE), s.y = sd(Data7$Post_FFMQNR, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_FFMQNR))))

Calculate Cohen’s d effect size.

FFMQNR_PostD = DInd(t = FFMQNR_Post$statistic, nx = Norm_Data$n[5], ny = length(which(!is.na(Data7$Post_FFMQNR))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

FFMQNR_PrePost_p = p.adjust(c(FFMQNR_Pre$p.value, FFMQNR_Post$p.value), method = c("holm"), n = 2)

T-Tests - Observing

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

FFMQOB_Pre = tsum.test(mean.x = Norm_Data$M[6], s.x = Norm_Data$SD[6], n.x = Norm_Data$n[6], mean.y = mean(Data7$Pre_FFMQOB), s.y = sd(Data7$Pre_FFMQOB), n.y = length(Data7$Pre_FFMQOB))

Calculate Cohen’s d effect size.

FFMQOB_PreD = DInd(t = FFMQOB_Pre$statistic, nx = Norm_Data$n[6], ny = length(Data7$Pre_FFMQOB))

Post-Intervention

Run the t-test.

FFMQOB_Post = tsum.test(mean.x = Norm_Data$M[6], s.x = Norm_Data$SD[6], n.x = Norm_Data$n[6], mean.y = mean(Data7$Post_FFMQOB, na.rm = TRUE), s.y = sd(Data7$Post_FFMQOB, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_FFMQOB))))

Calculate Cohen’s d effect size.

FFMQOB_PostD = DInd(t = FFMQOB_Post$statistic, nx = Norm_Data$n[6], ny = length(which(!is.na(Data7$Post_FFMQOB))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

FFMQOB_PrePost_p = p.adjust(c(FFMQOB_Pre$p.value, FFMQOB_Post$p.value), method = c("holm"), n = 2)

T-Tests - Acting with Awareness

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

FFMQAA_Pre = tsum.test(mean.x = Norm_Data$M[7], s.x = Norm_Data$SD[7], n.x = Norm_Data$n[7], mean.y = mean(Data7$Pre_FFMQAA), s.y = sd(Data7$Pre_FFMQAA), n.y = length(Data7$Pre_FFMQAA))

Calculate Cohen’s d effect size.

FFMQAA_PreD = DInd(t = FFMQAA_Pre$statistic, nx = Norm_Data$n[7], ny = length(Data7$Pre_FFMQAA))

Post-Intervention

Run the t-test.

FFMQAA_Post = tsum.test(mean.x = Norm_Data$M[7], s.x = Norm_Data$SD[7], n.x = Norm_Data$n[7], mean.y = mean(Data7$Post_FFMQAA, na.rm = TRUE), s.y = sd(Data7$Post_FFMQAA, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_FFMQAA))))

Calculate Cohen’s d effect size.

FFMQAA_PostD = DInd(t = FFMQAA_Post$statistic, nx = Norm_Data$n[7], ny = length(which(!is.na(Data7$Post_FFMQAA))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

FFMQAA_PrePost_p = p.adjust(c(FFMQAA_Pre$p.value, FFMQAA_Post$p.value), method = c("holm"), n = 2)

T-Tests - Describing

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

FFMQDS_Pre = tsum.test(mean.x = Norm_Data$M[8], s.x = Norm_Data$SD[8], n.x = Norm_Data$n[8], mean.y = mean(Data7$Pre_FFMQDS), s.y = sd(Data7$Pre_FFMQDS), n.y = length(Data7$Pre_FFMQDS))

Calculate Cohen’s d effect size.

FFMQDS_PreD = DInd(t = FFMQDS_Pre$statistic, nx = Norm_Data$n[8], ny = length(Data7$Pre_FFMQDS))

Post-Intervention

Run the t-test.

FFMQDS_Post = tsum.test(mean.x = Norm_Data$M[8], s.x = Norm_Data$SD[8], n.x = Norm_Data$n[8], mean.y = mean(Data7$Post_FFMQDS, na.rm = TRUE), s.y = sd(Data7$Post_FFMQDS, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_FFMQDS))))

Calculate Cohen’s d effect size.

FFMQDS_PostD = DInd(t = FFMQDS_Post$statistic, nx = Norm_Data$n[8], ny = length(which(!is.na(Data7$Post_FFMQDS))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

FFMQDS_PrePost_p = p.adjust(c(FFMQDS_Pre$p.value, FFMQDS_Post$p.value), method = c("holm"), n = 2)

T-Tests - Non-Judging

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

FFMQNJ_Pre = tsum.test(mean.x = Norm_Data$M[9], s.x = Norm_Data$SD[9], n.x = Norm_Data$n[9], mean.y = mean(Data7$Pre_FFMQNJ), s.y = sd(Data7$Pre_FFMQNJ), n.y = length(Data7$Pre_FFMQNJ))

Calculate Cohen’s d effect size.

FFMQNJ_PreD = DInd(t = FFMQNJ_Pre$statistic, nx = Norm_Data$n[9], ny = length(Data7$Pre_FFMQNJ))

Post-Intervention

Run the t-test.

FFMQNJ_Post = tsum.test(mean.x = Norm_Data$M[9], s.x = Norm_Data$SD[9], n.x = Norm_Data$n[9], mean.y = mean(Data7$Post_FFMQNJ, na.rm = TRUE), s.y = sd(Data7$Post_FFMQNJ, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_FFMQNJ))))

Calculate Cohen’s d effect size.

FFMQNJ_PostD = DInd(t = FFMQNJ_Post$statistic, nx = Norm_Data$n[9], ny = length(which(!is.na(Data7$Post_FFMQNJ))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

FFMQNJ_PrePost_p = p.adjust(c(FFMQNJ_Pre$p.value, FFMQNJ_Post$p.value), method = c("holm"), n = 2)

Depression, Anxiety, and Stress Scale

T-Tests - Depression

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

DASSD_Pre = tsum.test(mean.x = Norm_Data$M[10], s.x = Norm_Data$SD[10], n.x = Norm_Data$n[10], mean.y = mean(Data7$Pre_DASSD), s.y = sd(Data7$Pre_DASSD), n.y = length(Data7$Pre_DASSD))

Calculate Cohen’s d effect size.

DASSD_PreD = DInd(t = DASSD_Pre$statistic, nx = Norm_Data$n[10], ny = length(Data7$Pre_DASSD))

Post-Intervention

Run the t-test.

DASSD_Post = tsum.test(mean.x = Norm_Data$M[10], s.x = Norm_Data$SD[10], n.x = Norm_Data$n[10], mean.y = mean(Data7$Post_DASSD, na.rm = TRUE), s.y = sd(Data7$Post_DASSD, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_DASSD))))

Calculate Cohen’s d effect size.

DASSD_PostD = DInd(t = DASSD_Post$statistic, nx = Norm_Data$n[10], ny = length(which(!is.na(Data7$Post_DASSD))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

DASSD_PrePost_p = p.adjust(c(DASSD_Pre$p.value, DASSD_Post$p.value), method = c("holm"), n = 2)

T-Tests - Anxiety

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

DASSA_Pre = tsum.test(mean.x = Norm_Data$M[11], s.x = Norm_Data$SD[11], n.x = Norm_Data$n[11], mean.y = mean(Data7$Pre_DASSA), s.y = sd(Data7$Pre_DASSA), n.y = length(Data7$Pre_DASSA))

Calculate Cohen’s d effect size.

DASSA_PreD = DInd(t = DASSA_Pre$statistic, nx = Norm_Data$n[11], ny = length(Data7$Pre_DASSA))

Post-Intervention

Run the t-test.

DASSA_Post = tsum.test(mean.x = Norm_Data$M[11], s.x = Norm_Data$SD[11], n.x = Norm_Data$n[11], mean.y = mean(Data7$Post_DASSA, na.rm = TRUE), s.y = sd(Data7$Post_DASSA, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_DASSA))))

Calculate Cohen’s d effect size.

DASSA_PostD = DInd(t = DASSA_Post$statistic, nx = Norm_Data$n[11], ny = length(which(!is.na(Data7$Post_DASSA))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

DASSA_PrePost_p = p.adjust(c(DASSA_Pre$p.value, DASSA_Post$p.value), method = c("holm"), n = 2)

T-Tests - Stress

As before, we’ll perform Welch’s t-tests.

Pre-Intervention

Run the t-test.

DASSS_Pre = tsum.test(mean.x = Norm_Data$M[12], s.x = Norm_Data$SD[12], n.x = Norm_Data$n[12], mean.y = mean(Data7$Pre_DASSS), s.y = sd(Data7$Pre_DASSS), n.y = length(Data7$Pre_DASSS))

Calculate Cohen’s d effect size.

DASSS_PreD = DInd(t = DASSS_Pre$statistic, nx = Norm_Data$n[12], ny = length(Data7$Pre_DASSS))

Post-Intervention

Run the t-test.

DASSS_Post = tsum.test(mean.x = Norm_Data$M[12], s.x = Norm_Data$SD[12], n.x = Norm_Data$n[12], mean.y = mean(Data7$Post_DASSS, na.rm = TRUE), s.y = sd(Data7$Post_DASSS, na.rm = TRUE), n.y = length(which(!is.na(Data7$Post_DASSS))))

Calculate Cohen’s d effect size.

DASSS_PostD = DInd(t = DASSS_Post$statistic, nx = Norm_Data$n[12], ny = length(which(!is.na(Data7$Post_DASSS))))

p-Adjustment

In order to correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

DASSS_PrePost_p = p.adjust(c(DASSS_Pre$p.value, DASSS_Post$p.value), method = c("holm"), n = 2)

Comparisons

# Create a list of pre-intervention comparison values:

Pre_Ms = c((round(mean(Data7$Pre_PSS), 2)), (round(mean(Data7$Pre_PANASP), 2)), (round(mean(Data7$Pre_PANASN), 2)), (round(mean(Data7$Pre_BRS), 2)), (round(mean(Data7$Pre_FFMQNR), 2)), (round(mean(Data7$Pre_FFMQOB), 2)), (round(mean(Data7$Pre_FFMQAA), 2)), (round(mean(Data7$Pre_FFMQDS), 2)), (round(mean(Data7$Pre_FFMQNJ), 2)), (round(mean(Data7$Pre_DASSD), 2)), (round(mean(Data7$Pre_DASSA), 2)), (round(mean(Data7$Pre_DASSS), 2)))

Pre_SDs = c((round(sd(Data7$Pre_PSS), 2)), (round(sd(Data7$Pre_PANASP), 2)), (round(sd(Data7$Pre_PANASN), 2)), (round(sd(Data7$Pre_BRS), 2)), (round(sd(Data7$Pre_FFMQNR), 2)), (round(sd(Data7$Pre_FFMQOB), 2)), (round(sd(Data7$Pre_FFMQAA), 2)), (round(sd(Data7$Pre_FFMQDS), 2)), (round(sd(Data7$Pre_FFMQNJ), 2)), (round(sd(Data7$Pre_DASSD), 2)), (round(sd(Data7$Pre_DASSA), 2)), (round(sd(Data7$Pre_DASSS), 2)))

Pre_Ts = c((round(PSS_Pre$statistic, 2)), (round(PANASP_Pre$statistic, 2)), (round(PANASN_Pre$statistic, 2)), (round(BRS_Pre$statistic, 2)), (round(FFMQNR_Pre$statistic, 2)), (round(FFMQOB_Pre$statistic, 2)), (round(FFMQAA_Pre$statistic, 2)), (round(FFMQDS_Pre$statistic, 2)), (round(FFMQNJ_Pre$statistic, 2)), (round(DASSD_Pre$statistic, 2)), (round(DASSA_Pre$statistic, 2)), (round(DASSS_Pre$statistic, 2)))

Pre_DFs = c((round(PSS_Pre$parameters, 2)), (round(PANASP_Pre$parameters, 2)), (round(PANASN_Pre$parameters, 2)), (round(BRS_Pre$parameters, 2)), (round(FFMQNR_Pre$parameters, 2)), (round(FFMQOB_Pre$parameters, 2)), (round(FFMQAA_Pre$parameters, 2)), (round(FFMQDS_Pre$parameters, 2)), (round(FFMQNJ_Pre$parameters, 2)), (round(DASSD_Pre$parameters, 2)), (round(DASSA_Pre$parameters, 2)), (round(DASSS_Pre$parameters, 2)))

Pre_Ps = c((round(PSS_PrePost_p[1], 4)), (round(PANASP_PrePost_p[1], 4)), (round(PANASN_PrePost_p[1], 4)), (round(BRS_PrePost_p[1], 4)), (round(FFMQNR_PrePost_p[1], 4)), (round(FFMQOB_PrePost_p[1], 4)), (round(FFMQAA_PrePost_p[1], 4)), (round(FFMQDS_PrePost_p[1], 4)), (round(FFMQNJ_PrePost_p[1], 4)), (round(DASSD_PrePost_p[1], 4)), (round(DASSA_PrePost_p[1], 4)), (round(DASSS_PrePost_p[1], 4)))

Pre_Ds = c((round(PSS_PreD, 2)), (round(PANASP_PreD, 2)), (round(PANASN_PreD, 2)), (round(BRS_PreD, 2)), (round(FFMQNR_PreD, 2)), (round(FFMQOB_PreD, 2)), (round(FFMQAA_PreD, 2)), (round(FFMQDS_PreD, 2)), (round(FFMQNJ_PreD, 2)), (round(DASSD_PreD, 2)), (round(DASSA_PreD, 2)), (round(DASSS_PreD, 2)))

# Create a list of post-intervention comparison values:

Post_Ms = c((round(mean(Data7$Post_PSS), 2)), (round(mean(Data7$Post_PANASP), 2)), (round(mean(Data7$Post_PANASN), 2)), (round(mean(Data7$Post_BRS), 2)), (round(mean(Data7$Post_FFMQNR, na.rm = TRUE), 2)), (round(mean(Data7$Post_FFMQOB, na.rm = TRUE), 2)), (round(mean(Data7$Post_FFMQAA, na.rm = TRUE), 2)), (round(mean(Data7$Post_FFMQDS, na.rm = TRUE), 2)), (round(mean(Data7$Post_FFMQNJ, na.rm = TRUE), 2)), (round(mean(Data7$Post_DASSD, na.rm = TRUE), 2)), (round(mean(Data7$Post_DASSA, na.rm = TRUE), 2)), (round(mean(Data7$Post_DASSS, na.rm = TRUE), 2)))

Post_SDs = c((round(sd(Data7$Post_PSS), 2)), (round(sd(Data7$Post_PANASP), 2)), (round(sd(Data7$Post_PANASN), 2)), (round(sd(Data7$Post_BRS), 2)), (round(sd(Data7$Post_FFMQNR, na.rm = TRUE), 2)), (round(sd(Data7$Post_FFMQOB, na.rm = TRUE), 2)), (round(sd(Data7$Post_FFMQAA, na.rm = TRUE), 2)), (round(sd(Data7$Post_FFMQDS, na.rm = TRUE), 2)), (round(sd(Data7$Post_FFMQNJ, na.rm = TRUE), 2)), (round(sd(Data7$Post_DASSD, na.rm = TRUE), 2)), (round(sd(Data7$Post_DASSA, na.rm = TRUE), 2)), (round(sd(Data7$Post_DASSS, na.rm = TRUE), 2)))

Post_Ts = c((round(PSS_Post$statistic, 2)), (round(PANASP_Post$statistic, 2)), (round(PANASN_Post$statistic, 2)), (round(BRS_Post$statistic, 2)), (round(FFMQNR_Post$statistic, 2)), (round(FFMQOB_Post$statistic, 2)), (round(FFMQAA_Post$statistic, 2)), (round(FFMQDS_Post$statistic, 2)), (round(FFMQNJ_Post$statistic, 2)), (round(DASSD_Post$statistic, 2)), (round(DASSA_Post$statistic, 2)), (round(DASSS_Post$statistic, 2)))

Post_DFs = c((round(PSS_Post$parameters, 2)), (round(PANASP_Post$parameters, 2)), (round(PANASN_Post$parameters, 2)), (round(BRS_Post$parameters, 2)), (round(FFMQNR_Post$parameters, 2)), (round(FFMQOB_Post$parameters, 2)), (round(FFMQAA_Post$parameters, 2)), (round(FFMQDS_Post$parameters, 2)), (round(FFMQNJ_Post$parameters, 2)), (round(DASSD_Post$parameters, 2)), (round(DASSA_Post$parameters, 2)), (round(DASSS_Post$parameters, 2)))

Post_Ps = c((round(PSS_PrePost_p[2], 4)), (round(PANASP_PrePost_p[2], 4)), (round(PANASN_PrePost_p[2], 4)), (round(BRS_PrePost_p[2], 4)), (round(FFMQNR_PrePost_p[2], 4)), (round(FFMQOB_PrePost_p[2], 4)), (round(FFMQAA_PrePost_p[2], 4)), (round(FFMQDS_PrePost_p[2], 4)), (round(FFMQNJ_PrePost_p[2], 4)), (round(DASSD_PrePost_p[2], 4)), (round(DASSA_PrePost_p[2], 4)), (round(DASSS_PrePost_p[2], 4)))

Post_Ds = c((round(PSS_PostD, 2)), (round(PANASP_PostD, 2)), (round(PANASN_PostD, 2)), (round(BRS_PostD, 2)), (round(FFMQNR_PostD, 2)), (round(FFMQOB_PostD, 2)), (round(FFMQAA_PostD, 2)), (round(FFMQDS_PostD, 2)), (round(FFMQNJ_PostD, 2)), (round(DASSD_PostD, 2)), (round(DASSA_PostD, 2)), (round(DASSS_PostD, 2)))

# Combine the subsets into a full data frame:

Comps = data.frame("Measure" = Norm_Subscales, "Pre_M" = Pre_Ms, "Pre_SD" = Pre_SDs, "Pre_t" = Pre_Ts, "Pre_df" = Pre_DFs, "Pre_p" = Pre_Ps, "Pre_d" = Pre_Ds, "Post_M" = Post_Ms, "Post_SD" = Post_SDs, "Post_t" = Post_Ts, "Post_df" = Post_DFs, "Post_p" = Post_Ps, "Post_d" = Post_Ds)

# Format the results table so that significant p-values will be bolded:

CompsB = Comps %>%
  mutate(
    Pre_p = cell_spec(Pre_p, bold = (ifelse(Pre_p < .05, "TRUE", "FALSE"))),
    Post_p = cell_spec(Post_p, bold = (ifelse(Post_p < .05, "TRUE", "FALSE")))
  )

# Create a table to display the results:

kable(CompsB, digits = 4,
      caption = "Table 94. Comparisons between norming values and self-report scores.",
      col.names = c("Measure", "M", "SD", "t", "df", "p", "d", "M", "SD", "t", "df", "p", "d"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = F, position = "center") %>%
  add_header_above(c(" " = 1, "Pre-Intervention" = 6, "Post-Intervention" = 6)) %>%
  group_rows("Perceived Stress Scale", 1, 1) %>%
  group_rows("Positive and Negative Affect Schedule", 2, 3) %>%
  group_rows("Brief Resilience Scale", 4, 4) %>%
  group_rows("Five Facet Mindfulness Questionnaire", 5, 9) %>%
  group_rows("Depression, Anxiety, and Stress Scale", 10, 12) %>%
  footnote(general = "For the post-intervention FFMQ and DASS scales, n = 44; for all other measures, n = 45.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 94. Comparisons between norming values and self-report scores.
Pre-Intervention
Post-Intervention
Measure M SD t df p d M SD t df p d
Perceived Stress Scale
41.24 9.01 -16.00 45.15 0 -2.41 36.22 7.35 -15.01 45.74 0 -2.26
Positive and Negative Affect Schedule
Positive Affect 31.49 7.08 0.47 50.83 0.6426 0.07 33.76 6.99 -1.62 51.01 0.2214 -0.25
Negative Affect 24.33 9.09 -3.49 48.09 0.0021 -0.54 20.93 7.25 -1.28 50.51 0.206 -0.20
Brief Resilience Scale
3.41 0.83 2.26 47.18 0.0571 0.35 3.63 0.76 0.64 47.85 0.524 0.10
Five Facet Mindfulness Questionnaire
Non-Reactivity 14.13 3.93 -1.09 50.61 0.2801 -0.17 15.82 3.60 -4.15 50.57 0.0003 -0.66
Observing 12.29 3.29 3.04 54.54 0.0073 0.48 13.64 2.87 0.48 56.37 0.6311 0.08
Awareness 14.33 4.05 -1.82 51.34 0.074 -0.29 15.82 3.29 -5.00 53.74 0 -0.80
Describing 17.60 3.65 -2.28 56.82 0.0266 -0.36 17.86 3.74 -2.65 54.61 0.0213 -0.42
Non-Judging 15.62 4.72 -2.11 50.43 0.0402 -0.33 17.52 3.98 -5.46 51.73 0 -0.87
Depression, Anxiety, and Stress Scale
Depression 9.47 9.77 -2.51 49.75 0.031 -0.39 5.64 5.46 0.07 61.59 0.9439 0.01
Anxiety 7.16 7.53 -2.74 49.66 0.0171 -0.43 5.23 5.00 -1.54 55.67 0.1295 -0.24
Stress 14.22 8.05 -4.89 51.37 0 -0.76 10.45 6.04 -2.40 55.84 0.0197 -0.38
Note: For the post-intervention FFMQ and DASS scales, n = 44; for all other measures, n = 45.

Compared to the norming populations considered, participants began the study with significantly higher scores on the PSS; PANAS-Negative; FFMQ-Describing and Non-Judging; and DASS-Depression, Anxiety, and Stress. Participants also began the study with significantly lower scores on the FFMQ-Observing. Following the completion of the mindfulness intervention, participants were no longer significantly different from the norming populations with respect to the PANAS-Negative, FFMQ-Observing, and the depression and anxiety subscales of the DASS, though they remained significantly higher on the PSS and DASS-Stress. Compared to the norming population, participants also ended the study with significantly higher scores on all subscales of the FFMQ but the FFMQ-Observing.

Conclusion

A comparison between norming data and self-report scores indicated that participants were initially experiencing higher levels of perceived stress and negative affect than is present in the general population. Additionally, participants began the study with relatively severe levels of symptoms associated with depression, anxiety, and stress. Compared to a norming population with symptoms of depression and anxiety, participants also initially had lower levels of observing and similar levels of all other mindfulness facets. Throughout the intervention, participants experienced significant increases in aspects related to mindful cognition that ultimately resulted in higher levels of almost all aspects of mindfulness compared to the symptomatic norming population. Participants also experienced significant decreases in stress, as measured by the PSS and DASS, yet these decreases did not lower participant PSS or DASS-Stress scores to the level of scores reported by the norming samples. Reductions in negative affect, depression, and anxiety did, however, bring their post-intervention PANAS-Negative, DASS-Depression, and DASS-Anxiety scores to be within the typical range.


Overall Conclusions

For experimental participants, the completion of the mindfulness intervention was associated with a decrease in stress, negative affect, and depression, as well as an increase in positive affect, non-reactivity, observing, acting with awareness, and non-judging; additionally, control participants experienced a decrease in stress and negative affect and an increase in non-judging and perceived job effectiveness following the program. These changes failed to decrease participants’ level of stress to levels experienced by the general population. Nevertheless, significant changes in both groups were observed, suggesting that the intervention was effective in enhancing participants’ mindfulness and improving their psychological well-being. Based on correlation and moderation analyses, most improvements seem to have been unrelated to the amount of program engagement (i.e. the amount of time spent meditating throughout the 30-day program) and length of previous meditation experience. It is, however, important to note that sample sizes in both groups were relatively small due to participant drop-out throughout the study. Consequently, though the significant findings and general trends within the data are promising, these results should be interpreted with caution and future work should consider ways in which drop-out can be minimized or mitigated.