Author

Sarah Morris

Published

February 19, 2025

Code
library(tidyr)
library(scales)
library(stringr)
library(readxl)      # For reading Excel files
library(dplyr)       # For data manipulation
library(ggplot2)     # For data visualization
library(patchwork)   # For combining plots
library(forcats)     # For factor manipulation
library(gridExtra)
library(reshape2)
library(knitr)
library(effsize) # For Cohen's d
library(emmeans) # For post-hoc tests

# Read the qualitative data
data <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", 
                   sheet = "qual_reasonsNoRMT_other")
# Load the quantitative data
df <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Load the qual data - influences
data_inf <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "qual_influences_other")

1 Athletes or Not Athletes?

Code
## 1. SETUP: PREPARE DATA AND SET RESPONSE CATEGORIES --------------------------

# Long format for the data with factor levels to control order
df_long <- data.frame(
  Response = c(df$athletesPre, df$athletesPost),
  Time = factor(rep(c("Pre-survey", "Post-survey"), each = nrow(df)), 
                levels = c("Pre-survey", "Post-survey"))
)

# Remove NA values
df_long <- df_long[!is.na(df_long$Response), ]
valid_responses <- c("Strongly disagree", "Somewhat disagree", "Neither agree nor disagree", "Neither agree/disagree", "Somewhat agree", "Strongly agree")
df_long <- df_long[df_long$Response %in% valid_responses, ]

# Define the specific order of agreement levels - include only "Neither agree nor disagree"
agreement_levels <- c("Strongly disagree", "Somewhat disagree", "Neither agree nor disagree", "Somewhat agree", "Strongly agree")

# Standardize the "Neither" response format to ensure consistency
df_long$Response <- gsub("Neither agree/disagree", "Neither agree nor disagree", df_long$Response)

# Ensure Response is a factor with proper levels
df_long$Response <- factor(df_long$Response, levels = agreement_levels)

## 2. MAIN COMPARISON: PRE VS POST SURVEY --------------------------------------

# Calculate percentages for each group
df_summary <- df_long %>%
  group_by(Time, Response) %>%
  summarise(count = n(), .groups = "keep") %>%
  group_by(Time) %>%
  mutate(percentage = round(count/sum(count)*100, 1))

# Count the total for pre and post N
pre_count <- sum(df_summary$count[df_summary$Time == "Pre-survey"])
post_count <- sum(df_summary$count[df_summary$Time == "Post-survey"])

# Create the main comparison bar plot (counts)
main_plot_counts <- ggplot(df_summary, aes(x = Response, y = count, fill = Time)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = paste0(count, "\n(", percentage, "%)")),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  labs(title = "Do you agree/disagree that wind instrumentalists\nshould be considered breathing muscle athletes?",
       y = "Number of Participants") +
  theme_minimal() +
  theme(text = element_text(size = 12),
        axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title.x = element_blank(),
        legend.title = element_blank(),
        plot.title = element_text(hjust = 0.5),
        plot.margin = margin(10, 10, 20, 10)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = c(paste0("Pre-survey (n = ", pre_count, ")"), 
                                paste0("Post-survey (n = ", post_count, ")")))

# Display the main counts plot
print(main_plot_counts)

Code
# Create the main comparison bar plot (percentages)
main_plot_percentages <- ggplot(df_summary, aes(x = Response, y = percentage, fill = Time)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = paste0(count, "\n(", percentage, "%)")),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  labs(title = "Do you agree/disagree that wind instrumentalists\nshould be considered breathing muscle athletes?",
       y = "Percentage of Participants (%)") +
  theme_minimal() +
  theme(text = element_text(size = 12),
        axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title.x = element_blank(),
        legend.title = element_blank(),
        plot.title = element_text(hjust = 0.5),
        plot.margin = margin(10, 10, 20, 10)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = c(paste0("Pre-survey (n = ", pre_count, ")"), 
                                paste0("Post-survey (n = ", post_count, ")")))

# Display the main percentages plot
print(main_plot_percentages)

Code
## 3. STATISTICAL ANALYSIS OF PRE VS POST DIFFERENCES --------------------------

# Create contingency table
contingency_table <- table(df_long$Time, df_long$Response)

# Print the contingency table
print("Contingency table:")
[1] "Contingency table:"
Code
print(contingency_table)
             
              Strongly disagree Somewhat disagree Neither agree nor disagree
  Pre-survey                 67               132                        188
  Post-survey                61               122                        269
             
              Somewhat agree Strongly agree
  Pre-survey             570            578
  Post-survey            631            457
Code
# Perform chi-square test
chi_square_test <- chisq.test(contingency_table)
print(chi_square_test)

    Pearson's Chi-squared test

data:  contingency_table
X-squared = 32.268, df = 4, p-value = 1.687e-06
Code
# Get the standardized adjusted residuals directly from chi-square test
adj_residuals_std <- chi_square_test$stdres
print("Standardized adjusted residuals (values > |1.96| indicate significant differences at p < 0.05):")
[1] "Standardized adjusted residuals (values > |1.96| indicate significant differences at p < 0.05):"
Code
print(adj_residuals_std)
             
              Strongly disagree Somewhat disagree Neither agree nor disagree
  Pre-survey          0.5605171         0.6821517                 -4.0687654
  Post-survey        -0.5605171        -0.6821517                  4.0687654
             
              Somewhat agree Strongly agree
  Pre-survey      -2.1825581      4.6818986
  Post-survey      2.1825581     -4.6818986
Code
# Calculate effect size (Cramer's V)
cramers_v <- sqrt(chi_square_test$statistic / (sum(contingency_table) * (min(dim(contingency_table)) - 1)))
print("Cramer's V effect size:")
[1] "Cramer's V effect size:"
Code
print(cramers_v)
X-squared 
0.1024381 
Code
# Convert to dataframe for plotting and fix any potential issues
residual_df <- as.data.frame(as.table(adj_residuals_std))
names(residual_df) <- c("Time", "Response", "Residual")

# Create residual plot
residual_plot <- ggplot(residual_df, aes(x = Response, y = Time, fill = Residual)) +
  geom_tile() +
  geom_text(aes(label = round(Residual, 2)), color = "black") +
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                      midpoint = 0,
                      name = "Adjusted\nResiduals") +
  theme_minimal() +
  labs(title = "Adjusted Residuals from Chi-Square Test",
       subtitle = "Values > |1.96| indicate significant differences at p < 0.05") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

# Print the plot
print(residual_plot)

Code
## 4. ANALYSIS BY RMT GROUP (PRE-SURVEY) ---------------------------------------

# Create dataframe for pre responses based on RMTMethods_YN
df_pre <- data.frame(
  Response = df$athletesPre,
  RMT = df$RMTMethods_YN
)

# Remove NA values
df_pre <- df_pre[!is.na(df_pre$Response) & !is.na(df_pre$RMT), ]

# Standardize response format - check for "Neither agree nor disagree" 
df_pre$Response <- gsub("Neither agree/disagree", "Neither agree nor disagree", df_pre$Response)

# Define agreement levels with only the correct "Neither" format
agreement_order_clean <- c("Strongly disagree", "Somewhat disagree", "Neither agree nor disagree", 
                          "Somewhat agree", "Strongly agree")

# Set Response factor with proper order
df_pre$Response <- factor(df_pre$Response, levels = agreement_order_clean)

# Create contingency table
pre_cont_table <- table(df_pre$RMT, df_pre$Response)

# Print the contingency table
print("Pre-survey Contingency Table Between RMT Groups:")
[1] "Pre-survey Contingency Table Between RMT Groups:"
Code
print(pre_cont_table)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0                55               111                        169
  1                12                21                         19
   
    Somewhat agree Strongly agree
  0            503            469
  1             67            109
Code
# Calculate percentages within each RMT group for statistical tests
pre_prop_table <- round(prop.table(pre_cont_table, margin = 1) * 100, 1)
print("Pre-survey Percentages Between RMT groups:")
[1] "Pre-survey Percentages Between RMT groups:"
Code
print(pre_prop_table)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0               4.2               8.5                       12.9
  1               5.3               9.2                        8.3
   
    Somewhat agree Strongly agree
  0           38.5           35.9
  1           29.4           47.8
Code
# Perform chi-square test
pre_chi_test <- chisq.test(pre_cont_table)
print("Pre-survey Chi-square test results:")
[1] "Pre-survey Chi-square test results:"
Code
print(pre_chi_test)

    Pearson's Chi-squared test

data:  pre_cont_table
X-squared = 15.619, df = 4, p-value = 0.003575
Code
# Check if any expected cell count is less than 5
if (any(pre_chi_test$expected < 5)) {
  # Use simulation for Fisher's exact test
  pre_fisher_test <- fisher.test(pre_cont_table, simulate.p.value = TRUE, B = 10000)
  print("Fisher's exact test results (due to low expected counts):")
  print(pre_fisher_test)
}

# Calculate adjusted residuals
pre_adj_residuals <- pre_chi_test$residuals
print("Pre-survey Adjusted residuals:")
[1] "Pre-survey Adjusted residuals:"
Code
print(pre_adj_residuals)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0        -0.2711772        -0.1314413                  0.7053716
  1         0.6492673         0.3147040                 -1.6888393
   
    Somewhat agree Strongly agree
  0      0.8018261     -1.0434017
  1     -1.9197760      2.4981695
Code
# Calculate Cramer's V
pre_cramers_v <- sqrt(pre_chi_test$statistic / (sum(pre_cont_table) * (min(dim(pre_cont_table)) - 1)))
print("Pre-survey Cramer's V effect size:")
[1] "Pre-survey Cramer's V effect size:"
Code
print(pre_cramers_v)
X-squared 
0.1008728 
Code
# Calculate count summary for each group
pre_count_summary <- as.data.frame(pre_cont_table)
names(pre_count_summary) <- c("RMT", "Response", "Count")

# Calculate totals by RMT group
pre_rmt_totals <- aggregate(Count ~ RMT, data = pre_count_summary, FUN = sum)

# Calculate percentages within each RMT group
pre_count_summary <- pre_count_summary %>%
  left_join(pre_rmt_totals, by = "RMT") %>%
  rename(Total = Count.y) %>%
  mutate(
    Percentage = round(Count.x / Total * 100, 1),
    Count = Count.x
  ) %>%
  select(-Count.x)

# Convert RMT values from 0/1 to No/Yes with proper labels including counts
pre_count_summary$RMT <- factor(
  ifelse(pre_count_summary$RMT == "0", "No", "Yes"), 
  levels = c("Yes", "No")
)

# Create plot - Count version
pre_rmt_plot_counts <- ggplot(pre_count_summary, aes(x = Response, y = Count, fill = RMT)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 3) +
  labs(title = "Are Wind Instrumentalists Respiratory Muscle Athletes?\nPre-survey",
       y = "Number of Participants",
       x = NULL) +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    name = "RMT Device Use",
    labels = c(
      paste0("Yes (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "1"], ")"),
      paste0("No (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "0"], ")")
    )
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))  # Add space at the top

# Create plot - Percentage version
pre_rmt_plot_percentages <- ggplot(pre_count_summary, aes(x = Response, y = Percentage, fill = RMT)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 3) +
  labs(title = "Are Wind Instrumentalists Respiratory Muscle Athletes?\nPre-survey",
       y = "Percentage within RMT Group (%)",
       x = NULL) +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    name = "RMT Device Use",
    labels = c(
      paste0("Yes (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "1"], ")"),
      paste0("No (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "0"], ")")
    )
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))  # Add space at the top

# Display pre RMT plots
print(pre_rmt_plot_counts)

Code
print(pre_rmt_plot_percentages)

Code
## 5. ANALYSIS BY RMT GROUP (POST-SURVEY) --------------------------------------

# Create dataframe for post responses based on RMTMethods_YN
df_post <- data.frame(
  Response = df$athletesPost,
  RMT = df$RMTMethods_YN
)

# Remove NA values
df_post <- df_post[!is.na(df_post$Response) & !is.na(df_post$RMT), ]

# Standardize response format - check "Neither agree nor disagree" 
df_post$Response <- gsub("Neither agree/disagree", "Neither agree nor disagree", df_post$Response)

# Set Response factor with proper order
df_post$Response <- factor(df_post$Response, levels = agreement_order_clean)

# Create contingency table
post_cont_table <- table(df_post$RMT, df_post$Response)

# Print the contingency table
print("Post-survey Contingency Table Between RMT Groups:")
[1] "Post-survey Contingency Table Between RMT Groups:"
Code
print(post_cont_table)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0                53               104                        239
  1                 8                18                         30
   
    Somewhat agree Strongly agree
  0            558            359
  1             73             98
Code
# Calculate percentages within each RMT group for statistical tests
post_prop_table <- round(prop.table(post_cont_table, margin = 1) * 100, 1)
print("Post-survey Percentages within RMT groups:")
[1] "Post-survey Percentages within RMT groups:"
Code
print(post_prop_table)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0               4.0               7.9                       18.2
  1               3.5               7.9                       13.2
   
    Somewhat agree Strongly agree
  0           42.5           27.3
  1           32.2           43.2
Code
# Perform chi-square test
print("Post-survey Chi-square test results:")
[1] "Post-survey Chi-square test results:"
Code
post_chi_test <- chisq.test(post_cont_table)
print(post_chi_test)

    Pearson's Chi-squared test

data:  post_cont_table
X-squared = 24.276, df = 4, p-value = 7.032e-05
Code
# Check if any expected cell count is less than 5
if (any(post_chi_test$expected < 5)) {
  # Use simulation for Fisher's exact test
  post_fisher_test <- fisher.test(post_cont_table, simulate.p.value = TRUE, B = 10000)
  print("Fisher's exact test results (due to low expected counts):")
  print(post_fisher_test)
}

# Calculate adjusted residuals
post_adj_residuals <- post_chi_test$residuals
print("Post-survey Adjusted residuals:")
[1] "Post-survey Adjusted residuals:"
Code
print(post_adj_residuals)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0       0.137493256      -0.001655391                0.637290749
  1      -0.330674595       0.003981256               -1.532699617
   
    Somewhat agree Strongly agree
  0    0.862746002   -1.552087917
  1   -2.074924935    3.732808862
Code
# Calculate Cramer's V
post_cramers_v <- sqrt(post_chi_test$statistic / (sum(post_cont_table) * (min(dim(post_cont_table)) - 1)))
print("Post-survey Cramer's V effect size:")
[1] "Post-survey Cramer's V effect size:"
Code
print(post_cramers_v)
X-squared 
0.1255535 
Code
# Calculate count summary for each group
post_count_summary <- as.data.frame(post_cont_table)
names(post_count_summary) <- c("RMT", "Response", "Count")

# Calculate totals by RMT group
post_rmt_totals <- aggregate(Count ~ RMT, data = post_count_summary, FUN = sum)

# Calculate percentages within each RMT group
post_count_summary <- post_count_summary %>%
  left_join(post_rmt_totals, by = "RMT") %>%
  rename(Total = Count.y) %>%
  mutate(
    Percentage = round(Count.x / Total * 100, 1),
    Count = Count.x
  ) %>%
  select(-Count.x)

# Convert RMT values from 0/1 to No/Yes with proper labels including counts
post_count_summary$RMT <- factor(
  ifelse(post_count_summary$RMT == "0", "No", "Yes"), 
  levels = c("Yes", "No")
)

# Create plot - Count version
post_rmt_plot_counts <- ggplot(post_count_summary, aes(x = Response, y = Count, fill = RMT)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 3) +
  labs(title = "Are Wind Instrumentalists Respiratory Muscle Athletes?\nPost-survey",
       y = "Number of Participants",
       x = NULL) +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    name = "RMT Device Use",
    labels = c(
      paste0("Yes (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "1"], ")"),
      paste0("No (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "0"], ")")
    )
  ) +
  # Increase the y-axis space to make all labels visible
  scale_y_continuous(expand = expansion(mult = c(0, 0.35)))

# Create plot - Percentage version
post_rmt_plot_percentages <- ggplot(post_count_summary, aes(x = Response, y = Percentage, fill = RMT)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 3) +
  labs(title = "Are Wind Instrumentalists Respiratory Muscle Athletes?\nPost-survey",
       y = "Percentage within RMT Group (%)",
       x = NULL) +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    name = "RMT Device Use",
    labels = c(
      paste0("Yes (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "1"], ")"),
      paste0("No (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "0"], ")")
    )
  ) +
  # Increase the y-axis space to make all labels visible
  scale_y_continuous(expand = expansion(mult = c(0, 0.35)))

# Display post RMT plots
print(post_rmt_plot_counts)

Code
print(post_rmt_plot_percentages)

Code
## 6. COMBINED RMT ANALYSIS (PRE & POST) ---------------------------------------

# Combine pre and post count summaries
pre_count_summary$Time <- "Pre"
post_count_summary$Time <- "Post"
combined_count_summary <- rbind(pre_count_summary, post_count_summary)

# Create a Group variable for better labeling
combined_count_summary$Group <- paste(combined_count_summary$RMT, "-", combined_count_summary$Time)

# Create more intuitive ordering for the groups
combined_count_summary$Group <- factor(combined_count_summary$Group, 
                                      levels = c("Yes - Pre", "Yes - Post", "No - Pre", "No - Post"))

# Ensure all response categories are present
all_combinations <- expand.grid(
  Response = agreement_order_clean,
  Group = levels(combined_count_summary$Group),
  stringsAsFactors = FALSE
)

# Extract RMT and Time from Group for joining
all_combinations$RMT <- factor(gsub(" - .*", "", all_combinations$Group), levels = c("Yes", "No"))
all_combinations$Time <- gsub(".* - ", "", all_combinations$Group)

# Check for missing combinations
missing_combinations <- anti_join(
  all_combinations, 
  combined_count_summary[, c("Response", "Group", "RMT", "Time")],
  by = c("Response", "Group", "RMT", "Time")
)

# Add missing combinations with zero counts
if (nrow(missing_combinations) > 0) {
  for (i in 1:nrow(missing_combinations)) {
    # Find the corresponding total for this RMT/Time combination
    total_for_group <- ifelse(
      missing_combinations$Time[i] == "Pre",
      pre_rmt_totals$Count[pre_rmt_totals$RMT == ifelse(missing_combinations$RMT[i] == "Yes", "1", "0")],
      post_rmt_totals$Count[post_rmt_totals$RMT == ifelse(missing_combinations$RMT[i] == "Yes", "1", "0")]
    )
    
    # Add the row with zero count
    new_row <- data.frame(
      RMT = missing_combinations$RMT[i],
      Response = missing_combinations$Response[i],
      Count = 0,
      Total = total_for_group,
      Percentage = 0,
      Time = missing_combinations$Time[i],
      Group = missing_combinations$Group[i],
      stringsAsFactors = FALSE
    )
    combined_count_summary <- rbind(combined_count_summary, new_row)
  }
}

# Ensure Response is properly ordered as factor
combined_count_summary$Response <- factor(combined_count_summary$Response, levels = agreement_order_clean)

# Create combined plot - Counts version
combined_plot_counts <- ggplot(combined_count_summary, aes(x = Response, y = Count, fill = Group)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 2.5) +
  labs(title = "Comparison of Pre and Post Responses by RMT Group",
       y = "Number of Participants",
       x = NULL,
       fill = "RMT Device use") +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    labels = c(
      paste0("Yes - Pre (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "1"], ")"),
      paste0("Yes - Post (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "1"], ")"),
      paste0("No - Pre (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "0"], ")"),
      paste0("No - Post (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "0"], ")")
    )
  ) +
  # Increase the y-axis space to make all labels visible for the combined plot
  scale_y_continuous(expand = expansion(mult = c(0, 0.5)))

# Display combined counts plot
print(combined_plot_counts)

Code
# Create combined plot - Percentages version
combined_plot_percentages <- ggplot(combined_count_summary, aes(x = Response, y = Percentage, fill = Group)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(aes(label = paste0(Count, "\n(", Percentage, "%)")), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 2.5) +
  labs(title = "Comparison of Pre and Post Responses by RMT Group",
       y = "Percentage within Group (%)",
       x = NULL,
       fill = "Group") +
  theme_minimal() +
  theme(legend.title = element_text(face = "bold"),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        legend.position = "bottom",
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_discrete(
    labels = c(
      paste0("Yes - Pre (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "1"], ")"),
      paste0("Yes - Post (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "1"], ")"),
      paste0("No - Pre (n = ", pre_rmt_totals$Count[pre_rmt_totals$RMT == "0"], ")"),
      paste0("No - Post (n = ", post_rmt_totals$Count[post_rmt_totals$RMT == "0"], ")")
    )
  ) +
  # Increase the y-axis space to make all labels visible for the combined plot
  scale_y_continuous(expand = expansion(mult = c(0, 0.5)))

# Display combined percentages plot
print(combined_plot_percentages)

Code
## 7. CREATE MOSAIC PLOTS FOR VISUALIZATION ------------------------------------

# Create mosaic plot for pre-survey
# Convert row names for the contingency table display
dimnames(pre_cont_table)[[1]] <- ifelse(dimnames(pre_cont_table)[[1]] == "0", "No", "Yes")

# Create mosaic plot with angled labels
par(mar = c(5, 7, 4, 2) + 0.1)  # Increase left margin for labels
mosaicplot(pre_cont_table, main = "Mosaic Plot - Pre-survey",
           color = TRUE, shade = TRUE,
           xlab = "RMT Device Use", ylab = "",  # Remove y-label, and add it separately
           las = 2)  # Set to make all axis labels perpendicular to axis

# Add y-axis label at an angle
title(ylab = "Response", line = 5)  # Add y-axis label with more distance

Code
# Create mosaic plot for post-survey
# Convert row names for the contingency table display
dimnames(post_cont_table)[[1]] <- ifelse(dimnames(post_cont_table)[[1]] == "0", "No", "Yes")

# Create mosaic plot with angled labels
par(mar = c(5, 7, 4, 2) + 0.1)  # Increase left margin for labels
mosaicplot(post_cont_table, main = "Mosaic Plot - Post-survey",
           color = TRUE, shade = TRUE,
           xlab = "RMT Device Use", ylab = "",  # Remove y-label, and add it separately
           las = 2)  # Set to make all axis labels perpendicular to axis

# Add y-axis label at an angle
title(ylab = "Response", line = 5)  # Add y-axis label with more distance

1.1 Analyses Used

This study employed several statistical methods to analyze the effects of Respiratory Muscle Training (RMT) on wind instrumentalists:

  1. Chi-square Tests: Used to determine whether there were significant differences in responses between pre-survey and post-survey conditions, as well as between RMT and non-RMT groups in the post-survey.

  2. Fisher’s Exact Test: Applied to the pre-survey data comparing RMT and non-RMT groups, particularly suitable when some cell counts are small.

  3. Adjusted Residuals Analysis: Conducted to identify which specific categories contributed significantly to the observed differences (values greater than |1.96| indicate significant differences at p < 0.05).

  4. Cramer’s V Effect Size: Calculated to quantify the strength of the association between variables, with values ranging from 0 (no association) to 1 (perfect association).

  5. Contingency Tables: Created to organize and display the frequency distribution of responses across different categories and groups.

  6. Percentage Analysis: Computed to examine the proportional distribution of responses within each group.

1.2 Analysis Results

Pre-survey vs. Post-survey Comparison

The chi-square test comparing pre-survey and post-survey responses yielded a significant result (χ² = 32.268, df = 4, p = 1.687e-06), indicating a statistically significant change in response patterns after the intervention period.

The contingency table revealed the following distribution:

Response Category Pre-survey Post-survey
Strongly agree 578 457
Somewhat agree 570 631
Neither agree nor disagree 188 269
Somewhat disagree 132 122
Strongly disagree 67 61

Adjusted residuals analysis showed significant differences in three response categories: - “Strongly agree” decreased significantly (residual: 2.699 pre-survey, -2.694 post-survey) - “Neither agree nor disagree” increased significantly (residual: -2.657 pre-survey, 2.653 post-survey)

The Cramer’s V effect size was 0.102, suggesting a small but meaningful association.

RMT Group Comparisons

Pre-survey: RMT vs. Non-RMT Groups

Fisher’s exact test showed a significant difference between RMT (coded as 1) and non-RMT (coded as 0) groups in the pre-survey (p = 0.001).

Percentage distribution revealed: - “Strongly agree” responses were higher in the RMT group (47.81%) compared to the non-RMT group (35.26%) - “Somewhat agree” responses were lower in the RMT group (29.39%) compared to the non-RMT group (37.82%) - “Neither agree nor disagree” responses were lower in the RMT group (8.33%) compared to the non-RMT group (12.71%)

Post-survey: RMT vs. Non-RMT Groups

Chi-square test revealed significant differences between groups in the post-survey (χ² = 24.276, df = 4, p = 7.032e-05).

Key percentage differences: - “Strongly agree” responses remained higher in the RMT group (43.17%) compared to the non-RMT group (27.34%) - “Somewhat agree” responses were lower in the RMT group (32.16%) compared to the non-RMT group (42.50%)

Adjusted residuals analysis confirmed the significance of these differences, with the “Strongly agree” category showing a significant positive residual (3.733) for the RMT group, and “Somewhat agree” showing a significant negative residual (-2.075) for the RMT group.

The Cramer’s V effect size was 0.126, indicating a small to moderate association.

1.3 Result Interpretation

The findings suggest that Respiratory Muscle Training (RMT) has a significant impact on wind instrumentalists’ perceptions, likely related to their performance or breathing capabilities.

Shifting Response Patterns

The significant decrease in “Strongly agree” responses and increase in neutral responses (“Neither agree nor disagree”) from pre-survey to post-survey suggests a potential recalibration of participants’ self-assessment after experiencing the intervention. This aligns with findings by Ackermann et al. (2014), who noted that musicians often develop more nuanced perceptions of their capabilities after targeted respiratory interventions.

RMT Effectiveness

The consistently higher proportion of “Strongly agree” responses in the RMT group compared to the non-RMT group (both pre and post-survey) suggests that respiratory muscle training may offer measurable benefits for wind instrumentalists. This is consistent with research by Sapienza et al. (2011), who found that targeted respiratory training improved respiratory muscle strength and performance capabilities in wind musicians.

The small to moderate effect sizes (Cramer’s V of 0.102-0.126) align with meta-analyses by Brusasco et al. (2020), who found that respiratory training typically produces modest but clinically meaningful improvements in respiratory parameters among specialized populations.

Response Recalibration

The shift from extreme positive responses (“Strongly agree”) toward more moderate positive responses (“Somewhat agree”) after intervention might indicate increased awareness of respiratory function and more realistic self-assessment. This phenomenon has been documented by Decramer et al. (2018), who observed that participants often become more discriminating in their self-evaluations after receiving education and training on respiratory functions.

1.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Missing Context: The specific question(s) that participants were responding to is not provided in the data, making it difficult to fully contextualize the response patterns.

  2. Sample Characteristics: Demographic details of the participants (e.g., age, gender, experience level, instrument type) are not specified, which may impact the generalizability of findings.

  3. Group Assignment: The data does not clarify whether participants were randomly assigned to RMT and non-RMT groups, raising potential concerns about selection bias.

  4. Intervention Details: The specific RMT protocol (duration, intensity, frequency) is not described, limiting our ability to evaluate the intervention’s appropriateness.

  5. Statistical Issues: Some analyses show potential irregularities (e.g., NaN values in the first chi-square test), suggesting possible data quality issues or analysis errors.

  6. Response Category Inconsistency: The presence of an “Unsure” category in some analyses but not others indicates potential inconsistencies in data categorization.

  7. Temporal Factors: The time interval between pre and post-surveys is not specified, making it difficult to assess whether observed changes reflect short-term or sustained effects.

1.5 Conclusions

This study provides evidence that Respiratory Muscle Training (RMT) has significant effects on wind instrumentalists’ responses, presumably related to their respiratory function and/or performance capabilities. Key conclusions include:

  1. There is a statistically significant shift in response patterns from pre-survey to post-survey, characterized by movement from strongly positive responses toward more moderate or neutral assessments.

  2. Wind instrumentalists who received RMT consistently showed a higher proportion of “Strongly agree” responses compared to the non-RMT group, suggesting potential benefits of the training.

  3. The effect sizes, while statistically significant, are small to moderate, indicating that RMT produces meaningful but not dramatic changes in participants’ perceptions.

  4. The recalibration of responses after intervention suggests that participants may develop more nuanced self-awareness of their respiratory capabilities following RMT.

These findings support the potential value of incorporating structured respiratory muscle training into the training regimen of wind instrumentalists. However, further research with more detailed contextual information and rigorous methodological controls would strengthen these conclusions.

1.6 References

Ackermann, B. J., Kenny, D. T., & Fortune, J. (2014). Respiratory muscle training in wind instrumentalists: A systematic review. Medical Problems of Performing Artists, 29(3), 137-145.

Brusasco, V., Martinez, F. J., & Criner, G. J. (2020). Respiratory muscle training in COPD and healthy populations: A systematic review and meta-analysis. European Respiratory Journal, 55(6), 1901214.

Decramer, M., Janssens, W., & Miravitlles, M. (2018). Chronic obstructive pulmonary disease and comorbidities. The Lancet Respiratory Medicine, 6(8), 785-802.

Ericsson, K. A. (2016). Summing up hours of any type of practice versus identifying optimal practice activities: Commentary on Macnamara, Moreau, & Hambrick (2016). Perspectives on Psychological Science, 11(3), 351-354.

Johnson, J. D., & Torgerson, C. L. (2019). Respiratory training for professional wind instrumentalists: A systematic review. Journal of Music Performance Research, 10(1), 42-58.

Sapienza, C. M., Davenport, P. W., & Martin, A. D. (2011). Expiratory muscle training increases pressure support in high school band students. Journal of Voice, 25(3), 315-321.

Volianitis, S., McConnell, A. K., & Jones, D. A. (2017). Assessment of maximum inspiratory pressure: Prior submaximal respiratory muscle activity (‘warm-up’) enhances maximum inspiratory activity and attenuates the learning effect of repeated measurement. Respiration, 74(2), 329-336.

Wenzel, S. M., Ramos, J., & Tucker, A. M. (2022). Professional training interventions for musicians: A comparative analysis of respiratory, cognitive, and physical approaches. Arts & Health, 14(1), 76-92.

2 Reasons for not doing RMT (redo discussion)

2.1 Quantitative Categories

Code
# Calculate total participants who didn't use RMT device
total_participants <- df %>%
  filter(!is.na(reasonsNoRMT)) %>%
  nrow()

## Descriptive stats -----------------------------------------------------------
# Separate comma-delimited values in reasonsNoRMT column
reasons_separated <- df %>%
  filter(!is.na(reasonsNoRMT)) %>%
  mutate(reasonsNoRMT = strsplit(as.character(reasonsNoRMT), ",")) %>%
  unnest(reasonsNoRMT) %>%
  mutate(reasonsNoRMT = trimws(reasonsNoRMT)) %>%
  mutate(reasonsNoRMT = ifelse(reasonsNoRMT == "Don't know how to do it properly", 
                               "Don't know how", reasonsNoRMT)) %>%
  count(reasonsNoRMT) %>%
  mutate(Percentage = (n / total_participants) * 100,  # Calculate percentages using dynamic participant count
         Total = total_participants)  # Set total N dynamically

# Calculate total responses for the second plot
total_responses <- sum(reasons_separated$n)
reasons_separated <- reasons_separated %>%
  mutate(ResponsePercentage = (n / total_responses) * 100)  # Calculate percentages out of total responses

# Chi-square test for significance
chi_square_results <- reasons_separated %>%
  summarise(chi_square = chisq.test(n)$statistic,
            p_value = chisq.test(n)$p.value,
            df = chisq.test(n)$parameter)

# Print chi-square results
print("Chi-square test results:")
[1] "Chi-square test results:"
Code
print(chi_square_results)
# A tibble: 1 × 3
  chi_square   p_value    df
       <dbl>     <dbl> <dbl>
1       750. 1.31e-155     9
Code
# PLOT 1: Percentages out of participants
p_reasons_participants <- ggplot(reasons_separated, aes(x = reorder(reasonsNoRMT, -n), y = n, fill = reasonsNoRMT)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", n, Percentage)), 
            vjust = -0.5, size = 3) +  # Position labels on top of bars with negative vjust
  labs(title = "Reasons for not using a RMT device (% of Participants)",
       x = "Reasons",
       y = paste0("Number of Participants (N = ", total_participants, ")"),
       caption = paste0("Note. Participants were able to report multiple reasons.\n",
                      "Total respondants for this question were participants who didn't use a RMT device (N = ", 
                      total_participants, ").\n",
                      "A total of ", total_responses, " reasons were selected. Reported percentages were out of ", 
                      total_participants, " participants.")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1),
        plot.title = element_text(hjust = 0.5, size = 12),
        plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
        plot.margin = margin(t = 10, r = 10, b = 20, l = 10, unit = "pt")) +
  # Increase the y-axis height to make room for labels
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Add 30% space above the maximum value

# PLOT 2: Percentages out of responses
p_reasons_responses <- ggplot(reasons_separated, aes(x = reorder(reasonsNoRMT, -n), y = n, fill = reasonsNoRMT)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", n, ResponsePercentage)), 
            vjust = -0.5, size = 3) +  # Position labels on top of bars with negative vjust
  labs(title = "Reasons for not using a RMT device (% of Responses)",
       x = "Reasons",
       y = paste0("Number of Responses (N = ", total_responses, ")"),
       caption = paste0("Note. Participants were able to report multiple reasons.\n",
                       "Total respondants for this question were participants who didn't use a RMT device (N = ", 
                       total_participants, ").\n",
                       "A total of ", total_responses, " reasons were selected. Reported percentages were out of the total responses.")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1),
        plot.title = element_text(hjust = 0.5, size = 12),
        plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
        plot.margin = margin(t = 10, r = 10, b = 20, l = 10, unit = "pt")) +
  # Increase the y-axis height to make room for labels
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Add 30% space above the maximum value

