Mindful Lawyer Pilot

Full Analysis

E. G. Nielsen

April 6, 2019

Note: This document was prepared 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. 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, participants completed an 8-week mindfulness program. At the end of this program, participants completed the self-report measures for a second time (T2). The completion of the mindfulness program was associated with significant decreases in perceived stress, negative affect, and symptoms associated with depression, anxiety, and stress, as well as increases in positive affect, resilience, and aspects of mindful cognition. Based on correlation and moderation analyses, improvements seem to be unrelated to the amount of program engagement (i.e. the amount of time spent meditating throughout the 8-week program) and length of previous meditation experience. It is, however, important to note that this study did not include a control group. Consequently, though the significant findings and general trends within the data are promising, these results should be interpreted with caution.


Introduction

This document outlines the analyses from the Mindful Lawyer Pilot. The purpose of this study was to investigate whether an 8-week mindfulness intervention would improve the well-being of a group of lawyers.

Participants were recruited from a virtual book club run by the National Association of Women Lawyers (NAWL). Book club members read Cho and Gifford’s The Anxious Lawyer (2016) and completed an accompanying 8-week mindfulness program created and directed by the authors. Members were also invited to participate in a research study. 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 completed the 8-week mindfulness program. Following the program, participants completed the above self-report measures for a second time.

If the intervention was effective in improving well-being and perceived job competency, analyses should reveal that, from T1 to T2, participants 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.


Analysis Prep

Import Data File

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

This file contains all of the data collected in this study.

Some notes regarding the names of variables:

  • ID denotes subject number.

  • T1 and T2 is an indication of whether participants did (1) or did not (0) complete the T1 and T2 surveys.

  • Late_T1 and Late_T2 indicates whether a participant’s T1 and T2 survey responses were completed more than 2.5 weeks after the corresponding survey launch (1) or if they were completed within that 2.5 week response period.

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

  • Age indicates each participant’s age in years.

  • Education indicates whether a participant’s highest level of education was less than high school (1), high school/GED (2), some college (3), a 2-year college diploma (4), a 3-4 year university degree (5), a master’s degree (6), a doctoral degree (7), or a professional degree (8).

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

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

  • Leadership is an indication 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 indication of a participant’s job title.

  • Functional_Area is an indication of whether a participant functions as a partner (1), non-partner attorney (2), or other (3).

  • Firm_Size is an indication of whether a participant works for an Am law 200 or similar (1), small firm (2), or boutique firm (3), or is a solo practitioner (4), in house counsel (5), or other (6).

  • Med, Yoga, and Tai is an indication 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 indication 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 is an indication of whether a participant currently practices meditation 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 other (5).

  • Med_Current_Other is an indication of how often each participant currently practices meditation 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 the Med_Current variable above).

  • Current_Tech is an indication of whether a participant uses 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.

  • Current_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 Current_Tech variable).

  • Med_Week is an indication of whether, during the 8-week meditation program, participants meditated 2 or more times each day (1), 1 time each day (2), 3-5 times each week (3), 1-2 times each week (4), less than once a week (5), or never (6).

  • Med_Week_Approx is an indication of the approximate number of times per week that each participant meditated for. Values for this variable were calculated as follows based on the values selected in Med_Week: option 1 selected = 14, option 2 selected = 7, option 3 selected = 4, option 4 selected = 1.5, option 5 selected = .5, option 6 selected = 0.

  • Mins_Med is an indication of whether, when they meditated during the 8-week meditation program, participants meditated for less than a minute (1), 1-2 minutes (2), 3-5 minutes (3), 6-8 minutes (4), 9-12 minutes (5), 13-15 minutes (6), more than 15 minutes (7)

  • Mins_Med_Other is an indication of how long each participant meditated for if they previously indicated that they meditated for more than 15 minutes each time they meditated (i.e. they had selected option 7 in response to the Mins_Med variable).

  • Mins_Med_Approx is an indication of the approximate time each participant meditated for (i.e. the middle of the range indicated in the Mins_Med and Mins_Med_Other variables).

  • Mins_Week is an index combining the Med_Week_Approx and Mins_Med_Approx variables to indicate how many minutes participants spent meditating per week throughout the 8-week meditation program.

  • Tech and Tech_Other refer to participants use of technology during the 8-week meditation program. These variables are coded the same as Current_Tech and Current_Tech_Other.

  • 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 or T2).

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 calculating Cohen's d:

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

# 7. For performing Wilcoxon Tests:

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

# 8. For performing correlations:

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

# 9. For replacing values with NA:

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

# 10 For performing t-tests using summary data:

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

Adjust Display Options

To make it easier to read our statistical 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 Time for All Participants

Our first set of analyses will look at changes in self-report scores across time for all participants who actively participated in the mindfulness program.

Subsetting Data

For these analyses, we will focus on participants who provided responses to both the T1 and T2 surveys and who actively participated in the mindfulness program. Before we begin, therefore, we will subset the data according to the T1, T2, and Med_Week variables.

NAWL1 = subset(AllData, T1 == "1" & T2 == "1" & Med_Week < "6")

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:

T1Frame1 = data.frame(matrix("T1", nrow = (nrow(NAWL1)), ncol = 1))

T2Frame1 = data.frame(matrix("T2", nrow = (nrow(NAWL1)), ncol = 1))

# T1 subset:

T1Data1 = data.frame(NAWL1$ID, T1Frame1, NAWL1$T1_PSS, NAWL1$T1_POS_PANAS, NAWL1$T1_NEG_PANAS, NAWL1$T1_BRS, NAWL1$T1_NR_FFMQ, NAWL1$T1_OB_FFMQ, NAWL1$T1_AA_FFMQ, NAWL1$T1_DS_FFMQ, NAWL1$T1_NJ_FFMQ, NAWL1$T1_D_DASS, NAWL1$T1_A_DASS, NAWL1$T1_S_DASS, NAWL1$T1_JEQ)