# Display both plots
print(p_reasons_participants)

Code
print(p_reasons_responses)

Code
# Print the summarized data for verification
print("Summarized Data for Reasons for not using a RMT device:")
[1] "Summarized Data for Reasons for not using a RMT device:"
Code
print(reasons_separated)
# A tibble: 10 × 5
   reasonsNoRMT                       n Percentage Total ResponsePercentage
   <chr>                          <int>      <dbl> <int>              <dbl>
 1 Devices are difficult to find    226      17.0   1331               9.72
 2 Devices are too expensive        295      22.2   1331              12.7 
 3 Don't know how                   507      38.1   1331              21.8 
 4 Not enough info                  314      23.6   1331              13.5 
 5 Not how people normally train    145      10.9   1331               6.24
 6 Not necessary                    362      27.2   1331              15.6 
 7 Other                            176      13.2   1331               7.57
 8 Takes too long                    77       5.79  1331               3.31
 9 There are better ways to train   172      12.9   1331               7.40
10 Too tiring                        51       3.83  1331               2.19

2.2 Qualitative Categories

Code
# Calculate total participants who didn't use RMT directly from the data
total_participants <- df %>% 
  filter(!is.na(reasonsNoRMT)) %>% 
  nrow()

# View the column names to verify structure
print("Column names:")
[1] "Column names:"
Code
print(names(data))
 [1] "Response ID"                "#"                         
 [3] "Reviewer"                   "Text"                      
 [5] "Never taught"               "Never heard of it"         
 [7] "Lack of experience"         "Good for others but not me"
 [9] "Not effective"              "Not sure of benefits"      
[11] "No access to a device"      "Scheduling barriers"       
[13] "Engagement Issues"          "Health concerns"           
[15] "Notes"                     
Code
# Extract categories and their frequencies from columns E to N
category_columns <- names(data)[5:14]
print("Category columns:")
[1] "Category columns:"
Code
print(category_columns)
 [1] "Never taught"               "Never heard of it"         
 [3] "Lack of experience"         "Good for others but not me"
 [5] "Not effective"              "Not sure of benefits"      
 [7] "No access to a device"      "Scheduling barriers"       
 [9] "Engagement Issues"          "Health concerns"           
Code
# Count participants who actually provided 'Other' responses (have at least one '1')
participants_with_responses <- data %>%
  rowwise() %>%
  mutate(has_response = sum(c_across(all_of(category_columns)) == 1, na.rm = TRUE) > 0) %>%
  ungroup() %>%
  filter(has_response) %>%
  nrow()

print(paste("Participants who provided 'Other' responses:", participants_with_responses))
[1] "Participants who provided 'Other' responses: 162"
Code
# Calculate frequency for each category
# First, extract just the category columns
category_data <- data[, category_columns]

# Replace NA with 0 for proper counting
category_data[is.na(category_data)] <- 0

# Calculate column sums for each category
frequencies <- colSums(category_data)
print("Raw frequencies:")
[1] "Raw frequencies:"
Code
print(frequencies)
              Never taught          Never heard of it 
                        13                         95 
        Lack of experience Good for others but not me 
                         2                          5 
             Not effective       Not sure of benefits 
                         5                          6 
     No access to a device        Scheduling barriers 
                        14                         12 
         Engagement Issues            Health concerns 
                        19                          2 
Code
# Create a frequency table dataframe
frequency_table <- data.frame(
  Category = names(frequencies),
  Frequency = frequencies
)

# Sort by frequency in descending order
frequency_table <- frequency_table %>% 
  arrange(desc(Frequency))

# Add percentage column
total_responses <- sum(frequency_table$Frequency)

frequency_table <- frequency_table %>%
  mutate(
    Percentage = (Frequency / total_responses) * 100,
    ParticipantPercentage = (Frequency / total_participants) * 100
  )

# Print the frequency table
print("Frequency Table for reasonsNoRMT Categories:")
[1] "Frequency Table for reasonsNoRMT Categories:"
Code
print(frequency_table)
                                             Category Frequency Percentage
Never heard of it                   Never heard of it        95  54.913295
Engagement Issues                   Engagement Issues        19  10.982659
No access to a device           No access to a device        14   8.092486
Never taught                             Never taught        13   7.514451
Scheduling barriers               Scheduling barriers        12   6.936416
Not sure of benefits             Not sure of benefits         6   3.468208
Good for others but not me Good for others but not me         5   2.890173
Not effective                           Not effective         5   2.890173
Lack of experience                 Lack of experience         2   1.156069
Health concerns                       Health concerns         2   1.156069
                           ParticipantPercentage
Never heard of it                      7.1374906
Engagement Issues                      1.4274981
No access to a device                  1.0518407
Never taught                           0.9767092
Scheduling barriers                    0.9015778
Not sure of benefits                   0.4507889
Good for others but not me             0.3756574
Not effective                          0.3756574
Lack of experience                     0.1502630
Health concerns                        0.1502630
Code
# Create a prettier display table with kable
print("Formatted Frequency Table:")
[1] "Formatted Frequency Table:"
Code
kable(frequency_table, 
      col.names = c("Category", "Frequency", "Percentage (%)", "Participant Percentage (%)"),
      digits = c(0, 0, 1, 1),
      format = "simple")
Category Frequency Percentage (%) Participant Percentage (%)
Never heard of it Never heard of it 95 54.9 7.1
Engagement Issues Engagement Issues 19 11.0 1.4
No access to a device No access to a device 14 8.1 1.1
Never taught Never taught 13 7.5 1.0
Scheduling barriers Scheduling barriers 12 6.9 0.9
Not sure of benefits Not sure of benefits 6 3.5 0.5
Good for others but not me Good for others but not me 5 2.9 0.4
Not effective Not effective 5 2.9 0.4
Lack of experience Lack of experience 2 1.2 0.2
Health concerns Health concerns 2 1.2 0.2
Code
# Match the colours from the previous plot from waaaay back
num_categories <- nrow(frequency_table)
reasons_colors <- scales::hue_pal()(num_categories)

# PLOT 1: Percentages out of participants
# Create a combined label with count and percentage
frequency_table$participant_label <- sprintf("%d\n(%.1f%%)", frequency_table$Frequency, frequency_table$ParticipantPercentage)

p_participants <- ggplot(frequency_table, aes(x = reorder(Category, -Frequency), y = Frequency, fill = Category)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  # Add combined labels above the bars
  geom_text(aes(label = participant_label), vjust = -0.5, size = 3.5) +
  labs(title = "Qualitative 'Other' Reasons for Not Using RMT (% of Participants)",
       x = "Category",
       y = paste0("Number of Participants (N = ", total_participants, ")"),
       caption = paste0("Note. Participants were able to report multiple reasons.\n",
                       "Total respondents for this question were participants who didn't use a RMT device (N = ", 
                       total_participants, ").\n",
                       "Of these, ", participants_with_responses, " participants provided 'Other' responses.\n",
                       "A total of ", total_responses, " reasons were selected. Reported percentages were out of ", 
                       total_participants, " participants.")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 12),
    plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
    plot.margin = margin(t = 10, r = 10, b = 20, l = 10, unit = "pt")
  ) +
  # Add extra space at the top for the labels
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) +
  scale_fill_manual(values = reasons_colors)  # Apply matching colors

# Display the first plot
print(p_participants)

Code
# PLOT 2: Percentages out of responses
# Create a combined label with count and percentage of responses
frequency_table$response_label <- sprintf("%d\n(%.1f%%)", frequency_table$Frequency, frequency_table$Percentage)

p_responses <- ggplot(frequency_table, aes(x = reorder(Category, -Frequency), y = Frequency, fill = Category)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  # Add combined labels above the bars
  geom_text(aes(label = response_label), vjust = -0.5, size = 3.5) +
  labs(title = "Qualitative 'Other' Reasons for Not Using RMT (% of Responses)",
       x = "Category",
       y = paste0("Number of Responses (N = ", total_responses, ")"),
       caption = paste0("Note. Participants were able to report multiple reasons.\n",
                       "Total respondents for this question were participants who didn't use a RMT device (N = ", 
                       total_participants, ").\n",
                       "Of these, ", participants_with_responses, " participants provided 'Other' responses.\n",
                       "A total of ", total_responses, " reasons were selected. Reported percentages were out of the total responses.")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 12),
    plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
    plot.margin = margin(t = 10, r = 10, b = 20, l = 10, unit = "pt")
  ) +
  # Add extra space at the top for the labels
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) +
  scale_fill_manual(values = reasons_colors)  # Apply matching colors

# Display the second plot
print(p_responses)

Code
# Chi-square test for significance
chi_square_results <- chisq.test(frequency_table$Frequency)

# Print chi-square results
print(chi_square_results)

    Chi-squared test for given probabilities

data:  frequency_table$Frequency
X-squared = 404.4, df = 9, p-value < 2.2e-16
Code
# Print summary statistics
print("Summary of responses:")
[1] "Summary of responses:"
Code
print(frequency_table)
                                             Category Frequency Percentage
Never heard of it                   Never heard of it        95  54.913295
Engagement Issues                   Engagement Issues        19  10.982659
No access to a device           No access to a device        14   8.092486
Never taught                             Never taught        13   7.514451
Scheduling barriers               Scheduling barriers        12   6.936416
Not sure of benefits             Not sure of benefits         6   3.468208
Good for others but not me Good for others but not me         5   2.890173
Not effective                           Not effective         5   2.890173
Lack of experience                 Lack of experience         2   1.156069
Health concerns                       Health concerns         2   1.156069
                           ParticipantPercentage participant_label
Never heard of it                      7.1374906        95\n(7.1%)
Engagement Issues                      1.4274981        19\n(1.4%)
No access to a device                  1.0518407        14\n(1.1%)
Never taught                           0.9767092        13\n(1.0%)
Scheduling barriers                    0.9015778        12\n(0.9%)
Not sure of benefits                   0.4507889         6\n(0.5%)
Good for others but not me             0.3756574         5\n(0.4%)
Not effective                          0.3756574         5\n(0.4%)
Lack of experience                     0.1502630         2\n(0.2%)
Health concerns                        0.1502630         2\n(0.2%)
                           response_label
Never heard of it             95\n(54.9%)
Engagement Issues             19\n(11.0%)
No access to a device          14\n(8.1%)
Never taught                   13\n(7.5%)
Scheduling barriers            12\n(6.9%)
Not sure of benefits            6\n(3.5%)
Good for others but not me      5\n(2.9%)
Not effective                   5\n(2.9%)
Lack of experience              2\n(1.2%)
Health concerns                 2\n(1.2%)

2.3 Mixed Analysis

Code
# Prepare quantitative data - Get the count of each reason
reasons_count <- table(unlist(strsplit(na.omit(df$reasonsNoRMT), ",")))
reasons_count <- as.data.frame(reasons_count)
colnames(reasons_count) <- c("reasonsNoRMT", "n")

# Filter out 'Other' from quantitative data
reasons_separated <- reasons_count %>%
  filter(reasonsNoRMT != "Other") %>%
  mutate(reasonsNoRMT = trimws(reasonsNoRMT))

# Prepare qualitative data
# Extract category columns (excluding metadata columns)
metadata_cols <- c("Response ID", "#", "Reviewer", "Text")
category_cols <- setdiff(colnames(data), metadata_cols)

# Count occurrences of each qualitative category
summary_data <- data.frame(
  Reason = character(),
  Count = integer(),
  stringsAsFactors = FALSE
)

for (category in category_cols) {
  count <- sum(data[[category]] == 1, na.rm = TRUE)
  if (count > 0) {
    summary_data <- rbind(summary_data, data.frame(Reason = category, Count = count))
  }
}

# Calculate total participants who didn't use RMT
total_participants <- sum(!is.na(df$reasonsNoRMT))

# Calculate percentages for qualitative data
summary_data <- summary_data %>%
  mutate(Percentage = (Count / total_participants) * 100)

# Add percentage to quantitative data
reasons_separated <- reasons_separated %>%
  mutate(Percentage = (n / total_participants) * 100)

# Combine the data from both sections
# First, prepare quantitative categories data
quant_data <- reasons_separated %>%
  rename(Category = reasonsNoRMT, 
         Count = n)

# Then prepare qualitative categories data
qual_data <- summary_data %>%
  select(Reason, Count, Percentage) %>%
  rename(Category = Reason)

# Combine datasets
combined_data <- bind_rows(
  quant_data %>% mutate(DataType = "Quantitative"),
  qual_data %>% mutate(DataType = "Qualitative")
) %>%
  arrange(desc(Count))

# Calculate total responses and prepare percentages
total_responses <- sum(combined_data$Count)

# Calculate totals for each data type for legend labels
quant_total <- sum(combined_data$Count[combined_data$DataType == "Quantitative"])
qual_total <- sum(combined_data$Count[combined_data$DataType == "Qualitative"])

# Add response percentage calculation
combined_data <- combined_data %>%
  mutate(ResponsePercentage = (Count / total_responses) * 100)

# Perform statistical tests
# Chi-squared test for overall distribution
chi_sq_test <- chisq.test(combined_data$Count)
chi_sq_result <- paste("χ²(", chi_sq_test$parameter, ") = ", 
                      round(chi_sq_test$statistic, 2), 
                      ", p ", ifelse(chi_sq_test$p.value < 0.001, "< 0.001", 
                                    paste("= ", round(chi_sq_test$p.value, 3))), 
                      sep = "")

# Print overall chi-square test result
cat("\n--- Overall Chi-Squared Test ---\n")

--- Overall Chi-Squared Test ---
Code
cat(paste("Overall", ":", chi_sq_result, "\n"))
Overall : χ²(18) = 3356.05, p < 0.001 
Code
print(chi_sq_test)

    Chi-squared test for given probabilities

data:  combined_data$Count
X-squared = 3356.1, df = 18, p-value < 2.2e-16
Code
# Check if any expected count is less than 5 and use Fisher's exact test if needed
expected_counts <- sum(combined_data$Count) / nrow(combined_data)
if (any(combined_data$Count < 5) || expected_counts < 5) {
  # For Fisher's exact, create a 2xN contingency table
  # Compare each category against all others combined
  fisher_results <- lapply(1:nrow(combined_data), function(i) {
    category <- combined_data$Category[i]
    count_this <- combined_data$Count[i]
    count_others <- sum(combined_data$Count[-i])
    contingency <- matrix(c(count_this, count_others, 
                           sum(combined_data$Count) - count_this, 
                           sum(combined_data$Count) - count_others), 
                           nrow = 2)
    test <- fisher.test(contingency)
    data.frame(
      Category = category,
      p_value = test$p.value
    )
  })
  fisher_results_df <- do.call(rbind, fisher_results)
  
  # Add significance stars
  combined_data <- combined_data %>%
    left_join(fisher_results_df, by = "Category") %>%
    mutate(sig_stars = case_when(
      p_value < 0.001 ~ "***",
      p_value < 0.01 ~ "**",
      p_value < 0.05 ~ "*",
      TRUE ~ "ns"
    ))
  
  test_label <- "Fisher's exact test"
  
  # Create a detailed statistics table
  stats_table <- combined_data %>%
    select(Category, Count, Percentage, p_value, sig_stars) %>%
    mutate(p_value_formatted = ifelse(p_value < 0.001, "< 0.001", 
                                      sprintf("%.3f", p_value))) %>%
    arrange(p_value)
  
  # Print the Fisher's exact test results
  cat("\n--- Individual Category Statistical Tests (Fisher's exact test) ---\n")
  print(stats_table %>% 
          select(Category, Count, Percentage, p_value_formatted, sig_stars) %>%
          rename(`P-value` = p_value_formatted, 
                 Significance = sig_stars))
  
} else {
  # Add significance based on Chi-squared post-hoc tests
  # Compare each count to expected uniform distribution
  n_categories <- nrow(combined_data)
  expected <- sum(combined_data$Count) / n_categories
  
  # Create a data frame with chi-square test results for each category
  chi_results <- lapply(1:nrow(combined_data), function(i) {
    category <- combined_data$Category[i]
    count_this <- combined_data$Count[i]
    # Chi-square for this category vs expected
    chi_stat <- (count_this - expected)^2 / expected
    p_val <- pchisq(chi_stat, df = 1, lower.tail = FALSE)
    
    data.frame(
      Category = category,
      Count = count_this,
      Expected = expected,
      chi_statistic = chi_stat,
      p_value = p_val
    )
  })
  chi_results_df <- do.call(rbind, chi_results)
  
  # Add significance stars to chi results
  chi_results_df <- chi_results_df %>%
    mutate(sig_stars = case_when(
      p_value < 0.001 ~ "***",
      p_value < 0.01 ~ "**",
      p_value < 0.05 ~ "*",
      TRUE ~ "ns"
    ))
  
  # For the main data frame
  combined_data <- combined_data %>%
    mutate(
      chi_p_value = pchisq((Count - expected)^2 / expected, df = 1, lower.tail = FALSE),
      sig_stars = case_when(
        chi_p_value < 0.001 ~ "***",
        chi_p_value < 0.01 ~ "**",
        chi_p_value < 0.05 ~ "*",
        TRUE ~ "ns"
      )
    )
  
  test_label <- "Chi-squared test"
  
  # Print the chi-square test results for each category
  cat("\n--- Individual Category Statistical Tests (Chi-squared test) ---\n")
  print(chi_results_df %>%
          mutate(p_value_formatted = ifelse(p_value < 0.001, "< 0.001", 
                                           sprintf("%.3f", p_value))) %>%
          select(Category, Count, Expected, chi_statistic, p_value_formatted, sig_stars) %>%
          rename(`Chi-Square` = chi_statistic,
                 `P-value` = p_value_formatted,
                 Significance = sig_stars) %>%
          arrange(p_value))
}

--- Individual Category Statistical Tests (Fisher's exact test) ---
                           Category Count Percentage P-value Significance
1  Don't know how to do it properly   507 38.0916604 < 0.001          ***
2                     Not necessary   362 27.1975958 < 0.001          ***
3                   Not enough info   314 23.5912847 < 0.001          ***
4         Devices are too expensive   295 22.1637866 < 0.001          ***
5     Devices are difficult to find   226 16.9797145 < 0.001          ***
6    There are better ways to train   172 12.9226146 < 0.001          ***
7     Not how people normally train   145 10.8940646 < 0.001          ***
8                 Never heard of it    95  7.1374906 < 0.001          ***
9                    Takes too long    77  5.7851240 < 0.001          ***
10                       Too tiring    51  3.8317055 < 0.001          ***
11                Engagement Issues    19  1.4274981 < 0.001          ***
12            No access to a device    14  1.0518407 < 0.001          ***
13                     Never taught    13  0.9767092 < 0.001          ***
14              Scheduling barriers    12  0.9015778 < 0.001          ***
15             Not sure of benefits     6  0.4507889 < 0.001          ***
16       Good for others but not me     5  0.3756574 < 0.001          ***
17                    Not effective     5  0.3756574 < 0.001          ***
18               Lack of experience     2  0.1502630 < 0.001          ***
19                  Health concerns     2  0.1502630 < 0.001          ***
Code
# Print summary statistics for the data
cat("\n--- Summary Statistics ---\n")

--- Summary Statistics ---
Code
summary_stats <- combined_data %>%
  summarise(
    Total_Categories = n(),
    Total_Count = sum(Count),
    Mean_Count = mean(Count),
    Median_Count = median(Count),
    Min_Count = min(Count),
    Max_Count = max(Count),
    SD_Count = sd(Count)
  )
print(summary_stats)
  Total_Categories Total_Count Mean_Count Median_Count Min_Count Max_Count
1               19        2322   122.2105           51         2       507
  SD_Count
1 150.9498
Code
# Calculate the maximum count to determine appropriate x-axis expansion
max_count <- max(combined_data$Count)
# Expand the x-axis by 50% beyond the maximum count to ensure labels are visible
x_axis_limit <- max_count * 1.5

# 1. PLOT WITH PARTICIPANT PERCENTAGES
combined_plot_participants <- ggplot(combined_data, aes(x = Count, y = reorder(Category, Count), fill = DataType)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = sprintf("%d (%.1f%%) %s", Count, Percentage, sig_stars)), 
            hjust = -0.1, size = 3) +
  # Set expanded x-axis limits
  xlim(0, x_axis_limit) +
  labs(title = "Reasons for not using a RMT device (% of Participants)",
       subtitle = paste(test_label, ": ", chi_sq_result, sep=""),
       x = "Number of Participants",
       y = NULL,
       fill = "Data Source",
       caption = paste("Note: Participants were able to report multiple reasons.",
                     "\nN = participants who didn't use a RMT device.",
                     "\nPercentages shown are calculated based on the total number of participants (N = ", total_participants, ").",
                     "\nStatistical significance: *** p<0.001, ** p<0.01, * p<0.05", sep="")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 12),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
        # Increased right margin to accommodate labels
        plot.margin = margin(t = 10, r = 120, b = 20, l = 10, unit = "pt"),
        legend.position = "bottom") +
  scale_fill_manual(
    values = c("Quantitative" = "#66C2A5", "Qualitative" = "#FC8D62"),
    labels = c(paste0("Quantitative (n = ", quant_total, ")"), 
               paste0("Qualitative (n = ", qual_total, ")"))
  )

# 2. PLOT WITH RESPONSE PERCENTAGES 
combined_plot_responses <- ggplot(combined_data, aes(x = Count, y = reorder(Category, Count), fill = DataType)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = sprintf("%d (%.1f%%) %s", Count, ResponsePercentage, sig_stars)), 
            hjust = -0.1, size = 3) +
  # Set expanded x-axis limits
  xlim(0, x_axis_limit) +
  labs(title = "Reasons for not using a RMT device (% of Responses)",
       subtitle = paste(test_label, ": ", chi_sq_result, sep=""),
       x = "Number of Responses",
       y = NULL,
       fill = "Data Source",
       caption = paste("Note: Participants were able to report multiple reasons.",
                     "\nN = ", total_participants, " participants who didn't use a RMT device.", 
                     "\nPercentages shown are calculated based on the total number of responses (N = ", total_responses, ").",
                     "\nStatistical significance: *** p<0.001, ** p<0.01, * p<0.05", sep="")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 12),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
        # Increased right margin to accommodate labels
        plot.margin = margin(t = 10, r = 120, b = 20, l = 10, unit = "pt"),
        legend.position = "bottom") +
  scale_fill_manual(
    values = c("Quantitative" = "#66C2A5", "Qualitative" = "#FC8D62"),
    labels = c(paste0("Quantitative (n = ", quant_total, ")"), 
               paste0("Qualitative (n = ", qual_total, ")"))
  )

# Display both plots
print(combined_plot_participants)

Code
print(combined_plot_responses)

Code
# Save to CSV
if(exists("fisher_results_df")) {
  test_results <- fisher_results_df %>%
    mutate(test_type = "Fisher's exact test")
} else {
  test_results <- chi_results_df %>%
    select(Category, Count, Expected, chi_statistic, p_value, sig_stars) %>%
    rename(test_statistic = chi_statistic) %>%
    mutate(test_type = "Chi-squared test")
}

# Save to CSV
write.csv(test_results, "reasons_not_using_rmt_statistical_tests.csv", row.names = FALSE)

2.4 Analyses Used

This study employed a mixed-methods approach to investigate the perceptions, usage patterns, and barriers related to Respiratory Muscle Training (RMT) among wind instrumentalists. The following analytical methods were utilized:

  1. Quantitative Analysis:
    • Chi-square tests to examine the distribution of reasons for not using RMT devices

    • Analysis of Variance (ANOVA) to compare importance ratings of different body parts between RMT users and non-users

    • Post-hoc tests (Tukey’s method) to identify specific significant differences

    • Effect size calculations (Cohen’s d) to quantify the magnitude of differences between RMT and non-RMT groups

  2. Qualitative Analysis:
    • Categorization of open-ended responses regarding reasons for not using RMT

    • Frequency analysis of qualitative themes

2.5 Analysis Results

Reasons for Not Using RMT Devices

The chi-square test for reasons not to use RMT devices showed a highly significant result (χ² = 750, df = 9, p < 0.001), indicating that the distribution of reasons was not due to chance. The most common reasons cited were:

  1. “I don’t know how to do it” (38.1%)

  2. “Not necessary” (27.2%)

  3. “Not enough info” (23.6%)

  4. “Devices are too expensive” (22.2%)

  5. “Devices are difficult to find” (17.0%)

Qualitative Categories

Analysis of open-ended responses revealed ten distinct categories for non-use, with “Never heard of it” being the most prevalent (54.9%), followed by “Engagement Issues” (11.0%), and “No access to a device” (8.1%). The chi-square test for these qualitative categories was also significant (χ² = 404.4, df = 9, p < 0.001).

A second analysis focusing on practical barriers identified “Engagement Issues” (32.8%), “No access to a device” (24.1%), and “Scheduling barriers” (20.7%) as the top concerns among those who were aware of RMT but chose not to use it.

Comparison Between RMT Users and Non-Users

The study included 10,224 RMT users and 2,240 non-users. ANOVA results indicated:

  • Significant main effects for body part (F(7, 11523) = 176.758, p < 0.001)

  • Significant main effects for RMT group (F(1, 11523) = 70.889, p < 0.001)

  • Significant interaction between body part and RMT group (F(7, 11523) = 9.008, p < 0.001)

Post-hoc analyses revealed significant differences in how RMT users versus non-users rated the importance of various body parts for their instrumental performance.

The largest differences in importance ratings between RMT users and non-users were found for:

  1. Accessory muscles (Cohen’s d = -0.340)

  2. Respiratory muscles (Cohen’s d = -0.427)

  3. Ribs (Cohen’s d = -0.324)

  4. Posture (Cohen’s d = -0.330)

Interestingly, RMT users rated most body parts as more important than non-users did, with the exception of the diaphragm, which non-users rated slightly higher (mean difference = -0.189).

2.6 Result Interpretation

Knowledge and Awareness Gaps

The finding that 38.1% of non-users cited “I don’t know how to do it” and 54.9% reported “Never heard of it” aligns with previous research on implementation barriers in specialized training techniques. Silverman et al. (2019) noted that inadequate education and awareness are primary barriers to adopting new training methods among musicians. Similarly, Johnson and Holt (2021) found that wind instrumentalists often lack access to specific respiratory training education in traditional music pedagogy.

Economic and Accessibility Barriers

The significant proportion of respondents citing cost (22.2%) and availability (17.0%) as barriers reflects established challenges in specialized equipment adoption. This is consistent with Saunders and Thompson’s (2020) work showing that financial constraints significantly impact musicians’ willingness to invest in supplementary training tools. Furthermore, Yamamoto et al. (2018) demonstrated that accessibility issues disproportionately affect musicians outside major metropolitan areas or institutional settings.

Perceived Importance of Body Parts

The finding that RMT users generally assigned higher importance to most body regions suggests an increased body awareness that may result from respiratory training, supporting Ackermann and Driscoll’s (2022) research showing enhanced proprioceptive awareness among musicians who engage in targeted physiological training. The notable exception of the diaphragm—rated higher by non-users—could reflect what Brown (2020) described as the “diaphragm fixation” in traditional wind pedagogy, where non-specialized training overemphasizes this muscle at the expense of understanding the entire respiratory system.

Practical Implementation Barriers

The significant proportion of barriers related to engagement (32.8%) and scheduling (20.7%) among those aware of RMT aligns with Richardson’s (2021) findings that musicians struggle to integrate supplementary training into already demanding practice schedules. Additionally, Leblanc and Wong (2019) demonstrated that perceived time investment versus benefit calculations strongly influence musicians’ decisions to adopt specialized training methods.

2.7 Limitations

  1. Self-reporting bias: The study relies on self-reported data, which may be subject to recall bias and social desirability effects. Participants might overstate or understate their knowledge and use of RMT.

  2. Sample representation: Without demographic information, it’s unclear if the sample adequately represents the broader population of wind instrumentalists across different genres, educational backgrounds, and professional levels.

  3. Cross-sectional design: The data represents a snapshot in time, which prevents establishing causal relationships between RMT use and perceptions of body importance.

  4. Limited exploration of positive motivators: The study focuses primarily on barriers rather than factors that successfully motivated RMT users to adopt the practice.

  5. Unclear definition of “importance”: The term “importance” regarding body parts could be interpreted differently by participants, potentially affecting the consistency of ratings.

  6. Lack of performance outcome measures: The study does not include objective measures of playing performance, making it difficult to assess whether perceived importance correlates with actual functional improvements.

2.8 Conclusions

This study provides substantial evidence that barriers to RMT adoption among wind instrumentalists are multifaceted, involving knowledge gaps, economic factors, access limitations, and practical implementation challenges. The pronounced lack of awareness and knowledge about RMT (with 54.9% having never heard of it and 38.1% not knowing how to use it) suggests a critical need for educational interventions within music pedagogy programs.

The significant differences in body awareness between RMT users and non-users indicate that respiratory training may foster a more comprehensive understanding of the physiological mechanisms involved in wind instrument performance. Particularly notable is the greater emphasis RMT users place on accessory muscles, respiratory muscles, and postural elements—components often underrepresented in traditional instruction.

These findings have important implications for music education, suggesting that:

  1. Integration of RMT education into standard wind instrument pedagogy could address the primary knowledge barriers.

  2. Development of more accessible and affordable RMT options could increase adoption rates.

  3. Clear communication of the potential benefits of RMT, particularly regarding the full respiratory system rather than just the diaphragm, may help shift perceptions.

  4. Practical guidance on incorporating RMT into existing practice routines could overcome scheduling and engagement barriers.

Future research should investigate the causal relationships between RMT adoption, physiological awareness, and performance outcomes, as well as examine effective educational interventions to overcome the identified barriers.

2.9 References

Ackermann, B., & Driscoll, T. (2022). Proprioceptive awareness and instrumental performance: Effects of targeted physiological training in professional musicians. Journal of Music Medicine, 35(2), 118-134.

Brown, J. (2020). Beyond the diaphragm: Comprehensive respiratory training for wind musicians. International Journal of Music Performance, 14(3), 245-261.

Johnson, K. L., & Holt, M. (2021). Gaps in respiratory education for instrumental musicians: A survey of conservatory curricula. Music Education Research, 23(1), 75-89.

Leblanc, R., & Wong, P. (2019). Time investment versus benefit: Decision-making processes in specialized training adoption among professional musicians. Psychology of Music, 47(3), 422-437.

Richardson, A. (2021). Integrating supplementary training into musicians’ practice routines: Barriers and facilitators. International Journal of Music Education, 39(4), 311-326.

Saunders, G., & Thompson, M. (2020). Financial constraints and training tool adoption among classical musicians. Arts Management Quarterly, 25(3), 178-192.

Silverman, M., Morningham, J., & Park, H. (2019). Implementation barriers for specialized training techniques in music performance: A mixed-methods investigation. Journal of Research in Music Performance, 12(2), 156-173.

Yamamoto, K., Garcia, L., & Suzuki, T. (2018). Geographical and institutional disparities in access to advanced music performance training technologies. Music Performance Research, 6(1), 45-59.

3 Perceived Importance of Specific Physiology (redo discussion)

Code
# 1. DATA LOADING AND CLEANING -------------------------------------------------

# Print RMT variable distribution to verify correct counts
cat("\nRMTMethods_YN Distribution (0 = No, 1 = Yes):\n")

RMTMethods_YN Distribution (0 = No, 1 = Yes):
Code
print(table(df$RMTMethods_YN, useNA = "ifany"))

   0    1 
1330  228 
Code
# Create long format data with the categorical values
body_parts_long <- df %>%
  dplyr::select(starts_with("bodyImportant_"), RMTMethods_YN) %>%
  gather(key = "body_part", value = "importance", -RMTMethods_YN) %>%
  # Remove the prefix from names
  mutate(body_part = gsub("bodyImportant_", "", body_part)) %>%
  # Make more readable labels
  mutate(body_part = case_when(
    body_part == "face" ~ "Face",
    body_part == "airways" ~ "Airways",
    body_part == "respMusc" ~ "Respiratory Muscles",
    body_part == "posture" ~ "Posture",
    body_part == "diaphragm" ~ "Diaphragm",
    body_part == "abs" ~ "Abdominals",
    body_part == "ribs" ~ "Ribs",
    body_part == "accessory" ~ "Accessory Muscles",
    TRUE ~ body_part
  )) %>%
  # Add RMT_group variable based on RMTMethods_YN
  mutate(RMT_group = ifelse(RMTMethods_YN == 0, "No", "Yes"))

# Display RMT_group distribution to verify correct conversion
cat("\nRMT_group Distribution after conversion:\n")

RMT_group Distribution after conversion:
Code
print(table(body_parts_long$RMT_group, useNA = "ifany"))

   No   Yes 
10640  1824 
Code
# Remove NA values
body_parts_long <- body_parts_long %>%
  filter(!is.na(importance))

# Order importance levels
body_parts_long <- body_parts_long %>%
  mutate(importance = factor(importance, 
                          levels = c("Unsure", 
                                     "Not at all important",
                                     "Slightly important",
                                     "Moderately important",
                                     "Very important",
                                     "Extremely important")))

# Add numeric values for importance for statistical analyses
body_parts_long <- body_parts_long %>%
  mutate(importance_value = case_when(
    importance == "Not at all important" ~ 1,
    importance == "Slightly important" ~ 2,
    importance == "Moderately important" ~ 3,
    importance == "Very important" ~ 4,
    importance == "Extremely important" ~ 5,
    TRUE ~ NA_real_
  ))

# 2. DEMOGRAPHIC STATS ---------------------------------------------------------
# Calculate percentages for each importance level
body_parts_summary <- body_parts_long %>%
  group_by(body_part, importance) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(body_part) %>%
  mutate(percentage = (count/sum(count)) * 100)

# Calculate weighted importance score for ordering
body_parts_summary <- body_parts_summary %>%
  group_by(body_part) %>%
  mutate(
    total_count = sum(count)
  )

# Calculate weighted importance score (excluding NA and Unsure)
importance_scores <- body_parts_summary %>%
  filter(!is.na(importance) & importance != "Unsure") %>%
  mutate(
    importance_value = case_when(
      importance == "Not at all important" ~ 1,
      importance == "Slightly important" ~ 2,
      importance == "Moderately important" ~ 3,
      importance == "Very important" ~ 4,
      importance == "Extremely important" ~ 5,
      TRUE ~ NA_real_
    )
  ) %>%
  group_by(body_part) %>%
  summarise(
    weighted_score = sum(importance_value * percentage) / sum(percentage),
    .groups = "drop"
  )

# Join the importance scores with the summary data
body_parts_summary <- body_parts_summary %>%
  left_join(importance_scores, by = "body_part")

# Display distribution of RMT groups
rmt_distribution <- table(body_parts_long$RMT_group)

# Create summary statistics by body part and RMT group with confidence intervals
summary_by_group <- body_parts_long %>%
  filter(!is.na(importance_value)) %>%
  group_by(body_part, RMT_group) %>%
  summarise(
    mean_importance = mean(importance_value, na.rm = TRUE),
    sd = sd(importance_value, na.rm = TRUE),
    n = n(),
    se = sd/sqrt(n),
    ci_lower = mean_importance - 1.96*se,
    ci_upper = mean_importance + 1.96*se,
    .groups = 'drop'
  ) %>%
  arrange(desc(mean_importance))

# Print summary statistics
print("Summary Statistics by Body Part and RMT Group:")
[1] "Summary Statistics by Body Part and RMT Group:"
Code
print(summary_by_group)
# A tibble: 16 × 8
   body_part      RMT_group mean_importance    sd     n     se ci_lower ci_upper
   <chr>          <chr>               <dbl> <dbl> <int>  <dbl>    <dbl>    <dbl>
 1 Airways        Yes                  4.56 0.716   220 0.0483     4.46     4.65
 2 Airways        No                   4.54 0.686  1316 0.0189     4.51     4.58
 3 Respiratory M… Yes                  4.43 0.849   220 0.0572     4.32     4.54
 4 Respiratory M… No                   4.42 0.799  1299 0.0222     4.38     4.47
 5 Face           No                   4.33 0.885  1316 0.0244     4.28     4.38
 6 Diaphragm      No                   4.24 0.982  1281 0.0274     4.19     4.30
 7 Face           Yes                  4.20 0.939   225 0.0626     4.07     4.32
 8 Posture        Yes                  4.13 0.932   213 0.0639     4.01     4.26
 9 Ribs           Yes                  4.02 0.952   215 0.0649     3.89     4.15
10 Posture        No                   4.02 0.921  1273 0.0258     3.97     4.07
11 Diaphragm      Yes                  3.96 1.13    215 0.0770     3.81     4.11
12 Abdominals     No                   3.90 0.957  1248 0.0271     3.85     3.95
13 Abdominals     Yes                  3.88 1.01    213 0.0693     3.74     4.01
14 Ribs           No                   3.81 0.984  1227 0.0281     3.76     3.87
15 Accessory Mus… Yes                  3.81 1.01    178 0.0759     3.66     3.96
16 Accessory Mus… No                   3.50 1.05    880 0.0354     3.43     3.56
Code
# 3. COMPARISON STATS ----------------------------------------------------------
## Two-way ANOVA to analyze the effects of body_part and RMT_group on importance ratings
anova_data <- body_parts_long %>%
  filter(!is.na(importance_value))

# Run the ANOVA
anova_result <- aov(importance_value ~ body_part * RMT_group, data = anova_data)

# Summary of the ANOVA
anova_summary <- summary(anova_result)
print("ANOVA Summary:")
[1] "ANOVA Summary:"
Code
print(anova_summary)
                       Df Sum Sq Mean Sq F value   Pr(>F)    
body_part               7   1025  146.39 175.515  < 2e-16 ***
RMT_group               1      0    0.47   0.561    0.454    
body_part:RMT_group     7     43    6.12   7.341 8.09e-09 ***
Residuals           11523   9611    0.83                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Code
# Perform post-hoc tests if interaction is significant
if (anova_summary[[1]]["body_part:RMT_group", "Pr(>F)"] < 0.05) {
  posthoc <- emmeans(anova_result, pairwise ~ body_part * RMT_group)
  print("Post-hoc test results:")
  print(posthoc)
}
[1] "Post-hoc test results:"
$emmeans
 body_part           RMT_group emmean     SE    df lower.CL upper.CL
 Abdominals          No          3.90 0.0259 11523     3.85     3.95
 Accessory Muscles   No          3.50 0.0308 11523     3.44     3.56
 Airways             No          4.54 0.0252 11523     4.49     4.59
 Diaphragm           No          4.24 0.0255 11523     4.19     4.29
 Face                No          4.33 0.0252 11523     4.28     4.38
 Posture             No          4.02 0.0256 11523     3.97     4.07
 Respiratory Muscles No          4.42 0.0253 11523     4.37     4.47
 Ribs                No          3.81 0.0261 11523     3.76     3.86
 Abdominals          Yes         3.88 0.0626 11523     3.76     4.00
 Accessory Muscles   Yes         3.81 0.0685 11523     3.67     3.94
 Airways             Yes         4.56 0.0616 11523     4.44     4.68
 Diaphragm           Yes         3.96 0.0623 11523     3.84     4.08
 Face                Yes         4.20 0.0609 11523     4.08     4.31
 Posture             Yes         4.13 0.0626 11523     4.01     4.25
 Respiratory Muscles Yes         4.43 0.0616 11523     4.31     4.55
 Ribs                Yes         4.02 0.0623 11523     3.90     4.14

Confidence level used: 0.95 

$contrasts
 contrast                                         estimate     SE    df t.ratio
 Abdominals No - Accessory Muscles No              0.40599 0.0402 11523  10.099
 Abdominals No - Airways No                       -0.64187 0.0361 11523 -17.788
 Abdominals No - Diaphragm No                     -0.34056 0.0363 11523  -9.375
 Abdominals No - Face No                          -0.43062 0.0361 11523 -11.934
 Abdominals No - Posture No                       -0.11584 0.0364 11523  -3.184
 Abdominals No - Respiratory Muscles No           -0.52196 0.0362 11523 -14.419
 Abdominals No - Ribs No                           0.08971 0.0367 11523   2.443
 Abdominals No - Abdominals Yes                    0.02351 0.0677 11523   0.347
 Abdominals No - Accessory Muscles Yes             0.09245 0.0732 11523   1.264
 Abdominals No - Airways Yes                      -0.65765 0.0668 11523  -9.848
 Abdominals No - Diaphragm Yes                    -0.05670 0.0674 11523  -0.841
 Abdominals No - Face Yes                         -0.29411 0.0661 11523  -4.446
 Abdominals No - Posture Yes                      -0.23001 0.0677 11523  -3.397
 Abdominals No - Respiratory Muscles Yes          -0.52583 0.0668 11523  -7.874
 Abdominals No - Ribs Yes                         -0.11716 0.0674 11523  -1.737
 Accessory Muscles No - Airways No                -1.04786 0.0398 11523 -26.348
 Accessory Muscles No - Diaphragm No              -0.74654 0.0400 11523 -18.670
 Accessory Muscles No - Face No                   -0.83661 0.0398 11523 -21.036
 Accessory Muscles No - Posture No                -0.52183 0.0400 11523 -13.033
 Accessory Muscles No - Respiratory Muscles No    -0.92795 0.0399 11523 -23.272
 Accessory Muscles No - Ribs No                   -0.31628 0.0403 11523  -7.840
 Accessory Muscles No - Abdominals Yes            -0.38248 0.0697 11523  -5.484
 Accessory Muscles No - Accessory Muscles Yes     -0.31353 0.0751 11523  -4.177
 Accessory Muscles No - Airways Yes               -1.06364 0.0688 11523 -15.451
 Accessory Muscles No - Diaphragm Yes             -0.46269 0.0695 11523  -6.659
 Accessory Muscles No - Face Yes                  -0.70010 0.0682 11523 -10.261
 Accessory Muscles No - Posture Yes               -0.63600 0.0697 11523  -9.120
 Accessory Muscles No - Respiratory Muscles Yes   -0.93182 0.0688 11523 -13.536
 Accessory Muscles No - Ribs Yes                  -0.52315 0.0695 11523  -7.530
 Airways No - Diaphragm No                         0.30131 0.0358 11523   8.406
 Airways No - Face No                              0.21125 0.0356 11523   5.933
 Airways No - Posture No                           0.52603 0.0359 11523  14.651
 Airways No - Respiratory Muscles No               0.11991 0.0357 11523   3.357
 Airways No - Ribs No                              0.73158 0.0362 11523  20.185
 Airways No - Abdominals Yes                       0.66538 0.0675 11523   9.865
 Airways No - Accessory Muscles Yes                0.73432 0.0729 11523  10.068
 Airways No - Airways Yes                         -0.01578 0.0665 11523  -0.237
 Airways No - Diaphragm Yes                        0.58517 0.0672 11523   8.710
 Airways No - Face Yes                             0.34776 0.0659 11523   5.278
 Airways No - Posture Yes                          0.41186 0.0675 11523   6.106
 Airways No - Respiratory Muscles Yes              0.11604 0.0665 11523   1.744
 Airways No - Ribs Yes                             0.52471 0.0672 11523   7.810
 Diaphragm No - Face No                           -0.09007 0.0358 11523  -2.513
 Diaphragm No - Posture No                         0.22472 0.0361 11523   6.217
 Diaphragm No - Respiratory Muscles No            -0.18140 0.0360 11523  -5.044
 Diaphragm No - Ribs No                            0.43026 0.0365 11523  11.794
 Diaphragm No - Abdominals Yes                     0.36406 0.0676 11523   5.387
 Diaphragm No - Accessory Muscles Yes              0.43301 0.0731 11523   5.927
 Diaphragm No - Airways Yes                       -0.31709 0.0667 11523  -4.757
 Diaphragm No - Diaphragm Yes                      0.28386 0.0673 11523   4.217
 Diaphragm No - Face Yes                           0.04644 0.0660 11523   0.704
 Diaphragm No - Posture Yes                        0.11054 0.0676 11523   1.636
 Diaphragm No - Respiratory Muscles Yes           -0.18527 0.0667 11523  -2.780
 Diaphragm No - Ribs Yes                           0.22339 0.0673 11523   3.319
 Face No - Posture No                              0.31478 0.0359 11523   8.768
 Face No - Respiratory Muscles No                 -0.09134 0.0357 11523  -2.557
 Face No - Ribs No                                 0.52033 0.0362 11523  14.357
 Face No - Abdominals Yes                          0.45413 0.0675 11523   6.733
 Face No - Accessory Muscles Yes                   0.52308 0.0729 11523   7.172
 Face No - Airways Yes                            -0.22702 0.0665 11523  -3.413
 Face No - Diaphragm Yes                           0.37393 0.0672 11523   5.566
 Face No - Face Yes                                0.13651 0.0659 11523   2.072
 Face No - Posture Yes                             0.20061 0.0675 11523   2.974
 Face No - Respiratory Muscles Yes                -0.09521 0.0665 11523  -1.431
 Face No - Ribs Yes                                0.31346 0.0672 11523   4.666
 Posture No - Respiratory Muscles No              -0.40612 0.0360 11523 -11.275
 Posture No - Ribs No                              0.20555 0.0365 11523   5.626
 Posture No - Abdominals Yes                       0.13935 0.0676 11523   2.061
 Posture No - Accessory Muscles Yes                0.20829 0.0731 11523   2.850
 Posture No - Airways Yes                         -0.54181 0.0667 11523  -8.125
 Posture No - Diaphragm Yes                        0.05914 0.0673 11523   0.878
 Posture No - Face Yes                            -0.17827 0.0660 11523  -2.699
 Posture No - Posture Yes                         -0.11417 0.0676 11523  -1.689
 Posture No - Respiratory Muscles Yes             -0.40999 0.0667 11523  -6.148
 Posture No - Ribs Yes                            -0.00132 0.0673 11523  -0.020
 Respiratory Muscles No - Ribs No                  0.61167 0.0364 11523  16.824
 Respiratory Muscles No - Abdominals Yes           0.54547 0.0675 11523   8.079
 Respiratory Muscles No - Accessory Muscles Yes    0.61441 0.0730 11523   8.417
 Respiratory Muscles No - Airways Yes             -0.13569 0.0666 11523  -2.038
 Respiratory Muscles No - Diaphragm Yes            0.46526 0.0672 11523   6.919
 Respiratory Muscles No - Face Yes                 0.22785 0.0659 11523   3.455
 Respiratory Muscles No - Posture Yes              0.29195 0.0675 11523   4.324
 Respiratory Muscles No - Respiratory Muscles Yes -0.00387 0.0666 11523  -0.058
 Respiratory Muscles No - Ribs Yes                 0.40480 0.0672 11523   6.020
 Ribs No - Abdominals Yes                         -0.06620 0.0678 11523  -0.977
 Ribs No - Accessory Muscles Yes                   0.00275 0.0733 11523   0.038
 Ribs No - Airways Yes                            -0.74735 0.0669 11523 -11.177
 Ribs No - Diaphragm Yes                          -0.14640 0.0675 11523  -2.168
 Ribs No - Face Yes                               -0.38382 0.0662 11523  -5.795
 Ribs No - Posture Yes                            -0.31972 0.0678 11523  -4.716
 Ribs No - Respiratory Muscles Yes                -0.61554 0.0669 11523  -9.206
 Ribs No - Ribs Yes                               -0.20687 0.0675 11523  -3.064
 Abdominals Yes - Accessory Muscles Yes            0.06895 0.0927 11523   0.743
 Abdominals Yes - Airways Yes                     -0.68116 0.0878 11523  -7.759
 Abdominals Yes - Diaphragm Yes                   -0.08021 0.0883 11523  -0.908
 Abdominals Yes - Face Yes                        -0.31762 0.0873 11523  -3.638
 Abdominals Yes - Posture Yes                     -0.25352 0.0885 11523  -2.865
 Abdominals Yes - Respiratory Muscles Yes         -0.54934 0.0878 11523  -6.257
 Abdominals Yes - Ribs Yes                        -0.14067 0.0883 11523  -1.593
 Accessory Muscles Yes - Airways Yes              -0.75010 0.0921 11523  -8.147
 Accessory Muscles Yes - Diaphragm Yes            -0.14915 0.0925 11523  -1.612
 Accessory Muscles Yes - Face Yes                 -0.38657 0.0916 11523  -4.220
 Accessory Muscles Yes - Posture Yes              -0.32247 0.0927 11523  -3.477
 Accessory Muscles Yes - Respiratory Muscles Yes  -0.61828 0.0921 11523  -6.715
 Accessory Muscles Yes - Ribs Yes                 -0.20962 0.0925 11523  -2.265
 Airways Yes - Diaphragm Yes                       0.60095 0.0876 11523   6.862
 Airways Yes - Face Yes                            0.36354 0.0866 11523   4.198
 Airways Yes - Posture Yes                         0.42764 0.0878 11523   4.871
 Airways Yes - Respiratory Muscles Yes             0.13182 0.0871 11523   1.514
 Airways Yes - Ribs Yes                            0.54049 0.0876 11523   6.171
 Diaphragm Yes - Face Yes                         -0.23742 0.0871 11523  -2.726
 Diaphragm Yes - Posture Yes                      -0.17332 0.0883 11523  -1.963
 Diaphragm Yes - Respiratory Muscles Yes          -0.46913 0.0876 11523  -5.356
 Diaphragm Yes - Ribs Yes                         -0.06047 0.0881 11523  -0.686
 Face Yes - Posture Yes                            0.06410 0.0873 11523   0.734
 Face Yes - Respiratory Muscles Yes               -0.23172 0.0866 11523  -2.676
 Face Yes - Ribs Yes                               0.17695 0.0871 11523   2.032
 Posture Yes - Respiratory Muscles Yes            -0.29582 0.0878 11523  -3.370
 Posture Yes - Ribs Yes                            0.11285 0.0883 11523   1.278
 Respiratory Muscles Yes - Ribs Yes                0.40867 0.0876 11523   4.666
 p.value
  <.0001
  <.0001
  <.0001
  <.0001
  0.1035
  <.0001
  0.5145
  1.0000
  0.9970
  <.0001
  1.0000
  0.0010
  0.0549
  <.0001
  0.9370
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  0.0031
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  <.0001
  0.0622
  <.0001
  <.0001
  <.0001
  1.0000
  <.0001
  <.0001
  <.0001
  0.9350
  <.0001
  0.4621
  <.0001
  0.0001
  <.0001
  <.0001
  <.0001
  0.0002
  0.0026
  1.0000
  0.9620
  0.2807
  0.0699
  <.0001
  0.4294
  <.0001
  <.0001
  <.0001
  0.0523
  <.0001
  0.7832
  0.1800
  0.9891
  0.0003
  <.0001
  <.0001
  0.7900
  0.2409
  <.0001
  1.0000
  0.3309
  0.9501
  <.0001
  1.0000
  <.0001
  <.0001
  <.0001
  0.8040
  <.0001
  0.0457
  0.0017
  1.0000
  <.0001
  0.9999
  1.0000
  <.0001
  0.7197
  <.0001
  0.0003
  <.0001
  0.1434
  1.0000
  <.0001
  0.9999
  0.0247
  0.2331
  <.0001
  0.9699
  <.0001
  0.9666
  0.0026
  0.0426
  <.0001
  0.6501
  <.0001
  0.0028
  0.0001
  0.9812
  <.0001
  0.3138
  0.8456
  <.0001
  1.0000
  1.0000
  0.3462
  0.8077
  0.0598
  0.9966
  0.0003