colnames(T1Data1) = c("Subject", "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:

T2Data1 = data.frame(NAWL1$ID, T2Frame1, NAWL1$T2_PSS, NAWL1$T2_POS_PANAS, NAWL1$T2_NEG_PANAS, NAWL1$T2_BRS, NAWL1$T2_NR_FFMQ, NAWL1$T2_OB_FFMQ, NAWL1$T2_AA_FFMQ, NAWL1$T2_DS_FFMQ, NAWL1$T2_NJ_FFMQ, NAWL1$T2_D_DASS, NAWL1$T2_A_DASS, NAWL1$T2_S_DASS, NAWL1$T2_JEQ)

colnames(T2Data1) = c("Subject", "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:

Long1 = rbind(T1Data1, T2Data1)

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:

Gender1 = ftable(NAWL1$Gender)

# Prior meditation experience:

Med_Prior1 = ftable(NAWL1$Med)

# Prior yoga experience:

Yoga_Prior1 = ftable(NAWL1$Yoga)

# Prior tai chi experience:

Tai_Prior1 = ftable(NAWL1$Tai)

# Combine these variables into a single data frame:

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

# Create a table to display the results:

kable(Demos1a, caption = "Table 1. Frequency-based demographic information (i.e. n) for those who participated in the intervention.",  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 1. Frequency-based demographic information (i.e. n) for those who participated in the intervention.
Gender
Meditation Exp.
Yoga Exp.
Tai Chi Exp.
Male Female Yes No Yes No Yes No
8 36 27 17 7 37 2 40

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

# Age

Age1 = summarySE(data = NAWL1, measurevar = "Age", conf.interval = .95)

# Weekly hours:

Hrs_Worked1 = summarySE(data = NAWL1, measurevar = "Hrs_Worked", conf.interval = .95, na.rm = TRUE)

# Mins/Week spent meditating during the program:

Mins_Week1 = summarySE(data = NAWL1, measurevar = "Mins_Week", conf.interval = .95)

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

colnames(Age1)[colnames(Age1) == "Age"] = "M"
colnames(Hrs_Worked1)[colnames(Hrs_Worked1) == "Hrs_Worked"] = "M"
colnames(Mins_Week1)[colnames(Mins_Week1) == "Mins_Week"] = "M"

# Combine these variables into a single data frame:

Demos1b = data.frame(rbind(Age1, Hrs_Worked1, Mins_Week1))

# Create a table to display the results:

kable(Demos1b[,2:6], digits = 4, caption = "Table 2. Demographic information for those who participated in the intervention.",  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 2. Demographic information for those who participated in the intervention.
n M SD SE CI
Age
44 46.2500 11.0540 1.6665 3.3607
Weekly Hours Worked
43 41.8605 11.2347 1.7133 3.4575
Meditation During the Program (Min/Week)
44 47.2614 59.7168 9.0026 18.1556

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
PSSDesc1 = summarySE(data = Long1, measurevar = "PSS", groupvars = "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 (PSS) for those who participated in the intervention.",
      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 3. Scores on the Perceived Stress Scale (PSS) for those who participated in the intervention.
Time n M SD SE CI
T1 44 45.3864 8.7317 1.3164 2.6547
T2 44 38.2273 8.7121 1.3134 2.6487

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 were measured in our sample. For all figures, time of testing (i.e. T1 and T2) 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. T1 scores are depicted in yellow and T2 scores are depicted in pink.

  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("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 those who participated in the intervention. Dots and whiskers represent means and standard errors, respectively."
PSSCap1 = paste0(strwrap(PSSCap1, width = 48), collapse = "\n")

# Create the plot:

PSSFig1 = (Long1 %>%
  ggplot(aes(Time, PSS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = PSSCap1) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light()) + theme(plot.caption = element_text(hjust = 0, size = 10))
PSSFig1

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_Mod1 = lm(Long1$PSS ~ Long1$Time) 

# Calculate residuals:

PSS_Res1 = resid(PSS_Mod1)

Visualize the residuals with a q-q plot:

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

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

Visualize the residuals with a histogram:

qplot(PSS_Res1, main = "Histogram of PSS Residuals", binwidth = 1)

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

Conduct a Shapiro-Wilk test:

PSS_Shap1 = shapiro.test(PSS_Res1)
PSS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res1
## W = 0.9901, p-value = 0.7513

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

Interpretation of Main Effects

Run the t-test.

PSS_T1 = t.test(data = Long1, PSS ~ Time, paired = TRUE)
PSS_T1
## 
##  Paired t-test
## 
## data:  PSS by Time
## t = 8.4568, df = 43, p-value = 0.0000000001079
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  5.451866 8.866316
## sample estimates:
## mean of the differences 
##                7.159091

Calculate Cohen’s d effect size.

PSS_d1 = cohen.d(data = Long1, PSS ~ Time, paired = TRUE)
PSS_d1
## 
## Cohen's d
## 
## d estimate: 1.274913 (large)
## 95 percent confidence interval:
##       inf       sup 
## 0.8100175 1.7398080

T2 scores (MT2 = 38.23, SDT2 = 8.71) on the PSS were found to be significantly lower than T1 scores (MT1 = 45.39, SDT1 = 8.73); t(43) = 8.46, p < .001, d = 1.27.

Positive and Negative Affect Schedule

Descriptive Statistics

# PANAS-Positive:

POS_PANAS1 = summarySE(data = Long1, measurevar = "POS_PANAS", groupvars = c("Time"), conf.interval = .95)

# PANAS-Negative:

NEG_PANAS1 = summarySE(data = Long1, measurevar = "NEG_PANAS", groupvars = c("Time"), conf.interval = .95)

# 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 4. Scores on the Positive and Negative Affect Schedule (PANAS) for those who participated in the intervention.",  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 4. Scores on the Positive and Negative Affect Schedule (PANAS) for those who participated in the intervention.
Time n M SD SE CI
Positive Affect
T1 44 29.4318 7.9428 1.1974 2.4148
T2 44 33.8636 6.5542 0.9881 1.9927
Negative Affect
T1 44 28.3636 8.3669 1.2614 2.5438
T2 44 23.5000 8.2279 1.2404 2.5015

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 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("Time" = POS_PANAS1$Time, "PANASPMean" = POS_PANAS1$M,
                         "PANASPMin" = PANASPMin1, "PANASPMax" = PANASPMax1)
  1. Create the positive affect plot.
# Create the plot:

PANASPFig1 = (Long1 %>%
  ggplot(aes(Time, POS_PANAS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-2, 55) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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:

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("Time" = NEG_PANAS1$Time, "PANASNMean" = NEG_PANAS1$M,
                         "PANASNMin" = PANASNMin1, "PANASNMax" = PANASNMax1)
  1. Create the negative affect plot.
# Create the plot:

PANASNFig1 = (Long1 %>%
  ggplot(aes(Time, NEG_PANAS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-2, 55) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  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 those who participated in the mindfulness program. 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 = .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_Mod1 = lm(Long1$POS_PANAS ~ Long1$Time) 

# Calculate residuals:

PANASP_Res1 = resid(PANASP_Mod1)
qqnorm(PANASP_Res1, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res1)

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

qplot(PANASP_Res1, main = "Histogram of PANAS-P Residuals", binwidth = 1)

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

PANASP_Shap1 = shapiro.test(PANASP_Res1)
PANASP_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res1
## W = 0.97882, p-value = 0.1593

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

Interpretation of Main Effects

Run the t-test.

PANASP_T1 = t.test(data = Long1, POS_PANAS ~ Time, paired = TRUE)
PANASP_T1
## 
##  Paired t-test
## 
## data:  POS_PANAS by Time
## t = -4.615, df = 43, p-value = 0.00003533
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.368469 -2.495167
## sample estimates:
## mean of the differences 
##               -4.431818

Calculate Cohen’s d effect size.

PANASP_d1 = cohen.d(data = Long1, POS_PANAS ~ Time, paired = TRUE)
PANASP_d1
## 
## Cohen's d
## 
## d estimate: -0.6957351 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -1.1321979 -0.2592723

T2 scores (MT2 = 33.86, SDT2 = 6.55) on the PANAS-Positive were found to be significantly higher than T1 scores (MT1 = 29.43, SDT1 = 7.94); t(43) = -4.61, p < .001, d = -0.7.

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_Mod1 = lm(Long1$NEG_PANAS ~ Long1$Time) 

# Calculate residuals:

PANASN_Res1 = resid(PANASN_Mod1)
qqnorm(PANASN_Res1, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res1)

The residuals appear to be slightly platykurtic.

qplot(PANASN_Res1, main = "Histogram of PANAS-N Residuals", binwidth = 1)

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

PANASN_Shap1 = shapiro.test(PANASN_Res1)
PANASN_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res1
## W = 0.97372, p-value = 0.07044

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

Interpretation of Main Effects

Run the t-test.

PANASN_T1 = t.test(data = Long1, NEG_PANAS ~ Time, paired = TRUE) 
PANASN_T1
## 
##  Paired t-test
## 
## data:  NEG_PANAS by Time
## t = 4.7126, df = 43, p-value = 0.00002579
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  2.782329 6.944943
## sample estimates:
## mean of the differences 
##                4.863636

Calculate Cohen’s d effect size.

PANASN_d1 = cohen.d(data = Long1, NEG_PANAS ~ Time, paired = TRUE)
PANASN_d1
## 
## Cohen's d
## 
## d estimate: 0.7104577 (medium)
## 95 percent confidence interval:
##       inf       sup 
## 0.2734627 1.1474527

T2 scores (MT2 = 23.5, SDT2 = 8.23) on the PANAS-Negative were found to be significantly lower than T1 scores (MT1 = 28.36, SDT1 = 8.37); t(43) = 4.71, p < .001, d = 0.71.

Brief Resilience Scale

Descriptive Statistics

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

# Create a table to display the results:

kable(BRSDesc1, digits = 4,
      caption = "Table 5. Scores on the Brief Resilience Scale (BRS) for those who participated in the mindfulness program.",
      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 5. Scores on the Brief Resilience Scale (BRS) for those who participated in the mindfulness program.
Time n M SD SE CI
T1 44 3.0492 0.9161 0.1381 0.2785
T2 44 3.3485 0.8999 0.1357 0.2736

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:

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("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 those who participated in the intervention. Dots and whiskers represent means and standard errors, respectively."
BRSCap1 = paste0(strwrap(BRSCap1, width = 50), collapse = "\n")

# Create the plot:

BRSFig1 = (Long1 %>%
  ggplot(aes(Time, BRS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = BRSCap1) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
BRSFig1

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_Mod1 = lm(Long1$BRS ~ Long1$Time) 

# Calculate residuals:

BRS_Res1 = resid(BRS_Mod1)
qqnorm(BRS_Res1, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res1)

The residuals appear to be slightly skewed.

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

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

BRS_Shap1 = shapiro.test(BRS_Res1)
BRS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res1
## W = 0.97791, p-value = 0.1379

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

Interpretation of Main Effects

Run the t-test.

BRS_T1 = t.test(data = Long1, BRS ~ Time, paired = TRUE)
BRS_T1
## 
##  Paired t-test
## 
## data:  BRS by Time
## t = -3.0465, df = 43, p-value = 0.003947
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.4973327 -0.1011522
## sample estimates:
## mean of the differences 
##              -0.2992424

Calculate Cohen’s d effect size.

BRS_d1 = cohen.d(data = Long1, BRS ~ Time, paired = TRUE)
BRS_d1
## 
## Cohen's d
## 
## d estimate: -0.4592756 (small)
## 95 percent confidence interval:
##         inf         sup 
## -0.88865575 -0.02989547

T2 scores (MT2 = 3.35, SDT2 = 0.9) on the BRS were found to be significantly higher than T1 scores (MT1 = 3.05, SDT1 = 0.92); t(43) = -3.05, p = 0.004, d = -0.46.

Five Facet Mindfulness Questionnaire

Descriptive Statistics

# FFMQ-Non-Reactivity:

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

# FFMQ-Observing:

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

# FFMQ-Acting with Awareness:

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

# FFMQ-Describing:

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

# FFMQ-Non-Judging:

NJ_FFMQ1 = summarySE(data = Long1, measurevar = "NJ_FFMQ", groupvars = c("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 6. Scores on the Five Facet Mindfulness Questionnaire (FFMQ) for those who participated in the intervention.",  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 6. Scores on the Five Facet Mindfulness Questionnaire (FFMQ) for those who participated in the intervention.
Time n M SD SE CI
Non-Reactivity
T1 44 11.2045 4.2840 0.6458 1.3025
T2 44 14.2955 3.7390 0.5637 1.1368
Observing
T1 44 12.6591 3.7723 0.5687 1.1469
T2 44 13.6364 3.5900 0.5412 1.0915
Acting with Awareness
T1 44 13.3409 4.3719 0.6591 1.3292
T2 44 16.2500 3.4515 0.5203 1.0493
Describing
T1 44 17.0000 3.6409 0.5489 1.1069
T2 44 18.7500 3.5707 0.5383 1.0856
Non-Judging
T1 44 12.9773 4.5058 0.6793 1.3699
T2 44 16.2273 4.3555 0.6566 1.3242

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("Time" = NR_FFMQ1$Time,
                    "FFMQNRMean" = NR_FFMQ1$M, "FFMQNRMin" = FFMQNRMin1,
                    "FFMQNRMax" = FFMQNRMax1)
  1. Create the non-reactivity plot.
# Create the plot:

FFMQNRFig1 = (Long1 %>%
  ggplot(aes(Time, NR_FFMQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("Time" = OB_FFMQ1$Time,
                    "FFMQOBMean" = OB_FFMQ1$M, "FFMQOBMin" = FFMQOBMin1,
                    "FFMQOBMax" = FFMQOBMax1)
  1. Create the observing plot.
# Create the plot:

FFMQOBFig1 = (Long1 %>%
  ggplot(aes(Time, OB_FFMQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("Time" = AA_FFMQ1$Time,
                    "FFMQAAMean" = AA_FFMQ1$M, "FFMQAAMin" = FFMQAAMin1,
                    "FFMQAAMax" = FFMQAAMax1)
  1. Create the awareness plot.
# Create the plot:

FFMQAAFig1 = (Long1 %>%
  ggplot(aes(Time, AA_FFMQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("Time" = DS_FFMQ1$Time,
                    "FFMQDSMean" = DS_FFMQ1$M, "FFMQDSMin" = FFMQDSMin1,
                    "FFMQDSMax" = FFMQDSMax1)
  1. Create the describing plot.
# Create the plot:

FFMQDSFig1 = (Long1 %>%
  ggplot(aes(Time, DS_FFMQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("Time" = NJ_FFMQ1$Time,
                    "FFMQNJMean" = NJ_FFMQ1$M, "FFMQNJMin" = FFMQNJMin1,
                    "FFMQNJMax" = FFMQNJMax1)
  1. Create the non-judging plot.
# Create the plot:

FFMQNJFig1 = (Long1 %>%
  ggplot(aes(Time, NJ_FFMQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 those who participated in the intervention. Dots and whiskers represent means and standard errors, respectively."
FFMQCap1 = paste0(strwrap(FFMQCap1, width = 107), 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 = .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_Mod1 = lm(Long1$NR_FFMQ ~ Long1$Time) 

# Calculate residuals:

FFMQNR_Res1 = resid(FFMQNR_Mod1)
qqnorm(FFMQNR_Res1, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res1)

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

qplot(FFMQNR_Res1, main = "Histogram of FFMQ-NR Residuals", binwidth = 1)

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

FFMQNR_Shap1 = shapiro.test(FFMQNR_Res1)
FFMQNR_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res1
## W = 0.97349, p-value = 0.06789

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

Interpretation of Main Effects

Run the t-test.

FFMQNR_T1 = t.test(data = Long1, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_T1
## 
##  Paired t-test
## 
## data:  NR_FFMQ by Time
## t = -5.653, df = 43, p-value = 0.000001166
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.193585 -1.988234
## sample estimates:
## mean of the differences 
##               -3.090909

Calculate Cohen’s d effect size.

FFMQNR_d1 = cohen.d(data = Long1, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_d1
## 
## Cohen's d
## 
## d estimate: -0.8522202 (large)
## 95 percent confidence interval:
##        inf        sup 
## -1.2948699 -0.4095704

T2 scores (MT2 = 14.3, SDT2 = 3.74) on the FFMQ-Non-Reactivity were found to be significantly higher than T1 scores (MT1 = 11.2, SDT1 = 4.28); t(43) = -5.65, p < .001, d = -0.85.

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_Mod1 = lm(Long1$OB_FFMQ ~ Long1$Time) 

# Calculate residuals:

FFMQOB_Res1 = resid(FFMQOB_Mod1)
qqnorm(FFMQOB_Res1, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res1)

The residuals appear to be slightly platykurtic.

qplot(FFMQOB_Res1, main = "Histogram of FFMQ-OB Residuals", binwidth = 1)

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

FFMQOB_Shap1 = shapiro.test(FFMQOB_Res1)
FFMQOB_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res1
## W = 0.9646, p-value = 0.01663

Based on an alpha level of .05, the assumption of normality is not met; W = 0.96, p = 0.02. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

FFMQOB_W1 = wilcoxsign_test(data = Long1, OB_FFMQ ~ Time | (as.factor(Subject)), distribution = "exact")
FFMQOB_W1
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -2.48, p-value = 0.01226
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQOB_r1 = WilcoxEff(abs(unname(FFMQOB_W1@statistic@teststatistic)), (length(Long1$OB_FFMQ)/2))
FFMQOB_r1
## [1] 0.3738731

T2 scores (MT2 = 13.64, SDT2 = 3.59) on the FFMQ-Observing were found to be significantly higher than T1 scores (MT1 = 12.66, SDT1 = 3.77); Z = -2.48, p = 0.01, r = 0.37.

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_Mod1 = lm(Long1$AA_FFMQ ~ Long1$Time) 

# Calculate residuals:

FFMQAA_Res1 = resid(FFMQAA_Mod1)
qqnorm(FFMQAA_Res1, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res1)

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

qplot(FFMQAA_Res1, main = "Histogram of FFMQ-AA Residuals", binwidth = 1)

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

FFMQAA_Shap1 = shapiro.test(FFMQAA_Res1)
FFMQAA_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res1
## W = 0.98776, p-value = 0.5836

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

Interpretation of Main Effects

Run the t-test.

FFMQAA_T1 = t.test(data = Long1, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_T1
## 
##  Paired t-test
## 
## data:  AA_FFMQ by Time
## t = -5.5297, df = 43, p-value = 0.000001759
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.970039 -1.848143
## sample estimates:
## mean of the differences 
##               -2.909091

Calculate Cohen’s d effect size.

FFMQAA_d1 = cohen.d(data = Long1, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_d1
## 
## Cohen's d
## 
## d estimate: -0.8336363 (large)
## 95 percent confidence interval:
##        inf        sup 
## -1.2754907 -0.3917819

T2 scores (MT2 = 16.25, SDT2 = 3.45) on the FFMQ-Awareness were found to be significantly higher than T1 scores (MT1 = 13.34, SDT1 = 4.37); t(43) = -5.53, p < .001, d = -0.83.

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_Mod1 = lm(Long1$DS_FFMQ ~ Long1$Time) 

# Calculate residuals:

FFMQDS_Res1 = resid(FFMQDS_Mod1)
qqnorm(FFMQDS_Res1, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res1)

The residuals appear to be slightly skewed.

qplot(FFMQDS_Res1, main = "Histogram of FFMQ-DS Residuals", binwidth = 1)

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

FFMQDS_Shap1 = shapiro.test(FFMQDS_Res1)
FFMQDS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res1
## W = 0.97386, p-value = 0.07207

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

Interpretation of Main Effects

Run the t-test.

FFMQDS_T1 = t.test(data = Long1, DS_FFMQ ~ Time, paired = TRUE)
FFMQDS_T1
## 
##  Paired t-test
## 
## data:  DS_FFMQ by Time
## t = -3.6034, df = 43, p-value = 0.00081
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.7294182 -0.7705818
## sample estimates:
## mean of the differences 
##                   -1.75

Calculate Cohen’s d effect size.

FFMQDS_d1 = cohen.d(data = Long1, DS_FFMQ ~ Time, paired = TRUE)
FFMQDS_d1
## 
## Cohen's d
## 
## d estimate: -0.5432293 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -0.9748044 -0.1116541

T2 scores (MT2 = 18.75, SDT2 = 3.57) on the FFMQ-Describing were found to be significantly higher than T1 scores (MT1 = 17, SDT1 = 3.64); t(43) = -3.6, p = 0.001, d = -0.54.

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_Mod1 = lm(Long1$NJ_FFMQ ~ Long1$Time) 

# Calculate residuals:

FFMQNJ_Res1 = resid(FFMQNJ_Mod1)
qqnorm(FFMQNJ_Res1, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res1)

The residuals appear to be slightly platykurtic.

qplot(FFMQNJ_Res1, 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_Shap1 = shapiro.test(FFMQNJ_Res1)
FFMQNJ_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res1
## W = 0.97479, p-value = 0.08363

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

Interpretation of Main Effects

Run the t-test.

FFMQNJ_T1 = t.test(data = Long1, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_T1
## 
##  Paired t-test
## 
## data:  NJ_FFMQ by Time
## t = -5.1474, df = 43, p-value = 0.000006238
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.523318 -1.976682
## sample estimates:
## mean of the differences 
##                   -3.25

Calculate Cohen’s d effect size

FFMQNJ_d1 = cohen.d(data = Long1, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_d1
## 
## Cohen's d
## 
## d estimate: -0.7759968 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -1.2154875 -0.3365061

T2 scores (MT2 = 16.23, SDT2 = 4.36) on the FFMQ-Non-Judging were found to be significantly higher than T1 scores (MT1 = 12.98, SDT1 = 4.51); t(43) = -5.15, p < .001, d = -0.78.

Depression, Anxiety, and Stress Scale

Descriptive Statistics

# DASS-Depression:

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

# DASS-Anxiety:

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

# DASS-Stress:

S_DASS1 = summarySE(data = Long1, measurevar = "S_DASS", groupvars = c("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 7. Scores on the Depression, Anxiety, and Stress Scale (DASS) for those who participated in the intervention.",  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 7. Scores on the Depression, Anxiety, and Stress Scale (DASS) for those who participated in the intervention.
Time n M SD SE CI
Depression
T1 44 11.9545 9.5527 1.4401 2.9043
T2 44 8.5909 8.3703 1.2619 2.5448
Anxiety
T1 44 9.0909 7.1976 1.0851 2.1883
T2 44 6.3636 5.1448 0.7756 1.5642
Stress
T1 44 19.5000 9.1104 1.3734 2.7698
T2 44 13.0909 8.9490 1.3491 2.7207

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("Time" = D_DASS1$Time,
                    "DASSDMean" = D_DASS1$M, "DASSDMin" = DASSDMin1,
                    "DASSDMax" = DASSDMax1)
  1. Create the depression plot.
# Create the plot:

DASSDFig1 = (Long1 %>%
  ggplot(aes(Time, D_DASS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 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("Time" = A_DASS1$Time,
                    "DASSAMean" = A_DASS1$M, "DASSAMin" = DASSAMin1,
                    "DASSAMax" = DASSAMax1)
  1. Create the anxiety plot.
# Create the plot:

DASSAFig1 = (Long1 %>%
  ggplot(aes(Time, A_DASS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 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("Time" = S_DASS1$Time,
                    "DASSSMean" = S_DASS1$M, "DASSSMin" = DASSSMin1,
                    "DASSSMax" = DASSSMax1)
  1. Create the stress plot.
# Create the plot:

DASSSFig1 = (Long1 %>%
  ggplot(aes(Time, S_DASS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  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 those who participated in the intervention. Dots and whiskers represent means and standard errors, respectively."
DASSCap1 = paste0(strwrap(DASSCap1, width = 110), collapse = "\n")
  1. Define the figure layout
DASSLayout1 = rbind(c("DASSAFig1", "DASSDFig1"),
                      c("DASSSFig1", "SharedLeg"))
  1. Display the figure.
DASSFig1 = grid.arrange(DASSDFig1 + theme(legend.position = "hidden"), DASSAFig1 + theme(legend.position = "hidden"), DASSSFig1 + theme(legend.position = "hidden"), SharedLeg, layout_matrix = DASSLayout1, bottom = textGrob(DASSCap1, hjust = 0, x = .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_Mod1 = lm(Long1$D_DASS ~ Long1$Time) 

# Calculate residuals:

DASSD_Res1 = resid(DASSD_Mod1)
qqnorm(DASSD_Res1, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res1)

The residuals appear to be slightly skewed to the right.

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

The residuals appear to be slightly skewed to the right.

DASSD_Shap1 = shapiro.test(DASSD_Res1)
DASSD_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res1
## W = 0.88654, p-value = 0.000001337

Based on an alpha level of .05, the assumption of normality is not met; W = 0.89, 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_W1 = wilcoxsign_test(data = Long1, D_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSD_W1
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 2.9244, p-value = 0.002847
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_r1 = WilcoxEff(abs(unname(DASSD_W1@statistic@teststatistic)), (length(Long1$D_DASS)/2))
DASSD_r1
## [1] 0.4408634

T2 scores (MT2 = 8.59, SDT2 = 8.37) on the DASS-Depression were found to be significantly lower than T1 scores (MT1 = 11.95, SDT1 = 9.55); Z = 2.92, p = 0.003, r = 0.44.

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_Mod1 = lm(Long1$A_DASS ~ Long1$Time) 

# Calculate residuals:

DASSA_Res1 = resid(DASSA_Mod1)
qqnorm(DASSA_Res1, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res1)

The residuals appear to be slightly skewed to the right.

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

The residuals appear to be slightly skewed to the right.

DASSA_Shap1 = shapiro.test(DASSA_Res1)
DASSA_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res1
## W = 0.91728, p-value = 0.00003192

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.

Interpretation of Main Effects

DASSA_W1 = wilcoxsign_test(data = Long1, A_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSA_W1
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 2.8607, p-value = 0.003575
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSA_r1 = WilcoxEff(abs(unname(DASSA_W1@statistic@teststatistic)), (length(Long1$A_DASS)/2))
DASSA_r1
## [1] 0.43126

T2 scores (MT2 = 6.36, SDT2 = 5.14) on the DASS-Anxiety were found to be significantly lower than T1 scores (MT1 = 9.09, SDT1 = 7.2); Z = 2.86, p = 0.004, r = 0.43.

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_Mod1 = lm(Long1$S_DASS ~ Long1$Time) 

# Calculate residuals:

DASSS_Res1 = resid(DASSS_Mod1)
qqnorm(DASSS_Res1, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res1)

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

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

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

DASSS_Shap1 = shapiro.test(DASSS_Res1)
DASSS_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res1
## W = 0.98342, p-value = 0.3237

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

Interpretation of Main Effects

Run the t-test.

DASSS_T1 = t.test(data = Long1, S_DASS ~ Time, paired = TRUE)
DASSS_T1
## 
##  Paired t-test
## 
## data:  S_DASS by Time
## t = 5.7329, df = 43, p-value = 0.0000008933
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  4.154534 8.663648
## sample estimates:
## mean of the differences 
##                6.409091

Calculate Cohen’s d effect size.

DASSS_d1 = cohen.d(data = Long1, S_DASS ~ Time, paired = TRUE)
DASSS_d1
## 
## Cohen's d
## 
## d estimate: 0.8642681 (large)
## 95 percent confidence interval:
##       inf       sup 
## 0.4210941 1.3074420

T2 scores (MT2 = 13.09, SDT2 = 8.95) on the DASS-Stress were found to be significantly lower than T1 scores (MT1 = 19.5, SDT1 = 9.11); t(43) = 5.73, p < .001, d = 0.86.

Job Effectiveness Questionnaire

Descriptive Statistics

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

# Create a table to display the results:

kable(JEQDesc1, digits = 4,
      caption = "Table 8. Scores on the Job Effectiveness Questionnaire (JEQ) for those who participated in the intervention.",
      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 8. Scores on the Job Effectiveness Questionnaire (JEQ) for those who participated in the intervention.
Time n M SD SE CI
T1 44 5.1076 0.7709 0.1162 0.2344
T2 44 5.4290 0.8026 0.1210 0.2440

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("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 those who participated in the intervention. Dots and whiskers represent means and standard errors, respectively."
JEQCap1 = paste0(strwrap(JEQCap1, width = 55), collapse = "\n")

# Create the plot:

JEQFig1 = (Long1 %>%
  ggplot(aes(Time, JEQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = JEQCap1) +

  # Define variable colours and theme:

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

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_Mod1 = lm(Long1$JEQ ~ Long1$Time) 

# Calculate residuals:

JEQ_Res1 = resid(JEQ_Mod1)
qqnorm(JEQ_Res1, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res1)

The residuals appear to slightly skewed to the left.

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

The residuals appear to be slightly skewed to the left.

JEQ_Shap1 = shapiro.test(JEQ_Res1)
JEQ_Shap1
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res1
## W = 0.95368, p-value = 0.003254

Based on an alpha level of .05, the assumption of normality is not met; W = 0.95, p = 0.003. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

JEQ_W1 = wilcoxsign_test(data = Long1, JEQ ~ Time | (as.factor(Subject)), distribution = "exact")
JEQ_W1
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -3.5482, p-value = 0.0002306
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

JEQ_r1 = WilcoxEff(abs(unname(JEQ_W1@statistic@teststatistic)), (length(Long1$JEQ)/2))
JEQ_r1
## [1] 0.5349055

T2 scores (MT2 = 5.43, SDT2 = 0.8) on the JEQ were found to be significantly higher than T1 scores (MT1 = 5.11, SDT1 = 0.77); Z = -3.55, p < .001, r = 0.53.

Summary of Results

The following results were found to be statistically significant:

  • Perceived Stress Scale

    • a decrease in perceived stress from T1 to T2 (p < .001)
  • Positive and Negative Affect Schedule

    • an increase in positive affect from T1 to T2 (p < .001)
    • a decrease in negative affect from T1 to T2 (p < .001)
  • Brief Resilience Scale

    • an increase in psychological resilience from T1 to T2 (p = 0.004)
  • Five Facet Mindfulness Questionnaire

    • an increase in non-reactivity, observing, awareness, describing, and non-judging from T1 to T2 (p < .001, p = 0.01, p < .001, p = 0.001, and p < .001, respectively)
  • Depression, Anxiety, and Stress Scale

    • a decrease in symptoms associated with depression, anxiety, and stress from T1 to T2 (p = 0.003, p = 0.004, and p < .001, respectively)
  • Job Effectiveness Questionnaire

    • an increase in perceived job competency from T1 to T2 (p < .001)

Conclusion

Initial analyses revealed significant changes in all of the variables considered. Additionally, all changes were found to occur in the predicted direction (e.g. a decrease in things like stress and depression and an increase in things like positive affect and mindful cognition). Consequently, the mindfulness intervention seems to have been effective in improving well-being. A potential issue with these results, however, is that some participants completed the surveys late (i.e. weeks into/after the intervention) meaning that, for some, T1 (T2) responses are not truly reflective of a baseline (the intervention). The next set of analyses will address this issue by replicating this first set of analyses with only those who completed both surveys within 2.5 weeks of the beginning of each response period.


2. Changes Across Time for “On-Time” Participants

Our second set of analyses will look at changes in self-report scores across time for participants who actively participated in the mindfulness program and completed both surveys within the 2.5 week response period.

Subsetting Data

For these analyses, we will focus on participants who provided responses to both the T1 and T2 surveys, who responded to both surveys within the 2.5 week response periods, and who actively participated in the meditation program. Before we begin, therefore, we will subset the first subset (i.e. “NAWL1”) according to the Late_T1 and Late_T2 variables.

NAWL2 = subset(NAWL1, Late_T1 == "0" & Late_T2 == "0")

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:

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

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

# T1 subset:

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

colnames(T1Data2) = c("Subject", "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(NAWL2$ID, T2Frame2, NAWL2$T2_PSS, NAWL2$T2_POS_PANAS, NAWL2$T2_NEG_PANAS, NAWL2$T2_BRS, NAWL2$T2_NR_FFMQ, NAWL2$T2_OB_FFMQ, NAWL2$T2_AA_FFMQ, NAWL2$T2_DS_FFMQ, NAWL2$T2_NJ_FFMQ, NAWL2$T2_D_DASS, NAWL2$T2_A_DASS, NAWL2$T2_S_DASS, NAWL2$T2_JEQ)

colnames(T2Data2) = c("Subject", "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 = ftable(NAWL2$Gender)

# Prior meditation experience:

Med_Prior2 = ftable(NAWL2$Med)

# Prior yoga experience:

Yoga_Prior2 = ftable(NAWL2$Yoga)

# Prior tai chi experience:

Tai_Prior2 = ftable(NAWL2$Tai)

# 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 9. Frequency-based demographic information (i.e. n) for 'on-time' participants.",  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 9. Frequency-based demographic information (i.e. n) for ‘on-time’ participants.
Gender
Meditation Exp.
Yoga Exp.
Tai Chi Exp.
Male Female Yes No Yes No Yes No
5 30 21 14 7 28 2 32

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

# Age

Age2 = summarySE(data = NAWL2, measurevar = "Age", conf.interval = .95)

# Weekly hours:

Hrs_Worked2 = summarySE(data = NAWL2, measurevar = "Hrs_Worked", conf.interval = .95, na.rm = TRUE)

# Mins/Week spent meditating during the program:

Mins_Week2 = summarySE(data = NAWL2, measurevar = "Mins_Week", conf.interval = .95)

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

colnames(Age2)[colnames(Age2) == "Age"] = "M"
colnames(Hrs_Worked2)[colnames(Hrs_Worked2) == "Hrs_Worked"] = "M"
colnames(Mins_Week2)[colnames(Mins_Week2) == "Mins_Week"] = "M"

# Combine these variables into a single data frame:

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

# Create a table to display the results:

kable(Demos2b[,2:6], digits = 4, caption = "Table 10. Demographic information for 'on-time' participants.",  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 10. Demographic information for ‘on-time’ participants.
n M SD SE CI
Age
35 44.3429 10.5606 1.7851 3.6277
Weekly Hours Worked
34 41.7647 11.0702 1.8985 3.8626
Meditation During the Program (Min/Week)
35 47.6643 64.6546 10.9286 22.2096

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
PSSDesc2 = summarySE(data = Long2, measurevar = "PSS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(PSSDesc2, digits = 4,
      caption = "Table 11. Scores on the Perceived Stress Scale (PSS) for 'on-time' participants.",
      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 11. Scores on the Perceived Stress Scale (PSS) for ‘on-time’ participants.
Time n M SD SE CI
T1 35 45.8857 7.7679 1.3130 2.6683
T2 35 38.6286 8.4474 1.4279 2.9018

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("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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
PSSCap2 = paste0(strwrap(PSSCap2, width = 51), collapse = "\n")

# Create the plot:

PSSFig2 = (Long2 %>%
  ggplot(aes(Time, PSS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = PSSCap2) +

  # Define variable colours and theme:

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

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_Mod2 = lm(Long2$PSS ~ Long2$Time) 

# Calculate residuals:

PSS_Res2 = resid(PSS_Mod2)

Visualize the residuals with a q-q plot:

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

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

Visualize the residuals with a histogram.

qplot(PSS_Res2, main = "Histogram of PSS Residuals", binwidth = 1)

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

Conduct a Shapiro-Wilk test:

PSS_Shap2 = shapiro.test(PSS_Res2)
PSS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PSS_Res2
## W = 0.99049, p-value = 0.8778

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

Interpretation of Main Effects

Run the t-test.

PSS_T2 = t.test(data = Long2, PSS ~ Time, paired = TRUE)
PSS_T2
## 
##  Paired t-test
## 
## data:  PSS by Time
## t = 7.5186, df = 34, p-value = 0.000000009955
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  5.295560 9.218726
## sample estimates:
## mean of the differences 
##                7.257143

Calculate Cohen’s d effect size.

PSS_d2 = cohen.d(data = Long2, PSS ~ Time, paired = TRUE)
PSS_d2
## 
## Cohen's d
## 
## d estimate: 1.270869 (large)
## 95 percent confidence interval:
##       inf       sup 
## 0.7479219 1.7938168

T2 scores (MT2 = 38.63, SDT2 = 8.45) on the PSS were found to be significantly lower than T1 scores (MT1 = 45.89, SDT1 = 7.77); t(34) = 7.52, p < .001, d = 1.27.

Positive and Negative Affect Schedule

Descriptive Statistics

# PANAS-Positive:

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

# PANAS-Negative:

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

# 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 12. Scores on the Positive and Negative Affect Schedule (PANAS) for 'on-time' participants.",  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 12. Scores on the Positive and Negative Affect Schedule (PANAS) for ‘on-time’ participants.
Time n M SD SE CI
Positive Affect
T1 35 29.2571 7.5823 1.2816 2.6046
T2 35 33.7143 6.0613 1.0245 2.0821
Negative Affect
T1 35 28.8286 7.7478 1.3096 2.6615
T2 35 24.0000 8.3420 1.4100 2.8656

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 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:

PANASPPlot2 = data.frame("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .7) +

  # Add in dots and lines:

  geom_pointrange(data = PANASPPlot2,
    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(-3, 55) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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:

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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 55) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10), legend.position = "none")
  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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
PANASCap2 = paste0(strwrap(PANASCap2, width = 100), 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 = .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_Mod2 = lm(Long2$POS_PANAS ~ Long2$Time) 

# Calculate residuals:

PANASP_Res2 = resid(PANASP_Mod2)
qqnorm(PANASP_Res2, main = "Q-Q Plot of PANAS-P Residuals")
qqline(PANASP_Res2)

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

qplot(PANASP_Res2, main = "Histogram of PANAS-P Residuals", binwidth = 1)

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

PANASP_Shap2 = shapiro.test(PANASP_Res2)
PANASP_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASP_Res2
## W = 0.98573, p-value = 0.6112

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

Interpretation of Main Effects

Run the t-test.

PANASP_T2 = t.test(data = Long2, POS_PANAS ~ Time, paired = TRUE)
PANASP_T2
## 
##  Paired t-test
## 
## data:  POS_PANAS by Time
## t = -3.8945, df = 34, p-value = 0.0004377
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -6.782993 -2.131293
## sample estimates:
## mean of the differences 
##               -4.457143

Calculate Cohen’s d effect size.

PANASP_d2 = cohen.d(data = Long2, POS_PANAS ~ Time, paired = TRUE)
PANASP_d2
## 
## Cohen's d
## 
## d estimate: -0.6582892 (medium)
## 95 percent confidence interval:
##       inf       sup 
## -1.148046 -0.168532

T2 scores (MT2 = 33.71, SDT2 = 6.06) on the PANAS-Positive were found to be significantly higher than T1 scores (MT1 = 29.26, SDT1 = 7.58); t(34) = -3.89, p < .001, d = -0.66.

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_Mod2 = lm(Long2$NEG_PANAS ~ Long2$Time) 

# Calculate residuals:

PANASN_Res2 = resid(PANASN_Mod2)
qqnorm(PANASN_Res2, main = "Q-Q Plot of PANAS-N Residuals")
qqline(PANASN_Res2)

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

qplot(PANASN_Res2, main = "Histogram of PANAS-N Residuals", binwidth = 1)

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

PANASN_Shap2 = shapiro.test(PANASN_Res2)
PANASN_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  PANASN_Res2
## W = 0.98503, p-value = 0.5708

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

Interpretation of Main Effects

Run the t-test.

PANASN_T2 = t.test(data = Long2, NEG_PANAS ~ Time, paired = TRUE)
PANASN_T2
## 
##  Paired t-test
## 
## data:  NEG_PANAS by Time
## t = 4.3519, df = 34, p-value = 0.0001168
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  2.573725 7.083418
## sample estimates:
## mean of the differences 
##                4.828571

Calculate Cohen’s d effect size.

PANASN_d2 = cohen.d(data = Long2, NEG_PANAS ~ Time, paired = TRUE)
PANASN_d2
## 
## Cohen's d
## 
## d estimate: 0.7356031 (medium)
## 95 percent confidence interval:
##       inf       sup 
## 0.2427265 1.2284796

T2 scores (MT2 = 24, SDT2 = 8.34) on the PANAS-Negative were found to be significantly higher than T1 scores (MT1 = 28.83, SDT1 = 7.75); t(34) = 4.35, p < .001, d = 0.74.

Brief Resilience Scale

Descriptive Statistics

# Calculate summary statistics
BRSDesc2 = summarySE(data = Long2, measurevar = "BRS", groupvars = "Time", conf.interval = .95, na.rm = TRUE)

# Create a table to display the results:

kable(BRSDesc2, digits = 4,
      caption = "Table 13. Scores on the Brief Resilience Scale (BRS) for 'on-time' participants.",
      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 13. Scores on the Brief Resilience Scale (BRS) for ‘on-time’ participants.
Time n M SD SE CI
T1 35 3.000 0.8575 0.1449 0.2946
T2 35 3.281 0.8991 0.1520 0.3089

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:

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("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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
BRSCap2 = paste0(strwrap(BRSCap2, width = 53), collapse = "\n")

# Create the plot:

BRSFig2 = (Long2 %>%
  ggplot(aes(Time, BRS, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = BRSCap2) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
BRSFig2

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_Mod2 = lm(Long2$BRS ~ Long2$Time) 

# Calculate residuals:

BRS_Res2 = resid(BRS_Mod2)
qqnorm(BRS_Res2, main = "Q-Q Plot of BRS Residuals")
qqline(BRS_Res2)

The residuals appear to be slightly skewed to the left.

qplot(BRS_Res2, main = "Histogram of BRS Residuals", binwidth = .25)

The residuals appear to be slightly skewed to the left.

BRS_Shap2 = shapiro.test(BRS_Res2)
BRS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  BRS_Res2
## W = 0.95589, p-value = 0.01493

Based on an alpha level of .05, the assumption of normality is not met; W = 0.96, 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

BRS_W2 = wilcoxsign_test(data = Long2, BRS ~ Time | (as.factor(Subject)), distribution = "exact")
BRS_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -2.313, p-value = 0.0196
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

BRS_r2 = WilcoxEff(abs(unname(BRS_W2@statistic@teststatistic)), (length(Long2$BRS)/2))
BRS_r2
## [1] 0.3909734

T2 scores (MT2 = 3.28, SDT2 = 0.9) on the BRS were found to be significantly higher than T1 scores (MT1 = 3, SDT1 = 0.86); Z = -2.31, p = 0.02, r = 0.39.

Five Facet Mindfulness Questionnaire

Descriptive Statistics

# FFMQ-Non-Reactivity:

NR_FFMQ2 = summarySE(data = Long2, measurevar = "NR_FFMQ", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Observing:

OB_FFMQ2 = summarySE(data = Long2, measurevar = "OB_FFMQ", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Acting with Awareness:

AA_FFMQ2 = summarySE(data = Long2, measurevar = "AA_FFMQ", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Describing:

DS_FFMQ2 = summarySE(data = Long2, measurevar = "DS_FFMQ", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# FFMQ-Non-Judging:

NJ_FFMQ2 = summarySE(data = Long2, measurevar = "NJ_FFMQ", groupvars = c("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 14. Scores on the Five Facet Mindfulness Questionnaire (FFMQ) for 'on-time' participants.",  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 14. Scores on the Five Facet Mindfulness Questionnaire (FFMQ) for ‘on-time’ participants.
Time n M SD SE CI
Non-Reactivity
T1 35 10.4571 3.7522 0.6342 1.2889
T2 35 13.8571 3.5986 0.6083 1.2361
Observing
T1 35 12.4571 3.8067 0.6434 1.3076
T2 35 13.5429 3.7522 0.6342 1.2889
Acting with Awareness
T1 35 13.3143 4.1215 0.6967 1.4158
T2 35 16.2857 3.6102 0.6102 1.2402
Describing
T1 35 16.7143 3.4859 0.5892 1.1974
T2 35 18.5714 3.6484 0.6167 1.2533
Non-Judging
T1 35 12.9143 4.5914 0.7761 1.5772
T2 35 16.1429 4.4599 0.7539 1.5320

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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-3, 30) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
FFMQCap2 = paste0(strwrap(FFMQCap2, width = 107), 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 = .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_Mod2 = lm(Long2$NR_FFMQ ~ Long2$Time) 

# Calculate residuals:

FFMQNR_Res2 = resid(FFMQNR_Mod2)
qqnorm(FFMQNR_Res2, main = "Q-Q Plot of FFMQ-NR Residuals")
qqline(FFMQNR_Res2)

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

qplot(FFMQNR_Res2, main = "Histogram of FFMQ-NR Residuals", binwidth = 1)

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

FFMQNR_Shap2 = shapiro.test(FFMQNR_Res2)
FFMQNR_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNR_Res2
## W = 0.98568, p-value = 0.608

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

Interpretation of Main Effects

Run the t-test.

FFMQNR_T2 = t.test(data = Long2, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_T2
## 
##  Paired t-test
## 
## data:  NR_FFMQ by Time
## t = -5.4078, df = 34, p-value = 0.000005072
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.677721 -2.122279
## sample estimates:
## mean of the differences 
##                    -3.4

Calculate Cohen’s d effect size.

FFMQNR_d2 = cohen.d(data = Long2, NR_FFMQ ~ Time, paired = TRUE)
FFMQNR_d2
## 
## Cohen's d
## 
## d estimate: -0.9140811 (large)
## 95 percent confidence interval:
##        inf        sup 
## -1.4153810 -0.4127812

T2 scores (MT2 = 13.86, SDT2 = 3.6) on the FFMQ-Non-Reactivity were found to be significantly higher than T1 scores (MT1 = 10.46, SDT1 = 3.75); t(34) = -5.41, p < .001, d = -0.91.

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_Mod2 = lm(Long2$OB_FFMQ ~ Long2$Time) 

# Calculate residuals:

FFMQOB_Res2 = resid(FFMQOB_Mod2)
qqnorm(FFMQOB_Res2, main = "Q-Q Plot of FFMQ-OB Residuals")
qqline(FFMQOB_Res2)

The residuals appear to be slightly platykurtic.

qplot(FFMQOB_Res2, main = "Histogram of FFMQ-OB Residuals", binwidth = 1)

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

FFMQOB_Shap2 = shapiro.test(FFMQOB_Res2)
FFMQOB_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQOB_Res2
## W = 0.96206, p-value = 0.03255

Based on an alpha level of .05, the assumption of normality is not met; W = 0.96, 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

FFMQOB_W2 = wilcoxsign_test(data = Long2, OB_FFMQ ~ Time | (as.factor(Subject)), distribution = "exact")
FFMQOB_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -2.8144, p-value = 0.004042
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQOB_r2 = WilcoxEff(abs(unname(FFMQOB_W2@statistic@teststatistic)), (length(Long2$OB_FFMQ)/2))
FFMQOB_r2
## [1] 0.4757228

T2 scores (MT2 = 13.54, SDT2 = 3.75) on the FFMQ-Observing were found to be significantly higher than T1 scores (MT1 = 12.46, SDT1 = 3.81); Z = -2.81, p = 0.004, r = 0.48.

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_Mod2 = lm(Long2$AA_FFMQ ~ Long2$Time) 

# Calculate residuals:

FFMQAA_Res2 = resid(FFMQAA_Mod2)
qqnorm(FFMQAA_Res2, main = "Q-Q Plot of FFMQ-AA Residuals")
qqline(FFMQAA_Res2)

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

qplot(FFMQAA_Res2, main = "Histogram of FFMQ-AA Residuals", binwidth = 1)

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

FFMQAA_Shap2 = shapiro.test(FFMQAA_Res2)
FFMQAA_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQAA_Res2
## W = 0.98058, p-value = 0.3489

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

Interpretation of Main Effects

Run the t-test.

FFMQAA_T2 = t.test(data = Long2, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_T2
## 
##  Paired t-test
## 
## data:  AA_FFMQ by Time
## t = -4.9036, df = 34, p-value = 0.0000229
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.202913 -1.739944
## sample estimates:
## mean of the differences 
##               -2.971429

Calculate Cohen’s d effect size.

FFMQAA_d2 = cohen.d(data = Long2, AA_FFMQ ~ Time, paired = TRUE)
FFMQAA_d2
## 
## Cohen's d
## 
## d estimate: -0.8288544 (large)
## 95 percent confidence interval:
##        inf        sup 
## -1.3259224 -0.3317863

T2 scores (MT2 = 16.29, SDT2 = 3.61) on the FFMQ-Awareness were found to be significantly higher than T1 scores (MT1 = 13.31, SDT1 = 4.12); t(34) = -4.9, p < .001, d = -0.83.

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_Mod2 = lm(Long2$DS_FFMQ ~ Long2$Time) 

# Calculate residuals:

FFMQDS_Res2 = resid(FFMQDS_Mod2)
qqnorm(FFMQDS_Res2, main = "Q-Q Plot of FFMQ-DS Residuals")
qqline(FFMQDS_Res2)

The residuals appear to be slightly skewed to the left.

qplot(FFMQDS_Res2, main = "Histogram of FFMQ-DS Residuals", binwidth = 1)

The residuals appear to be slightly skewed to the left.

FFMQDS_Shap2 = shapiro.test(FFMQDS_Res2)
FFMQDS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQDS_Res2
## W = 0.9639, p-value = 0.04126

Based on an alpha level of .05, the assumption of normality is not met; W = 0.96, p = 0.04. As a result, rather than perform a t-test, we will use the non-parametric Wilcoxon Signed-Rank Test.

Interpretation of Main Effects

FFMQDS_W2 = wilcoxsign_test(data = Long2, DS_FFMQ ~ Time | (as.factor(Subject)), distribution = "exact")
FFMQDS_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -3.3059, p-value = 0.0006167
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

FFMQDS_r2 = WilcoxEff(abs(unname(FFMQDS_W2@statistic@teststatistic)), (length(Long2$DS_FFMQ)/2))
FFMQDS_r2
## [1] 0.5588043

T2 scores (MT2 = 18.57, SDT2 = 3.65) on the FFMQ-Describing were found to be significantly higher than T1 scores (MT1 = 16.71, SDT1 = 3.49); Z = -3.31, p = 0.001, r = 0.56.

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_Mod2 = lm(Long2$NJ_FFMQ ~ Long2$Time) 

# Calculate residuals:

FFMQNJ_Res2 = resid(FFMQNJ_Mod2)
qqnorm(FFMQNJ_Res2, main = "Q-Q Plot of FFMQ-NJ Residuals")
qqline(FFMQNJ_Res2)

The residuals appear to be slightly skewed.

qplot(FFMQNJ_Res2, main = "Histogram of FFMQ-NJ Residuals", binwidth = 1)

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

FFMQNJ_Shap2 = shapiro.test(FFMQNJ_Res2)
FFMQNJ_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  FFMQNJ_Res2
## W = 0.9742, p-value = 0.1572

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

Interpretation of Main Effects

Run the t-test.

FFMQNJ_T2 = t.test(data = Long2, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_T2
## 
##  Paired t-test
## 
## data:  NJ_FFMQ by Time
## t = -4.5923, df = 34, p-value = 0.00005765
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -4.657315 -1.799827
## sample estimates:
## mean of the differences 
##               -3.228571

Calculate Cohen’s d effect size.

FFMQNJ_d2 = cohen.d(data = Long2, NJ_FFMQ ~ Time, paired = TRUE)
FFMQNJ_d2
## 
## Cohen's d
## 
## d estimate: -0.7762434 (medium)
## 95 percent confidence interval:
##        inf        sup 
## -1.2708895 -0.2815972

T2 scores (MT2 = 16.14, SDT2 = 4.46) on the FFMQ-Non-Judging were found to be significantly higher than T1 scores (MT1 = 12.91, SDT1 = 4.59); t(34) = -4.59, p < .001, d = -0.78.

Depression, Anxiety, and Stress Scale

Descriptive Statistics

# DASS-Depression:

D_DASS2 = summarySE(data = Long2, measurevar = "D_DASS", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Anxiety:

A_DASS2 = summarySE(data = Long2, measurevar = "A_DASS", groupvars = c("Time"), conf.interval = .95, na.rm = TRUE)

# DASS-Stress:

S_DASS2 = summarySE(data = Long2, measurevar = "S_DASS", groupvars = c("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 15. Scores on the Depression, Anxiety, and Stress Scale (DASS) for 'on-time' participants.",  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 15. Scores on the Depression, Anxiety, and Stress Scale (DASS) for ‘on-time’ participants.
Time n M SD SE CI
Depression
T1 35 11.7714 9.7108 1.6414 3.3358
T2 35 8.2857 8.3051 1.4038 2.8529
Anxiety
T1 35 9.4286 7.7242 1.3056 2.6534
T2 35 6.5714 5.5428 0.9369 1.9040
Stress
T1 35 19.7143 9.0637 1.5321 3.1135
T2 35 14.1714 8.6551 1.4630 2.9731

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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  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 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("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 = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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(-13, 50) +

  # Add labels:

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

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light()) + theme(plot.title = element_text(hjust = 0, size = 10))
  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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
DASSCap2 = paste0(strwrap(DASSCap2, width = 105), collapse = "\n")
  1. Define the figure layout
DASSLayout2 = rbind(c("DASSAFig2", "DASSDFig2"),
                      c("DASSSFig2", "SharedLeg"))
  1. Display the figure.
DASSFig2 = grid.arrange(DASSDFig2 + theme(legend.position = "hidden"), DASSAFig2 + theme(legend.position = "hidden"), DASSSFig2 + theme(legend.position = "hidden"), SharedLeg, layout_matrix = DASSLayout2, bottom = textGrob(DASSCap2, hjust = 0, x = .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_Mod2 = lm(Long2$D_DASS ~ Long2$Time) 

# Calculate residuals:

DASSD_Res2 = resid(DASSD_Mod2)
qqnorm(DASSD_Res2, main = "Q-Q Plot of DASS-D Residuals")
qqline(DASSD_Res2)

The residuals appear to be slightly skewed to the right.

qplot(DASSD_Res2, main = "Histogram of DASS-D Residuals", binwidth = 1.25)

The residuals appear to be slightly skewed to the right.

DASSD_Shap2 = shapiro.test(DASSD_Res2)
DASSD_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSD_Res2
## W = 0.8719, p-value = 0.000003553

Based on an alpha level of .05, the assumption of normality is not met; W = 0.87, 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_W2 = wilcoxsign_test(data = Long2, D_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSD_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 2.6473, p-value = 0.007065
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSD_r2 = WilcoxEff(abs(unname(DASSD_W2@statistic@teststatistic)), (length(Long2$D_DASS)/2))
DASSD_r2
## [1] 0.4474742

T2 scores (MT2 = 8.29, SDT2 = 8.31) on the DASS-Depression were found to be significantly lower than T1 scores (MT1 = 11.77, SDT1 = 9.71); Z = 2.65, p = 0.01, r = 0.45.

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_Mod2 = lm(Long2$A_DASS ~ Long2$Time) 

# Calculate residuals:

DASSA_Res2 = resid(DASSA_Mod2)
qqnorm(DASSA_Res2, main = "Q-Q Plot of DASS-A Residuals")
qqline(DASSA_Res2)

The residuals appear to be slightly skewed to the right.

qplot(DASSA_Res2, main = "Histogram of DASS-A Residuals", binwidth = 1.25)

The residuals appear to be slightly skewed to the right.

DASSA_Shap2 = shapiro.test(DASSA_Res2)
DASSA_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSA_Res2
## W = 0.91582, p-value = 0.0001735

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.

Interpretation of Main Effects

DASSA_W2 = wilcoxsign_test(data = Long2, A_DASS ~ Time | (as.factor(Subject)), distribution = "exact")
DASSA_W2
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = 2.3901, p-value = 0.01573
## alternative hypothesis: true mu is not equal to 0

Calculate an effect size for the Wilcoxon Test.

DASSA_r2 = WilcoxEff(abs(unname(DASSA_W2@statistic@teststatistic)), (length(Long2$A_DASS)/2))
DASSA_r2
## [1] 0.4039993

T2 scores (MT2 = 6.57, SDT2 = 5.54) on the DASS-Anxiety were found to be significantly lower than T1 scores (MT1 = 9.43, SDT1 = 7.72); Z = 2.39, p = 0.02, r = 0.4.

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_Mod2 = lm(Long2$S_DASS ~ Long2$Time) 

# Calculate residuals:

DASSS_Res2 = resid(DASSS_Mod2)
qqnorm(DASSS_Res2, main = "Q-Q Plot of DASS-S Residuals")
qqline(DASSS_Res2)

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

qplot(DASSS_Res2, main = "Histogram of DASS-S Residuals", binwidth = 1.25)

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

DASSS_Shap2 = shapiro.test(DASSS_Res2)
DASSS_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  DASSS_Res2
## W = 0.98793, p-value = 0.741

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

Interpretation of Main Effects

Run the t-test.

DASSS_T2 = t.test(data = Long2, S_DASS ~ Time, paired = TRUE)
DASSS_T2
## 
##  Paired t-test
## 
## data:  S_DASS by Time
## t = 4.3812, df = 34, p-value = 0.0001072
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  2.971786 8.113929
## sample estimates:
## mean of the differences 
##                5.542857

Calculate Cohen’s d effect size.

DASSS_d2 = cohen.d(data = Long2, S_DASS ~ Time, paired = TRUE)
DASSS_d2
## 
## Cohen's d
## 
## d estimate: 0.7405621 (medium)
## 95 percent confidence interval:
##       inf       sup 
## 0.2474744 1.2336498

T2 scores (MT2 = 14.17, SDT2 = 8.66) on the DASS-Stress were found to be significantly lower than T1 scores (MT1 = 19.71, SDT1 = 9.06); t(34) = 4.38, p < .001, d = 0.74.

Job Effectiveness Questionnaire

Descriptive Statistics

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

# Create a table to display the results:

kable(JEQDesc2, digits = 4,
      caption = "Table 16. Scores on the Job Effectiveness Questionnaire (JEQ) for 'on-time' participants.",
      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 16. Scores on the Job Effectiveness Questionnaire (JEQ) for ‘on-time’ participants.
Time n M SD SE CI
T1 35 5.1046 0.7315 0.1236 0.2513
T2 35 5.3975 0.7779 0.1315 0.2672

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("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 'on-time' participants. Dots and whiskers represent means and standard errors, respectively."
JEQCap2 = paste0(strwrap(JEQCap2, width = 50), collapse = "\n")

# Create the plot:

JEQFig2 = (Long2 %>%
  ggplot(aes(Time, JEQ, fill = Time)) +
  geom_violin(color="black", trim=FALSE, alpha = .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", caption = JEQCap2) +

  # Define variable colours and theme:

  scale_fill_manual(values = c("gold2", "orchid2")) +
  scale_color_manual(values = c("gold2", "orchid2")) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
JEQFig2

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_Mod2 = lm(Long2$JEQ ~ Long2$Time) 

# Calculate residuals:

JEQ_Res2 = resid(JEQ_Mod2)
qqnorm(JEQ_Res2, main = "Q-Q Plot of JEQ Residuals")
qqline(JEQ_Res2)

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

qplot(JEQ_Res2, main = "Histogram of JEQ Residuals", binwidth = .25)

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

JEQ_Shap2 = shapiro.test(JEQ_Res2)
JEQ_Shap2
## 
##  Shapiro-Wilk normality test
## 
## data:  JEQ_Res2
## W = 0.96911, p-value = 0.08117

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

Interpretation of Main Effects

Run the t-test.

JEQ_T2 = t.test(data = Long2, JEQ ~ Time, paired = TRUE)
JEQ_T2
## 
##  Paired t-test
## 
## data:  JEQ by Time
## t = -2.6698, df = 34, p-value = 0.01155
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.5159382 -0.0699572
## sample estimates:
## mean of the differences 
##              -0.2929477

Calculate Cohen’s d effect size.

JEQ_d2 = cohen.d(data = Long2, JEQ ~ Time, paired = TRUE)
JEQ_d2
## 
## Cohen's d
## 
## d estimate: -0.4512796 (small)
## 95 percent confidence interval:
##         inf         sup 
## -0.93432124  0.03176211

T2 scores (MT2 = 5.4, SDT2 = 0.78) on the JEQ were found to be significantly higher than T1 scores (MT1 = 5.4, SDT1 = 0.73); t(34) = -2.67, p = 0.01, d = -0.45.

Summary of Results

The following results were found to be statistically significant:

  • Perceived Stress Scale

    • a decrease in perceived stress from T1 to T2 (p < .001)
  • Positive and Negative Affect Schedule

    • an increase in positive affect from T1 to T2 (p < .001)
    • a decrease in negative affect from T1 to T2 (p < .001)
  • Brief Resilience Scale

    • an increase in psychological resilience from T1 to T2 (p = 0.02)
  • Five Facet Mindfulness Questionnaire

    • an increase in non-reactivity, observing, awareness, describing, and non-judging from T1 to T2 (p < .001, p = 0.004, p < .001, p = 0.001, and p < .001, respectively)
  • Depression, Anxiety, and Stress Scale

    • a decrease in symptoms associated with depression, anxiety, and stress from T1 to T2 (p = 0.01, p = 0.02, and p < .001, respectively)
  • Job Effectiveness Questionnaire

    • an increase in perceived job competency from T1 to T2 (p = 0.01)

Conclusion

A second set of analyses, involving only participants who completed the measures in a timely manner, replicated the results from the first set of analyses: for each measure, a significant change in the predicted direction was observed. These findings support the conclusion that the mindfulness intervention was effective in improving well-being. 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.


3. Relationship with Other Variables - All Participants

Our third 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 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”). The new variable will be created from the NAWL1 data set because 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 first set of analyses).

# Copy "Other" values into a new variable:

NAWL1$Avg_Exp = as.numeric(as.character(NAWL1$Med_Length_Other))

# Re-code "Length" responses and insert into the new variable:

NAWL1$Avg_Exp[is.na(NAWL1$Med_Length)] = 0
NAWL1$Avg_Exp[NAWL1$Med_Length == 1] = (2/12)
NAWL1$Avg_Exp[NAWL1$Med_Length == 2] = (4.5/12)
NAWL1$Avg_Exp[NAWL1$Med_Length == 3] = (9/12)
NAWL1$Avg_Exp[NAWL1$Med_Length == 4] = 2

Now we will create a dataset that includes the Avg_Exp and Mins_Week variables and a measure of the changes that occurred from T1 to T2.

NAWL3 = data.frame("Subject" = NAWL1$ID,"Avg_Exp" = NAWL1$Avg_Exp, "Mins_Week" = NAWL1$Mins_Week, "PSS_Change" = (NAWL1$T2_PSS - NAWL1$T1_PSS), "PANASP_Change" = (NAWL1$T2_POS_PANAS - NAWL1$T1_POS_PANAS), "PANASN_Change" = (NAWL1$T2_NEG_PANAS - NAWL1$T1_NEG_PANAS), "BRS_Change" = (NAWL1$T2_BRS - NAWL1$T1_BRS), "FFMQNR_Change" = (NAWL1$T2_NR_FFMQ - NAWL1$T1_NR_FFMQ), "FFMQOB_Change" = (NAWL1$T2_OB_FFMQ - NAWL1$T1_OB_FFMQ), "FFMQAA_Change" = (NAWL1$T2_AA_FFMQ - NAWL1$T1_AA_FFMQ), "FFMQDS_Change" = (NAWL1$T2_DS_FFMQ - NAWL1$T1_DS_FFMQ), "FFMQNJ_Change" = (NAWL1$T2_NJ_FFMQ - NAWL1$T1_NJ_FFMQ), "DASSD_Change" = (NAWL1$T2_D_DASS - NAWL1$T1_D_DASS), "DASSA_Change" = (NAWL1$T2_A_DASS - NAWL1$T1_A_DASS), "DASSS_Change" = (NAWL1$T2_S_DASS - NAWL1$T1_S_DASS), "JEQ_Change" = (NAWL1$T2_JEQ - NAWL1$T1_JEQ))

Correlation

To test for basic relationships between the variables, 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_Corrs3 = rcorr(as.matrix(NAWL3), type = c("pearson"))

# Perform p-adjustment for previous experience:

Exp_Corrs_p3 = p.adjust(Change_Corrs3$P[4:16, 2], method = c("holm"), n = 13)

# Perform p-adjustment for degree of participation:

Part_Corrs_p3 = p.adjust(Change_Corrs3$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_r3 = round(Change_Corrs3$r[4:16, 2], 4)
Exp_Corrs_p3 = round(Exp_Corrs_p3, 4)

# Create lists of the participation values:

Part_Corrs_r3 = round(Change_Corrs3$r[4:16, 3], 4)
Part_Corrs_p3 = round(Part_Corrs_p3, 4)

# Combine into a single data frame:

Corrs3 = data.frame("Measure" = Corr_Subscales, "Exp_r" = Exp_Corrs_r3, "Exp_p" = Exp_Corrs_p3, "Part_r" = Part_Corrs_r3, "Part_p" = Part_Corrs_p3)

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

CorrsB3 = Corrs3 %>%
  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(CorrsB3, digits = 4,
      caption = "Table 17. 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", "p", "r", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = FALSE, position = "center") %>%
  add_header_above(c("", "Previous Experience (yrs)" = 2, "Program Participation (mins/wk)" = 2)) %>%
  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 = "For all correlations, n = 44. 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 17. 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 p r p
Perceived Stress Scale
0.2249 1 -0.0968 1
Positive and Negative Affect Schedule
Positive Affect -0.3258 0.402 -0.1439 1
Negative Affect 0.1667 1 -0.0635 1
Brief Resilience Scale
-0.1973 1 0.1613 1
Five Facet Mindfulness Questionnaire
Non-Reactivity -0.1386 1 0.0193 1
Observing -0.0763 1 -0.0746 1
Awareness -0.2495 1 -0.0708 1
Describing -0.1754 1 0.0885 1
Non-Judging -0.0525 1 -0.1222 1
Depression, Anxiety, and Stress Scale
Depression 0.1050 1 -0.1140 1
Anxiety 0.0081 1 -0.1748 1
Stress -0.2870 0.707 -0.0397 1
Job Effectiveness Questionnaire
-0.1317 1 0.1895 1
Note: For all correlations, n = 44. 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 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_E3 = summary(lm(data = NAWL3, PSS_Change ~ Avg_Exp))
PSS_E3
## 
## Call:
## lm(formula = PSS_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.3324  -3.7249   0.0785   4.4303  10.6053 
## 
## Coefficients:
##             Estimate Std. Error t value       Pr(>|t|)    
## (Intercept) -7.68543    0.90578  -8.485 0.000000000119 ***
## Avg_Exp      0.10689    0.07147   1.496          0.142    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.536 on 42 degrees of freedom
## Multiple R-squared:  0.05057,    Adjusted R-squared:  0.02796 
## F-statistic: 2.237 on 1 and 42 DF,  p-value: 0.1422

Previous experience was found to explain 5.06% of the change in PSS scores; R2 = 0.05, F(1, 42 ) = 2.24, p = 0.14. Length of previous experience is not a significant moderator of PSS change; \(\beta\) = 0.11, t = 1.5, p = 0.14.

  1. Program Participation
PSS_P3 = summary(lm(data = NAWL3, PSS_Change ~ Mins_Week))
PSS_P3
## 
## Call:
## lm(formula = PSS_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.8888  -3.9764  -0.0066   4.5014  11.8246 
## 
## Coefficients:
##             Estimate Std. Error t value    Pr(>|t|)    
## (Intercept) -6.72901    1.09210  -6.162 0.000000233 ***
## Mins_Week   -0.00910    0.01444  -0.630       0.532    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.655 on 42 degrees of freedom
## Multiple R-squared:  0.009365,   Adjusted R-squared:  -0.01422 
## F-statistic: 0.3971 on 1 and 42 DF,  p-value: 0.532

Program participation was found to explain 0.94% of the change in PSS scores; R2 = 0.01, F(1, 42 ) = 0.4, p = 0.53. Time spent meditating is not a significant moderator of PSS change; \(\beta\) = -0.01, t = -0.63, p = 0.53.

Positive and Negative Affect Schedule

Positive Affect

  1. Previous Experience
PANASP_E3 = summary(lm(data = NAWL3, PANASP_Change ~ Avg_Exp))
PANASP_E3
## 
## Call:
## lm(formula = PANASP_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.7296  -3.4590  -0.2639   3.0207  14.7032 
## 
## Coefficients:
##             Estimate Std. Error t value   Pr(>|t|)    
## (Intercept)  5.29683    0.99698   5.313 0.00000383 ***
## Avg_Exp     -0.17566    0.07866  -2.233     0.0309 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.094 on 42 degrees of freedom
## Multiple R-squared:  0.1061, Adjusted R-squared:  0.08486 
## F-statistic: 4.987 on 1 and 42 DF,  p-value: 0.03092

Previous experience was found to explain 10.61% of the change in PANAS-Positive scores; R2 = 0.11, F(1, 42 ) = 4.99, p = 0.03. Length of previous experience is a significant negative moderator of PANAS-Positive change, meaning that participants with more years of experience demonstrated less positive change over time; \(\beta\) = -0.18, t = -2.23, p = 0.03. This relationship is plotted below.

# Create a figure caption:

PANASPCap3 = "Figure 13. Linear relationship between PANAS-Positive change over time and years of previous meditation experience. Shaded area represents a 95% confidence region."
PANASPCap3 = paste0(strwrap(PANASPCap3, width = 55), collapse = "\n")

# Create the plot:

PANASPFig3 = (NAWL3 %>%
  ggplot(aes(Avg_Exp, PANASP_Change)) + 
  geom_point(shape = 16) +

# Add linear regression line:                
                            
  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Previous Experience (years)", y = "T1 to T2 PANAS-P Change", caption = PANASPCap3) + 
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10))) 
PANASPFig3

  1. Program Participation
PANASP_P3 = summary(lm(data = NAWL3, PANASP_Change ~ Mins_Week))
PANASP_P3
## 
## Call:
## lm(formula = PANASP_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.9959  -3.0477  -0.4588   2.9401  15.2726 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.15702    1.23176   4.187 0.000142 ***
## Mins_Week   -0.01534    0.01629  -0.942 0.351550    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.378 on 42 degrees of freedom
## Multiple R-squared:  0.02069,    Adjusted R-squared:  -0.002624 
## F-statistic: 0.8875 on 1 and 42 DF,  p-value: 0.3515

Program participation was found to explain 2.07% of the change in PANAS-Positive scores; R2 = 0.02, F(1, 42 ) = 0.89, p = 0.35. Time spent meditating is not a significant moderator of PANAS-Positive change; \(\beta\) = -0.02, t = -0.94, p = 0.35.

Negative Affect

  1. Previous Experience
PANASN_E3 = summary(lm(data = NAWL3, PANASN_Change ~ Avg_Exp))
PANASN_E3
## 
## Call:
## lm(formula = PANASN_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.6608  -3.7091  -0.1717   4.3271  15.3392 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -5.33919    1.11743  -4.778 0.0000218 ***
## Avg_Exp      0.09657    0.08816   1.095      0.28    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.83 on 42 degrees of freedom
## Multiple R-squared:  0.02778,    Adjusted R-squared:  0.004627 
## F-statistic:   1.2 on 1 and 42 DF,  p-value: 0.2796

Previous experience was found to explain 2.78% of the change in PANAS-Negative scores; R2 = 0.03, F(1, 42 ) = 1.2, p = 0.28. Length of previous experience is not a significant moderator of PANAS-Negative change; \(\beta\) = 0.1, t = 1.1, p = 0.28.

  1. Program Participation
PANASN_P3 = summary(lm(data = NAWL3, PANASN_Change ~ Mins_Week))
PANASN_P3
## 
## Call:
## lm(formula = PANASN_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.9454  -4.2402   0.5131   4.1900  14.5579 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -4.519654   1.334974  -3.386  0.00155 **
## Mins_Week   -0.007278   0.017653  -0.412  0.68222   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.913 on 42 degrees of freedom
## Multiple R-squared:  0.004031,   Adjusted R-squared:  -0.01968 
## F-statistic:  0.17 on 1 and 42 DF,  p-value: 0.6822

Program participation was found to explain 0.4% of the change in PANAS-Negative scores; R2 = 0, F(1, 42 ) = 0.17, p = 0.68. Time spent meditating is not a significant moderator of PANAS-Negative change; \(\beta\) = -0.01, t = -0.41, p = 0.68.

Brief Resilience Scale

  1. Previous Experience
BRS_E3 = summary(lm(data = NAWL3, BRS_Change ~ Avg_Exp))
BRS_E3
## 
## Call:
## lm(formula = BRS_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.51949 -0.35282 -0.01541  0.35514  1.53146 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.352823   0.105741   3.337  0.00178 **
## Avg_Exp     -0.010881   0.008343  -1.304  0.19925   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6463 on 42 degrees of freedom
## Multiple R-squared:  0.03892,    Adjusted R-squared:  0.01604 
## F-statistic: 1.701 on 1 and 42 DF,  p-value: 0.1993

Previous experience was found to explain 3.89% of the change in BRS scores; R2 = 0.04, F(1, 42 ) = 1.7, p = 0.2. Length of previous experience is not a significant moderator of BRS change; \(\beta\) = -0.01, t = -1.3, p = 0.2.

  1. Program Participation
BRS_P3 = summary(lm(data = NAWL3, BRS_Change ~ Mins_Week))
BRS_P3
## 
## Call:
## lm(formula = BRS_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.3889 -0.3976 -0.0121  0.3881  1.3644 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 0.216046   0.125646   1.719   0.0929 .
## Mins_Week   0.001760   0.001662   1.059   0.2954  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6506 on 42 degrees of freedom
## Multiple R-squared:  0.02603,    Adjusted R-squared:  0.002841 
## F-statistic: 1.123 on 1 and 42 DF,  p-value: 0.2954

Program participation was found to explain 2.6% of the change in BRS scores; R2 = 0.03, F(1, 42 ) = 1.12, p = 0.3. Time spent meditating is not a significant moderator of BRS change; \(\beta\) = 0, t = 1.06, p = 0.3.

Five Facet Mindfulness Questionnaire

Non-Reactivity

  1. Previous Experience
FFMQNR_E3 = summary(lm(data = NAWL3, FFMQNR_Change ~ Avg_Exp))
FFMQNR_E3
## 
## Call:
## lm(formula = FFMQNR_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -5.300 -2.519 -0.133  2.439  9.785 
## 
## Coefficients:
##             Estimate Std. Error t value   Pr(>|t|)    
## (Intercept)  3.30041    0.59462   5.550 0.00000176 ***
## Avg_Exp     -0.04254    0.04691  -0.907       0.37    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.634 on 42 degrees of freedom
## Multiple R-squared:  0.0192, Adjusted R-squared:  -0.004148 
## F-statistic: 0.8224 on 1 and 42 DF,  p-value: 0.3697

Previous experience was found to explain 1.92% of the change in FFMQ-Non-Reactivity scores; R2 = 0.02, F(1, 42 ) = 0.82, p = 0.37. Length of previous experience is not a significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = -0.04, t = -0.91, p = 0.37.

  1. Program Participation
FFMQNR_P3 = summary(lm(data = NAWL3, FFMQNR_Change ~ Mins_Week))
FFMQNR_P3
## 
## Call:
## lm(formula = FFMQNR_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.1216 -3.0556 -0.0613  1.9132  9.9152 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.03560    0.70857   4.284 0.000105 ***
## Mins_Week    0.00117    0.00937   0.125 0.901199    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.669 on 42 degrees of freedom
## Multiple R-squared:  0.0003713,  Adjusted R-squared:  -0.02343 
## F-statistic: 0.0156 on 1 and 42 DF,  p-value: 0.9012

Program participation was found to explain 0.04% of the change in FFMQ-Non-Reactivity scores; R2 = 0, F(1, 42 ) = 0.02, p = 0.9. Time spent meditating is not a significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = 0, t = 0.12, p = 0.9.

Observing

  1. Previous Experience
FFMQOB_E3 = summary(lm(data = NAWL3, FFMQOB_Change ~ Avg_Exp))
FFMQOB_E3
## 
## Call:
## lm(formula = FFMQOB_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.3229 -1.0488 -0.8165  0.9558  5.9537 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  1.04875    0.37078   2.828  0.00714 **
## Avg_Exp     -0.01452    0.02925  -0.496  0.62233   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.266 on 42 degrees of freedom
## Multiple R-squared:  0.005828,   Adjusted R-squared:  -0.01784 
## F-statistic: 0.2462 on 1 and 42 DF,  p-value: 0.6223

Previous experience was found to explain 0.58% of the change in FFMQ-Observing scores; R2 = 0.01, F(1, 42 ) = 0.25, p = 0.62. Length of previous experience is not a significant moderator of FFMQ-Observing change; \(\beta\) = -0.01, t = -0.5, p = 0.62.

  1. Program Participation
FFMQOB_P3 = summary(lm(data = NAWL3, FFMQOB_Change ~ Mins_Week))
FFMQOB_P3
## 
## Call:
## lm(formula = FFMQOB_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0313 -1.0930 -0.5452  0.9785  6.0080 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  1.109876   0.437712   2.536    0.015 *
## Mins_Week   -0.002806   0.005788  -0.485    0.630  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.267 on 42 degrees of freedom
## Multiple R-squared:  0.005563,   Adjusted R-squared:  -0.01811 
## F-statistic: 0.235 on 1 and 42 DF,  p-value: 0.6304

Program participation was found to explain 0.56% of the change in FFMQ-Observing scores; R2 = 0.01, F(1, 42 ) = 0.23, p = 0.63. Time spent meditating is not a significant moderator of FFMQ-Observing change; \(\beta\) = 0, t = -0.48, p = 0.63.

Acting with Awareness

  1. Previous Experience
FFMQAA_E3 = summary(lm(data = NAWL3, FFMQAA_Change ~ Avg_Exp))
FFMQAA_E3
## 
## Call:
## lm(formula = FFMQAA_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -6.272 -2.272 -0.272  1.728  7.875 
## 
## Coefficients:
##             Estimate Std. Error t value    Pr(>|t|)    
## (Intercept)  3.27201    0.55942   5.849 0.000000655 ***
## Avg_Exp     -0.07370    0.04414  -1.670       0.102    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.419 on 42 degrees of freedom
## Multiple R-squared:  0.06225,    Adjusted R-squared:  0.03993 
## F-statistic: 2.788 on 1 and 42 DF,  p-value: 0.1024

Previous experience was found to explain 6.23% of the change in FFMQ-Awareness scores; R2 = 0.06, F(1, 42 ) = 2.79, p = 0.1. Length of previous experience is not a significant moderator of FFMQ-Awareness change; \(\beta\) = -0.07, t = -1.67, p = 0.1.

  1. Program Participation
FFMQAA_P3 = summary(lm(data = NAWL3, FFMQAA_Change ~ Mins_Week))
FFMQAA_P3
## 
## Call:
## lm(formula = FFMQAA_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.0426 -2.0918 -0.0592  2.1452  8.1995 
## 
## Coefficients:
##              Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  3.104712   0.680167   4.565 0.0000432 ***
## Mins_Week   -0.004139   0.008994  -0.460     0.648    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.522 on 42 degrees of freedom
## Multiple R-squared:  0.005017,   Adjusted R-squared:  -0.01867 
## F-statistic: 0.2118 on 1 and 42 DF,  p-value: 0.6477

Program participation was found to explain 0.5% of the change in FFMQ-Awareness scores; R2 = 0.01, F(1, 42 ) = 0.21, p = 0.65. Time spent meditating is not a significant moderator of FFMQ-Awareness change; \(\beta\) = 0, t = -0.46, p = 0.65.

Describing

  1. Previous Experience
FFMQDS_E3 = summary(lm(data = NAWL3, FFMQDS_Change ~ Avg_Exp))
FFMQDS_E3
## 
## Call:
## lm(formula = FFMQDS_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.9496 -1.9855  0.0145  1.9818  9.0145 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.98549    0.52503   3.782 0.000487 ***
## Avg_Exp     -0.04782    0.04142  -1.154 0.254842    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.209 on 42 degrees of freedom
## Multiple R-squared:  0.03076,    Adjusted R-squared:  0.007679 
## F-statistic: 1.333 on 1 and 42 DF,  p-value: 0.2548

Previous experience was found to explain 3.08% of the change in FFMQ-Describing scores; R2 = 0.03, F(1, 42 ) = 1.33, p = 0.25. Length of previous experience is not a significant moderator of FFMQ-Describing change; \(\beta\) = -0.05, t = -1.15, p = 0.25.

  1. Program Participation
FFMQDS_P3 = summary(lm(data = NAWL3, FFMQDS_Change ~ Mins_Week))
FFMQDS_P3
## 
## Call:
## lm(formula = FFMQDS_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.6580 -1.8647 -0.2141  1.2501  9.4506 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 1.524353   0.627010   2.431   0.0194 *
## Mins_Week   0.004774   0.008291   0.576   0.5678  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.247 on 42 degrees of freedom
## Multiple R-squared:  0.007833,   Adjusted R-squared:  -0.01579 
## F-statistic: 0.3316 on 1 and 42 DF,  p-value: 0.5678

Program participation was found to explain 0.78% of the change in FFMQ-Describing scores; R2 = 0.01, F(1, 42 ) = 0.33, p = 0.57. Time spent meditating is not a significant moderator of FFMQ-Describing change; \(\beta\) = 0, t = 0.58, p = 0.57.

Non-Judging

  1. Previous Experience
FFMQNJ_E3 = summary(lm(data = NAWL3, FFMQNJ_Change ~ Avg_Exp))
FFMQNJ_E3
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.3278 -3.3950 -0.8231  2.8964  9.6583 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  3.34173    0.69237   4.827 0.0000187 ***
## Avg_Exp     -0.01863    0.05463  -0.341     0.735    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.232 on 42 degrees of freedom
## Multiple R-squared:  0.002761,   Adjusted R-squared:  -0.02098 
## F-statistic: 0.1163 on 1 and 42 DF,  p-value: 0.7348

Previous experience was found to explain 0.28% of the change in FFMQ-Non-Judging scores; R2 = 0, F(1, 42 ) = 0.12, p = 0.73. Length of previous experience is not a significant moderator of FFMQ-Non-Judging change; \(\beta\) = -0.02, t = -0.34, p = 0.73.

  1. Program Participation
FFMQNJ_P3 = summary(lm(data = NAWL3, FFMQNJ_Change ~ Mins_Week))
FFMQNJ_P3
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.6035 -2.5071 -0.8251  2.6824  9.9748 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.654948   0.812241   4.500 0.000053 ***
## Mins_Week   -0.008568   0.010741  -0.798     0.43    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.206 on 42 degrees of freedom
## Multiple R-squared:  0.01493,    Adjusted R-squared:  -0.008529 
## F-statistic: 0.6364 on 1 and 42 DF,  p-value: 0.4295

Program participation was found to explain 1.49% of the change in FFMQ-Non-Judging scores; R2 = 0.01, F(1, 42 ) = 0.64, p = 0.43. Time spent meditating is not a significant moderator of FFMQ-Non-Judging change; \(\beta\) = -0.01, t = -0.8, p = 0.43.

Depression, Anxiety, and Stress Scale

Depression

  1. Previous Experience
DASSD_E3 = summary(lm(data = NAWL3, DASSD_Change ~ Avg_Exp))
DASSD_E3
## 
## Call:
## lm(formula = DASSD_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.326  -4.326   1.645   3.674  14.034 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -3.67423    1.16848  -3.144  0.00305 **
## Avg_Exp      0.06308    0.09219   0.684  0.49762   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.142 on 42 degrees of freedom
## Multiple R-squared:  0.01102,    Adjusted R-squared:  -0.01252 
## F-statistic: 0.4681 on 1 and 42 DF,  p-value: 0.4976

Previous experience was found to explain 1.1% of the change in DASS-Depression scores; R2 = 0.01, F(1, 42 ) = 0.47, p = 0.5. Length of previous experience is not a significant moderator of DASS-Depression change; \(\beta\) = 0.06, t = 0.68, p = 0.5.

  1. Program Participation
DASSD_P3 = summary(lm(data = NAWL3, DASSD_Change ~ Mins_Week))
DASSD_P3
## 
## Call:
## lm(formula = DASSD_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.518  -3.467   1.292   4.340  14.866 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.72323    1.37784  -1.976   0.0547 .
## Mins_Week   -0.01355    0.01822  -0.744   0.4612  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.135 on 42 degrees of freedom
## Multiple R-squared:  0.013,  Adjusted R-squared:  -0.0105 
## F-statistic: 0.5531 on 1 and 42 DF,  p-value: 0.4612

Program participation was found to explain 1.3% of the change in DASS-Depression scores; R2 = 0.01, F(1, 42 ) = 0.55, p = 0.46. Time spent meditating is not a significant moderator of DASS-Depression change; \(\beta\) = -0.01, t = -0.74, p = 0.46.

Anxiety

  1. Previous Experience
DASSA_E3 = summary(lm(data = NAWL3, DASSA_Change ~ Avg_Exp))
DASSA_E3
## 
## Call:
## lm(formula = DASSA_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.2515  -3.3066   0.7403   2.7487  14.7459 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -2.74928    1.08543  -2.533   0.0151 *
## Avg_Exp      0.00447    0.08564   0.052   0.9586  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.634 on 42 degrees of freedom
## Multiple R-squared:  6.486e-05,  Adjusted R-squared:  -0.02374 
## F-statistic: 0.002724 on 1 and 42 DF,  p-value: 0.9586

Previous experience was found to explain 0.01% of the change in DASS-Anxiety scores; R2 = 0, F(1, 42 ) = 0, p = 0.96. Length of previous experience is not a significant moderator of DASS-Anxiety change; \(\beta\) = 0, t = 0.05, p = 0.96.

  1. Program Participation
DASSA_P3 = summary(lm(data = NAWL3, DASSA_Change ~ Mins_Week))
DASSA_P3
## 
## Call:
## lm(formula = DASSA_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.3737  -3.7479   0.6263   3.2620  13.9355 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.82033    1.26152  -1.443    0.156
## Mins_Week   -0.01919    0.01668  -1.150    0.257
## 
## Residual standard error: 6.532 on 42 degrees of freedom
## Multiple R-squared:  0.03054,    Adjusted R-squared:  0.007463 
## F-statistic: 1.323 on 1 and 42 DF,  p-value: 0.2565

Program participation was found to explain 3.05% of the change in DASS-Anxiety scores; R2 = 0.03, F(1, 42 ) = 1.32, p = 0.26. Time spent meditating is not a significant moderator of DASS-Anxiety change; \(\beta\) = -0.02, t = -1.15, p = 0.26.

Stress

  1. Previous Experience
DASSS_E3 = summary(lm(data = NAWL3, DASSS_Change ~ Avg_Exp))
DASSS_E3
## 
## Call:
## lm(formula = DASSS_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.875  -4.455  -1.118   5.529  11.882 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -5.52202    1.17598  -4.696 0.0000284 ***
## Avg_Exp     -0.18014    0.09278  -1.942    0.0589 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.188 on 42 degrees of freedom
## Multiple R-squared:  0.08236,    Adjusted R-squared:  0.06051 
## F-statistic:  3.77 on 1 and 42 DF,  p-value: 0.05892

Previous experience was found to explain 8.24% of the change in DASS-Stress scores; R2 = 0.08, F(1, 42 ) = 3.77, p = 0.06. Length of previous experience is not a significant moderator of DASS-Stress change; \(\beta\) = -0.18, t = -1.94, p = 0.06.

  1. Program Participation
DASSS_P3 = summary(lm(data = NAWL3, DASSS_Change ~ Mins_Week))
DASSS_P3
## 
## Call:
## lm(formula = DASSS_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -17.582  -3.757  -1.582   6.206  12.659 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -6.175994   1.447879  -4.266 0.000111 ***
## Mins_Week   -0.004932   0.019146  -0.258 0.797973    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.497 on 42 degrees of freedom
## Multiple R-squared:  0.001577,   Adjusted R-squared:  -0.02219 
## F-statistic: 0.06636 on 1 and 42 DF,  p-value: 0.798

Program participation was found to explain 0.16% of the change in DASS-Stress scores; R2 = 0, F(1, 42 ) = 0.07, p = 0.8. Time spent meditating is not a significant moderator of DASS-Stress change; \(\beta\) = 0, t = -0.26, p = 0.8.

Job Effectiveness Questionnaire

  1. Previous Experience
JEQ_E3 = summary(lm(data = NAWL3, JEQ_Change ~ Avg_Exp))
JEQ_E3
## 
## Call:
## lm(formula = JEQ_Change ~ Avg_Exp, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.64525 -0.20484  0.03544  0.28870  1.28892 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.353903   0.097139   3.643 0.000734 ***
## Avg_Exp     -0.006598   0.007664  -0.861 0.394156    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5937 on 42 degrees of freedom
## Multiple R-squared:  0.01734,    Adjusted R-squared:  -0.006054 
## F-statistic: 0.7412 on 1 and 42 DF,  p-value: 0.3942

Previous experience was found to explain 1.73% of the change in JEQ scores; R2 = 0.02, F(1, 42 ) = 0.74, p = 0.39. Length of previous experience is not a significant moderator of JEQ change \(\beta\) = -0.01, t = -0.86, p = 0.39.

  1. Program Participation
JEQ_P3 = summary(lm(data = NAWL3, JEQ_Change ~ Mins_Week))
JEQ_P3
## 
## Call:
## lm(formula = JEQ_Change ~ Mins_Week, data = NAWL3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.58570 -0.21063  0.03103  0.26763  1.25894 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 0.232650   0.113571   2.049   0.0468 *
## Mins_Week   0.001878   0.001502   1.251   0.2180  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5881 on 42 degrees of freedom
## Multiple R-squared:  0.0359, Adjusted R-squared:  0.01294 
## F-statistic: 1.564 on 1 and 42 DF,  p-value: 0.218

Program participation was found to explain 3.59% of the change in JEQ scores; R2 = 0.04, F(1, 42 ) = 1.56, p = 0.22. Time spent meditating is not a significant moderator of JEQ change; \(\beta\) = 0, t = 1.25, p = 0.22.

Summary of Results

The following results were found to be statistically significant:

  • Positive and Negative Affect Schedule

    • positive affect changes were moderated by length of previous meditation experience (p = 0.03)

Conclusion

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 largely supported by moderation analyses, though changes in positive affect were found to be moderated by the length of previous meditation experience, such that more experience led to less positive change across time. It’s important to note, however, that this relationship appears to be driven largely by six individuals who reported 20+ years of meditation experience. In the next set of analyses, therefore, we will repeat the previous analyses after removing outliers.


4. Relationship with Other Variables - Outliers Removed

Our fourth 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:

EBox4 = boxplot(NAWL3$Avg_Exp, ylab = "Years of Experience")

# Identify outlier values:

OutE4 = EBox4$out

The outlier values correspond to participants 8, 14, 27, 46, 60, and 73. These participants reported 40, 20, 50, 30, 31, and 26 years of previous meditation experience, respectively.

  1. Program Participation
# Create boxplot:

PBox4 = boxplot(NAWL3$Mins_Week, ylab = "Mins / Week")

# Identify outlier values:

OutP4 = PBox4$out

The outlier values correspond to participants 6 and 60. These participants reported meditating for 262.5 and 280 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 3 dataset.

NAWL4 = NAWL3

# Set Experience outliers to NA:

NAWL4 = replace_with_na(data = NAWL4, replace = list(Avg_Exp = c(OutE4[1], OutE4[2], OutE4[3], OutE4[4], OutE4[5], OutE4[6])))

# Set Participation outliers to NA:

NAWL4 = replace_with_na(data = NAWL4, replace = list(Mins_Week = c(OutP4[1], OutP4[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_Corrs4 = rcorr(as.matrix(NAWL4), type = c("pearson"))

# Perform p-adjustment for previous experience:

Exp_Corrs_p4 = p.adjust(Change_Corrs4$P[4:16, 2], method = c("holm"), n = 13)

# Perform p-adjustment for degree of participation:

Part_Corrs_p4 = p.adjust(Change_Corrs4$P[4:16, 3], method = c("holm"), n = 13)

# Create lists of the experience values:

Exp_Corrs_r4 = round(Change_Corrs4$r[4:16, 2], 4)
Exp_Corrs_p4 = round(Exp_Corrs_p4, 4)

# Create lists of the participation values:

Part_Corrs_r4 = round(Change_Corrs4$r[4:16, 3], 4)
Part_Corrs_p4 = round(Part_Corrs_p4, 4)

# Combine into a single data frame:

Corrs4 = data.frame("Measure" = Corr_Subscales, "Exp_r" = Exp_Corrs_r4, "Exp_p" = Exp_Corrs_p4, "Part_r" = Part_Corrs_r4, "Part_p" = Part_Corrs_p4)

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

CorrsB4 = Corrs4 %>%
  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(CorrsB4, digits = 4,
      caption = "Table 18. 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", "p", "r", "p"),
      align = 'c', escape = FALSE) %>%
  kable_styling(bootstrap_options =
                  c("hover", "responsive", "striped"),
                full_width = FALSE, position = "center") %>%
  add_header_above(c("", "Previous Experience (yrs)" = 2, "Program Participation (mins/wk)" = 2)) %>%
  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 = "For previous experience correlations, n = 38. For program participation correlations, n = 42. 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 18. 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 p r p
Perceived Stress Scale
-0.1163 1 -0.2605 1
Positive and Negative Affect Schedule
Positive Affect -0.0845 1 0.0238 1
Negative Affect 0.0781 1 -0.1336 1
Brief Resilience Scale
0.0570 1 0.1159 1
Five Facet Mindfulness Questionnaire
Non-Reactivity 0.2353 1 0.1768 1
Observing -0.2076 1 -0.0667 1
Awareness 0.0041 1 -0.0381 1
Describing -0.0875 1 0.2344 1
Non-Judging -0.0496 1 0.1160 1
Depression, Anxiety, and Stress Scale
Depression -0.1593 1 -0.2666 1
Anxiety 0.1431 1 -0.2062 1
Stress 0.0195 1 -0.1702 1
Job Effectiveness Questionnaire
-0.0477 1 0.2303 1
Note: For previous experience correlations, n = 38. For program participation correlations, n = 42. 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 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_E4 = summary(lm(data = NAWL4, PSS_Change ~ Avg_Exp))
PSS_E4
## 
## Call:
## lm(formula = PSS_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.5542  -3.9483   0.3767   4.1353  10.9296 
## 
## Coefficients:
##             Estimate Std. Error t value     Pr(>|t|)    
## (Intercept)  -7.3076     1.0711  -6.823 0.0000000562 ***
## Avg_Exp      -0.8294     1.1804  -0.703        0.487    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.423 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.01353,    Adjusted R-squared:  -0.01387 
## F-statistic: 0.4937 on 1 and 36 DF,  p-value: 0.4868

After removing outliers, previous experience was found to explain 1.35% of the change in PSS scores; R2 = 0.01, F(1, 36 ) = 0.49, p = 0.49. Length of previous experience, therefore, remains a non-significant moderator of PSS change; \(\beta\) = -0.83, t = -0.7, p = 0.49.

  1. Program Participation
PSS_P4 = summary(lm(data = NAWL4, PSS_Change ~ Mins_Week))
PSS_P4
## 
## Call:
## lm(formula = PSS_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -10.556  -4.051   0.030   4.670  11.104 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -5.65787    1.24197  -4.556 0.0000482 ***
## Mins_Week   -0.04253    0.02492  -1.707    0.0956 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.464 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.06787,    Adjusted R-squared:  0.04457 
## F-statistic: 2.913 on 1 and 40 DF,  p-value: 0.09565

After removing outliers, program participation was found to explain 6.79% of the change in PSS scores; R2 = 0.07, F(1, 40 ) = 2.91, p = 0.1. Time spent meditating, therefore, remains a non-significant moderator of PSS change; \(\beta\) = -0.01, t = -0.63, p = 0.53.

Positive and Negative Affect Schedule

Positive Affect

  1. Previous Experience
PANASP_E4 = summary(lm(data = NAWL4, PANASP_Change ~ Avg_Exp))
PANASP_E4
## 
## Call:
## lm(formula = PANASP_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.1350  -3.3045  -0.5088   2.6133  14.3666 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)   5.6334     1.1843   4.757 0.0000315 ***
## Avg_Exp      -0.6644     1.3051  -0.509     0.614    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.997 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.007148,   Adjusted R-squared:  -0.02043 
## F-statistic: 0.2592 on 1 and 36 DF,  p-value: 0.6138

After removing outliers, previous experience was found to explain 0.71% of the change in PANAS-Positive scores; R2 = 0.01, F(1, 36 ) = 0.26, p = 0.61. Length of previous experience, therefore, is no longer a significant negative moderator of PANAS-Positive change; \(\beta\) = -0.66, t = -0.51, p = 0.61. This newly found lack of relationship is plotted below.

# Create a figure caption:

PANASPCap4 = "Figure 14. Linear relationship between PANAS-Positive change over time and years of previous meditation experience after outliers have been removed. Shaded area represents a 95% confidence region."
PANASPCap4 = paste0(strwrap(PANASPCap4, width = 55), collapse = "\n")

# Create the plot:

PANASPFig4 = (NAWL4 %>%
  ggplot(aes(Avg_Exp, PANASP_Change)) +
  geom_point(shape = 16) +

# Add linear regression line:

  geom_smooth(method = lm) +

# Add labels:

  labs(x = "Previous Experience (years)", y = "T1 to T2 PANAS-P Change", caption = PANASPCap4) +
  theme_light() + theme(plot.caption = element_text(hjust = 0, size = 10)))
PANASPFig4

  1. Program Participation
PANASP_P4 = summary(lm(data = NAWL4, PANASP_Change ~ Mins_Week))
PANASP_P4
## 
## Call:
## lm(formula = PANASP_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.5744  -3.4120  -0.2045   2.3322  15.3477 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 4.527756   1.473148   3.074   0.0038 **
## Mins_Week   0.004446   0.029559   0.150   0.8812   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.481 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.0005654,  Adjusted R-squared:  -0.02442 
## F-statistic: 0.02263 on 1 and 40 DF,  p-value: 0.8812

After removing outliers, program participation was found to explain 0.06% of the change in PANAS-Positive scores; R2 = 0, F(1, 40 ) = 0.02, p = 0.88. Time spent meditating, therefore, remains a non-significant moderator of PANAS-Positive change; \(\beta\) = 0, t = 0.15, p = 0.88.

Negative Affect

  1. Previous Experience
PANASN_E4 = summary(lm(data = NAWL4, PANASN_Change ~ Avg_Exp))
PANASN_E4
## 
## Call:
## lm(formula = PANASN_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.2013  -4.2959   0.2987   4.7683  15.7987 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -5.7987     1.4081  -4.118 0.000213 ***
## Avg_Exp       0.7298     1.5518   0.470 0.640987    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.13 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.006106,   Adjusted R-squared:  -0.0215 
## F-statistic: 0.2212 on 1 and 36 DF,  p-value: 0.641

After removing outliers, previous experience was found to explain 0.61% of the change in PANAS-Negative scores; R2 = 0.01, F(1, 36 ) = 0.22, p = 0.64. Length of previous experience, therefore, remains a non-significant moderator of PANAS-Negative change; \(\beta\) = 0.73, t = 0.47, p = 0.64.

  1. Program Participation
PANASN_P4 = summary(lm(data = NAWL4, PANASN_Change ~ Mins_Week))
PANASN_P4
## 
## Call:
## lm(formula = PANASN_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.3538  -4.7099   0.1174   4.7088  14.0248 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -3.88137    1.59706  -2.430   0.0197 *
## Mins_Week   -0.02731    0.03205  -0.852   0.3991  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.026 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.01784,    Adjusted R-squared:  -0.006715 
## F-statistic: 0.7265 on 1 and 40 DF,  p-value: 0.3991

After removing outliers, program participation was found to explain 1.78% of the change in PANAS-Negative scores; R2 = 0.02, F(1, 40 ) = 0.73, p = 0.4. Time spent meditating, therefore, remains a non-significant moderator of PANAS-Negative change; \(\beta\) = -0.03, t = -0.85, p = 0.4.

Brief Resilience Scale

  1. Previous Experience
BRS_E4 = summary(lm(data = NAWL4, BRS_Change ~ Avg_Exp))
BRS_E4
## 
## Call:
## lm(formula = BRS_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.4671 -0.3286 -0.0604  0.3643  1.1918 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  0.30041    0.12368   2.429   0.0203 *
## Avg_Exp      0.04666    0.13630   0.342   0.7341  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6262 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.003245,   Adjusted R-squared:  -0.02444 
## F-statistic: 0.1172 on 1 and 36 DF,  p-value: 0.7341

After removing outliers, previous experience was found to explain 0.32% of the change in BRS scores; R2 = 0, F(1, 36 ) = 0.12, p = 0.73. Length of previous experience, therefore, remains a non-significant moderator of BRS change; \(\beta\) = 0.05, t = 0.34, p = 0.73.

  1. Program Participation
BRS_P4 = summary(lm(data = NAWL4, BRS_Change ~ Mins_Week))
BRS_P4
## 
## Call:
## lm(formula = BRS_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.37526 -0.39695 -0.02998  0.35258  1.35750 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.200859   0.149216   1.346    0.186
## Mins_Week   0.002210   0.002994   0.738    0.465
## 
## Residual standard error: 0.6564 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.01344,    Adjusted R-squared:  -0.01122 
## F-statistic: 0.545 on 1 and 40 DF,  p-value: 0.4647

After removing outliers, program participation was found to explain 1.34% of the change in BRS scores; R2 = 0.01, F(1, 40 ) = 0.54, p = 0.46. Time spent meditating, therefore, remains a non-significant moderator of BRS change; \(\beta\) = 0, t = 0.74, p = 0.46.

Five Facet Mindfulness Questionnaire

Non-Reactivity

  1. Previous Experience
FFMQNR_E4 = summary(lm(data = NAWL4, FFMQNR_Change ~ Avg_Exp))
FFMQNR_E4
## 
## Call:
## lm(formula = FFMQNR_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.5090 -3.3809  0.1007  1.9728  8.0274 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   2.6309     0.7315   3.596 0.000961 ***
## Avg_Exp       1.1709     0.8062   1.452 0.155062    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.704 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.05535,    Adjusted R-squared:  0.02911 
## F-statistic: 2.109 on 1 and 36 DF,  p-value: 0.1551

After removing outliers, previous experience was found to explain 5.54% of the change in FFMQ-Non-Reactivity scores; R2 = 0.06, F(1, 36 ) = 2.11, p = 0.16. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = 1.17, t = 1.45, p = 0.16.

  1. Program Participation
FFMQNR_P4 = summary(lm(data = NAWL4, FFMQNR_Change ~ Mins_Week))
FFMQNR_P4
## 
## Call:
## lm(formula = FFMQNR_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -5.871 -3.221  0.067  1.564  9.730 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  2.46829    0.83699   2.949   0.0053 **
## Mins_Week    0.01908    0.01679   1.136   0.2626   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.682 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.03127,    Adjusted R-squared:  0.007052 
## F-statistic: 1.291 on 1 and 40 DF,  p-value: 0.2626

After removing outliers, program participation was found to explain 3.13% of the change in FFMQ-Non-Reactivity scores; R2 = 0.03, F(1, 40 ) = 1.29, p = 0.26. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Non-Reactivity change; \(\beta\) = 0.02, t = 1.14, p = 0.26.

Observing

  1. Previous Experience
FFMQOB_E4 = summary(lm(data = NAWL4, FFMQOB_Change ~ Avg_Exp))
FFMQOB_E4
## 
## Call:
## lm(formula = FFMQOB_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1636 -1.2662 -0.2662  0.8364  5.8364 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   1.2662     0.4390   2.884  0.00658 **
## Avg_Exp      -0.6161     0.4838  -1.274  0.21099   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.223 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.04311,    Adjusted R-squared:  0.01653 
## F-statistic: 1.622 on 1 and 36 DF,  p-value: 0.211

After removing outliers, previous experience was found to explain 4.31% of the change in FFMQ-Observing scores; R2 = 0.04, F(1, 36 ) = 1.62, p = 0.21. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Observing change; \(\beta\) = -0.62, t = -1.27, p = 0.21.

  1. Program Participation
FFMQOB_P4 = summary(lm(data = NAWL4, FFMQOB_Change ~ Mins_Week))
FFMQOB_P4
## 
## Call:
## lm(formula = FFMQOB_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0384 -1.1368 -0.6314  1.0085  6.0242 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  1.163681   0.527043   2.208    0.033 *
## Mins_Week   -0.004473   0.010575  -0.423    0.675  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.319 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.004452,   Adjusted R-squared:  -0.02044 
## F-statistic: 0.1789 on 1 and 40 DF,  p-value: 0.6746

After removing outliers, program participation was found to explain 0.45% of the change in FFMQ-Observing scores; R2 = 0, F(1, 40 ) = 0.18, p = 0.67. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Observing change; \(\beta\) = 0, t = -0.42, p = 0.67.

Acting with Awareness

  1. Previous Experience
FFMQAA_E4 = summary(lm(data = NAWL4, FFMQAA_Change ~ Avg_Exp))
FFMQAA_E4
## 
## Call:
## lm(formula = FFMQAA_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -6.211 -2.186 -0.175  1.825  7.822 
## 
## Coefficients:
##             Estimate Std. Error t value  Pr(>|t|)    
## (Intercept)  3.17496    0.65972   4.813 0.0000266 ***
## Avg_Exp      0.01787    0.72704   0.025     0.981    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.34 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  1.678e-05,  Adjusted R-squared:  -0.02776 
## F-statistic: 0.000604 on 1 and 36 DF,  p-value: 0.9805

After removing outliers, previous experience was found to explain 0% of the change in FFMQ-Awareness scores; R2 = 0, F(1, 36 ) = 0, p = 0.98. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Awareness change; \(\beta\) = 0.02, t = 0.02, p = 0.98.

  1. Program Participation
FFMQAA_P4 = summary(lm(data = NAWL4, FFMQAA_Change ~ Mins_Week))
FFMQAA_P4
## 
## Call:
## lm(formula = FFMQAA_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.0380 -2.0880 -0.0538  2.1766  8.1939 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.097456   0.818907   3.782 0.000509 ***
## Mins_Week   -0.003964   0.016432  -0.241 0.810587    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.603 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.001453,   Adjusted R-squared:  -0.02351 
## F-statistic: 0.05821 on 1 and 40 DF,  p-value: 0.8106

After removing outliers, program participation was found to explain 0.15% of the change in FFMQ-Awareness scores; R2 = 0, F(1, 40 ) = 0.06, p = 0.81. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Awareness change; \(\beta\) = 0, t = -0.24, p = 0.81.

Describing

  1. Previous Experience
FFMQDS_E4 = summary(lm(data = NAWL4, FFMQDS_Change ~ Avg_Exp))
FFMQDS_E4
## 
## Call:
## lm(formula = FFMQDS_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8056 -2.0932 -0.2097  1.8485  8.9068 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   2.0932     0.6603   3.170  0.00311 **
## Avg_Exp      -0.3835     0.7277  -0.527  0.60140   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.344 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.007657,   Adjusted R-squared:  -0.01991 
## F-statistic: 0.2778 on 1 and 36 DF,  p-value: 0.6014

After removing outliers, previous experience was found to explain 0.77% of the change in FFMQ-Describing scores; R2 = 0.01, F(1, 36 ) = 0.28, p = 0.6. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Describing change; \(\beta\) = -0.38, t = -0.53, p = 0.6.

  1. Program Participation
FFMQDS_P4 = summary(lm(data = NAWL4, FFMQDS_Change ~ Mins_Week))
FFMQDS_P4
## 
## Call:
## lm(formula = FFMQDS_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -6.644 -2.088 -0.197  1.060  9.921 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.96037    0.73711   1.303    0.200
## Mins_Week    0.02255    0.01479   1.525    0.135
## 
## Residual standard error: 3.243 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.05494,    Adjusted R-squared:  0.03131 
## F-statistic: 2.325 on 1 and 40 DF,  p-value: 0.1352

After removing outliers, program participation was found to explain 5.49% of the change in FFMQ-Describing scores; R2 = 0.05, F(1, 40 ) = 2.33, p = 0.14. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Describing change; \(\beta\) = 0.02, t = 1.52, p = 0.14.

Non-Judging

  1. Previous Experience
FFMQNJ_E4 = summary(lm(data = NAWL4, FFMQNJ_Change ~ Avg_Exp))
FFMQNJ_E4
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.2515 -2.4589 -0.6824  2.6304  9.5411 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   3.4589     0.8422   4.107  0.00022 ***
## Avg_Exp      -0.2764     0.9281  -0.298  0.76753    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.264 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.002458,   Adjusted R-squared:  -0.02525 
## F-statistic: 0.08872 on 1 and 36 DF,  p-value: 0.7675

After removing outliers, previous experience was found to explain 0.25% of the change in FFMQ-Non-Judging scores; R2 = 0, F(1, 36 ) = 0.09, p = 0.77. Length of previous experience, therefore, remains a non-significant moderator of FFMQ-Non-Judging change; \(\beta\) = -0.28, t = -0.3, p = 0.77.

  1. Program Participation
FFMQNJ_P4 = summary(lm(data = NAWL4, FFMQNJ_Change ~ Mins_Week))
FFMQNJ_P4
## 
## Call:
## lm(formula = FFMQNJ_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.0191 -2.4546  0.0039  2.6693  9.0250 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  2.93417    0.95549   3.071  0.00383 **
## Mins_Week    0.01416    0.01917   0.739  0.46446   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.203 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.01345,    Adjusted R-squared:  -0.01121 
## F-statistic: 0.5455 on 1 and 40 DF,  p-value: 0.4645

After removing outliers, program participation was found to explain 1.35% of the change in FFMQ-Non-Judging scores; R2 = 0.01, F(1, 40 ) = 0.55, p = 0.46. Time spent meditating, therefore, remains a non-significant moderator of FFMQ-Non-Judging change; \(\beta\) = 0.01, t = 0.74, p = 0.46.

Depression, Anxiety, and Stress Scale

Depression

  1. Previous Experience
DASSD_E4 = summary(lm(data = NAWL4, DASSD_Change ~ Avg_Exp))
DASSD_E4
## 
## Call:
## lm(formula = DASSD_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -21.153  -3.021   1.083   3.602  11.908 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   -2.847      1.326  -2.147   0.0386 *
## Avg_Exp       -1.415      1.461  -0.968   0.3395  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.714 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.02537,    Adjusted R-squared:  -0.001703 
## F-statistic: 0.9371 on 1 and 36 DF,  p-value: 0.3395

After removing outliers, previous experience was found to explain 2.54% of the change in DASS-Depression scores; R2 = 0.03, F(1, 36 ) = 0.94, p = 0.34. Length of previous experience, therefore, remains a non-significant moderator of DASS-Depression change; \(\beta\) = -1.41, t = -0.97, p = 0.34.

  1. Program Participation
DASSD_P4 = summary(lm(data = NAWL4, DASSD_Change ~ Mins_Week))
DASSD_P4
## 
## Call:
## lm(formula = DASSD_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.474  -3.821   1.628   4.220  13.953 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) -1.35950    1.61079  -0.844   0.4037  
## Mins_Week   -0.05654    0.03232  -1.749   0.0879 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.086 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.07106,    Adjusted R-squared:  0.04784 
## F-statistic:  3.06 on 1 and 40 DF,  p-value: 0.08791

After removing outliers, program participation was found to explain 7.11% of the change in DASS-Depression scores; R2 = 0.07, F(1, 40 ) = 3.06, p = 0.09. Time spent meditating, therefore, remains a non-significant moderator of DASS-Depression change; \(\beta\) = -0.06, t = -1.75, p = 0.09.

Anxiety

  1. Previous Experience
DASSA_E4 = summary(lm(data = NAWL4, DASSA_Change ~ Avg_Exp))
DASSA_E4
## 
## Call:
## lm(formula = DASSA_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.872  -2.661  -0.661   3.286  14.390 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   -3.339      1.323  -2.523   0.0162 *
## Avg_Exp        1.265      1.458   0.867   0.3914  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.701 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.02047,    Adjusted R-squared:  -0.006735 
## F-statistic: 0.7525 on 1 and 36 DF,  p-value: 0.3914

After removing outliers, previous experience was found to explain 2.05% of the change in DASS-Anxiety scores; R2 = 0.02, F(1, 36 ) = 0.75, p = 0.39. Length of previous experience, therefore, remains a non-significant moderator of DASS-Anxiety change; \(\beta\) = 1.27, t = 0.87, p = 0.39.

  1. Program Participation
DASSA_P4 = summary(lm(data = NAWL4, DASSA_Change ~ Mins_Week))
DASSA_P4
## 
## Call:
## lm(formula = DASSA_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.1641  -3.6024   0.8359   3.9763  13.3916 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.15085    1.50030  -0.767    0.448
## Mins_Week   -0.04012    0.03010  -1.333    0.190
## 
## Residual standard error: 6.6 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.04251,    Adjusted R-squared:  0.01858 
## F-statistic: 1.776 on 1 and 40 DF,  p-value: 0.1902

After removing outliers, program participation was found to explain 4.25% of the change in DASS-Anxiety scores; R2 = 0.04, F(1, 40 ) = 1.78, p = 0.19. Time spent meditating, therefore, remains a non-significant moderator of DASS-Anxiety change; \(\beta\) = -0.04, t = -1.33, p = 0.19.

Stress

  1. Previous Experience
DASSS_E4 = summary(lm(data = NAWL4, DASSS_Change ~ Avg_Exp))
DASSS_E4
## 
## Call:
## lm(formula = DASSS_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -12.461  -4.490  -2.431   5.562  11.569 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -5.5693     1.4290  -3.897 0.000406 ***
## Avg_Exp       0.1847     1.5748   0.117 0.907285    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.236 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.000382,   Adjusted R-squared:  -0.02739 
## F-statistic: 0.01376 on 1 and 36 DF,  p-value: 0.9073

After removing outliers, previous experience was found to explain 0.04% of the change in DASS-Stress scores; R2 = 0, F(1, 36 ) = 0.01, p = 0.91. Length of previous experience, therefore, remains a non-significant moderator of DASS-Stress change; \(\beta\) = 0.18, t = 0.12, p = 0.91.

  1. Program Participation
DASSS_P4 = summary(lm(data = NAWL4, DASSS_Change ~ Mins_Week))
DASSS_P4
## 
## Call:
## lm(formula = DASSS_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -17.0163  -4.2068  -0.6002   5.3526  14.8001 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept) -5.16723    1.69129  -3.055  0.00399 **
## Mins_Week   -0.03707    0.03394  -1.092  0.28123   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.44 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.02897,    Adjusted R-squared:  0.00469 
## F-statistic: 1.193 on 1 and 40 DF,  p-value: 0.2812

After removing outliers, program participation was found to explain 2.9% of the change in DASS-Stress scores; R2 = 0.03, F(1, 40 ) = 1.19, p = 0.28. Time spent meditating, therefore, remains a non-significant moderator of DASS-Stress change; \(\beta\) = -0.04, t = -1.09, p = 0.28.

Job Effectiveness Questionnaire

  1. Previous Experience
JEQ_E4 = summary(lm(data = NAWL4, JEQ_Change ~ Avg_Exp))
JEQ_E4
## 
## Call:
## lm(formula = JEQ_Change ~ Avg_Exp, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.64396 -0.15543 -0.00879  0.25779  1.32458 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.37324    0.10790   3.459  0.00141 **
## Avg_Exp     -0.03409    0.11891  -0.287  0.77597   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5463 on 36 degrees of freedom
##   (6 observations deleted due to missingness)
## Multiple R-squared:  0.002278,   Adjusted R-squared:  -0.02544 
## F-statistic: 0.08221 on 1 and 36 DF,  p-value: 0.776

After removing outliers, previous experience was found to explain 0.23% of the change in JEQ scores; R2 = 0, F(1, 36 ) = 0.08, p = 0.78. Length of previous experience, therefore, remains a non-significant moderator of JEQ change \(\beta\) = -0.03, t = -0.29, p = 0.78.

  1. Program Participation
JEQ_P4 = summary(lm(data = NAWL4, JEQ_Change ~ Mins_Week))
JEQ_P4
## 
## Call:
## lm(formula = JEQ_Change ~ Mins_Week, data = NAWL4)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.53923 -0.16588  0.04937  0.28528  1.16872 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.163200   0.135390   1.205    0.235
## Mins_Week   0.004067   0.002717   1.497    0.142
## 
## Residual standard error: 0.5956 on 40 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.05305,    Adjusted R-squared:  0.02938 
## F-statistic: 2.241 on 1 and 40 DF,  p-value: 0.1423

After removing outliers, program participation was found to explain 5.31% of the change in JEQ scores; R2 = 0.05, F(1, 40 ) = 2.24, p = 0.14. Time spent meditating, therefore, remains a non-significant moderator of JEQ change; \(\beta\) = 0, t = 1.5, p = 0.14.

Summary of Results

None of the results were found to be statistically significant.

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 supported by moderation analyses, which suggest that neither length of previous meditation experience nor degree of program participation are significant moderators of the change that was observed throughout the program. Importantly, the previously significant relationship between experience and PANAS-Positive change was rendered non-significant by the removal of six participants who reported 20+ years of meditation experience. This suggests that: (1) there may be a difference between those with many years of meditation experience and those with relatively little experience; (2) with respect to positive affect, expertise may temper or limit the amount of positive change that can be achieved throughout the program; and (3) for those with little-to-no meditation experience, change occurs independent from experience length. Overall, therefore, what seems to matter is that one participated, not how much they participated or how much experience they had prior to participating. Our fifth 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.


5. Comparison Between Participants and Norming Data

In this final set of analyses, we will compare participants’ pre- and post-intervention scores with norming data for each measure. We will only include data from participants who actively participated in the mindfulness program and who completed both surveys (i.e. the participants from the first 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:

Norming Data

Before we begin, we’ll create a data set 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 19. 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 19. 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

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 T1 mean and the T2 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_PreT = tsum.test(mean.x = Norm_Data$M[1], s.x = Norm_Data$SD[1], n.x = Norm_Data$n[1], mean.y = mean(NAWL1$T1_PSS), s.y = sd(NAWL1$T1_PSS), n.y = length(NAWL1$T1_PSS))

Calculate Cohen’s d effect size.

PSS_PreD = DInd(t = PSS_PreT$statistic, nx = Norm_Data$n[1], ny = length(NAWL1$T1_PSS))

Post-Intervention

Run the t-test.

PSS_PostT = tsum.test(mean.x = Norm_Data$M[1], s.x = Norm_Data$SD[1], n.x = Norm_Data$n[1], mean.y = mean(NAWL1$T2_PSS), s.y = sd(NAWL1$T2_PSS), n.y = length(NAWL1$T2_PSS))

Calculate Cohen’s d effect size.

PSS_PostD = DInd(t = PSS_PostT$statistic, nx = Norm_Data$n[1], ny = length(NAWL1$T2_PSS))

p-Adjustment

To correct the family-wise error rate, a Holm-Bonferroni adjustment will be used.

PSS_PrePost_p = p.adjust(c(PSS_PreT$p.value, PSS_PostT$p.value), method = c("holm"), n = 2)

Positive and Negative Affect Schedule

T-Tests - Positive Affect

Pre-Intervention

Run the t-test.

PANASP_PreT = tsum.test(mean.x = Norm_Data$M[2], s.x = Norm_Data$SD[2], n.x = Norm_Data$n[2], mean.y = mean(NAWL1$T1_POS_PANAS), s.y = sd(NAWL1$T1_POS_PANAS), n.y = length(NAWL1$T1_POS_PANAS))

Calculate Cohen’s d effect size.

PANASP_PreD = DInd(t = PANASP_PreT$statistic, nx = Norm_Data$n[2], ny = length(NAWL1$T1_POS_PANAS))

Post-Intervention

Run the t-test.

PANASP_PostT = tsum.test(mean.x = Norm_Data$M[2], s.x = Norm_Data$SD[2], n.x = Norm_Data$n[2], mean.y = mean(NAWL1$T2_POS_PANAS), s.y = sd(NAWL1$T2_POS_PANAS), n.y = length(NAWL1$T2_POS_PANAS))

Calculate Cohen’s d effect size.

PANASP_PostD = DInd(t = PANASP_PostT$statistic, nx = Norm_Data$n[2], ny = length(NAWL1$T2_POS_PANAS))

p-Adjustment

PANASP_PrePost_p = p.adjust(c(PANASP_PreT$p.value, PANASP_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Negative Affect

Pre-Intervention

Run the t-test.

PANASN_PreT = tsum.test(mean.x = Norm_Data$M[3], s.x = Norm_Data$SD[3], n.x = Norm_Data$n[3], mean.y = mean(NAWL1$T1_NEG_PANAS), s.y = sd(NAWL1$T1_NEG_PANAS), n.y = length(NAWL1$T1_NEG_PANAS))

Calculate Cohen’s d effect size.

PANASN_PreD = DInd(t = PANASN_PreT$statistic, nx = Norm_Data$n[3], ny = length(NAWL1$T1_NEG_PANAS))

Post-Intervention

Run the t-test.

PANASN_PostT = tsum.test(mean.x = Norm_Data$M[3], s.x = Norm_Data$SD[3], n.x = Norm_Data$n[3], mean.y = mean(NAWL1$T2_NEG_PANAS), s.y = sd(NAWL1$T2_NEG_PANAS), n.y = length(NAWL1$T2_NEG_PANAS))

Calculate Cohen’s d effect size.

PANASN_PostD = DInd(t = PANASN_PostT$statistic, nx = Norm_Data$n[3], ny = length(NAWL1$T2_NEG_PANAS))

p-Adjustment

PANASN_PrePost_p = p.adjust(c(PANASN_PreT$p.value, PANASN_PostT$p.value), method = c("holm"), n = 2)

Brief Resilience Scale

T-Tests

Pre-Intervention

Run the t-test.

BRS_PreT = tsum.test(mean.x = Norm_Data$M[4], s.x = Norm_Data$SD[4], n.x = Norm_Data$n[4], mean.y = mean(NAWL1$T1_BRS), s.y = sd(NAWL1$T1_BRS), n.y = length(NAWL1$T1_BRS))

Calculate Cohen’s d effect size.

BRS_PreD = DInd(t = BRS_PreT$statistic, nx = Norm_Data$n[4], ny = length(NAWL1$T1_BRS))

Post-Intervention

Run the t-test.

BRS_PostT = tsum.test(mean.x = Norm_Data$M[4], s.x = Norm_Data$SD[4], n.x = Norm_Data$n[4], mean.y = mean(NAWL1$T2_BRS), s.y = sd(NAWL1$T2_BRS), n.y = length(NAWL1$T2_BRS))

Calculate Cohen’s d effect size.

BRS_PostD = DInd(t = BRS_PostT$statistic, nx = Norm_Data$n[4], ny = length(NAWL1$T2_BRS))

p-Adjustment

BRS_PrePost_p = p.adjust(c(BRS_PreT$p.value, BRS_PostT$p.value), method = c("holm"), n = 2)

Five Facet Mindfulness Questionnaire

T-Tests - Non-Reactivity

Pre-Intervention

Run the t-test.

FFMQNR_PreT = tsum.test(mean.x = Norm_Data$M[5], s.x = Norm_Data$SD[5], n.x = Norm_Data$n[5], mean.y = mean(NAWL1$T1_NR_FFMQ), s.y = sd(NAWL1$T1_NR_FFMQ), n.y = length(NAWL1$T1_NR_FFMQ))

Calculate Cohen’s d effect size.

FFMQNR_PreD = DInd(t = FFMQNR_PreT$statistic, nx = Norm_Data$n[5], ny = length(NAWL1$T1_NR_FFMQ))

Post-Intervention

Run the t-test.

FFMQNR_PostT = tsum.test(mean.x = Norm_Data$M[5], s.x = Norm_Data$SD[5], n.x = Norm_Data$n[5], mean.y = mean(NAWL1$T2_NR_FFMQ), s.y = sd(NAWL1$T2_NR_FFMQ), n.y = length(NAWL1$T2_NR_FFMQ))

Calculate Cohen’s d effect size.

FFMQNR_PostD = DInd(t = FFMQNR_PostT$statistic, nx = Norm_Data$n[5], ny = length(NAWL1$T2_NR_FFMQ))

p-Adjustment

FFMQNR_PrePost_p = p.adjust(c(FFMQNR_PreT$p.value, FFMQNR_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Observing

Pre-Intervention

Run the t-test.

FFMQOB_PreT = tsum.test(mean.x = Norm_Data$M[6], s.x = Norm_Data$SD[6], n.x = Norm_Data$n[6], mean.y = mean(NAWL1$T1_OB_FFMQ), s.y = sd(NAWL1$T1_OB_FFMQ), n.y = length(NAWL1$T1_OB_FFMQ))

Calculate Cohen’s d effect size.

FFMQOB_PreD = DInd(t = FFMQOB_PreT$statistic, nx = Norm_Data$n[6], ny = length(NAWL1$T1_OB_FFMQ))

Post-Intervention

Run the t-test.

FFMQOB_PostT = tsum.test(mean.x = Norm_Data$M[6], s.x = Norm_Data$SD[6], n.x = Norm_Data$n[6], mean.y = mean(NAWL1$T2_OB_FFMQ), s.y = sd(NAWL1$T2_OB_FFMQ), n.y = length(NAWL1$T2_OB_FFMQ))

Calculate Cohen’s d effect size.

FFMQOB_PostD = DInd(t = FFMQOB_PostT$statistic, nx = Norm_Data$n[6], ny = length(NAWL1$T2_OB_FFMQ))

p-Adjustment

FFMQOB_PrePost_p = p.adjust(c(FFMQOB_PreT$p.value, FFMQOB_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Acting with Awareness

Pre-Intervention

Run the t-test.

FFMQAA_PreT = tsum.test(mean.x = Norm_Data$M[7], s.x = Norm_Data$SD[7], n.x = Norm_Data$n[7], mean.y = mean(NAWL1$T1_AA_FFMQ), s.y = sd(NAWL1$T1_AA_FFMQ), n.y = length(NAWL1$T1_AA_FFMQ))

Calculate Cohen’s d effect size.

FFMQAA_PreD = DInd(t = FFMQAA_PreT$statistic, nx = Norm_Data$n[7], ny = length(NAWL1$T1_AA_FFMQ))

Post-Intervention

Run the t-test.

FFMQAA_PostT = tsum.test(mean.x = Norm_Data$M[7], s.x = Norm_Data$SD[7], n.x = Norm_Data$n[7], mean.y = mean(NAWL1$T2_AA_FFMQ), s.y = sd(NAWL1$T2_AA_FFMQ), n.y = length(NAWL1$T2_AA_FFMQ))

Calculate Cohen’s d effect size.

FFMQAA_PostD = DInd(t = FFMQAA_PostT$statistic, nx = Norm_Data$n[7], ny = length(NAWL1$T2_AA_FFMQ))

p-Adjustment

FFMQAA_PrePost_p = p.adjust(c(FFMQAA_PreT$p.value, FFMQAA_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Describing

Pre-Intervention

Run the t-test.

FFMQDS_PreT = tsum.test(mean.x = Norm_Data$M[8], s.x = Norm_Data$SD[8], n.x = Norm_Data$n[8], mean.y = mean(NAWL1$T1_DS_FFMQ), s.y = sd(NAWL1$T1_DS_FFMQ), n.y = length(NAWL1$T1_DS_FFMQ))

Calculate Cohen’s d effect size.

FFMQDS_PreD = DInd(t = FFMQDS_PreT$statistic, nx = Norm_Data$n[8], ny = length(NAWL1$T1_DS_FFMQ))

Post-Intervention

Run the t-test.

FFMQDS_PostT = tsum.test(mean.x = Norm_Data$M[8], s.x = Norm_Data$SD[8], n.x = Norm_Data$n[8], mean.y = mean(NAWL1$T2_DS_FFMQ), s.y = sd(NAWL1$T2_DS_FFMQ), n.y = length(NAWL1$T2_DS_FFMQ))

Calculate Cohen’s d effect size.

FFMQDS_PostD = DInd(t = FFMQDS_PostT$statistic, nx = Norm_Data$n[8], ny = length(NAWL1$T2_DS_FFMQ))

p-Adjustment

FFMQDS_PrePost_p = p.adjust(c(FFMQDS_PreT$p.value, FFMQDS_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Non-Judging

Pre-Intervention

Run the t-test.

FFMQNJ_PreT = tsum.test(mean.x = Norm_Data$M[9], s.x = Norm_Data$SD[9], n.x = Norm_Data$n[9], mean.y = mean(NAWL1$T1_NJ_FFMQ), s.y = sd(NAWL1$T1_NJ_FFMQ), n.y = length(NAWL1$T1_NJ_FFMQ))

Calculate Cohen’s d effect size.

FFMQNJ_PreD = DInd(t = FFMQNJ_PreT$statistic, nx = Norm_Data$n[9], ny = length(NAWL1$T1_NJ_FFMQ))

Post-Intervention

Run the t-test.

FFMQNJ_PostT = tsum.test(mean.x = Norm_Data$M[9], s.x = Norm_Data$SD[9], n.x = Norm_Data$n[9], mean.y = mean(NAWL1$T2_NJ_FFMQ), s.y = sd(NAWL1$T2_NJ_FFMQ), n.y = length(NAWL1$T2_NJ_FFMQ))

Calculate Cohen’s d effect size.

FFMQNJ_PostD = DInd(t = FFMQNJ_PostT$statistic, nx = Norm_Data$n[9], ny = length(NAWL1$T2_NJ_FFMQ))

p-Adjustment

FFMQNJ_PrePost_p = p.adjust(c(FFMQNJ_PreT$p.value, FFMQNJ_PostT$p.value), method = c("holm"), n = 2)

Depression, Anxiety, and Stress Scale

T-Tests - Depression

Pre-Intervention

Run the t-test.

DASSD_PreT = tsum.test(mean.x = Norm_Data$M[10], s.x = Norm_Data$SD[10], n.x = Norm_Data$n[10], mean.y = mean(NAWL1$T1_D_DASS), s.y = sd(NAWL1$T1_D_DASS), n.y = length(NAWL1$T1_D_DASS))

Calculate Cohen’s d effect size.

DASSD_PreD = DInd(t = DASSD_PreT$statistic, nx = Norm_Data$n[10], ny = length(NAWL1$T1_D_DASS))

Post-Intervention

Run the t-test.

DASSD_PostT = tsum.test(mean.x = Norm_Data$M[10], s.x = Norm_Data$SD[10], n.x = Norm_Data$n[10], mean.y = mean(NAWL1$T2_D_DASS), s.y = sd(NAWL1$T2_D_DASS), n.y = length(NAWL1$T2_D_DASS))

Calculate Cohen’s d effect size.

DASSD_PostD = DInd(t = DASSD_PostT$statistic, nx = Norm_Data$n[10], ny = length(NAWL1$T2_D_DASS))

p-Adjustment

DASSD_PrePost_p = p.adjust(c(DASSD_PreT$p.value, DASSD_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Anxiety

Pre-Intervention

Run the t-test.

DASSA_PreT = tsum.test(mean.x = Norm_Data$M[11], s.x = Norm_Data$SD[11], n.x = Norm_Data$n[11], mean.y = mean(NAWL1$T1_A_DASS), s.y = sd(NAWL1$T1_A_DASS), n.y = length(NAWL1$T1_A_DASS))

Calculate Cohen’s d effect size.

DASSA_PreD = DInd(t = DASSA_PreT$statistic, nx = Norm_Data$n[11], ny = length(NAWL1$T1_A_DASS))

Post-Intervention

Run the t-test.

DASSA_PostT = tsum.test(mean.x = Norm_Data$M[11], s.x = Norm_Data$SD[11], n.x = Norm_Data$n[11], mean.y = mean(NAWL1$T2_A_DASS), s.y = sd(NAWL1$T2_A_DASS), n.y = length(NAWL1$T2_A_DASS))

Calculate Cohen’s d effect size.

DASSA_PostD = DInd(t = DASSA_PostT$statistic, nx = Norm_Data$n[11], ny = length(NAWL1$T2_A_DASS))

p-Adjustment

DASSA_PrePost_p = p.adjust(c(DASSA_PreT$p.value, DASSA_PostT$p.value), method = c("holm"), n = 2)

T-Tests - Stress

Pre-Intervention

Run the t-test.

DASSS_PreT = tsum.test(mean.x = Norm_Data$M[12], s.x = Norm_Data$SD[12], n.x = Norm_Data$n[12], mean.y = mean(NAWL1$T1_S_DASS), s.y = sd(NAWL1$T1_S_DASS), n.y = length(NAWL1$T1_S_DASS))

Calculate Cohen’s d effect size.

DASSS_PreD = DInd(t = DASSS_PreT$statistic, nx = Norm_Data$n[12], ny = length(NAWL1$T1_S_DASS))

Post-Intervention

Run the t-test.

DASSS_PostT = tsum.test(mean.x = Norm_Data$M[12], s.x = Norm_Data$SD[12], n.x = Norm_Data$n[12], mean.y = mean(NAWL1$T2_S_DASS), s.y = sd(NAWL1$T2_S_DASS), n.y = length(NAWL1$T2_S_DASS))

Calculate Cohen’s d effect size.

DASSS_PostD = DInd(t = DASSS_PostT$statistic, nx = Norm_Data$n[12], ny = length(NAWL1$T2_S_DASS))

p-Adjustment

DASSS_PrePost_p = p.adjust(c(DASSS_PreT$p.value, DASSS_PostT$p.value), method = c("holm"), n = 2)

Comparisons

# Create a list of pre-intervention comparison values:

Pre_Ms = c((round(mean(NAWL1$T1_PSS), 2)), (round(mean(NAWL1$T1_POS_PANAS), 2)), (round(mean(NAWL1$T1_NEG_PANAS), 2)), (round(mean(NAWL1$T1_BRS), 2)), (round(mean(NAWL1$T1_NR_FFMQ), 2)), (round(mean(NAWL1$T1_OB_FFMQ), 2)), (round(mean(NAWL1$T1_AA_FFMQ), 2)), (round(mean(NAWL1$T1_DS_FFMQ), 2)), (round(mean(NAWL1$T1_NJ_FFMQ), 2)), (round(mean(NAWL1$T1_D_DASS), 2)), (round(mean(NAWL1$T1_A_DASS), 2)), (round(mean(NAWL1$T1_S_DASS), 2)))

Pre_SDs = c((round(sd(NAWL1$T1_PSS), 2)), (round(sd(NAWL1$T1_POS_PANAS), 2)), (round(sd(NAWL1$T1_NEG_PANAS), 2)), (round(sd(NAWL1$T1_BRS), 2)), (round(sd(NAWL1$T1_NR_FFMQ), 2)), (round(sd(NAWL1$T1_OB_FFMQ), 2)), (round(sd(NAWL1$T1_AA_FFMQ), 2)), (round(sd(NAWL1$T1_DS_FFMQ), 2)), (round(sd(NAWL1$T1_NJ_FFMQ), 2)), (round(sd(NAWL1$T1_D_DASS), 2)), (round(sd(NAWL1$T1_A_DASS), 2)), (round(sd(NAWL1$T1_S_DASS), 2)))

Pre_Ts = c((round(PSS_PreT$statistic, 2)), (round(PANASP_PreT$statistic, 2)), (round(PANASN_PreT$statistic, 2)), (round(BRS_PreT$statistic, 2)), (round(FFMQNR_PreT$statistic, 2)), (round(FFMQOB_PreT$statistic, 2)), (round(FFMQAA_PreT$statistic, 2)), (round(FFMQDS_PreT$statistic, 2)), (round(FFMQNJ_PreT$statistic, 2)), (round(DASSD_PreT$statistic, 2)), (round(DASSA_PreT$statistic, 2)), (round(DASSS_PreT$statistic, 2)))

Pre_DFs = c((round(PSS_PreT$parameters, 2)), (round(PANASP_PreT$parameters, 2)), (round(PANASN_PreT$parameters, 2)), (round(BRS_PreT$parameters, 2)), (round(FFMQNR_PreT$parameters, 2)), (round(FFMQOB_PreT$parameters, 2)), (round(FFMQAA_PreT$parameters, 2)), (round(FFMQDS_PreT$parameters, 2)), (round(FFMQNJ_PreT$parameters, 2)), (round(DASSD_PreT$parameters, 2)), (round(DASSA_PreT$parameters, 2)), (round(DASSS_PreT$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(NAWL1$T2_PSS), 2)), (round(mean(NAWL1$T2_POS_PANAS), 2)), (round(mean(NAWL1$T2_NEG_PANAS), 2)), (round(mean(NAWL1$T2_BRS), 2)), (round(mean(NAWL1$T2_NR_FFMQ), 2)), (round(mean(NAWL1$T2_OB_FFMQ), 2)), (round(mean(NAWL1$T2_AA_FFMQ), 2)), (round(mean(NAWL1$T2_DS_FFMQ), 2)), (round(mean(NAWL1$T2_NJ_FFMQ), 2)), (round(mean(NAWL1$T2_D_DASS), 2)), (round(mean(NAWL1$T2_A_DASS), 2)), (round(mean(NAWL1$T2_S_DASS), 2)))

Post_SDs = c((round(sd(NAWL1$T2_PSS), 2)), (round(sd(NAWL1$T2_POS_PANAS), 2)), (round(sd(NAWL1$T2_NEG_PANAS), 2)), (round(sd(NAWL1$T2_BRS), 2)), (round(sd(NAWL1$T2_NR_FFMQ), 2)), (round(sd(NAWL1$T2_OB_FFMQ), 2)), (round(sd(NAWL1$T2_AA_FFMQ), 2)), (round(sd(NAWL1$T2_DS_FFMQ), 2)), (round(sd(NAWL1$T2_NJ_FFMQ), 2)), (round(sd(NAWL1$T2_D_DASS), 2)), (round(sd(NAWL1$T2_A_DASS), 2)), (round(sd(NAWL1$T2_S_DASS), 2)))

Post_Ts = c((round(PSS_PostT$statistic, 2)), (round(PANASP_PostT$statistic, 2)), (round(PANASN_PostT$statistic, 2)), (round(BRS_PostT$statistic, 2)), (round(FFMQNR_PostT$statistic, 2)), (round(FFMQOB_PostT$statistic, 2)), (round(FFMQAA_PostT$statistic, 2)), (round(FFMQDS_PostT$statistic, 2)), (round(FFMQNJ_PostT$statistic, 2)), (round(DASSD_PostT$statistic, 2)), (round(DASSA_PostT$statistic, 2)), (round(DASSS_PostT$statistic, 2)))

Post_DFs = c((round(PSS_PostT$parameters, 2)), (round(PANASP_PostT$parameters, 2)), (round(PANASN_PostT$parameters, 2)), (round(BRS_PostT$parameters, 2)), (round(FFMQNR_PostT$parameters, 2)), (round(FFMQOB_PostT$parameters, 2)), (round(FFMQAA_PostT$parameters, 2)), (round(FFMQDS_PostT$parameters, 2)), (round(FFMQNJ_PostT$parameters, 2)), (round(DASSD_PostT$parameters, 2)), (round(DASSA_PostT$parameters, 2)), (round(DASSS_PostT$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 20. 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 all measures, n = 44. Values in bold are significant at the p < .05 level.", title_format = c("italic"), footnote_as_chunk = TRUE)
Table 20. 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
45.39 8.73 -19.44 44.17 0 -2.96 38.23 8.71 -14.07 44.18 0 -2.14
Positive and Negative Affect Schedule
Positive Affect 29.43 7.94 2.08 48.15 0.0848 0.33 33.86 6.55 -1.81 50.65 0.0848 -0.28
Negative Affect 28.36 8.37 -6.85 47.63 0 -1.07 23.50 8.23 -3.14 47.79 0.0029 -0.49
Brief Resilience Scale
3.05 0.92 4.65 45.50 0.0001 0.72 3.35 0.90 2.55 45.60 0.0141 0.39
Five Facet Mindfulness Questionnaire
Non-Reactivity 11.20 4.28 3.41 48.30 0.0027 0.54 14.30 3.74 -1.41 50.02 0.1648 -0.22
Observing 12.66 3.77 2.03 50.55 0.0958 0.32 13.64 3.59 0.40 51.37 0.6944 0.06
Awareness 13.34 4.37 -0.22 48.97 0.8255 -0.04 16.25 3.45 -5.59 52.74 0 -0.89
Describing 17.00 3.64 -1.23 55.27 0.2234 -0.20 18.75 3.57 -4.30 55.79 0.0001 -0.68
Non-Judging 12.98 4.51 1.58 49.75 0.1206 0.25 16.23 4.36 -3.13 50.24 0.0058 -0.50
Depression, Anxiety, and Stress Scale
Depression 11.95 9.55 -4.21 48.75 0.0002 -0.66 8.59 8.37 -2.20 50.55 0.0324 -0.35
Anxiety 9.09 7.20 -4.55 48.93 0.0001 -0.72 6.36 5.14 -2.88 54.92 0.0057 -0.45
Stress 19.50 9.11 -8.04 48.45 0 -1.26 13.09 8.95 -3.57 48.66 0.0008 -0.56
Note: For all measures, n = 44. Values in bold are significant at the p < .05 level.

Compared to the norming populations considered, participants began the study with significantly higher scores on the PSS, PANAS-Negative, DASS-Depression, DASS-Anxiety, and DASS-Stress, as well as significantly lower scores on the BRS and FFMQ-Non-Reactivity. Following the completion of the mindfulness intervention, participants were no longer significantly different from the norming populations with respect to the FFMQ-Non-Reactivity, though they remained significantly lower on the BRS and significantly higher on the PSS, PANAS-Negative, and all subscales of the DASS. Compared to the norming population, participants also ended the study with significantly higher scores on the Awareness, Describing, and Non-Judging subscales of the FFMQ.

Conclusion

A comparison between norming data and self-report scores indicated that participants were initially experiencing higher levels of perceived stress and negative affect and significantly more symptoms associated with depression, anxiety, and stress than is present in the general population. Participants also began the study with lower than normal levels of resilience and, compared to a population with symptoms of depression and anxiety, lower levels of non-reactivity. 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: following the intervention, they were no longer lower on non-reactivity and they were, in fact, higher on awareness, describing, and non-judgmentalness. Participants also experienced significant increases in resilience and decreases in perceived stress, negative affect, and symptoms associated with depression, anxiety, and stress; these changes, however, did not raise participant BRS scores or lower PSS, PANAS-Negative, or DASS scores to the level of scores reported by the respective norming samples. This seems to suggest, therefore, that, though the intervention was successful in effecting change, there remains room for further improvements.


Overall Conclusions

Overall, the completion of the mindfulness intervention was associated with a decrease in stress, negative affect, and symptoms associated with depression, anxiety, and stress, as well as increases in positive affect, resilience, non-reactivity, observing, acting with awareness, describing, non-judging, and perceived job competence. Though these changes ultimately failed to fully assimilate participants to the norming populations considered, significant changes were observed, suggesting that the intervention was effective in enhancing participants’ mindfulness and improving their psychological well-being. Based on correlation and moderation analyses, improvements seem to be unrelated to the amount of program engagement (i.e. the amount of time spent meditating throughout the 8-week program) and length of previous meditation experience. It is, however, important to note that, due to the use of a convenience sampling technique, this study lacked a comparable control group. Consequently, though the significant findings and general trends within the data are promising, these results should be interpreted with caution. (A follow-up study designed to address this potential limitation has since been conducted. The results of this follow-up study are publicly available on RPubs: Main Study Analysis Summary, Main Study Full Analysis)