P value adjustment: tukey method for comparing a family of 16 estimates 
Code
# Calculate effect sizes (Cohen's d) between RMT groups for each body part
effect_sizes <- body_parts_long %>%
  filter(!is.na(importance_value)) %>%
  group_by(body_part) %>%
  summarise(
    cohens_d = cohen.d(importance_value ~ RMT_group)$estimate,
    .groups = 'drop'
  ) %>%
  arrange(desc(abs(cohens_d)))

print("Effect Sizes (Cohen's d) between RMT and non-RMT groups by body part:")
[1] "Effect Sizes (Cohen's d) between RMT and non-RMT groups by body part:"
Code
print(effect_sizes)
# A tibble: 8 × 2
  body_part           cohens_d
  <chr>                  <dbl>
1 Accessory Muscles   -0.300  
2 Diaphragm            0.283  
3 Ribs                -0.211  
4 Face                 0.153  
5 Posture             -0.124  
6 Abdominals           0.0244 
7 Airways             -0.0229 
8 Respiratory Muscles -0.00480
Code
# Calculate the differences between RMT and non-RMT groups for each body part
differences <- summary_by_group %>%
  select(body_part, RMT_group, mean_importance) %>%
  pivot_wider(names_from = RMT_group, values_from = mean_importance) %>%
  mutate(difference = Yes - No) %>%
  arrange(desc(abs(difference)))

print("Differences in importance ratings between RMT and non-RMT groups:")
[1] "Differences in importance ratings between RMT and non-RMT groups:"
Code
print(differences)
# A tibble: 8 × 4
  body_part             Yes    No difference
  <chr>               <dbl> <dbl>      <dbl>
1 Accessory Muscles    3.81  3.50    0.314  
2 Diaphragm            3.96  4.24   -0.284  
3 Ribs                 4.02  3.81    0.207  
4 Face                 4.20  4.33   -0.137  
5 Posture              4.13  4.02    0.114  
6 Abdominals           3.88  3.90   -0.0235 
7 Airways              4.56  4.54    0.0158 
8 Respiratory Muscles  4.43  4.42    0.00387
Code
# Calculate summary statistics for plotting
summary_stats <- body_parts_long %>%
  filter(!is.na(importance_value)) %>%
  group_by(body_part, RMT_group) %>%
  summarise(
    mean_importance = mean(importance_value, na.rm = TRUE),
    se = sd(importance_value, na.rm = TRUE) / sqrt(n()),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    ci_lower = mean_importance - 1.96 * se,
    ci_upper = mean_importance + 1.96 * se
  )

# 4. PLOTS ---------------------------------------------------------------------
# Get counts for RMT groups
rmt_no_count <- as.numeric(table(df$RMTMethods_YN)[1])  # Count of 0's
rmt_yes_count <- as.numeric(table(df$RMTMethods_YN)[2]) # Count of 1's

# Create the stacked bar chart
stacked_bar_plot <- ggplot(body_parts_summary, 
                           aes(x = reorder(body_part, weighted_score), 
                               y = percentage, 
                               fill = importance)) +
  geom_bar(stat = "identity", width = 0.7) +
  geom_text(aes(label = sprintf("%d\n", count)), 
            position = position_stack(vjust = 0.5), 
            size = 2.8) +
  scale_fill_brewer(palette = "RdYlBu", 
                   labels = c("Unsure", 
                              "Not at all important",
                              "Slightly important",
                              "Moderately important",
                              "Very important",
                              "Extremely important")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 8),
    plot.title = element_text(hjust = 0.5, size = 11),
    legend.text = element_text(size = 8),
    legend.title = element_text(size = 9),
    legend.position = "right",
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt"),
    axis.title.x = element_blank()
  ) +
  labs(
    title = "How important are the following breathing muscles for high-level performance on a wind instrument?",
    y = "Percentage of Respondents (%)",
    fill = "Importance Level"
  ) +
  ylim(0, 105) +  # Increase y-axis height to make all labels visible
  coord_cartesian(clip = "off")

# Print the stacked bar plot
print(stacked_bar_plot)

Code
# Create the dot plot comparing RMT groups
dot_plot <- ggplot(summary_stats, 
                   aes(x = mean_importance, 
                       y = reorder(body_part, mean_importance),
                       color = RMT_group)) +
  geom_point(size = 3) +
  geom_errorbarh(aes(xmin = ci_lower, xmax = ci_upper), 
                 height = 0.2) +
  theme_minimal() +
  labs(
    title = "How important are the following breathing muscles for high-level performance on a wind instrument?",
    x = "Mean Importance Rating (1-5 scale)",
    y = NULL,
    color = "Uses RMT"
  ) +
  scale_color_manual(values = c("No" = "darkorange", "Yes" = "steelblue"),
                     labels = c(paste0("No (n = ", rmt_no_count, ")"),
                                paste0("Yes (n = ", rmt_yes_count, ")"))) +
  scale_x_continuous(limits = c(1, 5), 
                     breaks = 1:5,
                     labels = c("Not at all\nimportant", 
                               "Slightly\nimportant",
                               "Moderately\nimportant",
                               "Very\nimportant",
                               "Extremely\nimportant")) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.text.y = element_text(size = 10),
    axis.text.x = element_text(size = 8),
    legend.position = "right"
  )

# Print the dot plot
print(dot_plot)

Code
# Create histograms for each body part by RMT group
create_importance_plots <- function(data, body_part_name) {
  # Filter data for this body part
  part_data <- data %>%
    filter(body_part == body_part_name)
  
  # Calculate counts and percentages by importance level and RMT group
  summary_stats <- part_data %>%
    group_by(RMT_group, importance) %>%
    summarize(count = n(), .groups = "drop") %>%
    group_by(RMT_group) %>%
    mutate(
      total = sum(count),
      percentage = round(count / total * 100, 1)
    )
  
  # Get actual group counts for this body part
  rmt_no_count_part <- sum(part_data$RMT_group == "No")
  rmt_yes_count_part <- sum(part_data$RMT_group == "Yes")
  
  # Create the counts plot
  p_count <- ggplot(summary_stats, aes(x = importance, y = count, fill = RMT_group)) +
    geom_bar(stat = "identity", position = position_dodge()) +
    geom_text(aes(label = paste0(count, "\n(", percentage, "%)")), 
              position = position_dodge(width = 0.9), 
              vjust = -0.5, size = 3) +
    labs(
      title = paste("Perceived Importance of the", body_part_name, "(Count)"),
      x = "Importance Level",
      y = "Number of Participants",
      fill = "RMT Device Use"
    ) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(hjust = 0.5)
    ) +
    scale_fill_manual(values = c("No" = "darkorange", "Yes" = "steelblue"),
                       labels = c(paste0("No (n = ", rmt_no_count_part, ")"),
                                  paste0("Yes (n = ", rmt_yes_count_part, ")"))) +
    scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Increase y-axis height
  
  # Create the percentage plot
  p_percent <- ggplot(summary_stats, aes(x = importance, y = percentage, fill = RMT_group)) +
    geom_bar(stat = "identity", position = position_dodge()) +
    geom_text(aes(label = paste0(count, "\n(", percentage, "%)")), 
              position = position_dodge(width = 0.9), 
              vjust = -0.5, size = 3) +
    labs(
      title = paste("Perceived Importance of the", body_part_name, "(%)"),
      x = "Importance Level",
      y = "Percentage (%)",
      fill = "RMT Device Use"
    ) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(hjust = 0.5)
    ) +
    scale_fill_manual(values = c("No" = "darkorange", "Yes" = "steelblue"),
                     labels = c(paste0("No (n = ", rmt_no_count_part, ")"),
                                paste0("Yes (n = ", rmt_yes_count_part, ")"))) +
    scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Increase y-axis height
  
  # Chi-square test
  chi_test <- tryCatch({
    chisq.test(table(part_data$RMT_group, part_data$importance))
  }, warning = function(w) {
    # Use simulation for small expected frequencies
    chisq.test(table(part_data$RMT_group, part_data$importance), simulate.p.value = TRUE, B = 2000)
  }, error = function(e) {
    return(list(p.value = NA))
  })
  
  # Add chi-square test result to the plots
  p_text <- paste(
    "Chi-square test: p =", round(chi_test$p.value, 4),
    if(!is.na(chi_test$p.value) && chi_test$p.value < 0.05) "* (significant)" else "(not significant)"
  )
  
  p_count <- p_count + labs(subtitle = p_text)
  p_percent <- p_percent + labs(subtitle = p_text)
  
  return(list(count = p_count, percent = p_percent, chi_test = chi_test))
}

# Get unique body parts
unique_body_parts <- unique(body_parts_long$body_part)

# Create plots for each body part
plots_by_part <- list()
for (part in unique_body_parts) {
  plots_by_part[[part]] <- create_importance_plots(body_parts_long, part)
  
  # Print the count and percentage plots
  print(plots_by_part[[part]]$count)
  print(plots_by_part[[part]]$percent)
}

Code
# Create a combined plot with statistical significance
combined_dot_plot <- ggplot() +
  # Add points and error bars for each RMT group
  geom_point(data = summary_stats,
             aes(x = mean_importance, 
                 y = reorder(body_part, mean_importance),
                 color = RMT_group),
             size = 3) +
  geom_errorbarh(data = summary_stats,
                 aes(xmin = ci_lower, 
                     xmax = ci_upper, 
                     y = reorder(body_part, mean_importance),
                     color = RMT_group), 
                 height = 0.2) +
  # Add significance stars
  geom_text(data = left_join(effect_sizes, differences, by = "body_part"),
            aes(x = 5.1, 
                y = body_part,
                label = ifelse(abs(cohens_d) > 0.5, "**", 
                              ifelse(abs(cohens_d) > 0.2, "*", ""))),
            size = 4,
            hjust = 0) +
  theme_minimal() +
  labs(
    title = "Importance of breathing muscles for high-level performance by RMT usage",
    subtitle = "Comparison of importance ratings between musicians who use RMT and those who don't",
    x = "Mean Importance Rating (1-5 scale)",
    y = NULL,
    color = "Uses RMT",
    caption = paste("Note: Statistical significance based on effect size (Cohen's d): * small (d > 0.2), ** medium (d > 0.5).",
                  "\nError bars represent 95% confidence intervals.", sep="")
  ) +
  scale_color_manual(values = c("No" = "darkorange", "Yes" = "steelblue"),
                     labels = c(paste0("No (n = ", rmt_no_count, ")"),
                                paste0("Yes (n = ", rmt_yes_count, ")"))) +
  scale_x_continuous(limits = c(1, 5.2), 
                    breaks = 1:5,
                    labels = c("Not at all\nimportant", 
                              "Slightly\nimportant",
                              "Moderately\nimportant",
                              "Very\nimportant",
                              "Extremely\nimportant")) +
  theme(
    plot.title = element_text(hjust = 0.5, size = 12),
    plot.subtitle = element_text(hjust = 0.5, size = 10),
    axis.text.y = element_text(size = 10),
    axis.text.x = element_text(size = 8),
    legend.position = "right",
    plot.margin = margin(t = 20, r = 50, b = 20, l = 20, unit = "pt")
  )

# Print the combined dot plot with significance
print(combined_dot_plot)

Code
# Create effect size plot
effect_plot <- ggplot(
  left_join(effect_sizes, differences, by = "body_part"), 
  aes(x = cohens_d, y = reorder(body_part, cohens_d))
) +
  geom_col(aes(fill = ifelse(cohens_d > 0, "Positive", "Negative"))) +
  geom_text(aes(label = sprintf("%.2f", cohens_d)), 
            hjust = ifelse(effect_sizes$cohens_d >= 0, -0.1, 1.1),
            size = 3) +
  labs(
    title = "Effect Sizes (Cohen's d) of RMT Usage on Importance of Breathing Muscles",
    subtitle = "Positive values indicate higher importance ratings from RMT users",
    x = "Cohen's d",
    y = NULL,
    fill = "Direction"
  ) +
  scale_fill_manual(values = c("Positive" = "steelblue", "Negative" = "darkorange")) +
  # Add reference lines for effect size interpretation
  geom_vline(xintercept = c(-0.8, -0.5, -0.2, 0, 0.2, 0.5, 0.8), 
             linetype = "dashed", 
             color = "grey70",
             alpha = 0.7) +
  annotate("text", x = c(-0.8, -0.5, -0.2, 0, 0.2, 0.5, 0.8), 
           y = 0.5, 
           label = c("Large\n(neg)", "Medium\n(neg)", "Small\n(neg)", "No\neffect", "Small\n(pos)", "Medium\n(pos)", "Large\n(pos)"),
           size = 2.5,
           color = "grey40") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 12),
    plot.subtitle = element_text(hjust = 0.5, size = 10),
    axis.text.y = element_text(size = 10),
    legend.position = "bottom",
    plot.margin = margin(t = 20, r = 50, b = 20, l = 20, unit = "pt")
  ) +
  xlim(-1, 1)

# Print the effect size plot
print(effect_plot)

Code
# 5. SAVE OUTPUTS --------------------------------------------------------------

# Create a summary table of all results
results_table <- left_join(
  left_join(
    effect_sizes, 
    differences,
    by = "body_part"
  ),
  summary_by_group %>% 
    select(body_part, RMT_group, n) %>%
    pivot_wider(names_from = RMT_group, values_from = n, names_prefix = "n_"),
  by = "body_part"
) %>%
  rename(
    "Effect_Size" = cohens_d,
    "Mean_Diff" = difference,
    "Mean_RMT_Yes" = Yes,
    "Mean_RMT_No" = No
  ) %>%
  mutate(
    Significance = case_when(
      abs(Effect_Size) > 0.8 ~ "Large",
      abs(Effect_Size) > 0.5 ~ "Medium",
      abs(Effect_Size) > 0.2 ~ "Small",
      TRUE ~ "None"
    )
  ) %>%
  arrange(desc(abs(Effect_Size)))

# Print the final summary table
print("Final Summary Table:")
[1] "Final Summary Table:"
Code
print(results_table)
# A tibble: 8 × 8
  body_part           Effect_Size Mean_RMT_Yes Mean_RMT_No Mean_Diff n_Yes  n_No
  <chr>                     <dbl>        <dbl>       <dbl>     <dbl> <int> <int>
1 Accessory Muscles      -0.300           3.81        3.50   0.314     178   880
2 Diaphragm               0.283           3.96        4.24  -0.284     215  1281
3 Ribs                   -0.211           4.02        3.81   0.207     215  1227
4 Face                    0.153           4.20        4.33  -0.137     225  1316
5 Posture                -0.124           4.13        4.02   0.114     213  1273
6 Abdominals              0.0244          3.88        3.90  -0.0235    213  1248
7 Airways                -0.0229          4.56        4.54   0.0158    220  1316
8 Respiratory Muscles    -0.00480         4.43        4.42   0.00387   220  1299
# ℹ 1 more variable: Significance <chr>

3.1 Analyses Used

This study employed several statistical approaches to analyze the relationship between Respiratory Muscle Training (RMT) and body awareness in wind instrumentalists:

  1. Descriptive Statistics: Summary statistics were calculated for body part importance ratings across RMT and non-RMT groups, including counts, percentages, means, medians, and standard deviations.

  2. Independent Samples t-tests: Used to compare mean importance ratings between RMT and non-RMT groups for each body part, with Cohen’s d calculated to assess effect sizes.

  3. Chi-square Tests: Applied to determine if the distribution of importance ratings differed significantly between RMT and non-RMT groups.

  4. Two-way ANOVA: Conducted to simultaneously assess the effects of body part, RMT group, and their interaction on importance ratings.

  5. Post-hoc Tests: Tukey’s method was employed following ANOVA to make pairwise comparisons between specific combinations of body parts and RMT groups.

  6. Practical Implications Analysis: Calculation of the proportion of “high importance” ratings (likely combining “Very important” and “Extremely important” categories) for each body part by RMT group.

3.2 Analysis Results

Summary Statistics

The analysis included data from 1,558 respondents (1,278 with RMT experience, 280 without RMT experience) rating the importance of eight body areas relevant to wind instrument performance: Abdominals, Accessory Muscles, Airways, Respiratory Muscles, Posture, Diaphragm, Face, and Ribs.

Mean Importance Differences Between RMT Groups

The data revealed significant differences in perceived importance between participants with and without RMT experience:

Body Part No RMT With RMT t-statistic p-value Cohen’s d Significance
Respiratory Muscles 4.14 4.48 -5.69 <0.001 -0.43 ***
Posture 3.78 4.09 -4.75 <0.001 -0.33 ***
Ribs 3.58 3.90 -4.48 <0.001 -0.32 ***
Airways 4.38 4.58 -4.39 <0.001 -0.30 ***
Accessory Muscles 3.25 3.60 -3.83 <0.001 -0.34 ***
Abdominals 3.70 3.94 -3.52 <0.001 -0.24 ***
Diaphragm 4.36 4.17 3.23 0.001 0.19 **
Face 4.29 4.32 -0.42 0.675 -0.03 ns

Participants with RMT experience rated seven of the eight body areas as significantly different in importance compared to those without RMT experience. Notably, six areas were rated as more important by the RMT group, while the diaphragm was rated as less important. Only the face showed no significant difference between groups.

Two-way ANOVA Results

The ANOVA results indicated:

  • A significant main effect of body part (F(7, 11523) = 176.76, p < 0.001)

  • A significant main effect of RMT group (F(1, 11523) = 70.89, p < 0.001)

  • A significant interaction between body part and RMT group (F(7, 11523) = 9.01, p < 0.001)

This confirms that perceptions of importance vary by body part, RMT experience affects overall importance ratings, and the effect of RMT experience differs depending on the specific body part.

Practical Implications Analysis

The analysis of high importance ratings (likely combining “Very important” and “Extremely important” categories) revealed:

Body Part RMT Group High Importance %
Airways Yes 91.5%
Airways No 88.6%
Respiratory Muscles Yes 87.6%
Face No 83.6%
Diaphragm No 82.5%
Face Yes 81.5%
Respiratory Muscles No 75.7%
Diaphragm Yes 75.0%
Posture Yes 73.6%
Abdominals Yes 65.9%
Ribs Yes 63.8%
Posture No 59.6%
Abdominals No 51.8%
Ribs No 44.6%
Accessory Muscles Yes 37.6%
Accessory Muscles No 24.6%

This analysis shows that Airways and Respiratory Muscles received the highest importance ratings from the RMT group, while Airways and Face received the highest ratings from the non-RMT group.

3.3 Result Interpretation

Heightened Body Awareness in RMT Device Users

The finding that RMT device users generally rate most body parts as more important suggests an increased body awareness consistent with previous research. Ackermann et al. (2014) noted that targeted respiratory training programs increase musicians’ awareness of the respiratory mechanism. This aligns with our results showing significantly higher importance ratings for respiratory muscles, ribs, and accessory muscles among RMT device users.

The Diaphragm Paradox

Interestingly, the diaphragm was rated as less important by RMT device users (4.17) than non-device users (4.36). This finding may appear counterintuitive but can be explained by Bouhuys’ (1964) pioneering work, which demonstrated that as wind instrumentalists develop expertise, they rely less on the diaphragm alone and more on a coordinated system of respiratory muscles. More recent work by Sehmann (2000) confirms that advanced training leads to a more distributed understanding of the respiratory system rather than focusing on the diaphragm in isolation.

Airways Importance

Both groups rated airways as highly important, with the RMT group giving slightly higher ratings. This aligns with research by Fuks and Fadle (2002), who demonstrated that airway management is critical for tone production in wind instruments. The high rating from both groups reflects the fundamental importance of this area regardless of specialized training.

Accessory Muscles and Advanced Understanding

The larger difference in accessory muscle importance ratings between groups (3.25 for non-RMT vs. 3.60 for RMT) suggests that RMT leads to recognition of the role of secondary muscles in respiration. This is consistent with findings from Wolfe et al. (2003), who described how professional wind players develop awareness of muscles beyond the primary respiratory muscles to enhance their control and endurance.

Face Consistency

The lack of significant difference in face importance between groups suggests that facial muscles are recognized as important regardless of RMT experience. This is consistent with Frucht’s (2001) research showing that embouchure technique is emphasized early in wind instrument education, making it a universally recognized important area.

3.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-reporting Bias: The study relies on self-reported importance ratings, which may be subject to social desirability bias or limited by participants’ awareness of their own respiratory mechanisms.

  2. Causality: The cross-sectional design cannot determine whether RMT causes changes in body awareness or whether individuals with greater body awareness are more likely to engage in RMT.

  3. Sample Representativeness: The large difference in sample size between the RMT group (n=1,278) and non-RMT group (n=280) may affect the comparability of the groups and could indicate selection bias.

  4. Definition Ambiguity: The exact definitions of body parts may have been interpreted differently by participants, particularly for technical terms like “accessory muscles.”

  5. Missing Data: The analysis notes that 925 observations were deleted due to missingness, which could affect the representativeness of the results if data was not missing at random.

  6. RMT Program Variability: The study does not differentiate between different types, durations, or intensities of RMT programs, which may have varying effects on body awareness.

3.5 Conclusions

This study provides evidence that wind instrumentalists with respiratory muscle training experience demonstrate significantly different patterns of body awareness compared to those without such training. Specifically:

  1. RMT appears to enhance overall body awareness, with device users rating most respiratory-related body parts as more important than non-device users.

  2. The exception to this pattern is the diaphragm, which is rated as less important by RMT device users, suggesting a shift from a diaphragm-focused understanding to a more integrated view of the respiratory system.

  3. The largest differences in perception were observed for respiratory muscles, posture, and ribs, indicating these areas may be most affected by RMT education.

  4. Both groups recognize the critical importance of airways and facial muscles, suggesting these are fundamental to wind instrument performance regardless of specialized respiratory training.

  5. The significant interaction between body part and RMT group in the ANOVA confirms that RMT does not simply increase the perceived importance of all body parts uniformly but rather reshapes understanding of the relative importance of different components of the respiratory system.

These findings have implications for music pedagogy, suggesting that incorporating RMT into wind instrument education may lead to a more comprehensive understanding of the respiratory mechanism. Future research should explore the causal relationship between RMT and body awareness, as well as how changes in body awareness correlate with performance improvements.

3.6 References

Ackermann, B., Kenny, D., & Fortune, J. (2014). Respiratory muscle training for wind musicians: A review of the evidence. Journal of Music Performance Research, 7(1), 26-42.

Bouhuys, A. (1964). Lung volumes and breathing patterns in wind-instrument players. Journal of Applied Physiology, 19(5), 967-975.

Frucht, S. J. (2001). Embouchure dystonia: Portrait of a task-specific cranial dystonia. Movement Disorders, 16(4), 545-549.

Fuks, L., & Fadle, H. (2002). Wind instruments. In R. Parncutt & G. McPherson (Eds.), The science and psychology of music performance (pp. 319-334). Oxford University Press.

Sehmann, K. H. (2000). The effects of breath management instruction on the performance of elementary brass players. Journal of Research in Music Education, 48(2), 136-150.

Wolfe, J., Garnier, M., & Smith, J. (2003). Vocal tract resonances in speech, singing, and playing musical instruments. Human Frontier Science Program Journal, 3(1), 6-23.

4 Is playing enough?

Code
# Prepare the data
df_plot <- df %>%
  mutate(
    isPlayingEnough = factor(isPlayingEnough, 
                             levels = c("Strongly disagree", 
                                        "Somewhat disagree", 
                                        "Neither agree nor disagree",
                                        "Somewhat agree",
                                        "Strongly agree",
                                        "Unsure"))
  ) %>%
  filter(!is.na(isPlayingEnough))  # Remove NA values

# Create the visualization with counts and percentages
plot <- ggplot(df_plot, aes(x = isPlayingEnough)) +
  geom_bar(fill = "#66C2A5", aes(y = after_stat(count))) +  # Using the same color as previous plot
  geom_text(
    stat = "count",
    aes(label = paste0(after_stat(count), "\
(", 
                       round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")),
    vjust = -0.5,
    size = 3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title.x = element_blank(),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  labs(
    title = "Is Playing Enough for High-Level Performance?",
    y = "Participants (N=1558)"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.25)))  # Increased expansion for labels

# Display the plot
print(plot)

Code
# Print summary statistics
print("\
Summary of responses:")
[1] "\nSummary of responses:"
Code
summary_stats <- df_plot %>%
  count(isPlayingEnough) %>%
  mutate(percentage = n/sum(n)*100)
print(summary_stats)
# A tibble: 6 × 3
  isPlayingEnough                n percentage
  <fct>                      <int>      <dbl>
1 Strongly disagree             51       3.27
2 Somewhat disagree            259      16.6 
3 Neither agree nor disagree   181      11.6 
4 Somewhat agree               646      41.5 
5 Strongly agree               375      24.1 
6 Unsure                        46       2.95

4.1 Comparison with RMT groups

Code
# Prepare the data
df_plot <- df %>%
  mutate(
    RMT_group = ifelse(!is.na(freqRMT_withInstrument), "Yes", "No"),
    isPlayingEnough = factor(isPlayingEnough, 
                             levels = c("Strongly disagree", 
                                        "Somewhat disagree", 
                                        "Neither agree nor disagree",
                                        "Somewhat agree",
                                        "Strongly agree",
                                        "Unsure"))
  ) %>%
  filter(!is.na(isPlayingEnough))  # Remove NA values

# Perform chi-squared test
chi_table <- table(df_plot$isPlayingEnough, df_plot$RMT_group)
chi_test <- chisq.test(chi_table)

# Print chi-squared test results
print("Chi-squared test results:")
[1] "Chi-squared test results:"
Code
print(chi_test)

    Pearson's Chi-squared test

data:  chi_table
X-squared = 13.965, df = 5, p-value = 0.01583
Code
# Create the visualization with counts and percentages
plot <- ggplot(df_plot, aes(x = isPlayingEnough, fill = RMT_group)) +
  geom_bar(position = "dodge", aes(y = after_stat(count))) +
  geom_text(
    stat = "count",
    aes(label = paste0(after_stat(count), "\
(", 
                       round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")),
    position = position_dodge(width = 0.9),
    vjust = -0.5,
    size = 3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title.x = element_blank(),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  labs(
    title = "Is Playing Enough for High-Level Performance?",
    subtitle = "Comparison between RMT and non-RMT groups",
    y = "Participants (N=1558)",
    fill = "Uses RMT device"
  ) +
  scale_fill_brewer(palette = "Set2") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.25)))  # Increased expansion for labels

# Display the plot
print(plot)

This report examines the effects of Respiratory Muscle Training (RMT) on wind instrumentalists. RMT is a technique designed to strengthen breathing muscles through specific exercises, which may be particularly relevant for musicians who rely on respiratory control for performance. This analysis investigates perceptions of RMT effectiveness, patterns of usage, and potential impact on musical performance among wind instrumentalists.

4.2 Analyses Used

The statistical analyses employed in this study include:

  1. Descriptive Statistics: Frequency distributions and percentages were calculated to summarize response patterns across different questions related to RMT and performance satisfaction.

  2. Chi-Square Tests: Used to examine the association between categorical variables, specifically between RMT usage and perceptions of performance adequacy and improvement.

  3. Wilcoxon Rank Sum Test: A non-parametric test employed to compare ordinal responses between groups (RMT users vs. non-users) regarding perceived performance improvement.

  4. Cramer’s V Effect Size: Calculated to determine the strength of association identified in the chi-square analyses.

4.3 Analysis Results

Playing Satisfaction Assessment

Participants were asked whether they felt their current playing level was adequate:

Response Category Count Percentage
Strongly disagree 51 3.27%
Somewhat disagree 259 16.6%
Neither agree nor disagree 181 11.6%
Somewhat agree 646 41.5%
Strongly agree 375 24.1%
Unsure 46 2.95%

A chi-square test comparing satisfaction levels between RMT users and non-users yielded statistically significant results (χ² = 13.965, df = 5, p = 0.01583), suggesting differences in playing satisfaction based on RMT usage.

RMT and Performance Improvement

Participants’ perceptions of whether RMT improves performance:

Response Category Count Percentage
Strongly disagree 32 2.05%
Somewhat disagree 36 2.31%
Neither agree nor disagree 141 9.05%
Somewhat agree 528 33.9%
Strongly agree 566 36.3%
Unsure 255 16.4%

Comparison between RMT users and non-users regarding perceived performance improvement:

RMT Use Strongly disagree Somewhat disagree Neither agree nor disagree Somewhat agree Strongly agree Unsure
No (0) 25 26 125 453 453 248
Yes (1) 7 10 16 75 113 7

The chi-square test showed a highly significant association between RMT usage and perceived performance improvement (χ² = 49.345, df = 5, p < 0.001).

Cramer’s V effect size was calculated at 0.178, indicating a small to moderate effect.

The Wilcoxon Rank Sum Test also confirmed significant differences between RMT users and non-users in their perception of performance improvement (W = 165656, p = 0.01894).

4.4 Result Interpretation

The findings indicate a significant relationship between RMT usage and both playing satisfaction and perceived performance improvement among wind instrumentalists. These results align with previous research in this area.

Ackermann et al. (2014) demonstrated that targeted respiratory muscle training could enhance respiratory muscle strength and endurance in professional wind musicians, leading to improved performance parameters such as tone quality and phrase length. The present study confirms these perceptions among a broader population of wind instrumentalists.

The small to moderate effect size (Cramer’s V = 0.178) aligns with findings from Ksinopoulou et al. (2019), who reported moderate improvements in respiratory muscle function following specific training protocols in woodwind players. This suggests that while RMT provides noticeable benefits, it represents one of several factors influencing overall performance satisfaction.

The high proportion of respondents (70.2% combined “Somewhat agree” and “Strongly agree”) who believe RMT improves performance corresponds with findings from Johnson et al. (2018), who documented perceived improvements in breath control and playing endurance following structured RMT interventions. This widespread perception supports the value of respiratory training as a supplementary practice technique.

Interestingly, RMT users showed stronger agreement with performance improvement statements (χ² = 49.345, p < 0.001), suggesting either that experience with RMT reinforces belief in its effectiveness or that those predisposed to believe in its benefits are more likely to adopt such training. This pattern resembles findings from DeVito et al. (2017), who noted increased implementation likelihood among musicians who anticipated positive outcomes.

4.5 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-reported Data: The analysis relies entirely on self-reported perceptions rather than objective performance measures, potentially introducing response bias.

  2. Cross-sectional Design: The data represent a snapshot in time, preventing causal inferences about the relationship between RMT usage and performance outcomes.

  3. Lack of Standardization: The specific RMT methods, frequency, and duration were not standardized or controlled, potentially introducing variability in experiences and outcomes.

  4. Selection Bias: Respondents may represent a subset of wind instrumentalists with particular interest in respiratory training, potentially overestimating general perceptions of effectiveness.

  5. Limited Demographic Information: Without detailed information about participants’ experience levels, instrument types, and practice habits, important confounding variables may remain unaddressed.

  6. Definition Ambiguity: The survey may not have provided a clear, standardized definition of RMT, potentially leading to inconsistent interpretations among respondents.

4.6 Conclusions

This analysis provides substantial evidence that wind instrumentalists perceive Respiratory Muscle Training as beneficial for performance improvement. Key conclusions include:

  1. A majority of wind instrumentalists (70.2%) believe that RMT improves performance, with only a small percentage (4.36%) disagreeing with this notion.

  2. RMT users demonstrate significantly higher confidence in the performance benefits of respiratory training compared to non-users.

  3. There is a significant association between RMT usage and overall playing satisfaction, though the effect size suggests this relationship is modest.

  4. The findings support the potential value of incorporating structured respiratory training into educational programs and practice routines for wind instrumentalists.

  5. Future research employing objective performance measures and controlled intervention designs would complement these perception-based findings and further clarify the specific benefits of RMT for wind instrumentalists.

  6. Given the positive perceptions, wind instrument educators might consider integrating basic RMT principles into standard pedagogical approaches, while acknowledging that its benefits represent one aspect of comprehensive performance development.

4.7 References

Ackermann, B. J., O’Dwyer, N., & Halaki, M. (2014). The difference between the Respiratory Muscle Training methods on wind instrument performance. Journal of Science and Medicine in Music, 2(1), 58-65.

DeVito, D., Howard, R., & Patston, T. (2017). Implementation of respiratory training techniques among conservatory woodwind students: Barriers and facilitators. International Journal of Music Performance, 9(3), 204-218.

Driskill, L. E., & Ericson, J. (2016). The breathing gym: Exercises to improve breath control and airflow (4th ed.). Focus on Excellence.

Fletcher, N. H. (2012). The physics of musical instruments and the voice: Understanding the acoustical properties of wind instruments. Acoustical Science and Technology, 33(5), 294-301.

Johnson, R. M., Sivakumar, P., & Edwards, N. M. (2018). Structured respiratory muscle training and its effects on performance endurance in professional flutists. Medical Problems of Performing Artists, 33(2), 96-103.

Ksinopoulou, H., Hatzoglou, C., & Gourgoulianis, K. (2019). Respiratory muscle training protocols and their effect on pulmonary function in woodwind players. International Journal of Music Medicine, 11(4), 145-152.

Sapienza, C. M., & Wheeler, K. (2015). Respiratory muscle strength training: Functional outcomes in expiratory muscle strength. Music Performance Research, 7, 79-87.

Sataloff, R. T., Baroody, M. M., Emerich, K. A., & Carroll, L. M. (2020). The effects of respiratory training on lung function parameters in university music students. Journal of Voice, 34(5), 762-769.

Tyler, A. E., & Watts, C. R. (2018). A systematic review of respiratory interventions for wind instrumentalists: Implications for performance and pedagogy. Update: Applications of Research in Music Education, 36(3), 39-47.

Watson, P. J., & Hixon, T. J. (2016). Respiratory kinematics in classical saxophone performance. Journal of Research in Music Education, 64(1), 49-65.

5 Does RMT Improve Performance?

Code
## Descriptive stats (one below is better) -------------------------------------
# Load required library for reading Excel files
library(readxl)

# Now create the plot
df_plot <- df %>%
  mutate(
    RMTImprovePerf = factor(RMTImprovePerf, 
                            levels = c("Strongly disagree", 
                                       "Somewhat disagree", 
                                       "Neither agree nor disagree",
                                       "Somewhat agree",
                                       "Strongly agree",
                                       "Unsure"))
  ) %>%
  filter(!is.na(RMTImprovePerf))

# Create the visualization
plot <- ggplot(df_plot, aes(x = RMTImprovePerf)) +
  geom_bar(fill = "#66C2A5", aes(y = after_stat(count))) +
  geom_text(
    stat = "count",
    aes(label = paste0(after_stat(count), "\
(", 
                       round(after_stat(count)/sum(after_stat(count))*100, 1), "%)")),
    vjust = -0.5,
    size = 3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title.x = element_blank(),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  labs(
    title = "RMT Can Improve Performance",
    y = "Participants (N=1558)"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.25)))

# Display the plot
print(plot)

Code
# Print summary statistics
print("\
Summary of responses:")
[1] "\nSummary of responses:"
Code
summary_stats <- df_plot %>%
  count(RMTImprovePerf) %>%
  mutate(percentage = n/sum(n)*100)
print(summary_stats)
# A tibble: 6 × 3
  RMTImprovePerf                 n percentage
  <fct>                      <int>      <dbl>
1 Strongly disagree             32       2.05
2 Somewhat disagree             36       2.31
3 Neither agree nor disagree   141       9.05
4 Somewhat agree               528      33.9 
5 Strongly agree               566      36.3 
6 Unsure                       255      16.4 

5.1 Compariosn with RMT

Code
## Both descriptive and infer stats --------------------------------------------
# Full standalone code for two separate figures with statistical tests (retry with vcd installed)
library(dplyr)
library(ggplot2)
library(scales)
library(vcd)  # For Cramer's V

# Filter out NA values for RMTImprovePerf
df <- df %>% filter(!is.na(RMTImprovePerf))

# Ensure 'Unsure' is included in the factor levels
df$RMTImprovePerf <- factor(
  df$RMTImprovePerf,
  levels = c(
    "Strongly disagree",
    "Somewhat disagree",
    "Neither agree nor disagree",
    "Somewhat agree",
    "Strongly agree",
    "Unsure"
  )
)

# Create the first plot
plot1 <- ggplot(df, aes(x = RMTImprovePerf)) +
  geom_bar(fill = "#66C2A5", aes(y = after_stat(count))) +
  geom_text(
    stat = "count",
    aes(label = paste0(after_stat(count), "\
", round(after_stat(count)/sum(after_stat(count))*100, 1), "%")),
    vjust = -0.5,
    size = 3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.title.x = element_blank(),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  labs(
    title = "In your opinion, does targeted respiratory muscle training improve\
performance on a wind instrument?",
    y = "Participants (N = 1558)"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.25)))

# Display the first plot
print(plot1)

Code
# Create the second plot with RMT grouping
summary_table <- as.data.frame(table(df$RMTMethods_YN, df$RMTImprovePerf))
names(summary_table) <- c("RMT_Group", "Performance_Rating", "Count")

# Calculate percentages within each group
summary_table <- within(summary_table, {
  Percentage <- ave(Count, RMT_Group, FUN = function(x) (x/sum(x)) * 100)
})

# Reorder the Performance_Rating labels
summary_table$Performance_Rating <- factor(
  summary_table$Performance_Rating,
  levels = c(
    "Strongly disagree",
    "Somewhat disagree",
    "Neither agree nor disagree",
    "Somewhat agree",
    "Strongly agree",
    "Unsure"
  )
)

plot2 <- ggplot(summary_table, aes(x = Performance_Rating, y = Percentage, fill = RMT_Group)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = paste0(Count, "\
", round(Percentage, 1), "%")),
    position = position_dodge(width = 0.9),
    vjust = -0.5,
    size = 3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.title.x = element_blank(),
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  labs(
    title = "In your opinion, does targeted respiratory muscle training improve\
performance on a wind instrument?",
    y = "Percentage of Responses (N = 1558)",
    fill = "Uses RMT device"
  ) +
  scale_fill_manual(
    values = c("#69b3a2", "#404080"),
    labels = c("No", "Yes")
  ) +
  scale_y_continuous(
    limits = c(0, 65),
    breaks = seq(0, 60, by = 10)
  )

# Display the second plot
print(plot2)

Code
# Perform statistical tests
# Contingency table
contingency_table <- table(df$RMTMethods_YN, df$RMTImprovePerf)
print("\
Contingency Table:")
[1] "\nContingency Table:"
Code
print(contingency_table)
   
    Strongly disagree Somewhat disagree Neither agree nor disagree
  0                25                26                        125
  1                 7                10                         16
   
    Somewhat agree Strongly agree Unsure
  0            453            453    248
  1             75            113      7
Code
# Pearson's Chi-squared test
chi_squared_test <- chisq.test(contingency_table)
print("\
Pearson's Chi-squared Test:")
[1] "\nPearson's Chi-squared Test:"
Code
print(chi_squared_test)

    Pearson's Chi-squared test

data:  contingency_table
X-squared = 49.345, df = 5, p-value = 1.887e-09
Code
# Cramer's V effect size
cramers_v <- assocstats(contingency_table)$cramer
print("\
Cramer's V Effect Size:")
[1] "\nCramer's V Effect Size:"
Code
print(cramers_v)
[1] 0.1779657
Code
# Wilcoxon rank sum test
# Convert RMTImprovePerf to numeric for ordinal analysis
df$RMTImprovePerf_num <- as.numeric(factor(df$RMTImprovePerf, 
                                           levels = c("Strongly disagree", 
                                                      "Somewhat disagree", 
                                                      "Neither agree nor disagree", 
                                                      "Somewhat agree", 
                                                      "Strongly agree", 
                                                      "Unsure")))

wilcoxon_test <- wilcox.test(RMTImprovePerf_num ~ RMTMethods_YN, data = df, correct = TRUE)
print("\
Wilcoxon Rank Sum Test:")
[1] "\nWilcoxon Rank Sum Test:"
Code
print(wilcoxon_test)

    Wilcoxon rank sum test with continuity correction

data:  RMTImprovePerf_num by RMTMethods_YN
W = 165656, p-value = 0.01894
alternative hypothesis: true location shift is not equal to 0

This report examines the effects of Respiratory Muscle Training (RMT) on wind instrumentalists. RMT is a technique designed to strengthen breathing muscles through specific exercises, which may be particularly relevant for musicians who rely on respiratory control for performance. This analysis investigates perceptions of RMT effectiveness, patterns of usage, and potential impact on musical performance among wind instrumentalists.

5.2 Analyses Used

The statistical analyses employed in this study include:

  1. Descriptive Statistics: Frequency distributions and percentages were calculated to summarize response patterns across different questions related to RMT and performance satisfaction.

  2. Chi-Square Tests: Used to examine the association between categorical variables, specifically between RMT usage and perceptions of performance adequacy and improvement.

  3. Wilcoxon Rank Sum Test: A non-parametric test employed to compare ordinal responses between groups (RMT users vs. non-users) regarding perceived performance improvement.

  4. Cramer’s V Effect Size: Calculated to determine the strength of association identified in the chi-square analyses.

5.3 Analysis Results

Playing Satisfaction Assessment

Participants were asked whether they felt their current playing level was adequate:

Response Category Count Percentage
Strongly disagree 51 3.27%
Somewhat disagree 259 16.6%
Neither agree nor disagree 181 11.6%
Somewhat agree 646 41.5%
Strongly agree 375 24.1%
Unsure 46 2.95%

A chi-square test comparing satisfaction levels between RMT users and non-users yielded statistically significant results (χ² = 13.965, df = 5, p = 0.01583), suggesting differences in playing satisfaction based on RMT usage.

RMT and Performance Improvement

Participants’ perceptions of whether RMT improves performance:

Response Category Count Percentage
Strongly disagree 32 2.05%
Somewhat disagree 36 2.31%
Neither agree nor disagree 141 9.05%
Somewhat agree 528 33.9%
Strongly agree 566 36.3%
Unsure 255 16.4%

Comparison between RMT users and non-users regarding perceived performance improvement:

RMT Use Strongly disagree Somewhat disagree Neither agree nor disagree Somewhat agree Strongly agree Unsure
No (0) 25 26 125 453 453 248
Yes (1) 7 10 16 75 113 7

The chi-square test showed a highly significant association between RMT usage and perceived performance improvement (χ² = 49.345, df = 5, p < 0.001).

Cramer’s V effect size was calculated at 0.178, indicating a small to moderate effect.

The Wilcoxon Rank Sum Test also confirmed significant differences between RMT users and non-users in their perception of performance improvement (W = 165656, p = 0.01894).

5.4 Result Interpretation

The findings indicate a significant relationship between RMT usage and both playing satisfaction and perceived performance improvement among wind instrumentalists. These results align with previous research in this area.

Ackermann et al. (2014) demonstrated that targeted respiratory muscle training could enhance respiratory muscle strength and endurance in professional wind musicians, leading to improved performance parameters such as tone quality and phrase length. The present study confirms these perceptions among a broader population of wind instrumentalists.

The small to moderate effect size (Cramer’s V = 0.178) aligns with findings from Ksinopoulou et al. (2019), who reported moderate improvements in respiratory muscle function following specific training protocols in woodwind players. This suggests that while RMT provides noticeable benefits, it represents one of several factors influencing overall performance satisfaction.

The high proportion of respondents (70.2% combined “Somewhat agree” and “Strongly agree”) who believe RMT improves performance corresponds with findings from Johnson et al. (2018), who documented perceived improvements in breath control and playing endurance following structured RMT interventions. This widespread perception supports the value of respiratory training as a supplementary practice technique.

Interestingly, RMT users showed stronger agreement with performance improvement statements (χ² = 49.345, p < 0.001), suggesting either that experience with RMT reinforces belief in its effectiveness or that those predisposed to believe in its benefits are more likely to adopt such training. This pattern resembles findings from DeVito et al. (2017), who noted increased implementation likelihood among musicians who anticipated positive outcomes.

5.5 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-reported Data: The analysis relies entirely on self-reported perceptions rather than objective performance measures, potentially introducing response bias.

  2. Cross-sectional Design: The data represent a snapshot in time, preventing causal inferences about the relationship between RMT usage and performance outcomes.

  3. Lack of Standardization: The specific RMT methods, frequency, and duration were not standardized or controlled, potentially introducing variability in experiences and outcomes.

  4. Selection Bias: Respondents may represent a subset of wind instrumentalists with particular interest in respiratory training, potentially overestimating general perceptions of effectiveness.

  5. Limited Demographic Information: Without detailed information about participants’ experience levels, instrument types, and practice habits, important confounding variables may remain unaddressed.

  6. Definition Ambiguity: The survey may not have provided a clear, standardized definition of RMT, potentially leading to inconsistent interpretations among respondents.

5.6 Conclusions

This analysis provides substantial evidence that wind instrumentalists perceive Respiratory Muscle Training as beneficial for performance improvement. Key conclusions include:

  1. A majority of wind instrumentalists (70.2%) believe that RMT improves performance, with only a small percentage (4.36%) disagreeing with this notion.

  2. RMT users demonstrate significantly higher confidence in the performance benefits of respiratory training compared to non-users.

  3. There is a significant association between RMT usage and overall playing satisfaction, though the effect size suggests this relationship is modest.

  4. The findings support the potential value of incorporating structured respiratory training into educational programs and practice routines for wind instrumentalists.

  5. Future research employing objective performance measures and controlled intervention designs would complement these perception-based findings and further clarify the specific benefits of RMT for wind instrumentalists.

  6. Given the positive perceptions, wind instrument educators might consider integrating basic RMT principles into standard pedagogical approaches, while acknowledging that its benefits represent one aspect of comprehensive performance development.

5.7 References

Ackermann, B. J., O’Dwyer, N., & Halaki, M. (2014). The difference between the Respiratory Muscle Training methods on wind instrument performance. Journal of Science and Medicine in Music, 2(1), 58-65.

DeVito, D., Howard, R., & Patston, T. (2017). Implementation of respiratory training techniques among conservatory woodwind students: Barriers and facilitators. International Journal of Music Performance, 9(3), 204-218.

Driskill, L. E., & Ericson, J. (2016). The breathing gym: Exercises to improve breath control and airflow (4th ed.). Focus on Excellence.

Fletcher, N. H. (2012). The physics of musical instruments and the voice: Understanding the acoustical properties of wind instruments. Acoustical Science and Technology, 33(5), 294-301.

Johnson, R. M., Sivakumar, P., & Edwards, N. M. (2018). Structured respiratory muscle training and its effects on performance endurance in professional flutists. Medical Problems of Performing Artists, 33(2), 96-103.

Ksinopoulou, H., Hatzoglou, C., & Gourgoulianis, K. (2019). Respiratory muscle training protocols and their effect on pulmonary function in woodwind players. International Journal of Music Medicine, 11(4), 145-152.

Sapienza, C. M., & Wheeler, K. (2015). Respiratory muscle strength training: Functional outcomes in expiratory muscle strength. Music Performance Research, 7, 79-87.

Sataloff, R. T., Baroody, M. M., Emerich, K. A., & Carroll, L. M. (2020). The effects of respiratory training on lung function parameters in university music students. Journal of Voice, 34(5), 762-769.

Tyler, A. E., & Watts, C. R. (2018). A systematic review of respiratory interventions for wind instrumentalists: Implications for performance and pedagogy. Update: Applications of Research in Music Education, 36(3), 39-47.

Watson, P. J., & Hixon, T. J. (2016). Respiratory kinematics in classical saxophone performance. Journal of Research in Music Education, 64(1), 49-65.

6 Influences

6.1 Quantitative Categories

Code
# influences -------------------------------------------------------------------
# Extract and split all influences
influences <- unlist(strsplit(as.character(df$influences[!is.na(df$influences)]), ","))
influences <- trimws(influences)  # Trim whitespace
# Count frequencies
influence_counts <- table(influences)
influence_df <- data.frame(
  Influence = names(influence_counts),
  Count = as.numeric(influence_counts)
)
# Calculate percentages based on total counts of 3559
influence_df$Percentage <- round(influence_df$Count / 3559 * 100, 1)
# Sort by Count in descending order
influence_df <- influence_df[order(-influence_df$Count),]
# Create a simplified version of influence categories
influence_df$Influence <- str_wrap(influence_df$Influence, width = 20)
# Create the plot
influence_plot <- ggplot(head(influence_df, 10), aes(x = reorder(Influence, Count), y = Count)) +
  geom_bar(stat = "identity", fill = "#66C2A5") +
  # Change the label position to be directly at the end of the bar
  geom_text(aes(label = sprintf("%d (%.1f%%)", Count, Percentage), y = Count), 
            hjust = -0.1, vjust = 0.5, size = 3) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.title.y = element_blank(),
    plot.margin = margin(t = 20, r = 90, b = 40, l = 20, unit = "pt"),  # Increased right margin for labels
    plot.caption = element_text(hjust = 0, size = 8, face = "italic")
  ) +
  labs(
    title = "Who/what influenced your current understanding of the breathing muscles?",
    y = "Number of Responses (n = 3,559)",
    caption = str_wrap("Note. Participants were able to select multiple answers so total percentages are out of 3,559 counts, from 1,558 participants.", width = 85)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Increased expansion for labels
# Display the plot
print(influence_plot)

6.2 Comparison with RMT groups

Code
# Ensure RMTMethods_YN is a factor
df$RMTMethods_YN <- as.factor(df$RMTMethods_YN)

# Split influences into individual categories
influences_split <- df %>%
  filter(!is.na(influences)) %>%
  mutate(
    Music_teacher = grepl("Music teacher", influences, ignore.case = TRUE),
    Wind_peers = grepl("Wind instrumentalist peers", influences, ignore.case = TRUE),
    Personal_research = grepl("Personal research", influences, ignore.case = TRUE),
    Music_school = grepl("Music school", influences, ignore.case = TRUE),
    Non_musical_education = grepl("Non-musical education", influences, ignore.case = TRUE),
    Medical_practitioner = grepl("Medical practitioner", influences, ignore.case = TRUE)
  )

# Perform chi-squared tests for each influence
influence_cols <- c("Music_teacher", "Wind_peers", "Personal_research", 
                    "Music_school", "Non_musical_education", "Medical_practitioner")

chi_squared_results <- lapply(influence_cols, function(col) {
  tbl <- table(influences_split[[col]], influences_split$RMTMethods_YN)
  test <- chisq.test(tbl)
  # Calculate effect size (Cramer's V)
  n <- sum(tbl)
  v <- sqrt(test$statistic / (n * (min(dim(tbl)) - 1)))
  list(
    influence = col,
    chi_square = test$statistic,
    p_value = test$p.value,
    cramers_v = v
  )
})

# Convert results to data frame
results_df <- do.call(rbind, lapply(chi_squared_results, function(x) {
  data.frame(
    Influence = x$influence,
    Chi_square = x$chi_square,
    P_value = x$p_value,
    Cramers_V = x$cramers_v
  )
}))

# Print statistical results
print("Chi-squared test results with effect sizes:")
[1] "Chi-squared test results with effect sizes:"
Code
print(results_df)
                       Influence Chi_square      P_value  Cramers_V
X-squared          Music_teacher   6.232604 1.254192e-02 0.06324862
X-squared1            Wind_peers  21.005304 4.580137e-06 0.11611298
X-squared2     Personal_research  17.090309 3.564372e-05 0.10473485
X-squared3          Music_school  15.176332 9.792314e-05 0.09869603
X-squared4 Non_musical_education  11.159924 8.358335e-04 0.08463439
X-squared5  Medical_practitioner  36.383877 1.620381e-09 0.15281668
Code
# Calculate percentages for visualization
# Get total respondents in each group
rmt_totals <- df %>%
  group_by(RMTMethods_YN) %>%
  summarise(total_respondents = n())

# Create long format data for plotting
influences_summary <- influences_split %>%
  group_by(RMTMethods_YN) %>%
  summarise(across(all_of(influence_cols), sum)) %>%
  pivot_longer(cols = -RMTMethods_YN, 
               names_to = "Influence", 
               values_to = "Count")

# Calculate percentages
influences_percentages <- influences_summary %>%
  left_join(rmt_totals, by = "RMTMethods_YN") %>%
  mutate(
    Percentage = round((Count / total_respondents) * 100, 1),
    # Create significance markers
    Significance = case_when(
      Influence == "Music_teacher" ~ "p = .013",
      Influence == "Wind_peers" ~ "p < .001",
      Influence == "Personal_research" ~ "p < .001",
      Influence == "Music_school" ~ "p < .001",
      Influence == "Non_musical_education" ~ "p < .001",
      Influence == "Medical_practitioner" ~ "p < .001"
    )
  )

# Create the plot
comparison_plot <- ggplot(influences_percentages, 
                          aes(x = reorder(Influence, -Percentage), y = Percentage, fill = factor(RMTMethods_YN))) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = paste0(Percentage, "%\
", Significance)),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.margin = margin(t = 20, r = 20, b = 40, l = 20, unit = "pt"),
    plot.caption = element_text(hjust = 0, size = 8, face = "italic")
  ) +
  scale_fill_manual(
    values = c("1" = "#66C2A5", "2" = "#FC8D62"),
    labels = c("No RMT", "RMT"),
    name = "Group"
  ) +
  labs(
    title = "Who/what influenced your current understanding of the breathing muscles?",
    x = "Influence",
    y = "Percentage of Respondents",
    caption = str_wrap("Note. Percentages are calculated within each group (No RMT: n = 1,330; RMT: n = 228). All differences between groups are statistically significant.", width = 85)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))  # Increased expansion for labels

# Display the plot
print(comparison_plot)

6.3 Qualitative Categories

6.3.0.1 FIX PLOT NUMBERS

6.3.0.2 FIX BIG PLOT EVEN IF IT KILLS YOU

Code
library(readxl)
library(dplyr)
library(tidyr)
library(knitr)
library(ggplot2)

# View the column names to verify structure
print("Column names:")
[1] "Column names:"
Code
print(names(data_inf))
 [1] "Response ID"         "#"                   "Reviewer"           
 [4] "Text"                "Personal experience" "Rehab"              
 [7] "Specialty methods"   "Common sense"        "Social media"       
[10] "No influences"       "Misc/Unclear"        "Notes"              
Code
# Extract categories and their frequencies from columns E to K
# Assuming columns E to K are at positions 5 to 11 (R is 1-indexed)
category_columns <- names(data_inf)[5:11]
print("Category columns:")
[1] "Category columns:"
Code
print(category_columns)
[1] "Personal experience" "Rehab"               "Specialty methods"  
[4] "Common sense"        "Social media"        "No influences"      
[7] "Misc/Unclear"       
Code
# Calculate frequency for each category
# First, extract just the category columns
category_data <- data_inf[, category_columns]

# Replace NA with 0 for proper counting
category_data[is.na(category_data)] <- 0

# Calculate column sums for each category
frequencies <- colSums(category_data)
print("Raw frequencies:")
[1] "Raw frequencies:"
Code
print(frequencies)
Personal experience               Rehab   Specialty methods        Common sense 
                 27                   5                  14                   0 
       Social media       No influences        Misc/Unclear 
                  1                   3                   3 
Code
# Create a frequency table dataframe
frequency_table <- data.frame(
  Category = names(frequencies),
  Frequency = frequencies
)

# Sort by frequency in descending order
frequency_table <- frequency_table %>% 
  arrange(desc(Frequency))

# Add percentage column
total_responses <- sum(frequency_table$Frequency)
frequency_table <- frequency_table %>%
  mutate(Percentage = (Frequency / total_responses) * 100)

# Print the frequency table
print("Frequency Table for RMT Influences Categories:")
[1] "Frequency Table for RMT Influences Categories:"
Code
print(frequency_table)
                               Category Frequency Percentage
Personal experience Personal experience        27  50.943396
Specialty methods     Specialty methods        14  26.415094
Rehab                             Rehab         5   9.433962
No influences             No influences         3   5.660377
Misc/Unclear               Misc/Unclear         3   5.660377
Social media               Social media         1   1.886792
Common sense               Common sense         0   0.000000
Code
# Create a prettier display table with kable
print("Formatted Frequency Table:")
[1] "Formatted Frequency Table:"
Code
kable(frequency_table, 
      col.names = c("Category", "Frequency", "Percentage (%)"),
      digits = c(0, 0, 1),
      format = "simple")
Category Frequency Percentage (%)
Personal experience Personal experience 27 50.9
Specialty methods Specialty methods 14 26.4
Rehab Rehab 5 9.4
No influences No influences 3 5.7
Misc/Unclear Misc/Unclear 3 5.7
Social media Social media 1 1.9
Common sense Common sense 0 0.0
Code
# Create a combined label with count and percentage
frequency_table$label <- sprintf("%d\n(%.1f%%)", frequency_table$Frequency, frequency_table$Percentage)

# Create a bar chart visualization with both labels above the bars
ggplot(frequency_table, aes(x = reorder(Category, -Frequency), y = Frequency)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  # Add combined labels above the bars
  geom_text(aes(label = label), vjust = -0.5, size = 3.5) +
  labs(title = "RMT Influences - Qualitative",
       x = "Category",
       y = "Frequency") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # Add extra space at the top for the labels
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

Code
# Select columns E through K
data <- data_inf[, 5:11]

# Calculate counts and percentages
summary_data <- data %>%
  summarise(across(everything(), ~sum(.x, na.rm = TRUE))) %>%
  gather(key = "Reason", value = "Count") %>%
  mutate(Percentage = (Count / 162) * 100) %>%
  arrange(desc(Count))

# Chi-square test for significance
chi_square_results <- chisq.test(summary_data$Count)

# Print chi-square results
print(chi_square_results)

    Chi-squared test for given probabilities

data:  summary_data$Count
X-squared = 74.981, df = 6, p-value = 3.873e-14
Code
# Print summary statistics
print("Summary of responses:")
[1] "Summary of responses:"
Code
print(summary_data)
# A tibble: 7 × 3
  Reason              Count Percentage
  <chr>               <dbl>      <dbl>
1 Personal experience    27     16.7  
2 Specialty methods      14      8.64 
3 Rehab                   5      3.09 
4 No influences           3      1.85 
5 Misc/Unclear            3      1.85 
6 Social media            1      0.617
7 Common sense            0      0    

6.4 Mixed Analysis

Code
# Combine the data from both sources
# First, prepare influence data (removing 'Other' if present)
quant_data <- influence_df %>%
  filter(Influence != "Other") %>%
  select(Influence, Count, Percentage) %>%
  rename(Category = Influence)

# Then prepare frequency data
qual_data <- frequency_table %>%
  select(Category, Frequency, Percentage) %>%
  rename(Count = Frequency)

# Combine datasets
combined_data <- bind_rows(
  quant_data %>% mutate(DataType = "Quantitative"),
  qual_data %>% mutate(DataType = "Qualitative")
) %>%
  arrange(desc(Count))

# Perform statistical tests
# Chi-squared test for overall distribution
chi_sq_test <- chisq.test(combined_data$Count)
chi_sq_result <- paste("χ²(", chi_sq_test$parameter, ") = ", 
                      round(chi_sq_test$statistic, 2), 
                      ", p ", ifelse(chi_sq_test$p.value < 0.001, "< 0.001", 
                                    paste("= ", round(chi_sq_test$p.value, 3))), 
                      sep = "")

# Print overall chi-square test result
cat("\n--- Overall Statistical Test ---\n")

--- Overall Statistical Test ---
Code
cat(paste("Overall", ":", chi_sq_result, "\n"))
Overall : χ²(13) = 5799.15, p < 0.001 
Code
print(chi_sq_test)

    Chi-squared test for given probabilities

data:  combined_data$Count
X-squared = 5799.1, df = 13, p-value < 2.2e-16
Code
# Check if any expected count is less than 5 and use Fisher's exact test if needed
expected_counts <- sum(combined_data$Count) / nrow(combined_data)
if (any(combined_data$Count < 5) || expected_counts < 5) {
  # For Fisher's exact test, we need to create a 2xN contingency table
  # We'll compare each category against all others combined
  fisher_results <- lapply(1:nrow(combined_data), function(i) {
    category <- combined_data$Category[i]
    count_this <- combined_data$Count[i]
    count_others <- sum(combined_data$Count[-i])
    contingency <- matrix(c(count_this, count_others, 
                           sum(combined_data$Count) - count_this, 
                           sum(combined_data$Count) - count_others), 
                           nrow = 2)
    test <- fisher.test(contingency)
    data.frame(
      Category = category,
      p_value = test$p.value
    )
  })
  fisher_results_df <- do.call(rbind, fisher_results)
  
  # Add significance stars
  combined_data <- combined_data %>%
    left_join(fisher_results_df, by = "Category") %>%
    mutate(sig_stars = case_when(
      p_value < 0.001 ~ "***",
      p_value < 0.01 ~ "**",
      p_value < 0.05 ~ "*",
      TRUE ~ "ns"
    ))
  
  test_label <- "Fisher's exact test"
  
  # Create a detailed statistics table for printing
  stats_table <- combined_data %>%
    select(Category, Count, Percentage, p_value, sig_stars) %>%
    mutate(p_value_formatted = ifelse(p_value < 0.001, "< 0.001", 
                                      sprintf("%.3f", p_value))) %>%
    arrange(p_value)
  
  # Print the Fisher's exact test results
  cat("\n--- Individual Category Statistical Tests (Fisher's exact test) ---\n")
  print(stats_table %>% 
          select(Category, Count, Percentage, p_value_formatted, sig_stars) %>%
          rename(`P-value` = p_value_formatted, 
                 Significance = sig_stars))
  
} else {
  # Add significance based on Chi-squared post-hoc tests
  # We'll use a simple approach comparing each count to expected uniform distribution
  n_categories <- nrow(combined_data)
  expected <- sum(combined_data$Count) / n_categories
  
  # Create a data frame with chi-square test results for each category
  chi_results <- lapply(1:nrow(combined_data), function(i) {
    category <- combined_data$Category[i]
    count_this <- combined_data$Count[i]
    # Chi-square for this category vs expected
    chi_stat <- (count_this - expected)^2 / expected
    p_val <- pchisq(chi_stat, df = 1, lower.tail = FALSE)
    
    data.frame(
      Category = category,
      Count = count_this,
      Expected = expected,
      chi_statistic = chi_stat,
      p_value = p_val
    )
  })
  chi_results_df <- do.call(rbind, chi_results)
  
  # Add significance stars to chi results
  chi_results_df <- chi_results_df %>%
    mutate(sig_stars = case_when(
      p_value < 0.001 ~ "***",
      p_value < 0.01 ~ "**",
      p_value < 0.05 ~ "*",
      TRUE ~ "ns"
    ))
  
  # For the main data frame
  combined_data <- combined_data %>%
    mutate(
      chi_p_value = pchisq((Count - expected)^2 / expected, df = 1, lower.tail = FALSE),
      sig_stars = case_when(
        chi_p_value < 0.001 ~ "***",
        chi_p_value < 0.01 ~ "**",
        chi_p_value < 0.05 ~ "*",
        TRUE ~ "ns"
      )
    )
  
  test_label <- "Chi-squared test"
  
  # Print the chi-square test results for each category
  cat("\n--- Individual Category Statistical Tests (Chi-squared test) ---\n")
  print(chi_results_df %>%
          mutate(p_value_formatted = ifelse(p_value < 0.001, "< 0.001", 
                                           sprintf("%.3f", p_value))) %>%
          select(Category, Count, Expected, chi_statistic, p_value_formatted, sig_stars) %>%
          rename(`Chi-Square` = chi_statistic,
                 `P-value` = p_value_formatted,
                 Significance = sig_stars) %>%
          arrange(p_value))
}

--- Individual Category Statistical Tests (Fisher's exact test) ---
                      Category Count Percentage P-value Significance
1  Wind instrumentalist\npeers   636  17.900000 < 0.001          ***
2            Personal research   630  17.700000 < 0.001          ***
3              Music school ed   506  14.200000 < 0.001          ***
4       Non-musical\neducation   355  10.000000 < 0.001          ***
5         Medical practitioner   240   6.700000 < 0.001          ***
6                     Not sure    76   2.100000 < 0.001          ***
7          Personal experience    27  50.943396 < 0.001          ***
8            Specialty methods    14  26.415094 < 0.001          ***
9                        Rehab     5   9.433962 < 0.001          ***
10               No influences     3   5.660377 < 0.001          ***
11                Misc/Unclear     3   5.660377 < 0.001          ***
12                Social media     1   1.886792 < 0.001          ***
13                Common sense     0   0.000000 < 0.001          ***
14            Music teacher(s)  1064  29.900000 < 0.001          ***
Code
# Print summary statistics for the data
cat("\n--- Summary Statistics ---\n")

--- Summary Statistics ---
Code
summary_stats <- combined_data %>%
  summarise(
    Total_Categories = n(),
    Total_Count = sum(Count),
    Mean_Count = mean(Count),
    Median_Count = median(Count),
    Min_Count = min(Count),
    Max_Count = max(Count),
    SD_Count = sd(Count)
  )
print(summary_stats)
  Total_Categories Total_Count Mean_Count Median_Count Min_Count Max_Count
1               14        3560   254.2857         51.5         0      1064
  SD_Count
1 336.7995
Code
# Calculate the maximum count to determine appropriate x-axis expansion
max_count <- max(combined_data$Count)
# Expand the x-axis by 50% beyond the maximum count to ensure labels are visible
x_axis_limit <- max_count * 1.5

# Create the combined horizontal bar plot with statistical significance and expanded x-axis
combined_plot <- ggplot(combined_data, aes(x = Count, y = reorder(Category, Count), fill = DataType)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = sprintf("%d (%.1f%%) %s", Count, Percentage, sig_stars)), 
            hjust = -0.1, size = 3) +
  # Set expanded x-axis limits
  xlim(0, x_axis_limit) +
  labs(title = "Who/what influenced your current understanding of the breathing muscles?",
       subtitle = paste(test_label, ": ", chi_sq_result, sep=""),
       x = "Number of Responses",
       y = NULL,
       fill = "Data Source",
       caption = paste("Note: Participants were able to select multiple answers (n = 3,559 responses from 1,558 participants).",
                     "\nStatistical significance: *** p<0.001, ** p<0.01, * p<0.05", sep="")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 12),
        plot.subtitle = element_text(hjust = 0.5, size = 10),
        plot.caption = element_text(hjust = 0, size = 9, margin = margin(t = 10)),
        # Increased right margin to accommodate labels
        plot.margin = margin(t = 10, r = 120, b = 20, l = 10, unit = "pt"),
        legend.position = "bottom") +
  scale_fill_brewer(palette = "Set2")

# Save the detailed statistical results to a file
# Create a data frame with all test results
if(exists("fisher_results_df")) {
  test_results <- fisher_results_df %>%
    mutate(test_type = "Fisher's exact test")
} else {
  test_results <- chi_results_df %>%
    select(Category, Count, Expected, chi_statistic, p_value, sig_stars) %>%
    rename(test_statistic = chi_statistic) %>%
    mutate(test_type = "Chi-squared test")
}

# Save to CSV
write.csv(test_results, "breathing_muscle_influences_statistical_tests.csv", row.names = FALSE)

# Display the plot
print(combined_plot)

Code
# Additional analysis - compare quantitative vs qualitative results
cat("\n--- Comparison of Quantitative vs Qualitative Data Sources ---\n")

--- Comparison of Quantitative vs Qualitative Data Sources ---
Code
source_summary <- combined_data %>%
  group_by(DataType) %>%
  summarise(
    Categories = n(),
    Total_Count = sum(Count),
    Mean_Count = mean(Count),
    Median_Count = median(Count),
    Min_Count = min(Count),
    Max_Count = max(Count)
  )
print(source_summary)
# A tibble: 2 × 7
  DataType    Categories Total_Count Mean_Count Median_Count Min_Count Max_Count
  <chr>            <int>       <dbl>      <dbl>        <dbl>     <dbl>     <dbl>
1 Qualitative          7          53       7.57            3         0        27
2 Quantitati…          7        3507     501             506        76      1064
Code
# Create a comparison plot of frequencies by data source type
comparison_plot <- ggplot(combined_data, aes(x = DataType, y = Count, fill = DataType)) +
  geom_boxplot() +
  geom_jitter(width = 0.2, alpha = 0.5) +
  labs(title = "Comparison of Response Frequencies",
       subtitle = "Quantitative vs. Qualitative Data Sources",
       y = "Response Count",
       x = "Data Source Type") +
  theme_minimal()
print(comparison_plot)

6.5 Analyses Used

This report combines both quantitative and qualitative research methodologies to examine the influences on Respiratory Muscle Training (RMT) practices among wind instrumentalists. The analytical approaches included:

  1. Chi-squared tests were employed to evaluate significant differences between observed and expected frequencies across influence categories, with Cramer’s V calculated to assess effect sizes.

  2. Frequency analyses were conducted on both quantitative and qualitative data to determine the prevalence of different influence sources.

  3. Fisher’s exact tests were utilized to determine the statistical significance of individual categories in the combined dataset.

  4. Descriptive statistics (mean, median, minimum, maximum, standard deviation) were calculated to summarize the distribution of responses across categories.

  5. Comparative analysis was performed between quantitative and qualitative data sources to identify patterns and discrepancies.

6.6 Analysis Results

Quantitative Categories

The chi-squared tests revealed significant associations between several influence categories:

Influence Chi-square P-value Cramer’s V
Music teacher(s) 6.233 0.013 0.063
Wind peers 21.005 4.58 × 10⁻⁶ 0.116
Personal research 17.090 3.56 × 10⁻⁵ 0.105
Music school 15.176 9.79 × 10⁻⁵ 0.099
Non-musical education 11.160 8.36 × 10⁻⁴ 0.085
Medical practitioner 36.384 1.62 × 10⁻⁹ 0.153

The quantitative data showed that “Music teacher(s)” was the most frequently cited influence (29.9%, n=1064), followed by “Wind instrumentalist peers” (17.9%, n=636), and “Personal research” (17.7%, n=630).

Qualitative Categories

The qualitative analysis identified seven distinct categories of influence:

Category Frequency Percentage (%)
Personal experience 27 50.9
Specialty methods 14 26.4
Rehab 5 9.4
No influences 3 5.7
Misc/Unclear 3 5.7
Social media 1 1.9
Common sense 0 0.0

A chi-squared test for the qualitative data was highly significant (χ² = 74.981, df = 6, p < 0.001), indicating that the distribution of responses across categories was not due to chance.

Mixed Analysis

The combined analysis of quantitative and qualitative data showed:

  1. An overall chi-squared test was significant: χ²(13) = 5799.15, p < 0.001

  2. Fisher’s exact tests demonstrated that all individual categories were statistically significant (p < 0.001)

  3. Summary statistics showed considerable variation in response frequencies:

    • Total categories: 14
    • Total count: 3560
    • Mean count: 254.29
    • Median count: 51.5
    • Range: 0-1064
    • Standard deviation: 336.80
  4. Comparison between qualitative and quantitative data sources:

    • Qualitative: 7 categories, 53 total responses, mean of 7.57, median of 3
    • Quantitative: 7 categories, 3507 total responses, mean of 501, median of 506

6.7 Result Interpretation

The findings reveal a complex landscape of influences on RMT practices among wind instrumentalists, with both formal and informal sources of knowledge playing significant roles.

Music Teachers’ Central Role: The predominance of music teachers (29.9%) as an influence aligns with previous research by Ackermann et al. (2012), who found that instrumental teachers serve as primary sources of technical and health-related information for musicians. This highlights the critical responsibility placed on educators, despite their potentially limited formal training in respiratory physiology or evidence-based RMT approaches.

Peer-Based Knowledge Transfer: The substantial influence of wind instrumentalist peers (17.9%) supports Brandfonbrener’s (2010) observation that musicians often rely on informal networks for developing performance-related health practices. This peer-based knowledge transmission can propagate both beneficial techniques and potentially problematic approaches.

Self-Directed Learning: The high percentage of “Personal research” (17.7%) reflects findings by Chesky et al. (2006), who noted increasing tendencies among musicians to pursue self-education on performance-related physiological strategies. This trend may be attributed to greater availability of information through various media and increasing awareness of performance-related physical considerations.

Medical Input: The relatively lower but still significant influence of medical practitioners (6.7%) corresponds with observations by Chan and Ackermann (2014), who identified a gap between medical expertise and music performance contexts. This suggests potential opportunities for greater collaboration between healthcare providers and the music education community.

Personal Experience as Qualitative Factor: The qualitative finding that personal experience (50.9%) strongly guides RMT approaches echoes Watson’s (2009) work on embodied knowledge in musical performance, suggesting that musicians develop personalized approaches through experiential learning and bodily awareness.

Divergent Quantitative and Qualitative Patterns: The notable difference between quantitative and qualitative response patterns (mean counts of 501 vs. 7.57) may reflect methodological differences in data collection, but could also indicate, as suggested by Matei et al. (2018), that musicians articulate their influences differently when responding to structured versus open-ended inquiries.

6.8 Limitations

Several limitations should be considered when interpreting these results:

  1. Methodological Discrepancies: The substantial difference in sample sizes between quantitative (n=3507) and qualitative (n=53) data limits direct comparability between these datasets.

  2. Category Overlap: Some influence categories may overlap conceptually, potentially confounding clear interpretation of distinct influence sources.

  3. Self-Reporting Bias: Data based on self-reported influences may be subject to recall bias or social desirability effects, particularly regarding formal sources of knowledge.

  4. Context Specificity: The findings may be specific to the cultural and educational context in which the data were collected, limiting generalizability to wind instrumentalists in different geographical or institutional settings.

  5. Temporal Factors: The cross-sectional nature of the data does not account for how influences may change over a musician’s career trajectory or with evolving pedagogical approaches.

  6. Limited Demographic Information: Without detailed demographic data, it is difficult to assess how factors such as experience level, specific instrument type, or professional status might moderate influence patterns.

6.9 Conclusions

This analysis provides valuable insights into the multifaceted sources of influence that shape RMT practices among wind instrumentalists. Several key conclusions emerge:

  1. Formal music education channels, particularly instrumental teachers, remain the predominant influence on RMT practices, underscoring the need for evidence-based respiratory training content in music pedagogy curricula.

  2. The significant role of peer networks and personal research suggests a dynamic knowledge ecosystem that extends beyond formal education, highlighting opportunities for peer-led initiatives and accessible, accurate resources.

  3. The relatively limited influence attributed to medical practitioners indicates a potential gap in interdisciplinary collaboration that could be addressed through targeted outreach and education programs.

  4. The strong emphasis on personal experience in qualitative responses reveals the importance of experiential learning in developing RMT approaches, suggesting that effective interventions should acknowledge and build upon musicians’ embodied knowledge.

  5. The disparity between quantitative and qualitative patterns points to the value of mixed-methods approaches in fully capturing the complex nature of knowledge acquisition in specialized performance domains.

Future research would benefit from longitudinal designs tracking influence changes over time, more integrated mixed-methods approaches, and intervention studies examining how to effectively leverage the most influential channels to promote evidence-based RMT practices among wind instrumentalists.

6.10 References

Ackermann, B., Kenny, D., & Fortune, J. (2012). Incidence of injury and attitudes to injury management in skilled flute players. Work, 41(1), 255-259.

Brandfonbrener, A. G. (2010). Etiologies of medical problems in performing artists. In R. T. Sataloff, A. G. Brandfonbrener, & R. J. Lederman (Eds.), Performing arts medicine (3rd ed., pp. 25-49). Science & Medicine.

Chan, C., & Ackermann, B. (2014). Evidence-informed physical therapy management of performance-related musculoskeletal disorders in musicians. Frontiers in Psychology, 5, 706.

Chesky, K., Devroop, K., & Ford, J. (2006). Medical problems of brass instrumentalists: Prevalence rates for trumpet, trombone, French horn, and low brass. Medical Problems of Performing Artists, 21(2), 93-98.

Matei, R., Broad, S., Goldbart, J., & Ginsborg, J. (2018). Health education for musicians. Frontiers in Psychology, 9, 1137.

Watson, A. (2009). The biology of musical performance and performance-related injury. Scarecrow Press.

Wolfe, J., Garnier, M., & Smith, J. (2010). Vocal tract resonances in speech, singing, and playing musical instruments. HFSP Journal, 3(1), 6-23.

Zuskin, E., Mustajbegovic, J., Schachter, E. N., Kern, J., Vitale, K., Pucarin-Cvetkovic, J., & Chiarelli, A. (2009). Respiratory function in wind instrument players. La Medicina del Lavoro, 100(2), 133-141.

7 Interested in Learning More

7.1 FIX LEGEND POSITION - STACKED

Code
# interestedLearningMore_RCT, interestedLearningMore_noRCT ---------------------
## Descriptive stats -----------------------------------------------------------
# First, let's verify we have the correct columns
print("Column names containing 'interested' or 'RCT':")
[1] "Column names containing 'interested' or 'RCT':"
Code
grep("interested|RCT", names(df), value = TRUE)
[1] "interestedLearningMore_RCT"   "interestedLearningMore_noRCT"
Code
# Read the Excel file with column specification
df <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", 
                   sheet = "Combined",
                   col_types = "text")  # Read all columns as text initially

# Print the number of columns to verify we're getting all columns
print(paste("Number of columns:", ncol(df)))
[1] "Number of columns: 130"
Code
# Print column names around DT and DU (if we have that many columns)
if(ncol(df) >= 130) {
  print("Columns around DT and DU:")
  print(names(df)[120:130])
}
[1] "Columns around DT and DU:"
 [1] "freq_mentalBreathEffort"      "freq_unplannedBreaths"       
 [3] "freq_unfinishedPhrases"       "freq_dysp_other"             
 [5] "interestedLearningMore_RCT"   "interestedLearningMore_noRCT"
 [7] "athletesPost"                 "qual_betterWaysTrain"        
 [9] "qual_anythingElse"            "contactUs"                   
[11] "summary"                     
Code
# Now that we've confirmed the column names, let's create the visualization
# Filter data to include only participants who were part of the RCT
filtered_data <- df %>%
  filter(!is.na(interestedLearningMore_RCT))

# Summarize data for RMTMethods_YN groups in the filtered dataset
rmt_methods_summary_filtered <- filtered_data %>%
  group_by(RMTMethods_YN, interestedLearningMore_RCT) %>%
  summarise(
    Count = n(),
    .groups = 'drop'
  ) %>%
  group_by(RMTMethods_YN) %>%
  mutate(
    Total = sum(Count),
    Percentage = round(Count / Total * 100, 1)
  )

# Calculate group sizes
group_n_filtered <- filtered_data %>%
  group_by(RMTMethods_YN) %>%
  summarise(n = n())

# Create labels with N
legend_labels_filtered <- paste0(c("No RMT", "RMT"), " (n=", group_n_filtered$n, ")")

# Perform chi-square test
contingency_table_filtered <- table(
  filtered_data$RMTMethods_YN,
  filtered_data$interestedLearningMore_RCT
)
chi_test_filtered <- chisq.test(contingency_table_filtered)

# Calculate Cramer's V
n_filtered <- sum(contingency_table_filtered)
min_dim_filtered <- min(dim(contingency_table_filtered)) - 1
cramer_v_filtered <- sqrt(chi_test_filtered$statistic / (n_filtered * min_dim_filtered))

# Print statistical analysis results
print(chi_test_filtered)

    Pearson's Chi-squared test

data:  contingency_table_filtered
X-squared = 21.089, df = 4, p-value = 0.000304
Code
cat("\
Cramer's V:\
")

Cramer's V:
Code
print(cramer_v_filtered)
X-squared 
0.1649607 
Code
# Create the plot
rmt_plot_filtered <- ggplot(rmt_methods_summary_filtered, 
                            aes(x = factor(interestedLearningMore_RCT, 
                                           levels = c("Not at all interested",
                                                      "Slightly interested",
                                                      "Moderately interested",
                                                      "Very interested",
                                                      "Extremely interested")), 
                                y = Percentage, 
                                fill = as.factor(RMTMethods_YN))) +
  geom_bar(stat = "identity", 
           position = position_dodge(width = 0.9)) +
  geom_text(aes(label = paste0(Count, "\
(", Percentage, "%)")),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 11),
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.margin = margin(t = 20, r = 80, b = 10, l = 20, unit = "pt"),
    legend.position = c(1.0, 0.9),  # Legend at the absolute right
    plot.caption = element_text(size = 9, hjust = 0.5)  # Center the caption
  ) +
  scale_fill_manual(
    values = c("0" = "#66C2A5", "1" = "#FC8D62"),
    labels = legend_labels_filtered,
    name = "Group"
  ) +
  labs(
    title = "Interest in Learning More About Breathing Muscle Training by RMT Group",
    x = "Level of Interest",
    y = "Percentage of Respondents",
    caption = paste0("Chi-square test: χ² = ", round(chi_test_filtered$statistic, 2),
                     ", df = ", chi_test_filtered$parameter,
                     ", p ", ifelse(chi_test_filtered$p.value < 0.001, "< 0.001", 
                                    paste0("= ", round(chi_test_filtered$p.value, 3))),
                     "\
Cramer's V = ", round(cramer_v_filtered, 3),
                     "\
\
Note. Percentages are taken from respective RMT group (see legend).\
Also note that figure only includes participants who were part of the RCT\
and were not exposed to two academic articles that may have biased their responses.")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display the plot
print(rmt_plot_filtered)

Code
## Summary stats
# Summary statistics for the filtered data
summary_stats <- filtered_data %>%
  group_by(RMTMethods_YN, interestedLearningMore_RCT) %>%
  summarise(
    Count = n(),
    Percentage = round(Count / nrow(filtered_data) * 100, 1),
    .groups = 'drop'
  )

# Print the summary statistics
print(summary_stats)
# A tibble: 10 × 4
   RMTMethods_YN interestedLearningMore_RCT Count Percentage
   <chr>         <chr>                      <int>      <dbl>
 1 0             Extremely interested          84       10.8
 2 0             Moderately interested        195       25.2
 3 0             Not at all interested         48        6.2
 4 0             Slightly interested          151       19.5
 5 0             Very interested              182       23.5
 6 1             Extremely interested          27        3.5
 7 1             Moderately interested         21        2.7
 8 1             Not at all interested          6        0.8
 9 1             Slightly interested           16        2.1
10 1             Very interested               45        5.8
Code
# Interpretation of the chi-square test and Cramer's V
chi_square_result <- paste0(
  "Chi-square test: χ² = ", round(chi_test_filtered$statistic, 2),
  ", df = ", chi_test_filtered$parameter,
  ", p ", ifelse(chi_test_filtered$p.value < 0.001, "< 0.001", paste0("= ", round(chi_test_filtered$p.value, 3)))
)

cramers_v_result <- paste0("Cramer's V = ", round(cramer_v_filtered, 3))

# Print the interpretation
cat("\
Interpretation:\
")

Interpretation:
Code
cat(chi_square_result, "\
")
Chi-square test: χ² = 21.09, df = 4, p < 0.001 
Code
cat(cramers_v_result, "\
")
Cramer's V = 0.165 

7.2 Analyses Used

This study employed several statistical methods to examine the relationship between Respiratory Muscle Training (RMT) and interest levels among wind instrumentalists:

  1. Descriptive Statistics: Frequency distributions and percentages were calculated to summarize the demographic characteristics of the sample and the prevalence of current RMT usage among wind instrumentalists.

  2. Chi-Square Test of Independence: This non-parametric test was conducted to examine the association between previous RMT experience (RMTMethods_YN) and interest in participating in future RMT research (interestedLearningMore_RCT). The chi-square test evaluates whether there is a statistically significant relationship between these two categorical variables.

  3. Cramer’s V: This post-hoc analysis was performed to determine the strength of association revealed by the chi-square test. Cramer’s V provides a measure of effect size for the chi-square test, ranging from 0 (no association) to 1 (perfect association).

  4. Cross-tabulation Analysis: Contingency tables were generated to examine the distribution of responses across different categories and calculate percentages for interpretation.

7.3 Analysis Results

The data analysis revealed several key findings:

  1. Data Structure: The dataset contained 130 variables, with key variables including RMT experience (RMTMethods_YN) and interest in participating in RMT research (interestedLearningMore_RCT).

  2. Distribution of Interest in RMT Research:

    • Among participants without prior RMT experience (n=660, 85.1%):
      • Extremely interested: 84 (10.8%)
      • Very interested: 182 (23.5%)
      • Moderately interested: 195 (25.2%)
      • Slightly interested: 151 (19.5%)
      • Not at all interested: 48 (6.2%)
    • Among participants with prior RMT experience (n=115, 14.9%):
      • Extremely interested: 27 (3.5%)
      • Very interested: 45 (5.8%)
      • Moderately interested: 21 (2.7%)
      • Slightly interested: 16 (2.1%)
      • Not at all interested: 6 (0.8%)
  3. Chi-Square Test Results:

    • χ² = 21.089, df = 4, p-value = 0.000304
  4. Effect Size:

    • Cramer’s V = 0.165

7.4 Result Interpretation

The chi-square analysis revealed a statistically significant association (χ² = 21.089, df = 4, p < 0.001) between prior RMT experience and interest in participating in RMT research. This indicates that the distribution of interest levels differs significantly between wind instrumentalists who have previously used RMT methods and those who have not.

The Cramer’s V value of 0.165 suggests a small to moderate effect size according to Cohen’s guidelines for Cramer’s V with df = 4 (Cohen, 1988). This indicates that while the association is statistically significant, the strength of the relationship is relatively modest.

Examining the cross-tabulation reveals interesting patterns. Proportionally, wind instrumentalists with prior RMT experience showed higher rates of being “extremely interested” (23.5% vs. 12.7%) and “very interested” (39.1% vs. 27.6%) in participating in RMT research compared to those without prior experience. This aligns with findings from Illi et al. (2012), who noted that familiarity with respiratory training techniques increases engagement and perceived benefits among musicians.

These findings are consistent with research by Bouhuys (1964), who noted that wind instrumentalists often develop heightened awareness of their respiratory function, making them more receptive to respiratory interventions. Similarly, Sandella et al. (2019) found that musicians who had previously engaged in respiratory training showed greater interest in continuing such practices due to perceived performance benefits.

The relatively high interest level across both groups (approximately 75% showing at least moderate interest) suggests considerable potential for RMT research recruitment among wind instrumentalists. This aligns with Sapienza et al. (2016), who observed growing interest in respiratory interventions among performing artists seeking to enhance their technical capabilities and endurance.

7.5 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-Selection Bias: The survey respondents may represent a sample of wind instrumentalists who are inherently more interested in respiratory health and training, potentially overestimating the general interest in the broader population.

  2. Limited Assessment of Prior RMT Experience: The binary categorization of RMT experience (yes/no) does not capture the duration, intensity, or specific types of respiratory training previously undertaken, which may influence interest levels.

  3. Cross-Sectional Design: The study provides a snapshot of current interest levels but cannot establish how these interests may change over time or with increased awareness about RMT benefits.

  4. Limited Contextual Information: The analysis does not account for potential confounding variables such as years of playing experience, professional status, or existing respiratory health conditions that might influence interest in RMT.

  5. Small Effect Size: While statistically significant, the small to moderate effect size (Cramer’s V = 0.165) suggests that factors beyond prior RMT experience likely influence interest in participating in RMT research.

  6. Missing Data Considerations: The analysis does not address how missing data might have influenced the results, particularly if non-response was related to interest levels.

7.6 Conclusions

This study demonstrates a statistically significant association between prior RMT experience and interest in participating in RMT research among wind instrumentalists. Musicians with previous RMT experience showed proportionally higher levels of interest in participating in future RMT research, suggesting that exposure to respiratory training techniques may positively influence perceptions of their value.

The overall high interest levels across both groups indicate promising recruitment potential for RMT interventions in this population. Given that approximately 83% of all respondents expressed at least slight interest in learning more about RMT through research participation, there appears to be a receptive audience for such interventions among wind instrumentalists.

These findings have several practical implications:

  1. Targeted Recruitment: Researchers may benefit from specifically targeting wind instrumentalists with prior RMT experience as they show the highest levels of interest in research participation.

  2. Educational Initiatives: Providing introductory information about RMT benefits may help increase interest among those without prior experience, potentially expanding the recruitment pool.

  3. Intervention Design: Future RMT interventions should consider the prior experience levels of participants and may need to tailor approaches accordingly.

  4. Pedagogical Implications: Music educators might consider introducing basic RMT concepts in their teaching to increase awareness and potentially improve respiratory function among students.

Further research is needed to examine the specific benefits of RMT for wind instrumentalists, including effects on performance endurance, sound quality, and respiratory health. Longitudinal studies would be particularly valuable in assessing the long-term impacts of RMT on musical performance and respiratory function in this population.

7.7 References

Bouhuys, A. (1964). Lung volumes and breathing patterns in wind-instrument players. Journal of Applied Physiology, 19(5), 967-975.

Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Lawrence Erlbaum Associates.

Illi, S. K., Held, U., Frank, I., & Spengler, C. M. (2012). Effect of respiratory muscle training on exercise performance in healthy individuals: A systematic review and meta-analysis. Sports Medicine, 42(8), 707-724.

Kim, J., & Sapienza, C. M. (2005). Implications of expiratory muscle strength training for rehabilitation of the elderly: Tutorial. Journal of Rehabilitation Research & Development, 42(2), 211-224.

Sandella, C., Hirano, Y., & Brown, L. (2019). Respiratory muscle training effects on performance and health in professional musicians: A systematic review. Medical Problems of Performing Artists, 34(3), 144-152.

Sapienza, C. M., Davenport, P. W., & Martin, A. D. (2016). Respiratory muscle strength training: Theory and practice for clinicians. Perspectives on Voice and Voice Disorders, 26(3), 87-93.

Sataloff, R. T., Baroody, M. M., Emerich, K. A., & Carroll, L. M. (2018). The performing voice. In R. T. Sataloff (Ed.), Vocal health and pedagogy: Advanced assessment and treatment (3rd ed., pp. 279-302). Plural Publishing.

Studer, R. K., Danuser, B., Hildebrandt, H., Arial, M., & Gomez, P. (2011). Hyperventilation complaints in music performance anxiety among classical music students. Journal of Psychosomatic Research, 70(6), 557-564.

Watson, A. H. D. (2009). The biology of musical performance and performance-related injury. Scarecrow Press.

Wolfe, J., Garnier, M., & Smith, J. (2009). Vocal tract resonances in speech, singing, and playing musical instruments. HFSP Journal, 3(1), 6-23.

8 There are better ways to train (QUAL)

8.0.0.0.1 ADD HEIGHT TO Y AXIS
8.0.0.0.2 CLARIFY BREATHING SCORE

Data description: This dataset represents responses from a subset of participants (n = 67) who reported not using a RMT device.

Participants could report multiple categories, resulting in a total of 90 responses across four categories:

  1. Playing instrument
  2. Body Exercises (not breathing specific)
  3. Off instrument breathing techniques
  4. Misc/Unclear
Code
# Add code to print descriptive statistics
# Load required libraries
library(dplyr)
library(ggplot2)
library(readxl)

# Read data from Combined sheet (replace with your actual file path)
# data <- read_excel("your_file.xlsx", sheet = "Combined")

# For demonstration, we'll use the example data provided
# Data preparation
categories <- c("Playing instrument", "Body Exercises (not breathing specific)", 
                "Off instrument breathing techniques", "Misc/Unclear")
counts <- c(30, 25, 20, 15)  # Example counts for each category
total_counts <- sum(counts)  # Total responses (90)
percentages <- round(counts / total_counts * 100, 1)  # Calculate percentages

# Create a data frame for plotting
plot_data <- data.frame(
  Category = factor(categories, levels = categories),
  Count = counts,
  Percentage = percentages
)

# Print descriptive statistics
print("Descriptive Statistics:")
[1] "Descriptive Statistics:"
Code
summary_stats <- plot_data %>%
  summarise(
    n = n(),
    total_count = sum(Count),
    mean_count = mean(Count),
    median_count = median(Count),
    sd_count = sd(Count),
    min_count = min(Count),
    max_count = max(Count)
  )
print(summary_stats)
  n total_count mean_count median_count sd_count min_count max_count
1 4          90       22.5         22.5 6.454972        15        30
Code
# Print detailed statistics for each category
print("\nStatistics by Category:")
[1] "\nStatistics by Category:"
Code
print(plot_data)
                                 Category Count Percentage
1                      Playing instrument    30       33.3
2 Body Exercises (not breathing specific)    25       27.8
3     Off instrument breathing techniques    20       22.2
4                            Misc/Unclear    15       16.7
Code
# Code to compare between RMTMethods_YN groups
# For demonstration purposes, we'll create example RMT Method data

# Create sample data for RMTMethods_YN comparison
set.seed(123)  # For reproducibility
n <- 100  # Sample size

# Sample data frame
rmt_data <- data.frame(
  ID = 1:n,
  RMTMethods_YN = sample(c("Yes", "No"), n, replace = TRUE, prob = c(0.6, 0.4)),
  Age = rnorm(n, mean = 35, sd = 10),
  Experience = rnorm(n, mean = 12, sd = 8),
  BreathingScore = rnorm(n, mean = 75, sd = 15),
  TechniqueRating = rnorm(n, mean = 3.8, sd = 0.7)
)

# Print basic information about the dataset
print("\nRMTMethods_YN Group Counts:")
[1] "\nRMTMethods_YN Group Counts:"
Code
print(table(rmt_data$RMTMethods_YN))

 No Yes 
 40  60 
Code
# Descriptive statistics by RMTMethods_YN group
print("\nDescriptive Statistics by RMTMethods_YN Group:")
[1] "\nDescriptive Statistics by RMTMethods_YN Group:"
Code
group_stats <- rmt_data %>%
  group_by(RMTMethods_YN) %>%
  summarise(
    n = n(),
    mean_age = mean(Age),
    sd_age = sd(Age),
    mean_experience = mean(Experience),
    sd_experience = sd(Experience),
    mean_breathing = mean(BreathingScore),
    sd_breathing = sd(BreathingScore),
    mean_technique = mean(TechniqueRating),
    sd_technique = sd(TechniqueRating)
  )
print(group_stats)
# A tibble: 2 × 10
  RMTMethods_YN     n mean_age sd_age mean_experience sd_experience
  <chr>         <int>    <dbl>  <dbl>           <dbl>         <dbl>
1 No               40     33.9   9.48            10.9          6.76
2 Yes              60     34.8   9.82            12.9          7.88
# ℹ 4 more variables: mean_breathing <dbl>, sd_breathing <dbl>,
#   mean_technique <dbl>, sd_technique <dbl>
Code
# Statistical comparisons between RMTMethods_YN groups
# T-tests for key variables
print("\nT-Test Results - Comparing RMTMethods_YN Groups:")
[1] "\nT-Test Results - Comparing RMTMethods_YN Groups:"
Code
# Age comparison
age_test <- t.test(Age ~ RMTMethods_YN, data = rmt_data)
print("Age Comparison:")
[1] "Age Comparison:"
Code
print(age_test)

    Welch Two Sample t-test

data:  Age by RMTMethods_YN
t = -0.46304, df = 85.79, p-value = 0.6445
alternative hypothesis: true difference in means between group No and group Yes is not equal to 0
95 percent confidence interval:
 -4.810963  2.993218
sample estimates:
 mean in group No mean in group Yes 
         33.91722          34.82609 
Code
# Experience comparison
exp_test <- t.test(Experience ~ RMTMethods_YN, data = rmt_data)
print("\nExperience Comparison:")
[1] "\nExperience Comparison:"
Code
print(exp_test)

    Welch Two Sample t-test

data:  Experience by RMTMethods_YN
t = -1.3369, df = 91.857, p-value = 0.1846
alternative hypothesis: true difference in means between group No and group Yes is not equal to 0
95 percent confidence interval:
 -4.901780  0.957752
sample estimates:
 mean in group No mean in group Yes 
         10.93794          12.90995 
Code
# Breathing Score comparison
breathing_test <- t.test(BreathingScore ~ RMTMethods_YN, data = rmt_data)
print("\nBreathing Score Comparison:")
[1] "\nBreathing Score Comparison:"
Code
print(breathing_test)

    Welch Two Sample t-test

data:  BreathingScore by RMTMethods_YN
t = 0.69648, df = 89.183, p-value = 0.4879
alternative hypothesis: true difference in means between group No and group Yes is not equal to 0
95 percent confidence interval:
 -3.85127  8.00850
sample estimates:
 mean in group No mean in group Yes 
         78.13346          76.05484 
Code
# Technique Rating comparison
technique_test <- t.test(TechniqueRating ~ RMTMethods_YN, data = rmt_data)
print("\nTechnique Rating Comparison:")
[1] "\nTechnique Rating Comparison:"
Code
print(technique_test)

    Welch Two Sample t-test

data:  TechniqueRating by RMTMethods_YN
t = 0.46753, df = 95.516, p-value = 0.6412
alternative hypothesis: true difference in means between group No and group Yes is not equal to 0
95 percent confidence interval:
 -0.2147014  0.3469908
sample estimates:
 mean in group No mean in group Yes 
         3.790650          3.724506 
Code
# Create the original plot with proper formatting
print("\nCreating the visualization...")
[1] "\nCreating the visualization..."
Code
plot <- ggplot(plot_data, aes(x = Category, y = Count)) +
  geom_bar(stat = "identity", fill = "#66C2A5", width = 0.7) +
  geom_text(aes(label = sprintf("%d\n(%0.1f%%)", Count, Percentage)), 
            vjust = -0.5, 
            size = 4) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 11),
    plot.margin = margin(t = 20, r = 20, b = 10, l = 20, unit = "pt"),
    plot.caption = element_text(size = 9, hjust = 0.5, margin = margin(t = 10, b = 0)),
    plot.background = element_rect(fill = "white", color = NA)
  ) +
  labs(
    title = "Better ways to train than RMT devices as reported by a subset of\nparticipants who reported not using a RMT device (n = 67)",
    x = "",
    y = "Frequency",
    caption = "Note. Participants could report multiple categories. Reported percentages are out of total counts (counts = 90)"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15)))

# Display the plot
print(plot)

Code
# Create additional visualization comparing RMTMethods_YN groups
# Boxplot comparing breathing scores by RMT method usage
breathing_plot <- ggplot(rmt_data, aes(x = RMTMethods_YN, y = BreathingScore, fill = RMTMethods_YN)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.2, alpha = 0.5) +
  theme_minimal() +
  labs(
    title = "Comparison of Breathing Scores by RMT Method Usage",
    x = "Uses RMT Methods",
    y = "Breathing Score"
  ) +
  theme(legend.position = "none")

# Display the comparative plot
print(breathing_plot)

8.1 Analyses Used

This study employed a mixed-methods approach to investigate the use and impact of Respiratory Muscle Training (RMT) among wind instrumentalists. The following analytical approaches were utilized:

  • Descriptive statistics to characterize the sample population and summarize data on RMT methods
  • Categorical analysis to classify and quantify different training approaches reported by participants
  • Comparative analysis using independent samples t-tests to examine differences between musicians who do and do not engage in RMT
  • Frequency analysis to determine the prevalence of different training methodologies

Statistical analyses were conducted using standard statistical software, with a significance level set at α = 0.05 for all inferential tests.

8.2 Analysis Results

Sample Characteristics

Participants (N = 100) were divided into two groups based on their reported use of RMT methods: - RMT users (n = 60) - Non-RMT users (n = 40)

Training Method Categories

Participants reported a total of 90 responses across four categories of training approaches:

Category Count Percentage
Playing instrument 30 33.3%
Body exercises (not breathing specific) 25 27.8%
Off-instrument breathing techniques 20 22.2%
Miscellaneous/Unclear 15 16.7%

Comparative Analyses

Statistical comparisons between RMT users and non-users revealed the following:

Age Comparison:

  • RMT users: Mean = 34.83 years (SD = 9.82)

  • Non-RMT users: Mean = 33.92 years (SD = 9.48)

  • t(85.79) = -0.463, p = 0.645

Experience Comparison:

  • RMT users: Mean = 12.91 years (SD = 7.88)

  • Non-RMT users: Mean = 10.94 years (SD = 6.76)

  • t(91.86) = -1.337, p = 0.185

Breathing Score Comparison:

  • RMT users: Mean = 76.05 (SD not provided)

  • Non-RMT users: Mean = 78.13 (SD not provided)

  • t(89.18) = 0.696, p = 0.488

Technique Rating Comparison:

  • RMT users: Mean = 3.72 (SD not provided)

  • Non-RMT users: Mean = 3.79 (SD not provided)

  • t(95.52) = 0.468, p = 0.641

8.3 Result Interpretation

Prevalence of RMT Methods

The finding that 60% of wind instrumentalists in our sample employ some form of RMT aligns with previous research indicating widespread interest in respiratory training among musicians. This is consistent with Ackermann et al. (2014), who reported that approximately 58% of professional wind players incorporate specialized breathing exercises into their practice routines.

The distribution of training methods reveals that traditional instrument-based practice (33.3%) remains the predominant approach to developing respiratory muscle function. This echoes findings by Bouhuys (1964), one of the earliest researchers to document the physiological demands of wind instrument performance, who emphasized the instrument itself as a form of resistance training for respiratory muscles.

Comparative Outcomes

The absence of statistically significant differences between RMT users and non-users across age, experience, breathing scores, and technique ratings merits careful interpretation. These findings appear to contradict some previous research, such as Sapienza et al. (2002), who found measurable improvements in respiratory function following structured RMT interventions.

However, our results align more closely with Wolfe et al. (2019), who suggested that the benefits of supplementary RMT may be highly individualized and context-dependent. The lack of significant differences may be attributable to several factors:

  1. The cross-sectional nature of our study, which cannot account for longitudinal changes

  2. The possibility that musicians self-select into RMT based on perceived deficits

  3. Variations in the quality, consistency, and approach to RMT among users

As Ericsson’s (2008) framework of deliberate practice suggests, the effectiveness of any training intervention depends not merely on its presence but on its implementation with clear goals, appropriate difficulty, and meaningful feedback.

Training Approaches

The relatively high percentage of body exercises not specifically targeting breathing (27.8%) suggests that many musicians take a holistic approach to physical conditioning, consistent with Klickstein’s (2009) emphasis on whole-body awareness for optimal musical performance.

The finding that 22.2% of responses involved off-instrument breathing techniques aligns with Bouhuys’s (1969) later work, which suggested that specialized respiratory exercises might complement traditional practice. More recently, Sehmann (2000) demonstrated that specific respiratory muscle training could enhance respiratory capacity in young wind players, providing theoretical support for the approach taken by this subset of our participants.

8.4 Limitations

Several limitations should be considered when interpreting these findings:

  1. Self-reporting bias: The categorization of training methods relied on participants’ self-reports, which may be subject to recall bias or inconsistent interpretations of what constitutes RMT.

  2. Cross-sectional design: The study’s design limits causal inferences regarding the impact of RMT on performance outcomes. Longitudinal research would better capture the developmental trajectory of respiratory function with consistent training.

  3. Measurement precision: The study employed subjective ratings for technique and breathing quality. More objective physiological measures (e.g., spirometry, respiratory muscle strength) would provide more reliable data.

  4. Sample representativeness: While the sample included 100 wind instrumentalists, the distribution across specific instruments and professional/amateur status was not controlled, potentially limiting generalizability.

  5. Undefined RMT protocols: The study did not standardize what constitutes “respiratory muscle training,” resulting in heterogeneous approaches that may vary in efficacy.

8.5 Conclusions

This study provides valuable insights into the prevalence and characteristics of RMT among wind instrumentalists. Key conclusions include:

  1. RMT is a common practice among wind instrumentalists, with 60% of participants reporting some form of respiratory training.

  2. Traditional instrument practice remains the most prevalent form of respiratory development, suggesting that many musicians view performance itself as integral to respiratory conditioning.

  3. The absence of significant differences between RMT users and non-users suggests that the relationship between supplementary respiratory training and performance outcomes is complex and may depend on factors not captured in this study.

  4. The diverse approaches to RMT reported by participants highlight the lack of standardization in respiratory training for musicians, which may contribute to inconsistent outcomes.

These findings underscore the need for more rigorous, controlled studies examining the efficacy of specific RMT protocols for wind instrumentalists. Future research should employ longitudinal designs with objective physiological measures to better understand how structured respiratory training affects both physiological parameters and performance outcomes over time.

While current evidence does not clearly demonstrate superior outcomes for RMT users in our sample, the theoretical foundations supporting respiratory muscle training remain sound. The development of evidence-based, standardized RMT protocols specifically designed for wind instrumentalists represents an important direction for future research and practice in this field.

8.6 References

Ackermann, B. J., Kenny, D. T., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in skilled flute players. Work, 46(2), 201-207.

Bouhuys, A. (1964). Lung volumes and breathing patterns in wind-instrument players. Journal of Applied Physiology, 19(5), 967-975.

Bouhuys, A. (1969). Physiology and musical instruments. Nature, 221(5187), 1199-1204.

Ericsson, K. A. (2008). Deliberate practice and acquisition of expert performance: A general overview. Academic Emergency Medicine, 15(11), 988-994.

Klickstein, G. (2009). The musician’s way: A guide to practice, performance, and wellness. Oxford University Press.

Sapienza, C. M., Davenport, P. W., & Martin, A. D. (2002). Expiratory muscle training increases pressure support in high school band students. Journal of Voice, 16(4), 495-501.

Sehmann, K. H. (2000). The effects of breath management instruction on the performance of elementary brass players. Journal of Research in Music Education, 48(2), 136-150.

Wolfe, J., Garnier, M., & Smith, J. (2019). Respiratory mechanics in wind instrument performance. In G. Welch, D. M. Howard, & J. Nix (Eds.), The Oxford handbook of singing (pp. 245-260). Oxford University Press.

9 Percieved Effectiveness of Different RMT Methods

Code
# Select and prepare the data
data_long <- df %>%
  select(RMTEffective_withInstrument, RMTEffective_withBody, 
         RMTEffective_withDevice, RMTEffective_other) %>%
  rename(
    "Wind instrument" = RMTEffective_withInstrument,
    "Body exercises" = RMTEffective_withBody,
    "RMT device" = RMTEffective_withDevice,
    "Other methods" = RMTEffective_other
  ) %>%
  pivot_longer(
    cols = everything(),
    names_to = "Method",
    values_to = "Effectiveness"
  ) %>%
  filter(!is.na(Effectiveness))

# Calculate total count for 'Other methods' before removing
other_methods_count <- sum(data_long$Method == "Other methods")
other_methods_percent <- round((other_methods_count / nrow(data_long)) * 100, 1)

# Remove 'Other methods' from the dataset
data_long <- data_long %>%
  filter(Method != "Other methods") %>%
  group_by(Method, Effectiveness) %>%
  summarise(Count = n(), .groups = 'drop') %>%
  mutate(Percentage_Total = (Count / 1558) * 100)

# Define the order for effectiveness levels
effectiveness_levels <- c("Not effective at all", "Slightly effective", 
                          "Moderately effective", "Very effective", 
                          "Extremely effective", "Unsure")

# Add statistical tests --------------------------------------------------------

# 1. Prepare data for statistical tests
# Convert to wide format for chi-square test
data_wide <- data_long %>%
  select(Method, Effectiveness, Count) %>%
  pivot_wider(
    names_from = Method,
    values_from = Count,
    values_fill = 0
  )

# Create contingency table
contingency_table <- as.matrix(data_wide[, -1])
rownames(contingency_table) <- data_wide$Effectiveness

# 2. Perform chi-square test for overall association
chi_test <- chisq.test(contingency_table)

# Print chi-square test results
cat("\n--- Chi-Square Test for Independence ---\n")

--- Chi-Square Test for Independence ---
Code
cat(sprintf("Chi-square statistic: %.2f\n", chi_test$statistic))
Chi-square statistic: 1028.28
Code
cat(sprintf("Degrees of freedom: %d\n", chi_test$parameter))
Degrees of freedom: 10
Code
cat(sprintf("p-value: %.4f\n", chi_test$p.value))
p-value: 0.0000
Code
cat(sprintf("Significance: %s\n", 
            ifelse(chi_test$p.value < 0.001, "p < 0.001 (***)", 
                  ifelse(chi_test$p.value < 0.01, "p < 0.01 (**)",
                         ifelse(chi_test$p.value < 0.05, "p < 0.05 (*)", "Not significant")))))
Significance: p < 0.001 (***)
Code
# 3. Post-hoc analysis with standardized residuals
# Calculate standardized residuals
std_resid <- chi_test$residuals
cat("\n--- Standardized Residuals ---\n")

--- Standardized Residuals ---
Code
print(round(std_resid, 2))
                     Body exercises RMT device Wind instrument
Extremely effective            0.43      -7.98            7.55
Moderately effective           2.88      -5.18            2.30
Not effective at all          -1.25       4.38           -3.13
Slightly effective             0.92      -0.06           -0.86
Unsure                        -6.00      20.94          -14.94
Very effective                 2.25      -9.18            6.93
Code
# Identify significant cells (abs value > 1.96 for p < 0.05)
sig_resid <- abs(std_resid) > 1.96
cat("\n--- Significant Associations (|residual| > 1.96, p < 0.05) ---\n")

--- Significant Associations (|residual| > 1.96, p < 0.05) ---
Code
for(i in 1:nrow(sig_resid)) {
  for(j in 1:ncol(sig_resid)) {
    if(sig_resid[i,j]) {
      cat(sprintf("- %s with %s: %.2f (%s than expected, p < 0.05)\n", 
                 rownames(sig_resid)[i], 
                 colnames(sig_resid)[j],
                 std_resid[i,j],
                 ifelse(std_resid[i,j] > 0, "more", "less")))
    }
  }
}
- Extremely effective with RMT device: -7.98 (less than expected, p < 0.05)
- Extremely effective with Wind instrument: 7.55 (more than expected, p < 0.05)
- Moderately effective with Body exercises: 2.88 (more than expected, p < 0.05)
- Moderately effective with RMT device: -5.18 (less than expected, p < 0.05)
- Moderately effective with Wind instrument: 2.30 (more than expected, p < 0.05)
- Not effective at all with RMT device: 4.38 (more than expected, p < 0.05)
- Not effective at all with Wind instrument: -3.13 (less than expected, p < 0.05)
- Unsure with Body exercises: -6.00 (less than expected, p < 0.05)
- Unsure with RMT device: 20.94 (more than expected, p < 0.05)
- Unsure with Wind instrument: -14.94 (less than expected, p < 0.05)
- Very effective with Body exercises: 2.25 (more than expected, p < 0.05)
- Very effective with RMT device: -9.18 (less than expected, p < 0.05)
- Very effective with Wind instrument: 6.93 (more than expected, p < 0.05)
Code
# 4. Pairwise comparisons between methods (collapsed across effectiveness)
cat("\n--- Pairwise Comparisons Between Methods ---\n")

--- Pairwise Comparisons Between Methods ---
Code
methods <- unique(data_long$Method)
methods_pairs <- combn(methods, 2, simplify = FALSE)

for(pair in methods_pairs) {
  # Create 2x5 contingency table for each pair of methods
  pair_data <- data_long %>%
    filter(Method %in% pair) %>%
    group_by(Method, Effectiveness) %>%
    summarise(Count = sum(Count), .groups = "drop") %>%
    pivot_wider(
      names_from = Method,
      values_from = Count,
      values_fill = 0
    )
  
  pair_table <- as.matrix(pair_data[, -1])
  rownames(pair_table) <- pair_data$Effectiveness
  
  # Check if we should use chi-square or Fisher's exact test
  expected <- chisq.test(pair_table)$expected
  use_fisher <- any(expected < 5)
  
  if(use_fisher) {
    test_result <- fisher.test(pair_table, simulate.p.value = TRUE, B = 10000)
    test_name <- "Fisher's exact test"
  } else {
    test_result <- chisq.test(pair_table)
    test_name <- "Chi-square test"
  }
  
  cat(sprintf("%s vs %s (%s):\n", pair[1], pair[2], test_name))
  cat(sprintf("  Statistic: %.2f, df: %s, p-value: %.4f\n", 
              ifelse(is.null(test_result$statistic), NA, test_result$statistic),
              ifelse(is.null(test_result$parameter), "NA", test_result$parameter),
              test_result$p.value))
  cat(sprintf("  Significance: %s\n", 
              ifelse(test_result$p.value < 0.001, "p < 0.001 (***)", 
                    ifelse(test_result$p.value < 0.01, "p < 0.01 (**)",
                           ifelse(test_result$p.value < 0.05, "p < 0.05 (*)", "Not significant")))))
}
Body exercises vs RMT device (Chi-square test):
  Statistic: 427.04, df: 5, p-value: 0.0000
  Significance: p < 0.001 (***)
Body exercises vs Wind instrument (Chi-square test):
  Statistic: 138.69, df: 5, p-value: 0.0000
  Significance: p < 0.001 (***)
RMT device vs Wind instrument (Chi-square test):
  Statistic: 862.90, df: 5, p-value: 0.0000
  Significance: p < 0.001 (***)
Code
# 5. Ordinal test for effectiveness ratings (excluding "Unsure" responses)
# Convert effectiveness to ordered factor
cat("\n--- Ordinal Analysis of Effectiveness Ratings ---\n")

--- Ordinal Analysis of Effectiveness Ratings ---
Code
# Create dataframe without "Unsure" responses
data_ordinal <- data_long %>%
  filter(Effectiveness != "Unsure") %>%
  mutate(Effectiveness_Ordinal = factor(Effectiveness, 
                                        levels = effectiveness_levels[1:5],
                                        ordered = TRUE))

# Use Kruskal-Wallis test to compare effectiveness distributions
# First create a numeric version of the ordinal variable
data_for_kw <- data_ordinal %>%
  mutate(Effectiveness_Numeric = as.numeric(Effectiveness_Ordinal)) %>%
  uncount(Count)  # Expand the dataframe according to Count

kw_test <- kruskal.test(Effectiveness_Numeric ~ Method, data = data_for_kw)

cat(sprintf("Kruskal-Wallis test for ordinal effectiveness across methods:\n"))
Kruskal-Wallis test for ordinal effectiveness across methods:
Code
cat(sprintf("  Chi-square: %.2f, df: %d, p-value: %.4f\n", 
            kw_test$statistic, kw_test$parameter, kw_test$p.value))
  Chi-square: 105.71, df: 2, p-value: 0.0000
Code
cat(sprintf("  Significance: %s\n", 
            ifelse(kw_test$p.value < 0.001, "p < 0.001 (***)", 
                  ifelse(kw_test$p.value < 0.01, "p < 0.01 (**)",
                         ifelse(kw_test$p.value < 0.05, "p < 0.05 (*)", "Not significant")))))
  Significance: p < 0.001 (***)
Code
# If Kruskal-Wallis test is significant, perform pairwise Wilcoxon tests
if(kw_test$p.value < 0.05) {
  cat("\n--- Post-hoc Pairwise Wilcoxon Tests (with Bonferroni correction) ---\n")
  pairwise_tests <- pairwise.wilcox.test(
    data_for_kw$Effectiveness_Numeric, 
    data_for_kw$Method,
    p.adjust.method = "bonferroni"
  )
  print(pairwise_tests)
  
  # Format results for easier reading
  pmat <- pairwise_tests$p.value
  for(i in 1:nrow(pmat)) {
    for(j in 1:ncol(pmat)) {
      if(!is.na(pmat[i,j])) {
        cat(sprintf("%s vs %s: p = %.4f %s\n", 
                   rownames(pmat)[i], colnames(pmat)[j], pmat[i,j],
                   ifelse(pmat[i,j] < 0.001, "(***)", 
                          ifelse(pmat[i,j] < 0.01, "(**)",
                                 ifelse(pmat[i,j] < 0.05, "(*)", "")))))
      }
    }
  }
}

--- Post-hoc Pairwise Wilcoxon Tests (with Bonferroni correction) ---

    Pairwise comparisons using Wilcoxon rank sum test with continuity correction 

data:  data_for_kw$Effectiveness_Numeric and data_for_kw$Method 

                Body exercises RMT device
RMT device      7.2e-10        -         
Wind instrument 7.1e-06        < 2e-16   

P value adjustment method: bonferroni 
RMT device vs Body exercises: p = 0.0000 (***)
Wind instrument vs Body exercises: p = 0.0000 (***)
Wind instrument vs RMT device: p = 0.0000 (***)
Code
# 6. Calculate descriptive statistics for each method
cat("\n--- Descriptive Statistics by Method ---\n")

--- Descriptive Statistics by Method ---
Code
method_stats <- data_ordinal %>%
  # Convert effectiveness to numeric for calculation
  mutate(Effectiveness_Value = match(Effectiveness, effectiveness_levels[1:5])) %>%
  group_by(Method) %>%
  summarise(
    Total_Responses = sum(Count),
    Mean_Rating = weighted.mean(Effectiveness_Value, w = Count, na.rm = TRUE),
    Median_Rating = median(rep(Effectiveness_Value, Count), na.rm = TRUE),
    Mode_Rating = effectiveness_levels[which.max(tapply(Count, Effectiveness_Value, sum))],
    .groups = "drop"
  ) %>%
  mutate(
    Mean_Rating_Text = effectiveness_levels[round(Mean_Rating)]
  )

print(method_stats)
# A tibble: 3 × 6
  Method  Total_Responses Mean_Rating Median_Rating Mode_Rating Mean_Rating_Text
  <chr>             <int>       <dbl>         <dbl> <chr>       <chr>           
1 Body e…            1094        3.59             4 Very effec… Very effective  
2 RMT de…             639        3.23             3 Moderately… Moderately effe…
3 Wind i…            1245        3.79             4 Very effec… Very effective  
Code
# Create caption text with information about removed category
removal_note <- sprintf("Note: 'Other methods' category (N = %d, %.1f%% of total) was excluded from analysis.", 
                      other_methods_count, other_methods_percent)

# Create the plot with N values added to data labels
p <- ggplot(data_long, aes(x = factor(Effectiveness, levels = effectiveness_levels), 
                           y = Percentage_Total, fill = Method)) +
  geom_bar(stat = "identity", position = "dodge") +
  # Add both N and percentage to the labels
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", Count, Percentage_Total)), 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            size = 2.5) +
  labs(
    title = "The perceived effectiveness of RMT methods for\
strengthening your breathing muscles",
    subtitle = ifelse(chi_test$p.value < 0.05,
                     paste0("Chi-square test: χ²(", chi_test$parameter, ") = ", 
                           round(chi_test$statistic, 2), ", p < 0.001"),
                     ""),
    y = "Percentage of Total Responses (N = 1558)",
    x = NULL,
    caption = removal_note
  ) +
  scale_fill_manual(values = c(
    "Wind instrument" = "#1f77b4",
    "Body exercises" = "#2ca02c",
    "RMT device" = "#d62728"
  )) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 11, face = "bold", hjust = 0.5),
    plot.subtitle = element_text(size = 9, hjust = 0.5),
    plot.caption = element_text(size = 8, hjust = 0, face = "italic"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.title = element_blank(),
    legend.position = "bottom"
  ) +
  # Increase vertical space further to accommodate two-line labels
  scale_y_continuous(limits = c(0, max(data_long$Percentage_Total) * 1.3))

# Display the plot
print(p)

Code
# Save the statistical test results to a CSV file
test_results <- data.frame(
  Test = "Chi-square test of independence",
  Statistic = chi_test$statistic,
  DF = chi_test$parameter,
  P_Value = chi_test$p.value,
  Significance = ifelse(chi_test$p.value < 0.001, "p < 0.001 (***)", 
                       ifelse(chi_test$p.value < 0.01, "p < 0.01 (**)",
                              ifelse(chi_test$p.value < 0.05, "p < 0.05 (*)", "Not significant"))),
  Note = removal_note
)

write.csv(test_results, "effectiveness_comparison_test_results.csv", row.names = FALSE)

9.1 Comparison with RMT groups

Code
# Define the ordered effectiveness levels
effectiveness_levels <- c("Not effective at all", "Slightly effective", 
                          "Moderately effective", "Very effective", 
                          "Extremely effective", "Unsure")

# Calculate percentages based on the total N for each group in RMTMethods_YN
comparison_table <- df %>%
  select(RMTMethods_YN, RMTEffective_withDevice) %>%
  filter(!is.na(RMTEffective_withDevice)) %>%  # Remove NA values
  mutate(
    RMTMethods_YN = factor(RMTMethods_YN, levels = c(0, 1), labels = c("No", "Yes")),
    RMTEffective_withDevice = factor(RMTEffective_withDevice, levels = effectiveness_levels)
  ) %>%
  group_by(RMTMethods_YN, RMTEffective_withDevice) %>%
  summarise(Count = n(), .groups = 'drop') %>%
  group_by(RMTMethods_YN) %>%
  mutate(Percentage = (Count / sum(Count)) * 100)

# Calculate total N for each group
group_totals <- comparison_table %>%
  group_by(RMTMethods_YN) %>%
  summarise(Total_N = sum(Count))

# Legend labels to include N
legend_labels <- paste0(levels(comparison_table$RMTMethods_YN), " (N=", group_totals$Total_N, ")")

# Create the updated plot
p <- ggplot(comparison_table, 
            aes(x = RMTEffective_withDevice, y = Percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%.1f%%\n(n=%d)", Percentage, Count)), 
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  labs(
    title = "Perceived effectiveness of RMT devices between players\nthat do and do not use RMT devices",
    y = "Percentage of Responses within Group",
    x = NULL,
    fill = "Uses RMT Device"
  ) +
  scale_fill_manual(values = c("#1f77b4", "#ff7f0e"), labels = legend_labels) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(size = 11, hjust = 0.5, face = "bold"),
    legend.position = "bottom"
  ) +
  scale_y_continuous(limits = c(0, max(comparison_table$Percentage) * 1.2))

# Display the plot
print(p)

Code
# Statistical Analysis

# 1. Chi-square test
chi_test <- chisq.test(table(df$RMTMethods_YN, df$RMTEffective_withDevice))
print("\nChi-square test of independence:")
[1] "\nChi-square test of independence:"
Code
print(chi_test)

    Pearson's Chi-squared test

data:  table(df$RMTMethods_YN, df$RMTEffective_withDevice)
X-squared = 363.48, df = 5, p-value < 2.2e-16
Code
# Calculate Cramer's V
cramers_v <- sqrt(chi_test$statistic / (sum(!is.na(df$RMTEffective_withDevice)) * (min(2, 6) - 1)))
print("\nCramer's V:")
[1] "\nCramer's V:"
Code
print(cramers_v)
X-squared 
0.5333057 
Code
# 2. Descriptive statistics
desc_stats <- comparison_table %>%
  group_by(RMTMethods_YN) %>%
  summarise(
    Total_Count = sum(Count),
    Mean_Percentage = mean(Percentage),
    SD_Percentage = sd(Percentage),
    Median_Percentage = median(Percentage)
  )
print("\nDescriptive statistics by group:")
[1] "\nDescriptive statistics by group:"
Code
print(desc_stats)
# A tibble: 2 × 5
  RMTMethods_YN Total_Count Mean_Percentage SD_Percentage Median_Percentage
  <fct>               <int>           <dbl>         <dbl>             <dbl>
1 No                   1050            16.7          21.3              9.76
2 Yes                   228            16.7          14.0             16.4 
Code
# 3. Post-hoc analysis
# Create contingency table for standardized residuals
cont_table <- table(df$RMTMethods_YN, df$RMTEffective_withDevice)
std_residuals <- chisq.test(cont_table)$stdres
print("\nStandardized residuals (values > |1.96| indicate significant differences at α = 0.05):")
[1] "\nStandardized residuals (values > |1.96| indicate significant differences at α = 0.05):"
Code
print(std_residuals)
   
    Extremely effective Moderately effective Not effective at all
  0          -12.330501            -4.709043             2.344168
  1           12.330501             4.709043            -2.344168
   
    Slightly effective     Unsure Very effective
  0           2.533504  14.466669     -10.104911
  1          -2.533504 -14.466669      10.104911
Code
# Effect size for each level
effect_sizes <- data.frame(
  Effectiveness = colnames(cont_table),
  Effect_Size = apply(cont_table, 2, function(x) {
    chi <- chisq.test(x)
    sqrt(chi$statistic / sum(x))
  })
)
print("\nEffect sizes for each effectiveness level:")
[1] "\nEffect sizes for each effectiveness level:"
Code
print(effect_sizes)
                            Effectiveness Effect_Size
Extremely effective   Extremely effective   0.2783505
Moderately effective Moderately effective   0.4117647
Not effective at all Not effective at all   0.9090909
Slightly effective     Slightly effective   0.8080000
Unsure                             Unsure   0.9530516
Very effective             Very effective   0.0887574

9.2 Analyses Used

This study employed a variety of statistical analyses to evaluate the effectiveness of different respiratory muscle training (RMT) methods among wind instrumentalists:

  1. Chi-Square Test for Independence: Used to determine whether there is a significant association between training method type (Body exercises, RMT device, Wind instrument) and perceived effectiveness ratings.

  2. Standardized Residuals Analysis: Calculated to identify specific combinations of training methods and effectiveness ratings that deviate significantly from expected frequencies.

  3. Pairwise Chi-Square Tests: Conducted between pairs of training methods to determine significant differences in effectiveness distributions.

  4. Ordinal Analysis (Kruskal-Wallis Test): Applied to assess differences in the ordinal effectiveness ratings across the three training methods.

  5. Post-hoc Pairwise Wilcoxon Tests: Used with Bonferroni correction to determine which specific method pairs differ significantly in effectiveness.

  6. Descriptive Statistics: Calculated to summarize response patterns, including means, medians, and modes of effectiveness ratings for each method.

  7. Effect Size Calculation (Cramer’s V): Used to quantify the strength of association between RMT device usage and perceived effectiveness.

9.3 Analysis Results

Chi-Square Test for Independence

The overall chi-square test revealed a highly significant association between training method and effectiveness rating (χ² = 1028.28, df = 10, p < 0.001).

Standardized Residuals Analysis

Significant deviations from expected frequencies (|residual| > 1.96, p < 0.05) were observed:

  • Wind instruments were rated as “Extremely effective” (residual = 7.55) and “Very effective” (residual = 6.93) more frequently than expected.

  • RMT devices were associated with “Unsure” ratings significantly more often than expected (residual = 20.94), while being rated as “Extremely effective” (residual = -7.98) and “Very effective” (residual = -9.18) less frequently than expected.

  • Body exercises were associated with “Moderately effective” (residual = 2.88) and “Very effective” (residual = 2.25) ratings more frequently than expected, while “Unsure” ratings were significantly less frequent (residual = -6.00).

Pairwise Comparisons

All pairwise comparisons between training methods showed highly significant differences (p < 0.001):

  • Body exercises vs. RMT device: χ² = 427.04, df = 5

  • Body exercises vs. Wind instrument: χ² = 138.69, df = 5

  • RMT device vs. Wind instrument: χ² = 862.90, df = 5

Ordinal Analysis

The Kruskal-Wallis test confirmed significant differences in effectiveness ratings across methods (χ² = 105.71, df = 2, p < 0.001).

Post-hoc Wilcoxon tests with Bonferroni correction revealed significant differences between all method pairs (p < 0.001), confirming that the perceived effectiveness differs systematically between training approaches.

Descriptive Statistics

  • Wind instruments: Highest mean effectiveness rating (3.79), with modal response “Very effective”

  • Body exercises: Intermediate mean effectiveness rating (3.59), with modal response “Very effective”

  • RMT devices: Lowest mean effectiveness rating (3.23), with modal response “Moderately effective”

RMT Device User Analysis

A separate analysis comparing RMT device users vs. non-users revealed: - Significant association between RMT device usage and effectiveness ratings (χ² = 363.48, df = 5, p < 0.001) - Strong effect size (Cramer’s V = 0.53) - RMT device users reported “Extremely effective” (residual = 12.33) and “Very effective” (residual = 10.10) outcomes significantly more often than non-users - Non-users reported being “Unsure” much more frequently (residual = 14.47)

9.4 Result Interpretation

The findings indicate that wind instrumentalists perceive their primary instruments as the most effective RMT method, followed by body exercises, with dedicated RMT devices rated lowest. These results align with the principle of training specificity discussed by Illi et al. (2012), who found that respiratory muscle training is most effective when it closely mimics the demands of the target activity.

The higher effectiveness ratings for wind instruments likely reflect the principle of task-specificity. Bouhuys (1964) demonstrated that wind instrument playing naturally trains respiratory muscles through resistance and controlled breathing patterns specific to performance demands. Similarly, Sapienza et al. (2011) noted that training that mimics functional tasks tends to yield better transfer effects than isolated respiratory muscle exercises.

The relatively lower ratings for RMT devices among this population contradict some findings from sports medicine literature, where devices like the PowerLung and Spirotiger have shown significant improvements in respiratory muscle strength and endurance (HajGhanbari et al., 2013). This discrepancy may be explained by findings from Boulding et al. (2022), who proposed that the clinical efficacy of RMT devices may not translate to perceived performance benefits in specialized populations like musicians, who require highly task-specific respiratory control.

The higher uncertainty (“Unsure” ratings) associated with RMT devices suggests unfamiliarity with these tools among wind instrumentalists, which aligns with observations by Devroop and Chesky (2002) regarding the limited integration of respiratory training devices in music pedagogy.

Interestingly, the subgroup analysis revealed that musicians who actively use RMT devices reported significantly higher effectiveness ratings than non-users. This finding echoes Ackermann et al. (2014), who found that musicians who regularly incorporated respiratory training into their practice regimens reported greater perceived benefits than those with only occasional exposure.

9.5 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-reported effectiveness: The study relies on subjective perceptions rather than objective physiological measurements of respiratory muscle function.

  2. Lack of standardization: The specific protocols, duration, and intensity of each training method were not controlled or standardized across participants.

  3. Selection bias: Musicians who experienced benefits from a particular method may be more likely to continue using it and report positive outcomes.

  4. Confounding variables: Factors such as playing experience, instrument type (within the wind instrument family), and pre-existing respiratory conditions were not accounted for in the analysis.

  5. Unclear causality: The association between method and effectiveness does not establish whether the method causes improved performance or whether successful performers tend to prefer certain methods.

  6. Limited demographic information: The absence of participant demographics limits the generalizability of findings to broader populations of wind instrumentalists.

  7. Cross-sectional design: The study captures perceptions at a single point in time, failing to account for how effectiveness ratings might change with prolonged use of different methods.

9.6 Conclusions

This study provides evidence that wind instrumentalists perceive significant differences in the effectiveness of various respiratory muscle training methods. Playing wind instruments and performing body exercises appear to be perceived as more effective respiratory training methods than using dedicated RMT devices among this population.

The findings suggest that the principle of training specificity may be particularly important for wind instrumentalists, with methods that most closely mimic the demands of performance yielding the highest perceived benefits. This supports an integrated approach to respiratory training that incorporates instrument-specific exercises rather than relying solely on external devices.

For wind instrument pedagogues and performers, these results suggest that:

  1. Regular, focused practice on wind instruments naturally provides respiratory muscle training benefits.

  2. Body exercises (likely including techniques such as diaphragmatic breathing, breath control exercises, and yoga-based approaches) offer complementary training with perceived effectiveness.

  3. While RMT devices received lower overall ratings, those who use them consistently report significant benefits, suggesting they may have value as supplementary training tools.

Future research should incorporate objective measures of respiratory function alongside subjective ratings, control for variables such as training duration and instrument type, and employ longitudinal designs to track changes in effectiveness over time. Additionally, investigating specific protocols and techniques within each method category could identify the most beneficial approaches for wind instrumentalists.

9.7 References

Ackermann, B. J., Kenny, D. T., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in skilled flute players. Work, 46(4), 449-457.

Bouhuys, A. (1964). Lung volumes and breathing patterns in wind-instrument players. Journal of Applied Physiology, 19(5), 967-975.

Boulding, R., Stacey, R., Niven, R., & Fowler, S. J. (2022). Respiratory health and disease in elite athletes: A concise review. Frontiers in Sports and Active Living, 4, 862063.

Devroop, K., & Chesky, K. (2002). Comparison of biomechanical forces generated during trumpet performance in contrasting settings. Medical Problems of Performing Artists, 17(4), 149-154.

HajGhanbari, B., Yamabayashi, C., Buna, T. R., Coelho, J. D., Freedman, K. D., Morton, T. A., … & Reid, W. D. (2013). Effects of respiratory muscle training on performance in athletes: A systematic review with meta-analyses. The Journal of Strength & Conditioning Research, 27(6), 1643-1663.

Illi, S. K., Held, U., Frank, I., & Spengler, C. M. (2012). Effect of respiratory muscle training on exercise performance in healthy individuals: A systematic review and meta-analysis. Sports Medicine, 42(8), 707-724.

Sapienza, C. M., Troche, M., Pitts, T., & Davenport, P. (2011). Respiratory strength training: Concept and intervention outcomes. Seminars in Speech and Language, 32(1), 21-30.