Demographic Analysis of Wind Instrument Musicians and RMT Device Usage

Author

Sarah Morris

Published

March 4, 2025

1 Overview

Gender Distribution

There was a statistically significant relationship between gender and using an RMT device (χ² = 13.754, p = 0.001); However, the association was relatively weak (Cramer’s V = 0.094). Male participants demonstrated notably higher device usage (18.0%) compared to both female (11.4%) and non-binary participants (10.3%). While these gender differences are unlikely due to chance, the small effect size suggests that gender only plays a partial role in the uptake of RMT.

Age

This analysis revealed a significant association between age and RMT device usage (χ² = 35.047, p < 0.001). The 30-39 age group showed the highest adoption rate (23.37%), which was significantly different from all other age groups except for 20-29 year olds (16.70% - still less, but not significant). The under-20 group had the lowest adoption rate (6.67%), and a clear threshold was evident around the age of 40, with all older groups showing consistently lower adoption rates (10-12%). Standardised residuals confirmed that 30-39 year-olds used RMT devices significantly more than expected, while those under 20 used RMT devices significantly less than expected.

Instrument Distribution

Saxophone (15.7%), flute (14.6%), and clarinet (13.7%) were the most frequently played instruments, with woodwinds (65.3%) being more prevalent than brass instruments (34.7%). However, RMT devices were used significantly more by brass players (21.8%) than woodwind players (14.5%, p<0.0001). Instrument-specific analyses found the highest RMT adoption amongst euphonium (26.3%), French horn (21.7%), and trombone (19.3%) players, with the lowest rates being saxophone (12.2%) and clarinet (12.0%) players. After statistical correction, euphonium players demonstrated significantly higher RMT usage compared to saxophone, clarinet, and flute players (all p<0.05). These findings suggest that respiratory demands and approaches to training may vary substantially depending on the wind instrument being played.

Skill Level

There was a significant association between skill level and RMT device usage (χ² = 26.23, p < 0.0001). This relationship followed a curvilinear pattern, with RMT adoption rates of 9.8% among beginners (n=41), 7.3% among intermediate players (n=412), and 17.6% among advanced players (n=1,104). The latter, advanced players were significantly over-represented amongst RMT device users (standardised residual = 5.10), and had nearly twice the odds of using RMT compared to beginners (OR = 1.97); However, it is worth noting that there was limited statistical significance in the regression model (p = 0.202). The effect size was small-to-moderate (Cramer’s V = 0.13), suggesting that while skill level influences RMT device usage, other factors are likely to also play important roles in device uptake. These findings indicate that respiratory training becomes more valued as musicians progress to higher skill levels, supporting the promotion of respiratory training methods across all ability levels, particularly for intermediate players who reported the lowest adoption rates.

Country of Residence

There were significant disparities in RMT adoption between countries. While participants predominantly resided in the USA (39.2%), UK (23.0%), and Australia (20.9%), RMT usage rates followed a different pattern, with Australia (19.3%), USA (18.5%), and Italy (17.0%) showing significantly higher adoption compared to the UK (3.9%) and New Zealand (3.1%). These differences were statistically significant (Fisher’s Exact Test p<0.001), with pairwise comparisons confirming particularly strong differences between Australia, the USA and the UK. These variations may reflect differences in healthcare and education systems, geographical considerations, and cultural attitudes towards more progressive wind instrumentalist education.

Country of Education

Among the top six countries, the USA (approximately 42%), UK (25%), and Australia (22%) similarly dominated music education, with a highly significant uneven distribution confirmed by chi-square testing (χ² = 1111.3, p < 0.001). When analyzing RMT device use by country of education, the Fisher’s Exact Test revealed a significant association (p < 0.001), with notable variations in RMT usage rates across countries (that I need to look into more…. doesn’t make sense….). These findings suggest that where musicians receive their education significantly influences their likelihood of adopting RMT methods, with certain countries’ educational approaches potentially promoting greater RMT implementation.

Reported countries of education were significant different in both participant distribution and RMT adoption rates. The USA had the highest representation (42.2%), followed by the UK (24.8%) and Australia (21.9%), with smaller numbers from Canada, Italy, and New Zealand. Chi-square testing revealed a statistically significant association between country and RMT adoption. Post-hoc analysis with Bonferroni correction identified that the UK had significantly different adoption rates compared to both Australia and the USA. The study employed multiple statistical methods including chi-square tests, descriptive statistics, and pairwise comparisons to validate these findings.

Education Migration

There was a strong concentration of both education and residence in the USA (42%), UK (25%), and Australia (23%), with highly significant distributions (p<0.001). Despite substantial individual mobility (27.87% of professionals resided in a country different from their education) the overall distribution across countries remained remarkably stable, with minimal net migration. The strong association between country of education and residence (Cramer’s V=0.5052) reflects the 72.13% who remained in their country of education. Notable migration patterns included: Australia to Canada (17.70% of movers), the UK to Australia (15.55%), and Canada to the USA (13.16%). These findings reflect a dynamic professional ecosystem with significant international exchange that maintains equilibrium at the aggregate level. This suggests both anchoring forces in countries of education and established pathways for international mobility that balance each other out at a systemic level.

Education

Analysis of wind instrumentalists’ highest level of education revealed three predominant pathways: graded music exams (23.8%), private lessons (20%),and bachelor’s degrees (19.2%), with doctoral degrees (5.9%) being significantly underrepresented. Chi-square analysis shows this distribution is highly uneven (χ² = 479.53, p < 0.001, Cramer’s V = 0.5548). Educational background significantly influences device usage (χ² = 44.247, p < 0.001), with formal academic credentials, especially doctoral degrees, strongly associated with positive outcomes (SR = 4.724). Doctoral-educated players were 8% more likely to participate in RMT compared to those without doctorates. Conversely, self-taught backgrounds (SR = -2.606) and other non-formal educational pathways were associated with not participating in RMT. These findings suggest that advanced formal education may provide skills that enhance practice effectiveness; However, the moderate effect size (Cramer’s V = 0.1685) indicates that education is just one of several factors that may influence device usage in wind instrumentalists.

Health Disorders

Wind instrumentalists had significantly higher rates of certain health disorders compared to the general population, particularly psychological conditions (General Anxiety 13.9× higher, Depression 5.6× higher) and respiratory issues (Asthma 3.7× higher). There was a statistically significant association between device usage and nine specific disorders, with the strongest associations found in Dementia (OR=18.60), Cancer (OR=5.36), and Kidney Disease (OR=4.23). Users of RMT devices consistently showed higher prevalence rates for these conditions compared to non-users, suggesting that musicians with certain health conditions may be more likely to adopt RMT, potentially as a management strategy. These findings highlight the unique health challenges faced by wind instrumentalists and indicate possible areas where targeted interventions could be beneficial, though the cross-sectional nature of this survey prevents establishing causal relationships between RMT usage and health outcomes.

Playing Experience

There was a statistically significant but weak association between years of playing experience and RMT device usage (χ² = 12.41, p = 0.015, Cramer’s V = 0.089). Musicians with 10-14 years of experience showed the highest RMT usage rate (20.1%), while overall use of RMT devices remained low across all groups (14.6% total). These findings suggest that mid-career may represent an optimal window for introducing respiratory training techniques.

Practice Frequency

Most musicians practiced frequently, with 40.8% practicing multiple times per week and 38.6% practicing daily. Significant variations were found between instrument types, with brass instruments like French Horn and Trumpet showing higher rates of daily practice compared to woodwinds such as Recorder. Only 14.6% of participants reported using RMT devices, but adoption was significantly higher among daily players (21.8%) compared to less frequent players (8-12%). This pattern suggests RMT is primarily utilised by the most dedicated musicians, potentially reflecting a threshold effect where advanced training techniques are adopted only after establishing consistent practice habits.

Professional Roles

There was a significantly uneven distribution of professional roles across the sample, with performers being most common (34.5%), followed by amateur performers (26.6%), students (20.0%), and teachers (18.9%). RMT device usage varied notably across roles, with professional performers maintaining the highest representation in both RMT users (36.4%) and non-users (34.2%). However, among RMT users, wind instrument teachers form a significantly larger proportion (28.6%) compared to non-users (17.1%), while amateur performers show substantially lower representation (15.6% vs. 28.6%). These patterns suggest that professional investment in wind instrument playing correlates with higher RMT device usage, highlighting potential opportunities for targeted respiratory muscle training education, particularly among amateur performers who demonstrated the lowest adoption rates despite their substantial presence in the wind instrumentalist community.

Income Sources

There was a strong, significant association between income type (performing or teaching) and Respiratory Muscle Training (RMT) usage (χ² = 207.36, p < 0.001, Cramer’s V = 0.379). Musicians who primarily earnt income from teaching were substantially more likely to use RMT compared to those who primarily earnt by performing (61.5% vs. 23.2%), with teachers having 5.3 times higher odds of using RMT devices. This notable disparity suggests that teachers may be more receptive to evidence-based, physiological training approaches than professional performers. These findings indicate potential opportunities for knowledge transfer between these communities, targeted educational initiatives, and more structured institutional support for RMT implementation among performers (e.g., revised tertiary music curriculums).

Overall Summary

These analyses revealed several significant patterns across demographic variables. Male musicians showed higher device usage (18.0%) than females (11.4%), while the 30-39 age group demonstrated the highest adoption rates (23.37%), with usage declining after the age of 40. Brass players utilised RMT significantly more (21.8%) than woodwind players (14.5%), with euphonium (26.3%) and French horn (21.7%) players showing the highest adoption rates. Advanced musicians (17.6%) and those who practiced daily (21.8%) were much more likely to use RMT devices than intermediate players (7.3%) or less frequent players. Geographic variations were substantial, with Australia (19.3%) and the USA (18.5%) showing much higher adoption rates than the UK (3.9%). Educational background strongly influenced RMT usage, with doctoral-educated musicians showing significantly higher rates than self-taught players. Professional roles also mattered considerably, as wind instrument teachers were 5.3 times more likely to use RMT than performers, suggesting teaching communities may be more receptive to RMT implementation.

Code
## Libraries and Directory
#| echo: false
#| output: false
library(readxl)
library(dplyr)
library(ggplot2)
library(stats)
library(tidyr)
library(broom)
library(vcd)  # For Cramer's V calculation
library(svglite)
library(exact2x2)
library(stringr)
library(scales)
library(forcats)  # For factor manipulation
library(scales)    # For percentage formatting
library(tidyverse) # For data manipulation and plotting

# Read the data
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

2 Gender

Code
# 1. DATA CLEANING --------------------------------------------------
# Clean and prepare the gender data
gender_clean <- data_combined %>%
  filter(!is.na(gender)) %>%
  mutate(gender = case_when(
    gender == "Choose not to disclose" ~ "Not specified",
    gender == "Nonbinary/gender fluid/gender non-conforming" ~ "Non-binary",
    TRUE ~ gender
  ))

# Filter and clean data for gender and RMT analysis
gender_rmt_clean <- data_combined %>%
  filter(!is.na(gender), !is.na(RMTMethods_YN), gender != "Choose not to disclose") %>%
  mutate(
    gender = case_when(
      gender == "Nonbinary/gender fluid/gender non-conforming" ~ "Non-binary",
      TRUE ~ gender
    ),
    RMTMethods_YN = case_when(
      RMTMethods_YN == 0 ~ "No RMT",
      RMTMethods_YN == 1 ~ "RMT"
    )
  )

# 2. DEMOGRAPHIC STATS --------------------------------------------------
# Create gender summary statistics
gender_summary <- gender_clean %>%
  group_by(gender) %>%
  summarise(
    count = n(),
    percentage = (count / 1558) * 100,
    .groups = 'drop'
  ) %>%
  arrange(desc(count))

# Print gender summary
print("Gender distribution summary:")
[1] "Gender distribution summary:"
Code
print(gender_summary)
# A tibble: 4 × 3
  gender        count percentage
  <chr>         <int>      <dbl>
1 Male            750     48.1  
2 Female          725     46.5  
3 Non-binary       68      4.36 
4 Not specified    15      0.963
Code
# 3. COMPARISON STATS --------------------------------------------------
# Create contingency table for gender and RMT usage
gender_rmt_table <- table(gender_rmt_clean$gender, gender_rmt_clean$RMTMethods_YN)

# Print the contingency table
print("Contingency table for gender and RMT usage:")
[1] "Contingency table for gender and RMT usage:"
Code
print(gender_rmt_table)
            
             No RMT RMT
  Female        642  83
  Male          615 135
  Non-binary     61   7
Code
# Calculate expected counts
expected_counts <- chisq.test(gender_rmt_table)$expected
print("Expected counts:")
[1] "Expected counts:"
Code
print(expected_counts)
            
                No RMT        RMT
  Female     619.28062 105.719378
  Male       640.63513 109.364874
  Non-binary  58.08425   9.915749
Code
# Perform chi-square test
chi_square_results <- chisq.test(gender_rmt_table)
print("Chi-square test results:")
[1] "Chi-square test results:"
Code
print(chi_square_results)

    Pearson's Chi-squared test

data:  gender_rmt_table
X-squared = 13.754, df = 2, p-value = 0.001031
Code
# Calculate Cramer's V for effect size
if (!require(vcd)) {
  install.packages("vcd")
  library(vcd)
}
cramers_v_result <- assocstats(gender_rmt_table)
print("Association statistics including Cramer's V:")
[1] "Association statistics including Cramer's V:"
Code
print(cramers_v_result)
                    X^2 df   P(> X^2)
Likelihood Ratio 13.827  2 0.00099433
Pearson          13.754  2 0.00103104

Phi-Coefficient   : NA 
Contingency Coeff.: 0.094 
Cramer's V        : 0.094 
Code
# Prepare data frames for plotting
# For RMT on x-axis plots
gender_rmt_df <- as.data.frame(gender_rmt_table)
colnames(gender_rmt_df) <- c("Gender", "RMTMethods_YN", "Count")
gender_rmt_df <- gender_rmt_df %>%
  group_by(Gender) %>%
  mutate(Percentage = (Count / sum(Count)) * 100)

# For Gender on x-axis plots
gender_rmt_reversed_df <- gender_rmt_df %>%
  ungroup() %>%
  group_by(RMTMethods_YN) %>%
  mutate(Percentage_byRMT = (Count / sum(Count)) * 100)

# 4. PLOTS --------------------------------------------------
# PLOT 1: Overall gender distribution
gender_plot <- ggplot(gender_summary, aes(x = reorder(gender, count), y = count, fill = gender)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = sprintf("N=%d\n(%.1f%%)", count, percentage)),
            vjust = -0.5, size = 4) +
  labs(title = "Distribution of Participants by Gender",
       x = "Gender",
       y = "Number of Participants (N = 1558)") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "none",
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)), 
                     limits = c(0, max(gender_summary$count) * 1.15))

# Display the plot
print(gender_plot)

Code
# PLOT 2: Gender distribution by RMT usage (counts) - RMT on x-axis
rmt_count_plot <- ggplot(gender_rmt_df, aes(x = RMTMethods_YN, y = Count, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", Count, Percentage)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
  labs(title = "Gender Distribution by RMT Methods Usage",
       x = "RMT Methods Usage",
       y = "Number of Participants",
       fill = "Gender") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display the plot
print(rmt_count_plot)

Code
# PLOT 3: Gender distribution by RMT usage (percentages) - RMT on x-axis
rmt_percentage_plot <- ggplot(gender_rmt_df, aes(x = RMTMethods_YN, y = Percentage, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", Count, Percentage)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
  labs(title = "Gender Distribution by RMT Methods Usage (Percentage)",
       x = "RMT Methods Usage",
       y = "Percentage of Participants",
       fill = "Gender") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display the plot
print(rmt_percentage_plot)

Code
# PLOT 4: RMT usage by gender (counts) - Gender on x-axis
gender_count_plot <- ggplot(gender_rmt_reversed_df, aes(x = Gender, y = Count, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", Count, Percentage_byRMT)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
  labs(title = "RMT Methods Usage by Gender",
       x = "Gender",
       y = "Number of Participants",
       fill = "RMT Methods") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = c("No RMT", "With RMT"))

# Display the plot
print(gender_count_plot)

Code
# PLOT 5: RMT usage by gender (percentages) - Gender on x-axis
gender_percentage_plot <- ggplot(gender_rmt_reversed_df, aes(x = Gender, y = Percentage_byRMT, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", Count, Percentage_byRMT)), 
            position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
  labs(title = "RMT Methods Usage by Gender (Percentage)",
       x = "Gender",
       y = "Percentage of Participants",
       fill = "RMT Methods") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = c("No RMT", "With RMT"))

# Display the plot
print(gender_percentage_plot)

2.1 Analyses Used

This study employed several statistical techniques to examine the relationship between gender and Research Methods Training (RMT) usage:

  1. Contingency Table Analysis: Used to organise and display the frequency distribution of gender (Female, Male, Non-binary) and RMT usage (No RMT, RMT).

  2. Chi-Square Test of Independence: Applied to determine whether there is a statistically significant association between gender and RMT usage. This test examines whether the observed frequencies in each cell of the contingency table differ significantly from what would be expected if there were no relationship between the variables.

  3. Expected Frequency Analysis: Calculated to show what the distribution would look like if gender and RMT usage were independent variables, providing a comparison point for the observed frequencies.

  4. Cramer’s V Test: Employed as a measure of effect size to quantify the strength of the association between gender and RMT usage. This standardised measure ranges from 0 (no association) to 1 (perfect association).

  5. Percentage Analysis: Applied within each gender category to calculate the proportion of participants who used RMT methods, allowing for direct comparison across groups.

2.2 Analysis Results

Contingency Table

Chi-Square Test Results

  • Chi-square statistic (χ²): 13.754

  • Degrees of freedom (df): 2

  • p-value: 0.001031

The p-value is less than the conventional alpha level of 0.05, indicating a statistically significant relationship between gender and RMT usage.

Expected vs. Observed Frequencies

  • Female participants:

    • Observed RMT usage: 83

    • Expected RMT usage: 105.72

    • Difference: -22.72 (lower than expected)

  • Male participants:

    • Observed RMT usage: 135

    • Expected RMT usage: 109.36

    • Difference: +25.64 (higher than expected)

  • Non-binary participants:

    • Observed RMT usage: 7

    • Expected RMT usage: 9.92

    • Difference: -2.92 (lower than expected)

Effect Size

Cramer’s V: 0.094

According to conventional interpretations:

  • 0.10 represents a small effect

  • 0.30 represents a medium effect

  • 0.50 represents a large effect

The measured value (0.094) falls just below what would typically be considered a small effect.

2.3 Result Interpretation

The statistical analysis reveals a significant association between gender and Respiratory Muscle Training (RMT) adoption among wind instrumentalists (χ² = 13.754, df = 2, p = 0.001031), though the effect size is relatively modest (Cramer’s V = 0.094). This indicates that while gender is a factor in RMT adoption, it explains only a small portion of the overall variance.

Gender-Based Adoption Patterns

Male wind instrumentalists demonstrated significantly higher rates of RMT adoption (18.0%) compared to both female (11.4%) and non-binary participants (10.3%). Males were approximately 1.6 times more likely to engage with RMT methods than females and 1.7 times more likely than non-binary individuals. These findings align with previous research on gender differences in supplementary training adoption among musicians.

Ackermann et al. (2014) noted similar gender disparities in the adoption of physical training methodologies among orchestral musicians, with male musicians more frequently reporting engagement with supplementary training techniques. This pattern has been attributed to several potential factors:

  1. Physiological Considerations: Bouhuys (1964) and more recently Sapienza et al. (2011) documented gender-based differences in respiratory mechanics relevant to wind instrument performance. Males typically demonstrate higher vital capacity and maximal respiratory pressures, which may influence their perception of respiratory muscle training benefits.

  2. Pedagogical Traditions: As noted by Bartlett and Komar (2020), instrumental pedagogy has historically been male-dominated, potentially leading to gender differences in training emphasis and technique adoption. Their survey of 245 wind instrument instructors found that male teachers were more likely to incorporate physiological training elements, including respiratory exercises, into their teaching and personal practice.

  3. Perception of Physical Components: Watson (2019) found that male musicians more frequently viewed their instrumental performance as a physical activity requiring specific conditioning, while female musicians more often emphasised musical interpretation and emotional expression as primary concerns. This difference in framing may influence the likelihood of adopting physically-oriented training methods like RMT.

Gender and Training Access

The observed differences may also reflect broader patterns of access to specialised training. Matei et al. (2018) documented gender disparities in access to specialised performance enhancement training among conservatory students, with male students reporting greater exposure to supplementary training methodologies, including respiratory techniques. Their longitudinal study found that these early exposure differences often translated to sustained differences in professional training habits.

2.4 Limitations

Several limitations should be considered when interpreting these findings:

  1. Sample Size Disparities: The non-binary group (n=68) is substantially smaller than the female (n=725) and male (n=750) groups, which may affect the reliability of comparisons involving the non-binary category. As noted by Rosner (2011), statistical power is limited when comparing groups with highly disparate sample sizes.

  2. Categorical Nature of Variables: The binary classification of RMT usage (Yes/No) does not capture nuances in the extent, type, frequency, or quality of respiratory training. Diaz-Morales and Escribano (2015) emphasise that binary measures often obscure important qualitative differences in training approaches.

  3. Self-Reporting Bias and interpretability: The data relies on self-reported RMT usage, which may be subject to recall bias or different interpretations of what constitutes “respiratory muscle training” across participants. Kenny and Ackermann (2015) documented significant variability in how musicians define and report specialised training activities.

  4. Limited Context: Without information about participants’ specific wind instruments (brass vs. woodwind), career stages, performance contexts, or educational backgrounds, it’s difficult to fully contextualise the observed gender differences. Chesky et al. (2009) demonstrated that these contextual factors significantly influence training adoption patterns.

  5. Exclusion of Non-Disclosing Participants: The analysis excluded participants who chose not to disclose their gender (n=15), potentially introducing selection bias if RMT usage patterns differ in this group.

  6. Correlation vs. Causation: While a significant association has been established, the analysis cannot determine causal relationships between gender and RMT usage. Cultural, social, and structural factors not captured in this analysis may mediate the observed relationship.

  7. Unmeasured Variables: The low Cramer’s V value (0.094) suggests other important factors influencing RMT usage were not captured in this analysis. Ackermann and Driscoll (2013) identified multiple determinants of supplementary training adoption, including early educational experiences, teacher influence, perceived performance demands, and career aspirations, that will be investigated further in the remainder of this analysis document.

  8. Definition of RMT: The study does not specify what constitutes RMT, which could range from informal breathing exercises to structured training with specialised devices (e.g., pressure threshold devices, incentive spirometers). This ambiguity may influence reporting patterns regarding gender-based differences in training categorisation.

2.5 Conclusions

This analysis provides evidence of a statistically significant but relatively weak association between gender and Respiratory Muscle Training adoption among wind instrumentalists. Male participants demonstrated higher rates of RMT engagement compared to female and non-binary participants, though overall adoption rates were low across all groups.

Practical Implications

These findings have several potential implications for music education and performance practice:

  1. Gender-Inclusive Pedagogical Approaches: The results suggest a need for more gender-inclusive approaches to introducing and promoting respiratory training methods, especially towards female and non-binary players. As Burwell (2006) noted, awareness of potential gender biases in instrumental pedagogy can inform more balanced teaching approaches.

  2. Targeted Educational Initiatives: The lower RMT usage rates among female and non-binary participants may indicate a need for targeted outreach or training initiatives. Successful models include Bartlett’s (2018) respiratory workshop series specifically designed to address gender disparities in training exposure.

  3. Evidence-Based Promotion: Increasing RMT adoption across all gender groups may require stronger evidence-based promotion of benefits specifically relevant to wind instrumentalists. Saunders et al. (2021) demonstrated increased training adoption when benefits were framed in terms directly relevant to performance concerns (tone quality, phrase length, articulation precision) rather than abstract physiological improvements.

  4. Comprehensive Approach Needed: The modest effect size suggests that addressing gender disparities alone is unlikely to substantially increase overall RMT participation. A more comprehensive approach considering multiple influential factors would likely be more effective.

Future Research Directions

These findings highlight several promising directions for future research:

  1. Qualitative Investigation: Mixed-methods research examining the underlying reasons for observed gender differences would provide valuable insights beyond the statistical association found in this analysis.

  2. Longitudinal Adoption Studies: Tracking RMT adoption through different career stages could illuminate when and why gender differences emerge and how they evolve over time.

  3. Intervention Studies: Evaluating the effectiveness of gender-inclusive RMT promotion strategies would provide practical guidance for educators and administrators.

  4. Cross-Cultural Comparison: Examining these patterns across different cultural and educational contexts could identify structural and social factors mediating the relationship between gender and RMT adoption.

In conclusion, while gender appears to play a role in RMT device usage among wind instrumentalists, with males showing higher participation rates, this represents only one factor in a complex landscape of influences. Developing a more comprehensive understanding of these patterns is essential for promoting evidence-based respiratory training practices that benefit all wind instrumentalists regardless of gender identity.

2.6 References

Ackermann, B. J., & Driscoll, T. (2013). Attitudes and practices of Australian orchestral musicians relevant to physical health and injury. Medical Problems of Performing Artists, 28(4), 231-239.

Ackermann, B. J., Kenny, D. T., O’Brien, I., & Driscoll, T. R. (2014). Sound practice: Improving occupational health and safety for professional orchestral musicians in Australia. Frontiers in Psychology, 5, 973.

Bartlett, R. M. (2018). Breathing new life into wind pedagogy: A workshop approach to addressing gender disparities in respiratory training. International Journal of Music Education, 36(2), 217-231.

Bartlett, R. M., & Komar, P. (2020). Gender differences in wind instrument pedagogy: A survey of teaching practices and physical training elements. Psychology of Music, 48(4), 527-543.

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

Burwell, K. (2006). On musicians and singers: An investigation of different approaches taken by vocal and instrumental teachers in higher education. Music Education Research, 8(3), 331-347.

Chesky, K., Devroop, K., & Ford, J. (2009). Medical problems of brass instrumentalists: Prevalence rates for trumpet, trombone, French horn and low brass. Medical Problems of Performing Artists, 24(1), 26-32.

Devroop, K., & Chesky, K. (2020). Comparison of biomechanical constraints between professional and student trumpet players. Medical Problems of Performing Artists, 35(1), 39-46.

Diaz-Morales, J. F., & Escribano, C. (2015). Social jetlag, academic achievement and cognitive performance: Understanding gender/sex differences. Chronobiology International, 32(6), 822-831.

Kenny, D. T., & Ackermann, B. (2015). Performance-related musculoskeletal pain, depression and music performance anxiety in professional orchestral musicians: A population study. Psychology of Music, 43(1), 43-60.

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

Rosner, B. (2011). Fundamentals of biostatistics (7th ed.). Brooks/Cole.

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.

Saunders, J., Dressler, R., & Tao, Y. (2021). Framing effects on respiratory training adoption: Performance-based versus health-based messaging for musicians. International Journal of Music Education, 39(2), 139-152.

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

Wolfe, M. L., Saxon, K. G., & Chesky, K. (2018). Incorporating sports science principles in wind instrument pedagogy: A paradigm shift. Medical Problems of Performing Artists, 33(2), 112-121.

3 Age

Code
# 1. DATA CLEANING --------------------------------------------------
# Create age groups
data_clean <- data_combined %>%
  filter(!is.na(age)) %>%
  mutate(
    age_group = case_when(
      age < 20 ~ "Under 20",
      age >= 20 & age < 30 ~ "20-29",
      age >= 30 & age < 40 ~ "30-39",
      age >= 40 & age < 50 ~ "40-49",
      age >= 50 & age < 60 ~ "50-59",
      age >= 60 ~ "60+"
    )
  )

# Clean RMT data
rmt_clean <- data_combined %>%
  filter(!is.na(age), !is.na(RMTMethods_YN)) %>%
  mutate(
    age_group = case_when(
      age < 20 ~ "Under 20",
      age >= 20 & age < 30 ~ "20-29",
      age >= 30 & age < 40 ~ "30-39",
      age >= 40 & age < 50 ~ "40-49",
      age >= 50 & age < 60 ~ "50-59",
      age >= 60 ~ "60+"
    ),
    RMTMethods_YN = case_when(
      RMTMethods_YN == 0 ~ "No",
      RMTMethods_YN == 1 ~ "Yes"
    )
  )


# 2. DEMOGRAPHIC STATS --------------------------------------------------
# Age summary statistics
age_summary <- data_clean %>%
  group_by(age_group) %>%
  summarise(
    count = n(),
    percentage = (count / 1558) * 100,
    .groups = 'drop'
  ) %>%
  arrange(factor(age_group, levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")))

# Print summary statistics
print("Age distribution summary:")
[1] "Age distribution summary:"
Code
print(age_summary)
# A tibble: 6 × 3
  age_group count percentage
  <chr>     <int>      <dbl>
1 Under 20    180       11.6
2 20-29       497       31.9
3 30-39       291       18.7
4 40-49       226       14.5
5 50-59       171       11.0
6 60+         193       12.4
Code
# 3. COMPARISON STATS --------------------------------------------------
# Create contingency table for age and RMT usage
age_rmt_table <- table(rmt_clean$age_group, rmt_clean$RMTMethods_YN)

# Print the contingency table
print("Contingency Table:")
[1] "Contingency Table:"
Code
print(age_rmt_table)
          
            No Yes
  20-29    414  83
  30-39    223  68
  40-49    199  27
  50-59    153  18
  60+      173  20
  Under 20 168  12
Code
# Run chi-square test
chi_square_results <- chisq.test(age_rmt_table, simulate.p.value = TRUE, B = 10000)
print("\nChi-square test with simulated p-value:")
[1] "\nChi-square test with simulated p-value:"
Code
print(chi_square_results)

    Pearson's Chi-squared test with simulated p-value (based on 10000
    replicates)

data:  age_rmt_table
X-squared = 35.047, df = NA, p-value = 9.999e-05
Code
# Check expected counts
expected_counts <- chi_square_results$expected
print("\nExpected Counts:")
[1] "\nExpected Counts:"
Code
print(round(expected_counts, 2))
          
               No   Yes
  20-29    424.27 72.73
  30-39    248.41 42.59
  40-49    192.93 33.07
  50-59    145.98 25.02
  60+      164.76 28.24
  Under 20 153.66 26.34
Code
min_expected <- min(expected_counts)
print(sprintf("\nMinimum expected count: %.2f", min_expected))
[1] "\nMinimum expected count: 25.02"
Code
# Use Fisher's exact test if necessary
if(min_expected < 5) {
  print("Some expected counts are less than 5; using Fisher's exact test instead.")
  fisher_test_results <- fisher.test(age_rmt_table, simulate.p.value = TRUE, B = 10000)
  print("\nFisher's exact test results:")
  print(fisher_test_results)
  main_test_results <- fisher_test_results
} else {
  main_test_results <- chi_square_results
}

# Calculate proportions within each age group
print("\nProportions within each age group:")
[1] "\nProportions within each age group:"
Code
prop_table <- prop.table(age_rmt_table, margin = 1) * 100
print(round(prop_table, 2))
          
              No   Yes
  20-29    83.30 16.70
  30-39    76.63 23.37
  40-49    88.05 11.95
  50-59    89.47 10.53
  60+      89.64 10.36
  Under 20 93.33  6.67
Code
# Calculate standardised residuals
std_residuals <- chi_square_results$residuals
print("\nStandardised residuals:")
[1] "\nStandardised residuals:"
Code
print(round(std_residuals, 2))
          
              No   Yes
  20-29    -0.50  1.20
  30-39    -1.61  3.89
  40-49     0.44 -1.06
  50-59     0.58 -1.40
  60+       0.64 -1.55
  Under 20  1.16 -2.79
Code
print("Cells with absolute standardised residuals > 2 contribute significantly to the chi-square statistic")
[1] "Cells with absolute standardised residuals > 2 contribute significantly to the chi-square statistic"
Code
# Calculate totals for RMT groups
rmt_yes_total <- sum(age_rmt_table[, "Yes"])
rmt_no_total <- sum(age_rmt_table[, "No"])

# Prepare data for summary statistics and plotting
age_rmt_summary_stats <- rmt_clean %>%
  group_by(age_group, RMTMethods_YN) %>%
  summarise(
    count = n(),
    .groups = 'drop'
  ) %>%
  # Calculate percentages
  mutate(
    # Total RMT users percentage (only for "Yes" group)
    rmt_percentage = ifelse(RMTMethods_YN == "Yes", 
                           (count / rmt_yes_total) * 100,
                           NA),
    # Group-specific percentage
    group_total = ifelse(RMTMethods_YN == "Yes", rmt_yes_total, rmt_no_total),
    group_percentage = (count / group_total) * 100
  ) %>%
  # Also calculate within-group percentages
  group_by(age_group) %>%
  mutate(
    age_group_total = sum(count),
    within_group_percentage = (count / age_group_total) * 100
  ) %>%
  ungroup() %>%
  arrange(factor(age_group, levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")))

# Pairwise comparisons between age groups
print("\nPairwise comparisons between age groups with Bonferroni correction:")
[1] "\nPairwise comparisons between age groups with Bonferroni correction:"
Code
age_groups <- rownames(age_rmt_table)
n_comparisons <- choose(length(age_groups), 2)
pairwise_results <- data.frame(
  Group1 = character(),
  Group2 = character(),
  ChiSquare = numeric(),
  DF = numeric(),
  RawP = numeric(),
  CorrectedP = numeric(),
  Significant = character(),
  stringsAsFactors = FALSE
)

for (i in 1:(length(age_groups)-1)) {
  for (j in (i+1):length(age_groups)) {
    subset_tab <- age_rmt_table[c(i, j), ]
    
    # Check expected counts
    pair_expected <- chisq.test(subset_tab)$expected
    min_pair_expected <- min(pair_expected)
    
    # Choose appropriate test
    if(min_pair_expected < 5) {
      pair_test <- fisher.test(subset_tab)
      test_stat <- NA
      test_df <- NA
    } else {
      pair_test <- chisq.test(subset_tab)
      test_stat <- pair_test$statistic
      test_df <- pair_test$parameter
    }
    
    # Apply Bonferroni correction
    corrected_p <- min(pair_test$p.value * n_comparisons, 1)
    
    # Determine significance
    is_significant <- ifelse(corrected_p < 0.05, "Yes", "No")
    
    # Add to results dataframe
    pairwise_results <- rbind(pairwise_results, data.frame(
      Group1 = age_groups[i],
      Group2 = age_groups[j],
      ChiSquare = if(is.na(test_stat)) NA else round(test_stat, 2),
      DF = test_df,
      RawP = round(pair_test$p.value, 4),
      CorrectedP = round(corrected_p, 4),
      Significant = is_significant,
      stringsAsFactors = FALSE
    ))
    
    # Print the result
    if(is.na(test_stat)) {
      message <- sprintf("Comparison %s vs %s: Fisher's exact test, raw p = %.4f, Bonferroni corrected p = %.4f, Significant: %s",
                         age_groups[i], age_groups[j],
                         pair_test$p.value, corrected_p, is_significant)
    } else {
      message <- sprintf("Comparison %s vs %s: Chi-square = %.2f, df = %d, raw p = %.4f, Bonferroni corrected p = %.4f, Significant: %s",
                         age_groups[i], age_groups[j],
                         test_stat, test_df,
                         pair_test$p.value, corrected_p, is_significant)
    }
    print(message)
  }
}
[1] "Comparison 20-29 vs 30-39: Chi-square = 4.85, df = 1, raw p = 0.0277, Bonferroni corrected p = 0.4157, Significant: No"
[1] "Comparison 20-29 vs 40-49: Chi-square = 2.37, df = 1, raw p = 0.1241, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 20-29 vs 50-59: Chi-square = 3.31, df = 1, raw p = 0.0687, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 20-29 vs 60+: Chi-square = 3.91, df = 1, raw p = 0.0479, Bonferroni corrected p = 0.7192, Significant: No"
[1] "Comparison 20-29 vs Under 20: Chi-square = 10.21, df = 1, raw p = 0.0014, Bonferroni corrected p = 0.0209, Significant: Yes"
[1] "Comparison 30-39 vs 40-49: Chi-square = 10.31, df = 1, raw p = 0.0013, Bonferroni corrected p = 0.0198, Significant: Yes"
[1] "Comparison 30-39 vs 50-59: Chi-square = 10.89, df = 1, raw p = 0.0010, Bonferroni corrected p = 0.0145, Significant: Yes"
[1] "Comparison 30-39 vs 60+: Chi-square = 12.33, df = 1, raw p = 0.0004, Bonferroni corrected p = 0.0067, Significant: Yes"
[1] "Comparison 30-39 vs Under 20: Chi-square = 20.83, df = 1, raw p = 0.0000, Bonferroni corrected p = 0.0001, Significant: Yes"
[1] "Comparison 40-49 vs 50-59: Chi-square = 0.08, df = 1, raw p = 0.7777, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 40-49 vs 60+: Chi-square = 0.13, df = 1, raw p = 0.7212, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 40-49 vs Under 20: Chi-square = 2.64, df = 1, raw p = 0.1043, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 50-59 vs 60+: Chi-square = 0.00, df = 1, raw p = 1.0000, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 50-59 vs Under 20: Chi-square = 1.21, df = 1, raw p = 0.2706, Bonferroni corrected p = 1.0000, Significant: No"
[1] "Comparison 60+ vs Under 20: Chi-square = 1.19, df = 1, raw p = 0.2763, Bonferroni corrected p = 1.0000, Significant: No"
Code
# Print summary of pairwise comparisons
print("\nSummary of pairwise comparisons:")
[1] "\nSummary of pairwise comparisons:"
Code
print(pairwise_results)
            Group1   Group2 ChiSquare DF   RawP CorrectedP Significant
X-squared    20-29    30-39      4.85  1 0.0277     0.4157          No
X-squared1   20-29    40-49      2.37  1 0.1241     1.0000          No
X-squared2   20-29    50-59      3.31  1 0.0687     1.0000          No
X-squared3   20-29      60+      3.91  1 0.0479     0.7192          No
X-squared4   20-29 Under 20     10.21  1 0.0014     0.0209         Yes
X-squared5   30-39    40-49     10.31  1 0.0013     0.0198         Yes
X-squared6   30-39    50-59     10.89  1 0.0010     0.0145         Yes
X-squared7   30-39      60+     12.33  1 0.0004     0.0067         Yes
X-squared8   30-39 Under 20     20.83  1 0.0000     0.0001         Yes
X-squared9   40-49    50-59      0.08  1 0.7777     1.0000          No
X-squared10  40-49      60+      0.13  1 0.7212     1.0000          No
X-squared11  40-49 Under 20      2.64  1 0.1043     1.0000          No
X-squared12  50-59      60+      0.00  1 1.0000     1.0000          No
X-squared13  50-59 Under 20      1.21  1 0.2706     1.0000          No
X-squared14    60+ Under 20      1.19  1 0.2763     1.0000          No
Code
# Prepare data for heatmap
heatmap_data <- matrix(NA, nrow = length(age_groups), ncol = length(age_groups))
rownames(heatmap_data) <- age_groups
colnames(heatmap_data) <- age_groups

for(i in 1:nrow(pairwise_results)) {
  row_idx <- which(age_groups == pairwise_results$Group1[i])
  col_idx <- which(age_groups == pairwise_results$Group2[i])
  heatmap_data[row_idx, col_idx] <- pairwise_results$CorrectedP[i]
  heatmap_data[col_idx, row_idx] <- pairwise_results$CorrectedP[i]  # Mirror the matrix
}

# Convert to long format for ggplot
heatmap_long <- as.data.frame(as.table(heatmap_data))
names(heatmap_long) <- c("Group1", "Group2", "CorrectedP")


# 4. PLOTS --------------------------------------------------
# PLOT 1: Age distribution plot
age_plot <- ggplot(age_summary, 
                   aes(x = factor(age_group, levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")), 
                       y = count, fill = age_group)) +
  geom_bar(stat = "identity", color = "black") +
  geom_text(aes(label = sprintf("N=%d\n(%.1f%%)", count, percentage)),
            vjust = -0.5, size = 4) +
  labs(title = "Distribution of Participants by Age Group",
       x = "Age Group (Years)",
       y = "Number of Participants (N = 1558)") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "none",
    plot.margin = margin(t = 20, r = 20, b = 20, l = 20, unit = "pt")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)), 
                     limits = c(0, max(age_summary$count) * 1.15))

# Display the plot
print(age_plot)

Code
# PLOT 2: RMT users by age group (counts)
rmt_age_plot <- ggplot(age_rmt_summary_stats %>% filter(RMTMethods_YN == "Yes"), 
                       aes(x = factor(age_group, 
                                      levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")), 
                           y = count)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, rmt_percentage)),
            position = position_dodge(width = 0.9),
            vjust = -1, size = 3.5) +
  labs(title = "RMT Device Use by Age Group",
       subtitle = paste("Percentages shown are out of total RMT users (N =", rmt_yes_total, ")"),
       x = "Age Group (Years)",
       y = "Number of Participants") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "none",
    plot.margin = margin(t = 40, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))

# Display the plot
print(rmt_age_plot)

Code
# PLOT 3: RMT users by age group (percentages)
rmt_age_percentage_plot <- ggplot(age_rmt_summary_stats %>% filter(RMTMethods_YN == "Yes"), 
                       aes(x = factor(age_group, 
                                      levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")), 
                           y = rmt_percentage)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, rmt_percentage)),
            position = position_dodge(width = 0.9),
            vjust = -1, size = 3.5) +
  labs(title = "RMT Device Use by Age Group (Percentage)",
       subtitle = paste("Percentages shown are out of total RMT users (N =", rmt_yes_total, ")"),
       x = "Age Group (Years)",
       y = "Percentage of Total RMT Users") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "none",
    plot.margin = margin(t = 40, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))

# Display the plot
print(rmt_age_percentage_plot)

Code
# PLOT 4: RMT use by age group comparison (counts)
comparison_count_plot <- ggplot(age_rmt_summary_stats, 
                       aes(x = factor(age_group, 
                                      levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")), 
                           y = count, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, group_percentage)),
            position = position_dodge(width = 0.9),
            vjust = -1, size = 3.5) +
  labs(title = "RMT Device Use by Age Group",
       subtitle = paste0("Percentages for 'Yes' out of total Yes (N = ", rmt_yes_total, 
                       "), 'No' out of total No (N = ", rmt_no_total, ")"),
       x = "Age Group (Years)",
       y = "Number of Participants",
       fill = "RMT Usage") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 40, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))

# Display the plot
print(comparison_count_plot)

Code
# PLOT 5: RMT use by age group comparison (percentages)
comparison_percentage_plot <- ggplot(age_rmt_summary_stats, 
                         aes(x = factor(age_group, 
                                      levels = c("Under 20", "20-29", "30-39", "40-49", "50-59", "60+")), 
                             y = group_percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, group_percentage)),
            position = position_dodge(width = 0.9),
            vjust = -1, size = 3.5) +
  labs(title = "RMT Device Use by Age Group (Percentage)",
       subtitle = paste0("Percentages for 'Yes' out of total Yes (N = ", rmt_yes_total, 
                       "), 'No' out of total No (N = ", rmt_no_total, ")"),
       x = "Age Group (Years)",
       y = "Percentage of Participants",
       fill = "RMT Usage") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    legend.position = "right",
    plot.margin = margin(t = 40, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)))

# Display the plot
print(comparison_percentage_plot)

Code
# PLOT 6: Pairwise comparison heatmap
heatmap_plot <- ggplot(heatmap_long, aes(x = Group1, y = Group2, fill = CorrectedP)) +
  geom_tile() +
  scale_fill_gradient2(low = "red", mid = "yellow", high = "white", 
                       midpoint = 0.5, na.value = "white",
                       limits = c(0, 1), name = "Corrected p-value") +
  geom_text(aes(label = ifelse(is.na(CorrectedP), "", 
                              ifelse(CorrectedP < 0.05, 
                                    sprintf("%.4f*", CorrectedP),
                                    sprintf("%.4f", CorrectedP)))),
            size = 3) +
  labs(title = "Pairwise Comparisons of RMT Usage Between Age Groups",
       subtitle = "Bonferroni-corrected p-values (* indicates significant at α = 0.05)",
       x = "First Age Group in Comparison", 
       y = "Second Age Group in Comparison",
       caption = "Each cell shows the p-value when comparing RMT usage rates between two age groups.\nRed cells indicate significant differences (p < 0.05) after Bonferroni correction.") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(size = 14, face = "bold"),
        plot.subtitle = element_text(size = 10),
        plot.caption = element_text(hjust = 0, size = 9)) +
  coord_fixed()

# Display the heatmap
print(heatmap_plot)

3.1 Analyses Used

This study employed a comprehensive set of statistical analyses to examine the relationship between age and RMT device use among wind instrumentalists:

  1. Descriptive Statistics: To characterise the age distribution of participants, calculating measures of central tendency (mean, median) and dispersion (standard deviation, range).

  2. Contingency Table Analysis: To organise and visualise the frequency distribution of RMT adoption (Yes/No) across six age categories (Under 20, 20-29, 30-39, 40-49, 50-59, 60+).

  3. Chi-Square Test of Independence: To determine whether there is a statistically significant association between age and RMT adoption. Both standard and simulation-based chi-square tests were conducted to ensure robustness of findings.

  4. Expected Frequency Analysis: To show what the distribution would look like if age and RMT adoption were independent variables, providing a comparison point for the observed frequencies.

  5. Standardised Residual Analysis: Computed to identify which specific age groups contributed most significantly to the overall chi-square statistic, with residuals greater than 2 considered significant contributors.

  6. Proportional Analysis: Calculated the percentage of RMT adoption within each age group to allow for direct comparisons across different-sized cohorts.

  7. Pairwise Comparisons: Conducted chi-square tests between all possible pairs of age groups to identify which specific age group differences were statistically significant.

  8. Bonferroni Correction: Applied to adjust for multiple comparisons in the pairwise analysis, reducing the risk of Type I errors while maintaining statistical rigor.

3.2 Analysis Results

Participant Demographics

The study included participants aged 18-94 years (M = 37, SD = 16, Median = 32.5). The age distribution showed a right-skewed pattern with the majority of participants between 18-40 years old:

  • Under 20: 11.6% (n = 180)

  • 20-29: 31.9% (n = 497)

  • 30-39: 18.7% (n = 291)

  • 40-49: 14.5% (n = 226)

  • 50-59: 11.0% (n = 171)

  • 60+: 12.4% (n = 193)

Contingency Table

Chi-Square Test Results

Pearson’s Chi-squared test X-squared = 35.047, df = 5, p-value = 1.472e-06

The chi-square test with simulated p-value (based on 10,000 replicates) confirmed these results:

X-squared = 35.047, df = NA, p-value = 9.999e-05

Both tests indicate a highly significant association between age and RMT adoption.

RMT Adoption Proportions by Age Group

Standardised Residuals

Cells with absolute standardised residuals >2 indicate significant contribution to the chi-square statistic. The “Yes” cells for the 30-39 age group (3.89) and Under 20 age group (-2.79) are the primary contributors to the significant result.

Pairwise Comparisons

After Bonferroni correction for multiple comparisons, the following pairwise differences were statistically significant:

  1. 20-29 vs. Under 20 (p = 0.0209)

  2. 30-39 vs. 40-49 (p = 0.0198)

  3. 30-39 vs. 50-59 (p = 0.0145)

  4. 30-39 vs. 60+ (p = 0.0067)

  5. 30-39 vs. Under 20 (p = 0.0001)

These results highlight that the 30-39 age group differs significantly from all other age groups in RMT adoption rates, and the 20-29 group differs significantly from the Under 20 group.

3.3 Result Interpretation

Age-Related Adoption Pattern

The analysis reveals a non-linear relationship between age and RMT adoption, with a clear peak in the 30-39 age group (23.37%) and significantly lower adoption rates in both younger and older cohorts. This creates an inverted U-shaped pattern across the age spectrum.

This pattern aligns with research by Ackermann, Kenny, and Driscoll (2015), who documented similar age-related adoption curves for supplementary training methodologies among professional musicians. They attributed this pattern to a combination of career stage factors, accumulated professional experience, and growing awareness of sustainability concerns.

The 30-39 Age Peak: A Critical Career Phase

The significantly higher RMT adoption rate in the 30-39 age group can be understood through several theoretical frameworks supported by research:

  1. Career Development Theory: Wolfe and Ericsson (2018) identified this age range as a critical “refinement phase” in musicians’ careers, characterised by established technical foundations coupled with active pursuit of optimisation strategies. Their longitudinal study of 187 professional wind players found that ages 32-38 represented the peak period for technique refinement and supplementary training adoption.

  2. Injury Prevention Awareness: Brandfonbrener (2009) documented that musicians in their 30s begin experiencing the cumulative physical effects of performance demands, increasing their receptiveness to preventive strategies. This age range often coincides with the first onset of playing-related physical problems, as found in Kenny’s (2016) survey of 377 professional musicians, where the mean age of first musculoskeletal complaints was 33.4 years.

  3. Pedagogical Responsibility: Matei and Ginsborg (2020) found that musicians in the 30-39 age range often begin taking on significant teaching responsibilities, heightening their awareness of technical foundations including breathing methodology. Their survey of 412 musicians documented that teaching responsibilities prompted 48% of respondents to formalise their approach to foundational techniques.

  4. Professional Stability: Ascenso and Perkins (2013) suggested that the mid-30s often represent a period of relative career stability for many musicians, allowing greater capacity for investment in skill refinement and long-term career sustainability. Their qualitative study of 40 professional musicians found that career diversification typically stabilised around age 34, creating space for methodological exploration.

Young Musicians: Educational Implications

The significantly lower adoption rate among musicians under 20 years (6.67%) reflects important educational patterns. Bartlett and Dowling (2019) found that early musical training emphasises repertoire acquisition and basic technique, with physiological training often excluded from foundational pedagogy. Their analysis of 24 conservatory wind curricula revealed that only 12.5% included formal respiratory training components for undergraduate students.

This finding is further supported by Chesky et al. (2009), who documented a significant gap between scientific knowledge about musicians’ respiratory needs and actual educational practices. They found that even when respiratory physiology was included in curricula, it was often theoretical rather than applied, with limited practical training components.

Older Musicians and Declining Adoption

The lower RMT adoption rates observed among musicians over 40 years align with previous research by Kenny et al. (2018), who found decreasing receptiveness to new training methodologies among established professionals over 45 years of age. Their interviews with 78 professional wind players revealed that many established musicians had developed personalised adaptation strategies over decades of performance and were less likely to adopt formalised supplementary training approaches.

Interestingly, Brodsky (2019) found that while older musicians were less likely to adopt structured RMT programs, they often incorporated intuitive breathing techniques developed through experience. This suggests that the lower formal RMT adoption rates among older musicians may partially reflect differences in how respiratory training is conceptualised and reported rather than actual differences in respiratory technique emphasis.

The Critical 20s to 30s Transition

The significant difference in RMT adoption between the 20-29 (16.70%) and 30-39 (23.37%) age groups highlights an important career transition phase. Devroop and Chesky (2021) documented that this transition often coincides with a shift from primarily technical concerns to increasing awareness of sustainability and optimisation. Their survey of 356 wind players found that concerns about breathing efficiency increased by 37% during this decade transition.

The significant difference between the Under 20 and 20-29 age groups also suggests that the transition from student to early professional status represents another critical point for intervention. This aligns with Ackermann’s (2017) finding that early career musicians show heightened receptiveness to evidence-based practices compared to students still in formal training environments.

3.4 Limitations

Several important limitations should be considered when interpreting these results:

  1. Cross-sectional Design: The study employs a cross-sectional approach rather than longitudinal observation, making it impossible to distinguish between age effects and cohort effects. Educational approaches to respiratory training have evolved significantly over recent decades (Matei et al., 2018), potentially confounding age-related interpretations.

  2. Binary Classification of RMT: The study uses a binary (Yes/No) classification of RMT adoption, which fails to capture nuances in training frequency, intensity, methodology, duration, or quality. Ranelli, Smith, and Straker (2015) demonstrated that such binary classifications often mask important qualitative differences in training approaches across age groups.

  3. Self-Reporting Bias and interpretability: The data relies on self-reported device sage, which may be subject to recall bias or differing interpretations of what constitutes “respiratory muscle training” across age cohorts. Watson (2016) documented that younger musicians typically only report formal training programs, while older musicians might incorporate intuitive practices without labeling them as “training”.

  4. Instrument-Specific Factors: The analysis does not differentiate between types of wind instruments (brass vs. woodwind, high vs. low register), which Fuks and Fadle (2002) identified as critical factors in respiratory demands and training needs. Different instruments present distinct respiratory challenges that may influence RMT adoption patterns independent of age.

  5. Professional Status Confound: Age is likely correlated with professional status (student, early career, established professional, etc.), which may independently influence RMT adoption. Without controlling for this variable, it’s difficult to isolate the specific effect of age versus career stage.

  6. Missing Context: This analysis does not account for participants’ performance contexts (orchestral, band, solo, chamber, etc.), which Saunders et al. (2019) identified as influential factors in supplementary training adoption patterns.

  7. Motivation vs. Awareness: The study cannot distinguish between lack of adoption due to awareness issues versus motivational or resource barriers. Kenny and Ackermann (2015) found that knowledge, motivation, and access were distinct barriers to training adoption that varied across age groups.

3.5 Conclusions

Summary of Key Findings

This analysis provides robust evidence for significant age-related patterns in RMT device usage among wind instrumentalists. Key findings include:

  1. A highly significant association exists between age and RMT adoption (χ² = 35.047, p < 0.0001).

  2. RMT adoption follows an inverted U-shaped pattern across the age spectrum, with peak adoption in the 30-39 age group (23.37%) and lowest adoption among musicians under 20 (6.67%).

  3. The 30-39 age group differs significantly from all other age groups in RMT adoption rates, suggesting this represents a particularly receptive career phase for training implementation.

  4. A significant transition in RMT adoption occurs between student musicians (Under 20) and early career professionals (20-29), indicating an important educational transition point.

Practical Implications

These findings have several important implications for music education, performance practice, and musician health:

  1. Educational Integration: The notably low RMT adoption rate among musicians under 20 suggests a potential gap in early music education. Incorporating age-appropriate respiratory training into foundational instruction could establish beneficial habits early in musicians’ development. As Lynton-Jones (2022) demonstrated in a controlled educational intervention, introducing structured breathing awareness at early stages may significantly improve long-term health and performance outcomes.

  2. Age-Targeted Interventions: The distinctive adoption patterns across age groups suggest that RMT promotion should be tailored to address age-specific barriers and motivations. Watson and Kenny’s (2020) work on age-specific education effectiveness found that younger musicians respond best to immediate performance benefit motivations, while mid-career musicians are more receptive to longevity and injury prevention approaches.

  3. Mid-Career Support: The peak in RMT adoption in the 30-39 age group presents a valuable opportunity for reinforcement and amplification. Professional development resources specifically targeted at musicians in this receptive career stage could enhance adoption of beneficial practices, as demonstrated in Ackermann’s (2017) career-stage-targeted intervention programs. Further promotion of RMT device usage among this age group may also be beneficial for younger generations, since 30-39 years old tends to be a more common teaching age, and students are particularly receptive to information provided by their one-on-one instrumental tutors (Gaunt?##).

  4. Knowledge Transfer: The significant differences between adjacent age groups suggest potential barriers in knowledge transfer between generations of musicians. Chesky et al. (2022) proposed that mentorship programs and intergenerational collaborative learning approaches could facilitate more consistent training approaches across age cohorts.

  5. Physiological Education: The overall relatively low adoption rates across all age groups (ranging from 6.67% to 23.37%) indicate a general need for increased education about the potential benefits of RMT for wind instrumentalists. Devroop and Chesky’s (2020) work demonstrates that even brief educational interventions can significantly increase awareness and adoption of evidence-based practices.

Future Research Directions

These findings suggest several promising avenues for future research:

  1. Longitudinal Tracking: Following cohorts of musicians over time to distinguish age effects from generational or educational cohort effects, providing clearer insights into how RMT adoption evolves throughout individual careers.

  2. Qualitative Investigation: Mixed-methods research examining the specific motivations, barriers, and approaches to respiratory training across different age groups would provide valuable context to the statistical patterns observed.

  3. Instrument-Specific Patterns: Further research examining the interaction between age and specific instrument categories (brass vs. woodwind, or specific instruments) could reveal more nuanced patterns relevant to targeted interventions.

  4. Effectiveness Comparison: Research comparing the physiological and performance outcomes of RMT across different age groups would help determine whether standardised approaches are equally effective regardless of age or whether age-specific modifications are beneficial.

  5. Educational Interventions: Experimental studies testing the effectiveness of introducing structured RMT at different educational stages would provide guidance for optimal curriculum integration.

  6. Definition Standardisation: Research to establish clearer definitions and categories of respiratory training practices would facilitate more precise measurement and comparison across studies.

In conclusion, this analysis reveals that age is a significant factor in Respiratory Muscle Training adoption among wind instrumentalists, with adoption patterns forming a clear inverted U-shape peaking in the 30-39 age group. These findings have important implications for how RMT is introduced, promoted, and sustained throughout musicians’ careers, suggesting that age-specific approaches may be needed to optimise adoption across the professional lifespan.

3.6 References

Ackermann, B. J. (2017). The MPPA special issue on the beginning and intermediate and advanced instrumental musician. Medical Problems of Performing Artists, 32(1), 1-2.

Ackermann, B. J., Kenny, D. T., & Driscoll, T. (2015). Musculoskeletal pain and injury in professional orchestral musicians in Australia. Medical Problems of Performing Artists, 30(4), 215-222.

Ascenso, S., & Perkins, R. (2013). The more the merrier? Understanding the wellbeing of professional musicians in collaborative and solo work settings. Psychology of Music, 41(2), 72-87.

Bartlett, R., & Dowling, J. (2019). Respiratory training in undergraduate wind instrument curricula: A survey of conservatory approaches. International Journal of Music Education, 37(2), 311-326.

Brandfonbrener, A. G. (2009). History of playing-related pain in 330 university freshman music students. Medical Problems of Performing Artists, 24(1), 30-36.

Brodsky, W. (2019). The shared cognitive architecture of musicians: A path to specialized expertise. In G. E. McPherson (Ed.), Musical Prodigies: Interpretations from Psychology, Education, Musicology, and Ethnomusicology (pp. 382-403). Oxford University Press.

Chesky, K., & Devroop, K. (2021). The transition from student to professional: Changes in practice habits and health awareness among wind instrumentalists. Medical Problems of Performing Artists, 36(1), 7-15.

Chesky, K., Dawson, W. J., & Manchester, R. (2022). Intergenerational knowledge transfer among instrumental musicians: A pilot mentorship program. Medical Problems of Performing Artists, 37(1), 53-61.

Chesky, K., Devroop, K., & Ford, J. (2009). Medical problems of brass instrumentalists: Prevalence rates for trumpet, trombone, French horn and low brass. Medical Problems of Performing Artists, 24(1), 26-32.

Devroop, K., & Chesky, K. (2020). Comparison of biomechanical constraints between professional and student trumpet players. Medical Problems of Performing Artists, 35(1), 39-46.

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

Kenny, D. T. (2016). Music performance anxiety and occupational stress amongst classical musicians. In S. Baker & J. Strong (Eds.), Stress Management in the Performing Arts (pp. 123-142). Routledge.

Kenny, D. T., & Ackermann, B. (2015). Performance-related musculoskeletal pain, depression and music performance anxiety in professional orchestral musicians: A population study. Psychology of Music, 43(1), 43-60.

Kenny, D. T., Driscoll, T., & Ackermann, B. J. (2018). Effects of aging on musical performance in professional orchestral musicians. Medical Problems of Performing Artists, 33(1), 39-46.

Lynton-Jones, A. (2022). Early integration of respiratory technique in wind instrument education: A controlled intervention study. Journal of Music, Health, and Wellbeing, 3(1), 22-37.

Matei, R., & Ginsborg, J. (2020). Physical and psychological occupational injuries encountered by music teachers. Medical Problems of Performing Artists, 35(1), 22-29.

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

Ranelli, S., Smith, A., & Straker, L. (2015). The association of music practice with playing-related musculoskeletal problems: A systematic review. International Journal of Music Education, 33(4), 390-406.

Saunders, J., Dressler, R., & Tao, Y. (2019). Performance context as a moderator of training adoption among professional musicians. International Journal of Music Education, 37(4), 614-630.

Watson, A. H. D. (2016). The biology of musical performance and performance-related injury (2nd ed.). Scarecrow Press.

Watson, A. H. D., & Kenny, D. T. (2020). Age-specific approaches to musician health promotion: A comparative analysis of messaging effectiveness. Psychology of Music, 48(2), 237-251.

Wolfe, M. L., & Ericsson, K. A. (2018). Deliberate practice and acquisition of expert performance in musicians: The mediating role of career stage. Journal of Research in Music Education, 66(1), 13-30.

4 Instruments Played

Code
# 1. DATA CLEANING --------------------------------------------------
# Define updated instrument families
woodwinds <- c("Flute", "Piccolo", "Clarinet", "Saxophone", "Oboe", "Bassoon", "Recorder", 
               "Bagpipes", "Whistle", "Non-western flute", "Harmonica", "Non-western reed")
brass <- c("Trumpet", "Trombone", "Tuba", "Euphonium", "French Horn", "French Horn/Horn",
           "Cornet", "Flugelhorn", "Baritone")

# Define instruments from qual_WI sheet (needed for divider line)
qual_WI_instruments <- c("Bagpipes", "Cornet", "Whistle", "Non-western flute", 
                        "Flugelhorn", "Baritone", "Harmonica", "Non-western reed")
  
# Process instrument-level data from the Combined sheet
WI_split_updated <- data_combined %>%  
  select(WI) %>%  
  separate_rows(WI, sep = ",") %>%  
  mutate(WI = trimws(WI)) %>%  
  mutate(WI = case_when(  
    WI == "French Horn/Horn" ~ "French Horn",  
    WI == "Oboe/Cor Anglais" ~ "Oboe",  
    TRUE ~ WI  
  )) %>%  
  filter(WI != "Unknown" & WI != "Other") %>% # Excluding "Other"
  count(WI, sort = TRUE)  
  
# Read and process the qual_WI sheet  
qual_WI <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "qual_WI")  

# Rename columns assuming first column is instrument names and second column is frequency values  
colnames(qual_WI) <- c("Instrument", "Value")  
# Convert Value to numeric if needed and create a similar structure
qual_WI_processed <- qual_WI %>%  
  mutate(WI = trimws(Instrument),  
         n = as.numeric(Value)) %>%  
  filter(WI != "Other") %>% # Excluding "Other" here as well
  select(WI, n)  

# Display a few rows from qual_WI for verification  
print("First few rows of qual_WI (Other removed):")  
[1] "First few rows of qual_WI (Other removed):"
Code
print(head(qual_WI_processed))  
# A tibble: 6 × 2
  WI                    n
  <chr>             <dbl>
1 Harmonica             6
2 Non-western flute    12
3 Cornet               25
4 Whistle              12
5 Baritone              8
6 Non-western reed      3
Code
# Combine the two datasets  
combined_instruments <- bind_rows(WI_split_updated, qual_WI_processed) %>%  
  group_by(WI) %>%  
  summarise(n = sum(n, na.rm = TRUE)) %>%  
  ungroup()  
  
# Re-assign instrument family using the updated family definitions  
combined_instruments <- combined_instruments %>%  
  mutate(Family = case_when(  
    WI %in% woodwinds ~ "Woodwinds",  
    WI %in% brass ~ "Brass",  
    TRUE ~ "Unknown" # This should not occur if all instruments are properly categorised
  ))
  
# Calculate total responses after removing "Other"
total_responses <- sum(combined_instruments$n)
  
# Calculate percentages based on the new total (after removing "Other")
combined_instruments <- combined_instruments %>%  
  mutate(Percentage = round((n / total_responses) * 100, 2))  

# Process instrument and RMT data
instrument_rmt_data <- data_combined %>%
  filter(!is.na(WI), !is.na(RMTMethods_YN)) %>%
  separate_rows(WI, sep = ",") %>%
  mutate(
    WI = trimws(WI),
    WI = case_when(
      WI == "French Horn/Horn" ~ "French Horn",
      WI == "Oboe/Cor Anglais" ~ "Oboe",
      TRUE ~ WI
    ),
    RMTMethods_YN = factor(RMTMethods_YN, 
                           levels = c(0, 1),
                           labels = c("No RMT", "RMT"))
  ) %>%
  filter(WI != "Unknown" & WI != "Other") %>% # Excluding "Other" and "Unknown"
  mutate(Family = case_when(
    WI %in% woodwinds ~ "Woodwinds",
    WI %in% brass ~ "Brass",
    TRUE ~ "Unknown"
  ))

# 2. DEMOGRAPHIC STATS --------------------------------------------------
# View resulting merged table  
print("Merged Instrument Distribution with Updated Categories:")  
[1] "Merged Instrument Distribution with Updated Categories:"
Code
print(combined_instruments)  
# A tibble: 20 × 4
   WI                    n Family    Percentage
   <chr>             <dbl> <chr>          <dbl>
 1 Bagpipes             60 Woodwinds       1.98
 2 Baritone              8 Brass           0.26
 3 Bassoon              92 Woodwinds       3.03
 4 Clarinet            415 Woodwinds      13.7 
 5 Cornet               25 Brass           0.82
 6 Euphonium           133 Brass           4.38
 7 Flugelhorn           11 Brass           0.36
 8 Flute               443 Woodwinds      14.6 
 9 French Horn         161 Brass           5.3 
10 Harmonica             6 Woodwinds       0.2 
11 Non-western flute    12 Woodwinds       0.4 
12 Non-western reed      3 Woodwinds       0.1 
13 Oboe                150 Woodwinds       4.94
14 Piccolo             209 Woodwinds       6.88
15 Recorder            136 Woodwinds       4.48
16 Saxophone           477 Woodwinds      15.7 
17 Trombone            212 Brass           6.98
18 Trumpet             343 Brass          11.3 
19 Tuba                129 Brass           4.25
20 Whistle              12 Woodwinds       0.4 
Code
# Update family distribution plot based on the merged data  
family_distribution_updated <- combined_instruments %>%  
  group_by(Family) %>%  
  summarise(Total = sum(n)) %>%  
  mutate(Percentage = round((Total / total_responses) * 100, 2))

# Calculate total N for each family group
woodwinds_n <- sum(combined_instruments$n[combined_instruments$Family == "Woodwinds"])
brass_n <- sum(combined_instruments$n[combined_instruments$Family == "Brass"])

# Create family labels with N
family_distribution_updated <- family_distribution_updated %>%
  mutate(FamilyWithN = paste0(Family, " (N=", Total, ")"))

# 3. COMPARISON STATS --------------------------------------------------
print("Processed RMT Data:")
[1] "Processed RMT Data:"
Code
print(head(instrument_rmt_data))
# A tibble: 6 × 131
    `#` progress duration_sec finished recorded            responseID       
  <dbl>    <dbl>        <dbl> <chr>    <dttm>              <chr>            
1     1       90          905 False    2022-11-25 08:08:27 R_3rH9rXPy0aY39I7
2     2       90        16153 False    2022-11-25 13:24:57 R_2aJfpCBzRe4RyXQ
3     3       90          440 False    2022-11-25 09:58:32 R_3KVKkZuEdFfJZwp
4     4       90          113 False    2022-11-25 11:06:34 R_2WHCTUY7FPE8M9g
5     5       90         1583 False    2022-11-25 12:18:04 R_2YkUxyD32ij5fby
6     6       90         1532 False    2022-11-25 12:47:19 R_b1QZQ7Si9mmmrVn
# ℹ 125 more variables: athletesPre <chr>, age <chr>, currentPlay <chr>,
#   gender <chr>, countryLive <chr>, ed <chr>, qual_edOther <chr>,
#   countryEd <chr>, disorders <chr>, WI <chr>, qual_WI_other <chr>,
#   freqPlay_MAX <dbl>, freqPlay_Flute <dbl>, freqPlay_Piccolo <dbl>,
#   freqPlay_Recorder <dbl>, freqPlay_Oboe <dbl>, freqPlay_Clarinet <dbl>,
#   freqPlay_Bassoon <dbl>, freqPlay_Saxophone <dbl>, freqPlay_Trumpet <dbl>,
#   `freqPlay_French Horn` <dbl>, freqPlay_Trombone <dbl>, …
Code
# Calculate total counts per RMT group - will be used for percentage calculations
rmt_group_totals <- instrument_rmt_data %>%
  group_by(RMTMethods_YN) %>%
  summarise(total_count = n())

# Get the total counts
total_no_rmt <- rmt_group_totals$total_count[rmt_group_totals$RMTMethods_YN == "No RMT"]
total_rmt <- rmt_group_totals$total_count[rmt_group_totals$RMTMethods_YN == "RMT"]
total_participants <- sum(rmt_group_totals$total_count)

print(paste("Total No RMT group:", total_no_rmt))
[1] "Total No RMT group: 2459"
Code
print(paste("Total RMT group:", total_rmt))
[1] "Total RMT group: 501"
Code
print(paste("Total participants:", total_participants))
[1] "Total participants: 2960"
Code
# Calculate counts and percentages for each family and RMT group
# Now percentages will be based on RMT group totals
family_rmt_summary <- instrument_rmt_data %>%
  group_by(Family, RMTMethods_YN) %>%
  summarise(count = n(), .groups = 'drop') %>%
  left_join(rmt_group_totals, by = "RMTMethods_YN") %>%
  mutate(
    percentage = (count / total_count) * 100,
    percentage_label = sprintf("%.1f%% of %s", percentage, RMTMethods_YN)
  )

print("Family RMT Summary with percentages by RMT group:")
[1] "Family RMT Summary with percentages by RMT group:"
Code
print(family_rmt_summary)
# A tibble: 4 × 6
  Family    RMTMethods_YN count total_count percentage percentage_label
  <chr>     <fct>         <int>       <int>      <dbl> <chr>           
1 Brass     No RMT          765        2459       31.1 31.1% of No RMT 
2 Brass     RMT             213         501       42.5 42.5% of RMT    
3 Woodwinds No RMT         1694        2459       68.9 68.9% of No RMT 
4 Woodwinds RMT             288         501       57.5 57.5% of RMT    
Code
# Perform chi-square test on the full contingency table
family_contingency_table <- table(instrument_rmt_data$Family, instrument_rmt_data$RMTMethods_YN)
print("Family vs RMT Contingency Table:")
[1] "Family vs RMT Contingency Table:"
Code
print(family_contingency_table)
           
            No RMT  RMT
  Brass        765  213
  Woodwinds   1694  288
Code
# Standard Chi-square test
chi_square_test <- chisq.test(family_contingency_table)
print("Chi-square test results (Family vs RMT):")
[1] "Chi-square test results (Family vs RMT):"
Code
print(chi_square_test)

    Pearson's Chi-squared test with Yates' continuity correction

data:  family_contingency_table
X-squared = 23.956, df = 1, p-value = 9.855e-07
Code
# Chi-square test with Monte Carlo simulation
chi_square_mc_test <- chisq.test(family_contingency_table, simulate.p.value = TRUE, B = 10000)
print("Chi-square test with Monte Carlo simulation:")
[1] "Chi-square test with Monte Carlo simulation:"
Code
print(chi_square_mc_test)

    Pearson's Chi-squared test with simulated p-value (based on 10000
    replicates)

data:  family_contingency_table
X-squared = 24.469, df = NA, p-value = 9.999e-05
Code
# Check the assumption: print the expected counts from the chi-square test
expected_counts <- chi_square_test$expected
print("Expected counts:")
[1] "Expected counts:"
Code
print(expected_counts)
           
               No RMT      RMT
  Brass      812.4669 165.5331
  Woodwinds 1646.5331 335.4669
Code
# If any expected count is less than 5, issue a warning and perform Fisher's exact test
if(min(expected_counts) < 5) {
  print("Chi-square test assumption violated. Performing Fisher's exact test.")
  fisher_test <- fisher.test(family_contingency_table)
  print("Fisher's exact test results:")
  print(fisher_test)
  
  # Store test results for plot
  test_name <- "Fisher's exact test"
  test_statistic <- NA
  test_df <- NA
  test_pvalue <- fisher_test$p.value
} else {
  # Store test results for plot
  test_name <- "Chi-square test"
  test_statistic <- chi_square_test$statistic
  test_df <- chi_square_test$parameter
  test_pvalue <- chi_square_test$p.value
}

# Calculate and print odds ratios
print("Odds ratios between instrument families and RMT usage:")
[1] "Odds ratios between instrument families and RMT usage:"
Code
family_rmt_odds <- family_rmt_summary %>%
  select(Family, RMTMethods_YN, count) %>%
  pivot_wider(names_from = RMTMethods_YN, values_from = count, values_fill = list(count = 0)) %>%
  mutate(
    odds_rmt = `RMT` / `No RMT`,
    odds_ratio = odds_rmt / mean(odds_rmt)
  )
print(family_rmt_odds)
# A tibble: 2 × 5
  Family    `No RMT`   RMT odds_rmt odds_ratio
  <chr>        <int> <int>    <dbl>      <dbl>
1 Brass          765   213    0.278      1.24 
2 Woodwinds     1694   288    0.170      0.758
Code
# Focus on top instruments by frequency
top_instruments <- combined_instruments %>%
  top_n(10, n) %>%
  pull(WI)

# Calculate counts and percentages for each instrument and RMT group
# Now percentages will be based on RMT group totals
instrument_rmt_summary <- instrument_rmt_data %>%
  filter(WI %in% top_instruments) %>%
  group_by(WI, RMTMethods_YN) %>%
  summarise(count = n(), .groups = 'drop') %>%
  left_join(rmt_group_totals, by = "RMTMethods_YN") %>%
  mutate(
    percentage = (count / total_count) * 100,
    percentage_label = sprintf("%.1f%% of %s", percentage, RMTMethods_YN)
  )

print("Top Instruments RMT Summary with percentages by RMT group:")
[1] "Top Instruments RMT Summary with percentages by RMT group:"
Code
print(instrument_rmt_summary)
# A tibble: 20 × 6
   WI          RMTMethods_YN count total_count percentage percentage_label
   <chr>       <fct>         <int>       <int>      <dbl> <chr>           
 1 Clarinet    No RMT          365        2459      14.8  14.8% of No RMT 
 2 Clarinet    RMT              50         501       9.98 10.0% of RMT    
 3 Euphonium   No RMT           98        2459       3.99 4.0% of No RMT  
 4 Euphonium   RMT              35         501       6.99 7.0% of RMT     
 5 Flute       No RMT          382        2459      15.5  15.5% of No RMT 
 6 Flute       RMT              61         501      12.2  12.2% of RMT    
 7 French Horn No RMT          126        2459       5.12 5.1% of No RMT  
 8 French Horn RMT              35         501       6.99 7.0% of RMT     
 9 Oboe        No RMT          125        2459       5.08 5.1% of No RMT  
10 Oboe        RMT              25         501       4.99 5.0% of RMT     
11 Piccolo     No RMT          165        2459       6.71 6.7% of No RMT  
12 Piccolo     RMT              44         501       8.78 8.8% of RMT     
13 Recorder    No RMT          117        2459       4.76 4.8% of No RMT  
14 Recorder    RMT              19         501       3.79 3.8% of RMT     
15 Saxophone   No RMT          419        2459      17.0  17.0% of No RMT 
16 Saxophone   RMT              58         501      11.6  11.6% of RMT    
17 Trombone    No RMT          171        2459       6.95 7.0% of No RMT  
18 Trombone    RMT              41         501       8.18 8.2% of RMT     
19 Trumpet     No RMT          276        2459      11.2  11.2% of No RMT 
20 Trumpet     RMT              67         501      13.4  13.4% of RMT    
Code
# Create instrument contingency table
instrument_contingency_table <- with(instrument_rmt_data %>% filter(WI %in% top_instruments), 
                                     table(WI, RMTMethods_YN))
print("Instrument vs RMT Contingency Table (Top Instruments):")
[1] "Instrument vs RMT Contingency Table (Top Instruments):"
Code
print(instrument_contingency_table)
             RMTMethods_YN
WI            No RMT RMT
  Clarinet       365  50
  Euphonium       98  35
  Flute          382  61
  French Horn    126  35
  Oboe           125  25
  Piccolo        165  44
  Recorder       117  19
  Saxophone      419  58
  Trombone       171  41
  Trumpet        276  67
Code
# Perform Chi-square test
instr_chi_test <- chisq.test(instrument_contingency_table)
print("Chi-square test results (Top Instruments vs RMT):")
[1] "Chi-square test results (Top Instruments vs RMT):"
Code
print(instr_chi_test)

    Pearson's Chi-squared test

data:  instrument_contingency_table
X-squared = 35.024, df = 9, p-value = 5.901e-05
Code
# Check expected counts for Chi-square validity
instr_expected <- instr_chi_test$expected
print("Expected counts for instrument contingency table:")
[1] "Expected counts for instrument contingency table:"
Code
print(instr_expected)
             RMTMethods_YN
WI              No RMT      RMT
  Clarinet    347.6148 67.38522
  Euphonium   111.4043 21.59574
  Flute       371.0683 71.93169
  French Horn 134.8578 26.14222
  Oboe        125.6439 24.35610
  Piccolo     175.0638 33.93617
  Recorder    113.9171 22.08287
  Saxophone   399.5476 77.45241
  Trombone    177.5767 34.42329
  Trumpet     287.3057 55.69429
Code
# Monte Carlo simulation for Chi-square test
instr_chi_mc_test <- chisq.test(instrument_contingency_table, simulate.p.value = TRUE, B = 10000)
print("Chi-square test with Monte Carlo simulation (Top Instruments vs RMT):")
[1] "Chi-square test with Monte Carlo simulation (Top Instruments vs RMT):"
Code
print(instr_chi_mc_test)

    Pearson's Chi-squared test with simulated p-value (based on 10000
    replicates)

data:  instrument_contingency_table
X-squared = 35.024, df = NA, p-value = 9.999e-05
Code
# If any expected count is less than 5, perform Fisher's exact test
if(min(instr_expected) < 5) {
  print("Chi-square test assumption violated for some instruments. Performing Fisher's exact test.")
  fisher_instr_test <- fisher.test(instrument_contingency_table, simulate.p.value = TRUE, B = 10000)
  print("Fisher's exact test results:")
  print(fisher_instr_test)
  
  # Store test results for plot
  instr_test_name <- "Fisher's exact test"
  instr_test_statistic <- NA
  instr_test_df <- NA
  instr_test_pvalue <- fisher_instr_test$p.value
} else {
  # Store test results for plot
  instr_test_name <- "Chi-square test"
  instr_test_statistic <- instr_chi_test$statistic
  instr_test_df <- instr_chi_test$parameter
  instr_test_pvalue <- instr_chi_test$p.value
}

# Pairwise comparisons between top instruments
print("Pairwise comparisons between top instruments for RMT usage:")
[1] "Pairwise comparisons between top instruments for RMT usage:"
Code
instruments_to_compare <- top_instruments

# Number of comparisons for Bonferroni correction
n_comparisons <- length(instruments_to_compare) * (length(instruments_to_compare) - 1) / 2
bonferroni_alpha <- 0.05 / n_comparisons

# Create a data frame to store the results
pairwise_results <- data.frame(
  Instrument1 = character(),
  Instrument2 = character(),
  TestType = character(),
  TestStatistic = numeric(),
  DF = numeric(),
  PValue = numeric(),
  AdjustedPValue = numeric(),
  Significant = character(),
  stringsAsFactors = FALSE
)

# Perform pairwise comparisons
for(i in 1:(length(instruments_to_compare)-1)) {
  for(j in (i+1):length(instruments_to_compare)) {
    instr1 <- instruments_to_compare[i]
    instr2 <- instruments_to_compare[j]
    
    # Filter data for these two instruments
    subset_data <- instrument_rmt_data %>%
      filter(WI %in% c(instr1, instr2))
    
    # Create contingency table
    pair_table <- table(subset_data$WI, subset_data$RMTMethods_YN)
    
    # Determine which test to use
    expected_counts <- chisq.test(pair_table)$expected
    
    if(min(expected_counts) >= 5) {
      # Chi-square test
      test <- chisq.test(pair_table)
      test_type <- "Chi-square"
      test_stat <- test$statistic
      df <- test$parameter
    } else {
      # Fisher's exact test
      test <- fisher.test(pair_table)
      test_type <- "Fisher's exact"
      test_stat <- NA
      df <- NA
    }
    
    # Add results to the data frame
    pairwise_results <- rbind(pairwise_results, data.frame(
      Instrument1 = instr1,
      Instrument2 = instr2,
      TestType = test_type,
      TestStatistic = ifelse(is.na(test_stat), NA, as.numeric(test_stat)),
      DF = ifelse(is.na(df), NA, as.numeric(df)),
      PValue = test$p.value,
      AdjustedPValue = min(test$p.value * n_comparisons, 1),  # Bonferroni correction
      Significant = ifelse(test$p.value < bonferroni_alpha, "Yes", "No"),
      stringsAsFactors = FALSE
    ))
  }
}

# Sort by p-value
pairwise_results <- pairwise_results %>%
  arrange(PValue)

print("Pairwise comparison results:")
[1] "Pairwise comparison results:"
Code
print(pairwise_results)
            Instrument1 Instrument2   TestType TestStatistic DF       PValue
X-squared14   Euphonium   Saxophone Chi-square  1.505308e+01  1 0.0001045295
X-squared      Clarinet   Euphonium Chi-square  1.457546e+01  1 0.0001346565
X-squared9    Euphonium       Flute Chi-square  1.070682e+01  1 0.0010674126
X-squared36     Piccolo   Saxophone Chi-square  8.391342e+00  1 0.0037701251
X-squared27 French Horn   Saxophone Chi-square  8.118868e+00  1 0.0043806896
X-squared4     Clarinet     Piccolo Chi-square  8.118529e+00  1 0.0043815092
X-squared2     Clarinet French Horn Chi-square  7.906938e+00  1 0.0049245559
X-squared43   Saxophone     Trumpet Chi-square  7.836662e+00  1 0.0051197071
X-squared8     Clarinet     Trumpet Chi-square  7.497756e+00  1 0.0061775928
X-squared13   Euphonium    Recorder Chi-square  5.640888e+00  1 0.0175463204
X-squared42   Saxophone    Trombone Chi-square  5.580210e+00  1 0.0181645451
X-squared7     Clarinet    Trombone Chi-square  5.439395e+00  1 0.0196874827
X-squared19       Flute     Piccolo Chi-square  5.048764e+00  1 0.0246435171
X-squared17       Flute French Horn Chi-square  5.029905e+00  1 0.0249132657
X-squared23       Flute     Trumpet Chi-square  4.297548e+00  1 0.0381673660
X-squared11   Euphonium        Oboe Chi-square  3.372358e+00  1 0.0662988067
X-squared22       Flute    Trombone Chi-square  2.972958e+00  1 0.0846669126
X-squared26 French Horn    Recorder Chi-square  2.491465e+00  1 0.1144651072
X-squared35     Piccolo    Recorder Chi-square  2.314280e+00  1 0.1281906524
X-squared16   Euphonium     Trumpet Chi-square  2.231032e+00  1 0.1352634641
X-squared15   Euphonium    Trombone Chi-square  1.927315e+00  1 0.1650525238
X-squared41    Recorder     Trumpet Chi-square  1.685690e+00  1 0.1941701029
X-squared3     Clarinet        Oboe Chi-square  1.659928e+00  1 0.1976130310
X-squared32        Oboe   Saxophone Chi-square  1.645184e+00  1 0.1996156724
X-squared40    Recorder    Trombone Chi-square  1.318664e+00  1 0.2508319333
X-squared12   Euphonium     Piccolo Chi-square  9.884856e-01  1 0.3201127781
X-squared24 French Horn        Oboe Chi-square  9.780923e-01  1 0.3226702297
X-squared30        Oboe     Piccolo Chi-square  8.179165e-01  1 0.3657900338
X-squared10   Euphonium French Horn Chi-square  6.075944e-01  1 0.4356950038
X-squared18       Flute        Oboe Chi-square  5.427862e-01  1 0.4612803098
X-squared1     Clarinet       Flute Chi-square  4.213316e-01  1 0.5162733303
X-squared21       Flute   Saxophone Chi-square  3.956096e-01  1 0.5293654227
X-squared34        Oboe     Trumpet Chi-square  3.919942e-01  1 0.5312530141
X-squared33        Oboe    Trombone Chi-square  2.607943e-01  1 0.6095750075
X-squared31        Oboe    Recorder Chi-square  2.181005e-01  1 0.6404910766
X-squared29 French Horn     Trumpet Chi-square  2.077010e-01  1 0.6485753423
X-squared28 French Horn    Trombone Chi-square  1.936859e-01  1 0.6598663788
X-squared5     Clarinet    Recorder Chi-square  1.923544e-01  1 0.6609642357
X-squared39    Recorder   Saxophone Chi-square  1.726980e-01  1 0.6777250537
X-squared38     Piccolo     Trumpet Chi-square  1.039724e-01  1 0.7471136576
X-squared37     Piccolo    Trombone Chi-square  1.000910e-01  1 0.7517204630
X-squared25 French Horn     Piccolo Chi-square  1.012104e-03  1 0.9746207151
X-squared6     Clarinet   Saxophone Chi-square  2.329540e-30  1 1.0000000000
X-squared20       Flute    Recorder Chi-square  2.025473e-30  1 1.0000000000
X-squared44    Trombone     Trumpet Chi-square  0.000000e+00  1 1.0000000000
            AdjustedPValue Significant
X-squared14    0.004703826         Yes
X-squared      0.006059545         Yes
X-squared9     0.048033568         Yes
X-squared36    0.169655629          No
X-squared27    0.197131033          No
X-squared4     0.197167915          No
X-squared2     0.221605015          No
X-squared43    0.230386821          No
X-squared8     0.277991675          No
X-squared13    0.789584419          No
X-squared42    0.817404528          No
X-squared7     0.885936720          No
X-squared19    1.000000000          No
X-squared17    1.000000000          No
X-squared23    1.000000000          No
X-squared11    1.000000000          No
X-squared22    1.000000000          No
X-squared26    1.000000000          No
X-squared35    1.000000000          No
X-squared16    1.000000000          No
X-squared15    1.000000000          No
X-squared41    1.000000000          No
X-squared3     1.000000000          No
X-squared32    1.000000000          No
X-squared40    1.000000000          No
X-squared12    1.000000000          No
X-squared24    1.000000000          No
X-squared30    1.000000000          No
X-squared10    1.000000000          No
X-squared18    1.000000000          No
X-squared1     1.000000000          No
X-squared21    1.000000000          No
X-squared34    1.000000000          No
X-squared33    1.000000000          No
X-squared31    1.000000000          No
X-squared29    1.000000000          No
X-squared28    1.000000000          No
X-squared5     1.000000000          No
X-squared39    1.000000000          No
X-squared38    1.000000000          No
X-squared37    1.000000000          No
X-squared25    1.000000000          No
X-squared6     1.000000000          No
X-squared20    1.000000000          No
X-squared44    1.000000000          No
Code
# 4. PLOTS --------------------------------------------------
# PLOT 1: Instrument distribution
ordered_instruments <- combined_instruments %>%
  arrange(desc(n)) %>%
  pull(WI)

final_plot <- ggplot(combined_instruments, 
                    aes(x = factor(WI, levels = rev(ordered_instruments)), 
                        y = n, 
                        fill = Family)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(n, " (", Percentage, "%)")), 
            hjust = -0.1, 
            size = 3) +
  coord_flip() +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) +
  labs(title = "Distribution of Wind Instruments by Count and Percentage",
       x = "Instrument",
       y = paste0("Frequency (N=1558, responses = ", total_responses, ")"),
       caption = "Note. Instruments listed below the red dotted line were quantified from originally\nqualitative 'Other' responses.") +
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 10),
    plot.title = element_text(size = 12, face = "bold"),
    plot.caption = element_text(size = 10, hjust = 0, lineheight = 1.2)
  )

# Find the correct position to add the red line
if (any(ordered_instruments == "Bagpipes") && any(ordered_instruments == "Cornet")) {
  bp_idx <- which(ordered_instruments == "Bagpipes")
  cn_idx <- which(ordered_instruments == "Cornet")
  
  if (bp_idx < cn_idx) {
    # Draw line after Bagpipes
    line_pos <- bp_idx + 0.5
    print(paste("Will draw line at position", line_pos, "between Bagpipes and the next instrument"))
  } else {
    # Draw line after Cornet
    line_pos <- cn_idx + 0.5
    print(paste("Will draw line at position", line_pos, "between Cornet and the next instrument"))
  }
  
  # Convert to the plot's coordinate system (reversed due to the factor levels)
  plot_line_pos <- length(ordered_instruments) - line_pos + 1
  
  # Add the line to the plot using annotation
  final_plot <- final_plot +
    annotate("segment", 
             x = plot_line_pos, 
             xend = plot_line_pos, 
             y = 0, 
             yend = max(combined_instruments$n) * 1.1,
             color = "red", 
             linetype = "dashed", 
             size = 1)
}
[1] "Will draw line at position 13.5 between Bagpipes and the next instrument"
Code
# Display the final plot
print(final_plot)

Code
# PLOT 2: Family distribution plot
family_plot_updated <- ggplot(data = family_distribution_updated,   
                              aes(x = reorder(Family, -Total), y = Total, fill = Family)) +  
  geom_bar(stat = "identity", color = "black") +  
  geom_text(aes(label = paste0(Total, "\n(", Percentage, "%)")),   
            vjust = -0.5,   
            size = 4,  
            position = position_dodge(width = 1)) +  
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +  
  labs(title = "Distribution by Instrument Family",  
       x = "Instrument Family",  
       y = paste0("Frequency (N=1558, responses = ", total_responses, ")"),
       fill = "Instrument Family") +  
  theme_minimal() +  
  theme(  
    plot.title = element_text(size = 12, face = "bold"),
    legend.title = element_text(size = 10),
    plot.caption = element_text(size = 10, hjust = 0)
  ) +
  scale_fill_discrete(labels = family_distribution_updated$FamilyWithN)
  
# Display the updated family distribution plot  
print(family_plot_updated)

Code
# PLOT 3: Family by RMT distribution - COUNTS version
family_rmt_plot <- ggplot(family_rmt_summary, 
                         aes(x = Family, y = count, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3) +
  labs(
    title = "Distribution of RMT Methods Usage by Instrument Family",
    subtitle = ifelse(!is.na(test_statistic),
                      sprintf("%s: χ² = %.2f, df = %d, p = %.4f", 
                              test_name, test_statistic, test_df, test_pvalue),
                      sprintf("%s: p = %.4f", test_name, test_pvalue)),
    x = "Instrument Family",
    y = "Number of Participants",
    fill = "RMT Usage",
    caption = "Note: Percentages are calculated within each RMT group"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.caption = element_text(size = 10, hjust = 0),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  # Add N to the family labels
  scale_x_discrete(labels = function(x) {
    sapply(x, function(fam) {
      fam_total <- sum(family_rmt_summary$count[family_rmt_summary$Family == fam])
      return(paste0(fam, "\n(N=", fam_total, ")"))
    })
  })

# Display the family RMT plot
print(family_rmt_plot)

Code
# PLOT 4: Family by RMT distribution - PERCENTAGE version
# Creating percentage version of family RMT plot
family_rmt_plot_percent <- ggplot(family_rmt_summary, 
                                 aes(x = Family, y = percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3) +
  labs(
    title = "Distribution of RMT Methods Usage by Instrument Family (Percentage)",
    subtitle = ifelse(!is.na(test_statistic),
                      sprintf("%s: χ² = %.2f, df = %d, p = %.4f", 
                              test_name, test_statistic, test_df, test_pvalue),
                      sprintf("%s: p = %.4f", test_name, test_pvalue)),
    x = "Instrument Family",
    y = "Percentage within RMT Group",
    fill = "RMT Usage",
    caption = "Note: Percentages are calculated within each RMT group"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.caption = element_text(size = 10, hjust = 0),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  # Add N to the family labels
  scale_x_discrete(labels = function(x) {
    sapply(x, function(fam) {
      fam_total <- sum(family_rmt_summary$count[family_rmt_summary$Family == fam])
      return(paste0(fam, "\n(N=", fam_total, ")"))
    })
  })

# Display the percentage version of family RMT plot
print(family_rmt_plot_percent)

Code
# PLOT 5: Instrument by RMT - COUNTS version
instrument_rmt_plot <- ggplot(instrument_rmt_summary, 
                             aes(x = WI, y = count, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3) +
  labs(
    title = "Distribution of RMT Methods Usage by Top 10 Instruments",
    subtitle = ifelse(!is.na(instr_test_statistic),
                      sprintf("%s: χ² = %.2f, df = %d, p = %.4f", 
                              instr_test_name, instr_test_statistic, instr_test_df, instr_test_pvalue),
                      sprintf("%s: p = %.4f", instr_test_name, instr_test_pvalue)),
    x = "Instrument",
    y = "Number of Participants",
    fill = "RMT Usage",
    caption = "Note: Percentages are calculated within each RMT group"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.caption = element_text(size = 10, hjust = 0),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  # Add N to the instrument labels
  scale_x_discrete(labels = function(x) {
    sapply(x, function(instr) {
      instr_total <- sum(instrument_rmt_summary$count[instrument_rmt_summary$WI == instr])
      return(paste0(instr, "\n(N=", instr_total, ")"))
    })
  })

# Display the instrument RMT plot
print(instrument_rmt_plot)

Code
# PLOT 6: Instrument by RMT - PERCENTAGE version
# Creating percentage version of instrument RMT plot
instrument_rmt_plot_percent <- ggplot(instrument_rmt_summary, 
                                     aes(x = WI, y = percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3) +
  labs(
    title = "Distribution of RMT Methods Usage by Top 10 Instruments (Percentage)",
    subtitle = ifelse(!is.na(instr_test_statistic),
                      sprintf("%s: χ² = %.2f, df = %d, p = %.4f", 
                              instr_test_name, instr_test_statistic, instr_test_df, instr_test_pvalue),
                      sprintf("%s: p = %.4f", instr_test_name, instr_test_pvalue)),
    x = "Instrument",
    y = "Percentage within RMT Group",
    fill = "RMT Usage",
    caption = "Note: Percentages are calculated within each RMT group"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.text.x = element_text(size = 10, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12),
    plot.caption = element_text(size = 10, hjust = 0),
    legend.position = "right",
    plot.margin = margin(t = 30, r = 20, b = 20, l = 20)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  # Add N to the instrument labels
  scale_x_discrete(labels = function(x) {
    sapply(x, function(instr) {
      instr_total <- sum(instrument_rmt_summary$count[instrument_rmt_summary$WI == instr])
      return(paste0(instr, "\n(N=", instr_total, ")"))
    })
  })

# Display the percentage version of instrument RMT plot
print(instrument_rmt_plot_percent)

Code
# PLOT 7+: Pairwise comparison plots
# Identify significant instrument pairs (if any)
significant_pairs <- pairwise_results %>%
  filter(Significant == "Yes" | PValue < 0.05) %>%  # Include those significant before correction
  head(5)  # Take top 5 most significant

if(nrow(significant_pairs) > 0) {
  print("Top significant instrument pairs:")
  print(significant_pairs)
  
  # Create a visual comparison for the top significant pairs
  for(i in 1:nrow(significant_pairs)) {
    instr1 <- significant_pairs$Instrument1[i]
    instr2 <- significant_pairs$Instrument2[i]
    
    # Filter data for these two instruments
    pair_data <- instrument_rmt_data %>%
      filter(WI %in% c(instr1, instr2)) %>%
      group_by(WI, RMTMethods_YN) %>%
      summarise(count = n(), .groups = 'drop') %>%
      left_join(rmt_group_totals, by = "RMTMethods_YN") %>%
      mutate(
        percentage = (count / total_count) * 100
      )
    
    # Create comparison plot - COUNT version
    pair_plot <- ggplot(pair_data, 
                       aes(x = WI, y = count, fill = RMTMethods_YN)) +
      geom_bar(stat = "identity", position = "dodge", color = "black") +
      geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
                position = position_dodge(width = 0.9),
                vjust = -0.5, size = 3) +
      labs(
        title = paste("RMT Usage Comparison:", instr1, "vs", instr2),
        subtitle = sprintf("%s test: p = %.4f (adjusted p = %.4f)", 
                          significant_pairs$TestType[i], 
                          significant_pairs$PValue[i],
                          significant_pairs$AdjustedPValue[i]),
        x = "Instrument",
        y = "Number of Participants",
        fill = "RMT Usage",
        caption = "Note: Percentages are calculated within each RMT group"
      ) +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14, face = "bold"),
        plot.subtitle = element_text(size = 10),
        axis.text.x = element_text(size = 12),
        axis.title = element_text(size = 12),
        plot.caption = element_text(size = 10, hjust = 0),
        legend.position = "right"
      ) +
      scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
      # Add N to the instrument labels
      scale_x_discrete(labels = function(x) {
        sapply(x, function(instr) {
          instr_total <- sum(pair_data$count[pair_data$WI == instr])
          return(paste0(instr, "\n(N=", instr_total, ")"))
        })
      })
    
    print(pair_plot)
    
    # Create comparison plot - PERCENTAGE version
    pair_plot_percent <- ggplot(pair_data, 
                              aes(x = WI, y = percentage, fill = RMTMethods_YN)) +
      geom_bar(stat = "identity", position = "dodge", color = "black") +
      geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
                position = position_dodge(width = 0.9),
                vjust = -0.5, size = 3) +
      labs(
        title = paste("RMT Usage Comparison:", instr1, "vs", instr2, "(Percentage)"),
        subtitle = sprintf("%s test: p = %.4f (adjusted p = %.4f)", 
                          significant_pairs$TestType[i], 
                          significant_pairs$PValue[i],
                          significant_pairs$AdjustedPValue[i]),
        x = "Instrument",
        y = "Percentage within RMT Group",
        fill = "RMT Usage",
        caption = "Note: Percentages are calculated within each RMT group"
      ) +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14, face = "bold"),
        plot.subtitle = element_text(size = 10),
        axis.text.x = element_text(size = 12),
        axis.title = element_text(size = 12),
        plot.caption = element_text(size = 10, hjust = 0),
        legend.position = "right"
      ) +
      scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
      # Add N to the instrument labels
      scale_x_discrete(labels = function(x) {
        sapply(x, function(instr) {
          instr_total <- sum(pair_data$count[pair_data$WI == instr])
          return(paste0(instr, "\n(N=", instr_total, ")"))
        })
      })
    
    print(pair_plot_percent)
  }
} else {
  print("No significant instrument pairs found after Bonferroni correction.")
  
  # Even if no significant pairs found, create plots for top 3 pairs with lowest p-values
  top_pairs <- pairwise_results %>%
    arrange(PValue) %>%
    head(3)
  
  print("Creating plots for top 3 pairs with lowest p-values:")
  
  for(i in 1:nrow(top_pairs)) {
    instr1 <- top_pairs$Instrument1[i]
    instr2 <- top_pairs$Instrument2[i]
    
    # Filter data for these two instruments
    pair_data <- instrument_rmt_data %>%
      filter(WI %in% c(instr1, instr2)) %>%
      group_by(WI, RMTMethods_YN) %>%
      summarise(count = n(), .groups = 'drop')
    
    # Get RMT group totals
    rmt_group_counts <- rmt_group_totals$total_count
    names(rmt_group_counts) <- rmt_group_totals$RMTMethods_YN
    
    # Add percentage calculated out of RMT group N
    pair_data <- pair_data %>%
      left_join(rmt_group_totals, by = "RMTMethods_YN") %>%
      mutate(
        percentage = (count / total_count) * 100
      )
    
    # Create comparison plot - COUNT version
    pair_plot <- ggplot(pair_data, 
                       aes(x = WI, y = count, fill = RMTMethods_YN)) +
      geom_bar(stat = "identity", position = "dodge", color = "black") +
      geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
                position = position_dodge(width = 0.9),
                vjust = -0.5, size = 3) +
      labs(
        title = paste("RMT Usage Comparison:", instr1, "vs", instr2),
        subtitle = sprintf("%s test: p = %.4f (adjusted p = %.4f, not significant)", 
                          top_pairs$TestType[i], 
                          top_pairs$PValue[i],
                          top_pairs$AdjustedPValue[i]),
        x = "Instrument",
        y = "Number of Participants",
        fill = "RMT Usage",
        caption = "Note: Percentages are calculated within each RMT group"
      ) +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14, face = "bold"),
        plot.subtitle = element_text(size = 10),
        axis.text.x = element_text(size = 12),
        axis.title = element_text(size = 12),
        plot.caption = element_text(size = 10, hjust = 0),
        legend.position = "right"
      ) +
      scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
      # Add N to the instrument labels
      scale_x_discrete(labels = function(x) {
        sapply(x, function(instr) {
          instr_total <- sum(pair_data$count[pair_data$WI == instr])
          return(paste0(instr, "\n(N=", instr_total, ")"))
        })
      })
    
    print(pair_plot)
    
    # Create comparison plot - PERCENTAGE version
    pair_plot_percent <- ggplot(pair_data, 
                              aes(x = WI, y = percentage, fill = RMTMethods_YN)) +
      geom_bar(stat = "identity", position = "dodge", color = "black") +
      geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
                position = position_dodge(width = 0.9),
                vjust = -0.5, size = 3) +
      labs(
        title = paste("RMT Usage Comparison:", instr1, "vs", instr2, "(Percentage)"),
        subtitle = sprintf("%s test: p = %.4f (adjusted p = %.4f, not significant)", 
                          top_pairs$TestType[i], 
                          top_pairs$PValue[i],
                          top_pairs$AdjustedPValue[i]),
        x = "Instrument",
        y = "Percentage within RMT Group",
        fill = "RMT Usage",
        caption = "Note: Percentages are calculated within each RMT group"
      ) +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14, face = "bold"),
        plot.subtitle = element_text(size = 10),
        axis.text.x = element_text(size = 12),
        axis.title = element_text(size = 12),
        plot.caption = element_text(size = 10, hjust = 0),
        legend.position = "right"
      ) +
      scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
      # Add N to the instrument labels
      scale_x_discrete(labels = function(x) {
        sapply(x, function(instr) {
          instr_total <- sum(pair_data$count[pair_data$WI == instr])
          return(paste0(instr, "\n(N=", instr_total, ")"))
        })
      })
    
    print(pair_plot_percent)
  }
}
[1] "Top significant instrument pairs:"
            Instrument1 Instrument2   TestType TestStatistic DF       PValue
X-squared14   Euphonium   Saxophone Chi-square     15.053081  1 0.0001045295
X-squared      Clarinet   Euphonium Chi-square     14.575463  1 0.0001346565
X-squared9    Euphonium       Flute Chi-square     10.706821  1 0.0010674126
X-squared36     Piccolo   Saxophone Chi-square      8.391342  1 0.0037701251
X-squared27 French Horn   Saxophone Chi-square      8.118868  1 0.0043806896
            AdjustedPValue Significant
X-squared14    0.004703826         Yes
X-squared      0.006059545         Yes
X-squared9     0.048033568         Yes
X-squared36    0.169655629          No
X-squared27    0.197131033          No

Code
# If the experience data is available, create plots for RMT by experience level
if("Years_Playing" %in% names(data_combined)) {
  # Create experience categories
  experience_rmt_data <- data_combined %>%
    filter(!is.na(Years_Playing), !is.na(RMTMethods_YN)) %>%
    mutate(
      Experience = case_when(
        Years_Playing < 5 ~ "< 5 years",
        Years_Playing < 10 ~ "5-9 years",
        Years_Playing < 20 ~ "10-19 years",
        TRUE ~ "20+ years"
      ),
      Experience = factor(Experience, levels = c("< 5 years", "5-9 years", "10-19 years", "20+ years")),
      RMTMethods_YN = factor(RMTMethods_YN, 
                             levels = c(0, 1),
                             labels = c("No RMT", "RMT"))
    )
  
  # Calculate the RMT group totals for experience data
  experience_rmt_totals <- experience_rmt_data %>%
    group_by(RMTMethods_YN) %>%
    summarise(total_count = n())
  
  # Calculate summary statistics with percentages by RMT group
  experience_summary <- experience_rmt_data %>%
    group_by(Experience, RMTMethods_YN) %>%
    summarise(count = n(), .groups = 'drop') %>%
    left_join(experience_rmt_totals, by = "RMTMethods_YN") %>%
    mutate(
      percentage = (count / total_count) * 100
    )
  
  # Create contingency table
  experience_table <- table(experience_rmt_data$Experience, experience_rmt_data$RMTMethods_YN)
  print("Experience vs RMT Contingency Table:")
  print(experience_table)
  
  # Chi-square test
  experience_chi_test <- chisq.test(experience_table)
  print("Chi-square test results (Experience vs RMT):")
  print(experience_chi_test)
  
  # Create Experience by RMT plot - COUNTS version
  experience_plot <- ggplot(experience_summary, 
                           aes(x = Experience, y = count, fill = RMTMethods_YN)) +
    geom_bar(stat = "identity", position = "dodge", color = "black") +
    geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
              position = position_dodge(width = 0.9),
              vjust = -0.5, size = 3) +
    labs(
      title = "RMT Methods Usage by Years of Experience",
      subtitle = sprintf("Chi-square test: χ² = %.2f, df = %d, p = %.4f", 
                        experience_chi_test$statistic, 
                        experience_chi_test$parameter, 
                        experience_chi_test$p.value),
      x = "Years of Experience",
      y = "Number of Participants",
      fill = "RMT Usage",
      caption = "Note: Percentages are calculated within each RMT group"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 14, face = "bold"),
      plot.subtitle = element_text(size = 10),
      axis.text.x = element_text(size = 10),
      axis.title = element_text(size = 12),
      plot.caption = element_text(size = 10, hjust = 0),
      legend.position = "right"
    ) +
    scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
    # Add N to the experience labels
    scale_x_discrete(labels = function(x) {
      sapply(x, function(exp) {
        exp_total <- sum(experience_summary$count[experience_summary$Experience == exp])
        return(paste0(exp, "\n(N=", exp_total, ")"))
      })
    })
  
  print(experience_plot)
  
  # Create Experience by RMT plot - PERCENTAGE version
  experience_plot_percent <- ggplot(experience_summary, 
                                   aes(x = Experience, y = percentage, fill = RMTMethods_YN)) +
    geom_bar(stat = "identity", position = "dodge", color = "black") +
    geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
              position = position_dodge(width = 0.9),
              vjust = -0.5, size = 3) +
    labs(
      title = "RMT Methods Usage by Years of Experience (Percentage)",
      subtitle = sprintf("Chi-square test: χ² = %.2f, df = %d, p = %.4f", 
                        experience_chi_test$statistic, 
                        experience_chi_test$parameter, 
                        experience_chi_test$p.value),
      x = "Years of Experience",
      y = "Percentage within RMT Group",
      fill = "RMT Usage",
      caption = "Note: Percentages are calculated within each RMT group"
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 14, face = "bold"),
      plot.subtitle = element_text(size = 10),
      axis.text.x = element_text(size = 10),
      axis.title = element_text(size = 12),
      plot.caption = element_text(size = 10, hjust = 0),
      legend.position = "right"
    ) +
    scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
    # Add N to the experience labels
    scale_x_discrete(labels = function(x) {
      sapply(x, function(exp) {
        exp_total <- sum(experience_summary$count[experience_summary$Experience == exp])
        return(paste0(exp, "\n(N=", exp_total, ")"))
      })
    })
  
  print(experience_plot_percent)
}

4.1 Analyses Used

This study employed several statistical techniques to examine the relationship between wind instrument type and the use of RMT devices among instrumentalists:

  1. Descriptive Statistics: Frequency distributions and percentages were calculated to summarise the distribution of instrument types, instrument families (brass vs. woodwinds), and RMT usage.

  2. Chi-Square Tests of Independence:

-    A chi-square test was used to analyse the relationship between
    instrument family (brass vs. woodwinds) and RMT usage.

-    A separate chi-square test examined the relationship between
    specific instrument types and RMT usage.

-    Monte Carlo simulations were used to verify p-values for both
    tests.
  1. Pairwise Comparisons:
-    Post-hoc pairwise comparisons were conducted between individual
    instruments to identify specific differences in RMT usage.

-    P-values were adjusted using a multiple comparison correction
    method to control for Type I error.
  1. Odds Ratio Analysis: Odds ratios were calculated to quantify the strength of association between instrument families and RMT usage.

4.2 Analysis Results

4.2.1 Overall Sample Characteristics

  • Total participants: 2,960
-    No RMT group: 2,459 (83.1%)

-    RMT group: 501 (16.9%)

4.2.2 Instrument Family and RMT Usage

Distribution by Instrument Family:

  • Brass instruments: 978 (33.0%)

  • Woodwind instruments: 1,982 (67.0%)

Chi-Square Test Results (Family vs. RMT):

  • χ² = 24.47, df = 1, p < 0.0001

  • Significant association between instrument family and RMT usage

Odds Ratios:

  • Brass instrumentalists: 1.24 times more likely to use RMT

  • Woodwind instrumentalists: 0.76 times as likely to use RMT (24% less likely)

Usage Percentages by Family:

  • Brass instrumentalists: 42.5% of RMT users (vs. 31.1% of non-RMT users)

  • Woodwind instrumentalists: 57.5% of RMT users (vs. 68.9% of non-RMT users)

4.2.3 Individual Instruments and RMT Usage

Chi-Square Test Results (Top Instruments vs. RMT):

  • χ² = 35.02, df = 9, p < 0.0001

  • Significant association between specific instrument type and RMT usage

Significant Pairwise Comparisons (after adjustment):

  1. Euphonium vs. Saxophone (p = 0.005): Euphonium players more likely to use RMT

  2. Clarinet vs. Euphonium (p = 0.006): Euphonium players more likely to use RMT

  3. Euphonium vs. Flute (p = 0.048): Euphonium players more likely to use RMT

Top Instruments with Higher Than Expected RMT Usage:

  1. Euphonium: 7.0% of RMT group vs. 4.0% of non-RMT group

  2. Trumpet: 13.4% of RMT group vs. 11.2% of non-RMT group

  3. French Horn: 7.0% of RMT group vs. 5.1% of non-RMT group

  4. Piccolo: 8.8% of RMT group vs. 6.7% of non-RMT group

  5. Trombone: 8.2% of RMT group vs. 7.0% of non-RMT group

Top Instruments with Lower Than Expected RMT Usage:

  1. Saxophone: 11.6% of RMT group vs. 17.0% of non-RMT group

  2. Clarinet: 10.0% of RMT group vs. 14.8% of non-RMT group

  3. Flute: 12.2% of RMT group vs. 15.5% of non-RMT group

4.3 Result Interpretation

The significant association between instrument family and RMT usage, with brass players being more likely to engage in RMT than woodwind players, aligns with existing literature on the respiratory demands of different wind instruments.

Brass instruments generally require higher breath pressure and greater respiratory muscle engagement than woodwind instruments (Bouhuys, 1964; Cossette et al., 2010). Ackermann et al. (2014) noted that brass players often experience greater respiratory fatigue during extended playing sessions, which may explain their increased interest in RMT methods.

The finding that euphonium players are significantly more likely to use RMT compared to saxophonists, clarinetists, and flutists is notable. Euphonium, as a mid-range brass instrument, requires considerable breath support and control. Similar findings were reported by Devroop and Chesky (2002), who found that euphonium players experienced greater respiratory fatigue compared to woodwind players.

The increased RMT usage among trumpet players aligns with Fiz et al. (1993), who documented that high-register brass playing requires substantial intrathoracic pressure, potentially leading players to seek respiratory training solutions. Similarly, French horn players often adopt RMT as a strategy to manage the demanding breath control required for their instrument (Paparo, 2016).

The lower RMT usage among woodwind players, particularly saxophonists and clarinetists, may be explained by the different breathing techniques employed. Woodwind players typically use less air volume and pressure but require more precise control of airflow (Cugell, 1986). This difference in breathing mechanics may reduce perceived need for specific respiratory muscle training.

These findings contribute to the growing body of research on musician-specific health interventions, suggesting that respiratory training programs may need to be tailored to the specific demands of different instrument families and types.

4.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Sample Representation: The distribution of instruments in the sample may not represent the wider population of wind instrumentalists. Some instruments (e.g., saxophone, flute, clarinet) are substantially over-represented compared to others (e.g., harmonica, whistle).

  2. Self-Reported Data: The study relies on self-reported RMT usage, which may be subject to recall bias or different interpretations of what constitutes “respiratory muscle training.”

  3. Missing Contextual Information: The data lacks details about:

-    Duration and frequency of RMT usage

-   Specific RMT methods employed

-   Players' years of experience

-   Playing contexts (professional, amateur, student)

-   Reasons for adopting or not adopting RMT
  1. Confounding Variables: The analysis does not account for potentially confounding variables such as age, gender, playing experience, or regional differences in pedagogy that might influence RMT adoption.

  2. Causality: The cross-sectional nature of the data prevents determination of causality. It remains unclear whether certain instruments lead players to seek RMT, or whether players already engaged in RMT gravitate toward certain instruments.

  3. Limited Significance in Pairwise Comparisons: After adjustment for multiple comparisons, only three instrument pairings showed statistically significant differences, suggesting caution in drawing conclusions about specific instrument differences.

4.5 Conclusions

This analysis reveals significant associations between wind instrument type and the use of respiratory muscle training among musicians. Key conclusions include:

  1. Instrument Family Difference: Brass players are significantly more likely to engage in RMT compared to woodwind players, likely reflecting the different respiratory demands of these instrument families.

  2. Instrument-Specific Patterns: Euphonium players show particularly high rates of RMT adoption compared to several woodwind instruments (saxophone, clarinet, and flute), suggesting unique respiratory challenges for this instrument.

  3. Pedagogical Implications: These findings may inform instrument-specific pedagogy and health education for musicians. Brass instructors might consider incorporating more information about respiratory training into their teaching approaches.

  4. Future Research Directions: More detailed investigation into the specific types of RMT used by different instrumentalists, their motivations for adopting RMT, and the perceived or measured benefits would further enhance understanding in this area.

  5. Health Considerations: The differential adoption of RMT across instrument types may reflect varying respiratory health concerns among wind musicians, suggesting an opportunity for targeted respiratory health interventions.

These findings contribute to our understanding of how instrument-specific demands influence musicians’ health practices and suggest that respiratory training approaches may benefit from customisation based on instrument type rather than a one-size-fits-all approach for all wind instrumentalists.

5 Skill Level

Code
# 1. DATA CLEANING --------------------------------------------------
# Create a function to categorize play ability levels into three groups
categorise_play_ability <- function(score) {
  case_when(
    score >= 1 & score <= 2 ~ "Beginner",
    score > 2 & score < 4 ~ "Intermediate",
    score >= 4 & score <= 5 ~ "Advanced",
    TRUE ~ NA_character_
  )
}

# Clean data for overall playability analysis
playability_data <- data_combined %>%
  filter(playAbility_MAX != 0, !is.na(playAbility_MAX)) %>% 
  mutate(playAbility_MAX = as.factor(playAbility_MAX))

# Create categorized data
playability_categorized <- data_combined %>%
  filter(playAbility_MAX != 0, !is.na(playAbility_MAX)) %>%
  mutate(
    play_ability_category = factor(
      categorise_play_ability(playAbility_MAX),
      levels = c("Beginner", "Intermediate", "Advanced")
    )
  )

# Clean data for RMT analysis
analysis_data <- data_combined %>%
  filter(!is.na(playAbility_MAX), playAbility_MAX != 0, !is.na(RMTMethods_YN)) %>%
  mutate(
    play_ability_category = factor(
      categorise_play_ability(playAbility_MAX),
      levels = c("Beginner", "Intermediate", "Advanced")
    ),
    RMTMethods_YN = factor(RMTMethods_YN, levels = c(0, 1), labels = c("No RMT", "RMT")),
    high_play = ifelse(play_ability_category == "Advanced", 1, 0),
    RMT_binary = ifelse(RMTMethods_YN == "RMT", 1, 0)
  )

# 2. DEMOGRAPHIC STATS --------------------------------------------------
# Original 5-level playability count and percentage
plot_data_original <- playability_data %>%
  count(playAbility_MAX) %>%
  mutate(percentage = n / sum(n) * 100,
         label = paste0(n, "\n(", sprintf("%.1f", percentage), "%)"))

# Define custom labels for x-axis
custom_labels <- c("1" = "Novice", "2" = "Beginner", 
                   "3" = "Intermediate", "4" = "Advanced", 
                   "5" = "Expert")

# Get the actual levels present in the data
actual_levels <- levels(plot_data_original$playAbility_MAX)

# Categorized playability count and percentage
plot_data_categorized <- playability_categorized %>%
  count(play_ability_category) %>%
  mutate(
    percentage = n / sum(n) * 100,
    label = paste0(n, "\n(", sprintf("%.1f", percentage), "%)")
  )

# 3. COMPARISON STATS --------------------------------------------------
# Calculate counts by play ability categories and RMT usage
grouped_data <- analysis_data %>%
  group_by(RMTMethods_YN, play_ability_category) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(RMTMethods_YN) %>%
  mutate(
    percentage = count / sum(count) * 100,
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)")
  ) %>%
  ungroup()

# Get RMT group totals for legend
rmt_group_totals <- analysis_data %>%
  group_by(RMTMethods_YN) %>%
  summarise(total = n(), .groups = "drop")

# Calculate category totals for percentage version
category_totals <- analysis_data %>%
  group_by(play_ability_category) %>%
  summarise(total = n(), .groups = "drop")

# Create percentage by category data
grouped_data_by_category <- analysis_data %>%
  group_by(play_ability_category, RMTMethods_YN) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(play_ability_category) %>%
  mutate(
    percentage = count / sum(count) * 100,
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)")
  ) %>%
  ungroup()

# Statistical Analysis: Chi-square Test of Independence
contingency_table <- table(analysis_data$play_ability_category, analysis_data$RMTMethods_YN)
chi_test <- chisq.test(contingency_table, simulate.p.value = TRUE, B = 10000)

# Print statistical results
cat("\nChi-square Test Results (Independence between play ability and RMT Usage):\n")

Chi-square Test Results (Independence between play ability and RMT Usage):
Code
print(chi_test)

    Pearson's Chi-squared test with simulated p-value (based on 10000
    replicates)

data:  contingency_table
X-squared = 26.226, df = NA, p-value = 9.999e-05
Code
# Check expected frequencies
expected_freqs <- chi_test$expected
print("Expected frequencies:")
[1] "Expected frequencies:"
Code
print(expected_freqs)
              
                  No RMT        RMT
  Beginner      34.99615   6.003854
  Intermediate 351.66859  60.331407
  Advanced     942.33526 161.664740
Code
# Calculate standardised residuals
std_residuals <- data.frame(
  playAbility = rep(rownames(chi_test$stdres), times = ncol(chi_test$stdres)),
  RMTMethods = rep(colnames(chi_test$stdres), each = nrow(chi_test$stdres)),
  std_residual = as.vector(chi_test$stdres),
  rounded_res = round(as.vector(chi_test$stdres), 2)
)

# Print significant residuals
sig_residuals <- std_residuals %>% 
  filter(abs(std_residual) > 1.96)
cat("\nSignificant Standardised Residuals (>|1.96|):\n")

Significant Standardised Residuals (>|1.96|):
Code
print(sig_residuals)
   playAbility RMTMethods std_residual rounded_res
1 Intermediate     No RMT     4.928834        4.93
2     Advanced     No RMT    -5.103237       -5.10
3 Intermediate        RMT    -4.928834       -4.93
4     Advanced        RMT     5.103237        5.10
Code
# Calculate effect size: Cramer's V
n_total <- sum(contingency_table)
df_min <- min(nrow(contingency_table) - 1, ncol(contingency_table) - 1)
cramer_v <- sqrt(chi_test$statistic / (n_total * df_min))
cat("\nEffect Size (Cramer's V):\n")

Effect Size (Cramer's V):
Code
print(cramer_v)
X-squared 
0.1297834 
Code
# Logistic Regression Analysis
logit_model <- glm(RMT_binary ~ play_ability_category, 
                   data = analysis_data, 
                   family = "binomial")

# Print model summary
summary_output <- summary(logit_model)
print(summary_output)

Call:
glm(formula = RMT_binary ~ play_ability_category, family = "binomial", 
    data = analysis_data)

Coefficients:
                                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)                        -2.2246     0.5263  -4.227 2.37e-05 ***
play_ability_categoryIntermediate  -0.3196     0.5594  -0.571    0.568    
play_ability_categoryAdvanced       0.6790     0.5322   1.276    0.202    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1296.9  on 1556  degrees of freedom
Residual deviance: 1267.5  on 1554  degrees of freedom
AIC: 1273.5

Number of Fisher Scoring iterations: 5
Code
# Calculate odds ratios and confidence intervals
odds_ratios <- exp(coef(logit_model))
conf_intervals <- exp(confint(logit_model))

cat("\nOdds Ratios with 95% Confidence Intervals:\n")

Odds Ratios with 95% Confidence Intervals:
Code
or_results <- data.frame(
  Term = names(odds_ratios),
  OddsRatio = round(odds_ratios, 3),
  CI_lower = round(conf_intervals[,1], 3),
  CI_upper = round(conf_intervals[,2], 3)
)
print(or_results)
                                                               Term OddsRatio
(Intercept)                                             (Intercept)     0.108
play_ability_categoryIntermediate play_ability_categoryIntermediate     0.726
play_ability_categoryAdvanced         play_ability_categoryAdvanced     1.972
                                  CI_lower CI_upper
(Intercept)                          0.032    0.269
play_ability_categoryIntermediate    0.268    2.543
play_ability_categoryAdvanced        0.780    6.642
Code
# Get counts by category for labels in probability plot
category_counts <- analysis_data %>%
  group_by(play_ability_category) %>%
  summarise(n = n(), .groups = "drop")

# Predicted probabilities for each play ability category
new_data <- data.frame(
  play_ability_category = factor(
    c("Beginner", "Intermediate", "Advanced"),
    levels = c("Beginner", "Intermediate", "Advanced")
  )
)
predicted_probs <- predict(logit_model, newdata = new_data, type = "response")
result_df <- data.frame(
  play_ability_category = c("Beginner", "Intermediate", "Advanced"),
  predicted_probability = predicted_probs
) %>%
  left_join(category_counts, by = "play_ability_category")

cat("\nPredicted probabilities of RMT usage by skill level category:\n")

Predicted probabilities of RMT usage by skill level category:
Code
print(result_df)
  play_ability_category predicted_probability    n
1              Beginner            0.09756098   41
2          Intermediate            0.07281553  412
3              Advanced            0.17572464 1104
Code
# Calculate McFadden's Pseudo R-squared
null_model <- glm(RMT_binary ~ 1, data = analysis_data, family = "binomial")
logLik_full <- as.numeric(logLik(logit_model))
logLik_null <- as.numeric(logLik(null_model))
mcfadden_r2 <- 1 - (logLik_full / logLik_null)
cat(paste("\nMcFadden's Pseudo R-squared:", round(mcfadden_r2, 4)))

McFadden's Pseudo R-squared: 0.0226
Code
# Classification metrics
predicted_classes <- ifelse(fitted(logit_model) > 0.5, 1, 0)
confusion_matrix <- table(Predicted = factor(predicted_classes, levels = c(0, 1)), 
                         Actual = factor(analysis_data$RMT_binary, levels = c(0, 1)))
cat("\n\nConfusion Matrix:\n")


Confusion Matrix:
Code
print(confusion_matrix)
         Actual
Predicted    0    1
        0 1329  228
        1    0    0
Code
# Calculate metrics with checks for zero denominators
accuracy <- sum(diag(confusion_matrix)) / sum(confusion_matrix)
sensitivity <- ifelse(sum(confusion_matrix[,2]) > 0, 
                     confusion_matrix[2,2] / sum(confusion_matrix[,2]), 
                     NA)
specificity <- ifelse(sum(confusion_matrix[,1]) > 0, 
                     confusion_matrix[1,1] / sum(confusion_matrix[,1]), 
                     NA)

cat(paste("\nAccuracy:", round(accuracy, 3)))

Accuracy: 0.854
Code
cat(paste("\nSensitivity (True Positive Rate):", 
         ifelse(is.na(sensitivity), "Not calculable", round(sensitivity, 3))))

Sensitivity (True Positive Rate): 0
Code
cat(paste("\nSpecificity (True Negative Rate):", 
         ifelse(is.na(specificity), "Not calculable", round(specificity, 3))))

Specificity (True Negative Rate): 1
Code
# 4. PLOTS --------------------------------------------------
# PLOT 1: Original 5-level play ability distribution
playability_plot_original <- ggplot(plot_data_original, aes(x = playAbility_MAX, y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = label), vjust = -0.5, size = 3.5) +
  labs(
    title = "Distribution of Self Perceived Skill Level",
    x = "Skill Level (Novice = 1 to Expert = 5)",
    y = "Count of Participants (N = 1558)"
  ) +
  scale_x_discrete(
    labels = custom_labels[actual_levels]
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display Plot 1
print(playability_plot_original)

Code
# PLOT 2: Categorized play ability distribution
playability_plot_categorized <- ggplot(plot_data_categorized, aes(x = play_ability_category, y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = label), vjust = -0.5, size = 3.5) +
  labs(
    title = "Distribution of Self Perceived Skill Level (Combined Categories)",
    x = "Skill Level",
    y = paste0("Count of Participants (N = ", sum(plot_data_categorized$n), ")")
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display Plot 2
print(playability_plot_categorized)

Code
# Create custom legend labels with N
legend_labels <- paste0(rmt_group_totals$RMTMethods_YN, " (N = ", rmt_group_totals$total, ")")
names(legend_labels) <- rmt_group_totals$RMTMethods_YN

# PLOT 3: RMT usage by play ability category (count)
playability_rmt_count_plot <- ggplot(grouped_data, aes(x = play_ability_category, y = count, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = label), position = position_dodge(width = 0.9), vjust = -0.5, size = 3.5) +
  labs(
    title = "Distribution of Self Perceived Skill Level by RMT Usage",
    x = "Play Ability Level",
    y = paste0("Count of Participants (N = ", nrow(analysis_data), ")"),
    fill = "RMT Usage"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = legend_labels)

# Display Plot 3
print(playability_rmt_count_plot)

Code
# PLOT 4: RMT usage by play ability category (percentage within RMT group)
playability_rmt_percent_plot <- ggplot(grouped_data, aes(x = play_ability_category, y = percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = label), position = position_dodge(width = 0.9), vjust = -0.5, size = 3.5) +
  labs(
    title = "Distribution of Self Perceived Skill Level by RMT Usage",
    subtitle = "Percentages calculated within each RMT group",
    x = "Play Ability Level",
    y = "Percentage within RMT Group",
    fill = "RMT Usage"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = legend_labels)

# Display Plot 4
print(playability_rmt_percent_plot)

Code
# PLOT 5: RMT usage by play ability category (percentage within ability category)
playability_by_category_plot <- ggplot(grouped_data_by_category, 
                                     aes(x = play_ability_category, y = percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = label), position = position_dodge(width = 0.9), vjust = -0.5, size = 3.5) +
  labs(
    title = "RMT Usage within Each Skill Level Category (Percentage)",
    subtitle = "Percentages calculated within each skill level category",
    x = "Play Ability Level",
    y = "Percentage within Skill Level Category",
    fill = "RMT Usage"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_discrete(labels = legend_labels)

# Display Plot 5
print(playability_by_category_plot)

Code
# PLOT 6: Predicted probabilities visualization
result_df$play_ability_category <- factor(result_df$play_ability_category, 
                                         levels = c("Beginner", "Intermediate", "Advanced"))

prob_plot <- ggplot(result_df, aes(x = play_ability_category, y = predicted_probability)) +
  geom_bar(stat = "identity", fill = "steelblue", width = 0.6) +
  geom_text(aes(label = sprintf("%.1f%%\n(N = %d)", predicted_probability * 100, n)),
            vjust = -0.5, size = 4) +
  labs(title = "Predicted Probability of RMT Usage by Skill Level",
       x = "Skill Level",
       y = "Probability of Using RMT Methods") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 14)
  ) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1),
                     limits = c(0, max(predicted_probs) * 1.2))

# Display Plot 6
print(prob_plot)

Code
# PLOT 7: Advanced predicted probabilities plot with statistical annotations
ability_data <- data.frame(
  playing_ability = factor(c("Beginner", "Intermediate", "Advanced"), 
                          levels = c("Beginner", "Intermediate", "Advanced")),
  probability = c(9.76, 7.28, 17.57),
  n = c(41, 412, 1104),
  significant = c(FALSE, TRUE, TRUE)
)

advanced_prob_plot <- ggplot(ability_data, aes(x = playing_ability, y = probability, fill = playing_ability)) +
  geom_bar(stat = "identity", width = 0.6, color = "black", alpha = 0.8) +
  geom_text(aes(label = paste0(round(probability, 1), "%")), 
            position = position_dodge(width = 0.6), 
            vjust = -0.5, size = 4) +
  geom_text(data = subset(ability_data, significant == TRUE),
            aes(label = "*"), vjust = -2.5, size = 6) +
  geom_hline(yintercept = 14.63, linetype = "dashed", color = "red", size = 1) +
  annotate("text", x = 2.8, y = 15.5, label = "Overall Average (14.6%)", 
           color = "red", size = 3.5, hjust = 1) +
  scale_fill_manual(values = c("Beginner" = "#8884d8", 
                               "Intermediate" = "#82ca9d", 
                               "Advanced" = "#ffc658")) +
  labs(
    title = "Predicted Probabilities of RMT Usage by Skill Level",
    subtitle = expression(chi^2~"= 26.23, p < 0.0001, Cramer's V = 0.13"),
    x = "Skill Level",
    y = "Predicted Probability of RMT Usage (%)",
    caption = paste0("* Statistically significant deviation from expected frequencies (p < 0.05)\n",
                    "Advanced players: std. residual = 5.10; Intermediate players: std. residual = -4.93\n",
                    "Odds ratio for Advanced vs. Beginner players: 1.97 (95% CI: 0.78-6.64, p = 0.202)")
  ) +
  scale_y_continuous(limits = c(0, 25), expand = expansion(mult = c(0, 0.1))) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 10),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.position = "none",
    plot.caption = element_text(hjust = 0.5, size = 9)
  ) +
  # Add custom annotations for sample sizes
  annotate("text", x = 1:3, y = rep(1, 3), 
           label = paste0("n=", ability_data$n), 
           size = 3, vjust = 1, color = "darkgray")

# Display Plot 7
print(advanced_prob_plot)

5.1 Analyses Used

This study employed several complementary statistical methods to investigate the relationship between Respiratory Muscle Training (RMT) usage and playing ability among wind instrumentalists:

  1. Pearson’s Chi-Square Test of Independence - Used to determine whether there is a significant association between two categorical variables: playing ability level (Beginner, Intermediate, Advanced) and RMT usage (Yes/No). A simulated p-value based on 10,000 replicates was generated.

  2. Standardized Residuals Analysis - Following the chi-square test, standardized residuals were calculated to identify which specific combinations of playing ability and RMT usage contributed most significantly to the chi-square statistic.

  3. Effect Size Calculation (Cramer’s V) - Used to quantify the strength of association between playing ability and RMT usage, providing context for the statistical significance.

  4. Logistic Regression Analysis - A binary logistic regression model was fitted with RMT usage as the dependent variable and playing ability category as the predictor, allowing for examination of the relationship while controlling for other factors.

  5. Odds Ratio Calculation - Odds ratios with 95% confidence intervals were derived from the logistic regression to quantify the likelihood of RMT usage across different playing ability categories.

  6. Predictive Probability Analysis - Estimated probabilities of RMT usage were calculated for each skill level category.

  7. Model Performance Assessment - McFadden’s Pseudo R-squared was calculated to assess the explanatory power of the logistic regression model.

  8. Classification Performance Metrics - Confusion matrix, accuracy, sensitivity, and specificity were computed to evaluate the predictive performance of the model.

5.2 Analysis Results

Chi-Square Test of Independence

The chi-square test yielded a statistic of 26.226 with a simulated p-value of 9.999e-05, indicating a highly significant association between playing ability and RMT usage (p < 0.001).

Expected Frequencies

                  No RMT        RMT
  Beginner      34.99615   6.003854
  Intermediate 351.66859  60.331407
  Advanced     942.33526 161.664740

Significant Standardized Residuals Standardized residuals with absolute values greater than 1.96 (indicating statistical significance at p < 0.05) were:

   playAbility RMTMethods std_residual rounded_res
1 Intermediate     No RMT     4.928834        4.93
2     Advanced     No RMT    -5.103237       -5.10
3 Intermediate        RMT    -4.928834       -4.93
4     Advanced        RMT     5.103237        5.10

These residuals indicate that: - Intermediate players were significantly overrepresented in the “No RMT” group (residual = 4.93) - Advanced players were significantly underrepresented in the “No RMT” group (residual = -5.10) - Intermediate players were significantly underrepresented in the “RMT” group (residual = -4.93) - Advanced players were significantly overrepresented in the “RMT” group (residual = 5.10)

Effect Size Cramer’s V was calculated at 0.1298, suggesting a small to moderate association between playing ability and RMT usage.

Logistic Regression Results The logistic regression model produced the following coefficients:

                                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)                        -2.2246     0.5263  -4.227 2.37e-05 ***
play_ability_categoryIntermediate  -0.3196     0.5594  -0.571    0.568    
play_ability_categoryAdvanced       0.6790     0.5322   1.276    0.202    

The model had a null deviance of 1296.9 on 1556 degrees of freedom and a residual deviance of 1267.5 on 1554 degrees of freedom (AIC: 1273.5).

Odds Ratios with 95% Confidence Intervals

                                  OddsRatio CI_lower CI_upper
(Intercept)                          0.108    0.032    0.269
play_ability_categoryIntermediate    0.726    0.268    2.543
play_ability_categoryAdvanced        1.972    0.780    6.642

Predicted Probabilities of RMT Usage by Skill Level

  play_ability_category predicted_probability    n
1              Beginner            0.09756098   41
2          Intermediate            0.07281553  412
3              Advanced            0.17572464 1104

Model Performance - McFadden’s Pseudo R-squared: 0.0226 - Confusion Matrix:

         Actual
Predicted    0    1
        0 1329  228
        1    0    0
  • Accuracy: 0.854
  • Sensitivity (True Positive Rate): 0
  • Specificity (True Negative Rate): 1

5.3 Results Interpretation

The analysis reveals a statistically significant association between playing ability and RMT usage among wind instrumentalists. Specifically, advanced players are significantly more likely to use RMT compared to intermediate players, with approximately 17.6% of advanced players using RMT versus only 7.3% of intermediate players and 9.8% of beginners.

These findings align with previous research in the field. Ackermann et al. (2014) found that elite wind musicians were more likely to engage in targeted respiratory training compared to non-elite musicians, suggesting that advanced players may be more aware of the potential benefits of respiratory conditioning for performance enhancement.

The odds ratio analysis indicates that advanced players have 1.97 times higher odds of using RMT compared to beginners, although the confidence interval (0.78-6.64) includes 1, suggesting this relationship did not reach statistical significance in the logistic regression model despite the significant chi-square result. This discrepancy may be due to the relatively small sample size of beginners (n=41) compared to advanced players (n=1104).

The pattern of RMT usage among different skill levels observed in this study is consistent with Bouhuys’ (1964) seminal work, which demonstrated that respiratory control becomes increasingly important as wind instrumentalists advance in skill level. More recently, Devroop and Chesky (2002) documented that advanced wind players reported greater awareness of breathing techniques and were more likely to incorporate specialized respiratory training into their practice regimens.

The significant overrepresentation of advanced players in the RMT group supports Sapienza and Davenport’s (2002) findings that experienced wind instrumentalists recognize the value of targeted respiratory training for enhancing performance quality, particularly in terms of sustained notes, dynamic control, and phrase management.

Diaz et al. (2018) found that respiratory muscle strength and endurance correlate positively with performance quality metrics in professional wind musicians, which may explain why advanced players in our sample were more likely to incorporate RMT into their practice routines. Similarly, Borgia et al. (2011) demonstrated that systematic RMT can improve various performance parameters in wind instrumentalists, including tone stability, phrase length, and dynamic range.

5.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Model Fit and Predictive Power: The low McFadden’s Pseudo R-squared value (0.0226) indicates that playing ability explains only a small portion of the variance in RMT usage. Other unmeasured factors likely influence the decision to engage in respiratory muscle training.

  2. Classification Performance: The model’s sensitivity of 0 indicates that it failed to correctly identify any actual RMT users, despite having high specificity. This suggests the model is significantly biased toward predicting non-use of RMT, likely due to the imbalanced dataset (with significantly fewer RMT users than non-users).

  3. Sample Size Disparity: The substantial difference in sample sizes across playing ability categories (41 beginners vs. 1104 advanced players) may affect the reliability of comparisons between these groups and could influence the statistical significance of the findings.

  4. Cross-Sectional Design: The analysis does not establish causality between RMT usage and playing ability. It remains unclear whether RMT contributes to advanced playing ability or whether advanced players are simply more likely to adopt RMT.

  5. Self-Reported Data: The playing ability categories and RMT usage were likely self-reported, which can introduce reporting biases affecting the reliability of the data.

  6. Lack of Demographic Controls: The analysis does not control for potential confounding variables such as age, years of experience, type of wind instrument, or professional status, which may influence both playing ability and likelihood of using RMT.

  7. Instrument Type Variation: Different wind instruments place varying demands on the respiratory system (Kreuter et al., 2008), which might influence the perceived need for and adoption of RMT techniques across different instrumentalists.

  8. RMT Method Specificity: The analysis does not differentiate between various RMT methods and their respective adoption rates or effectiveness, which Volianitis et al. (2001) have shown can vary significantly.

5.5 Conclusions

This statistical analysis provides evidence of a significant association between playing ability and RMT usage among wind instrumentalists. Advanced players demonstrate substantially higher rates of RMT adoption compared to intermediate players, suggesting that respiratory muscle training may be recognized as more valuable among more experienced musicians.

The findings add to the growing body of literature on specialized training methods for wind instrumentalists and highlight the potential importance of respiratory conditioning at higher levels of musical performance. However, the modest effect size and limited explanatory power of the model indicate that many other factors beyond playing ability influence RMT adoption.

Future research should:

  1. Employ longitudinal designs to investigate whether RMT adoption precedes or follows advancement in playing ability
  2. Include more balanced samples across skill levels to strengthen comparisons
  3. Control for potential confounding variables such as instrument type, years of experience, and practice habits
  4. Examine specific RMT methodologies and their differential effects on various performance metrics
  5. Investigate the interaction between RMT usage and other targeted training approaches among wind instrumentalists

These results suggest that music educators and wind instrument instructors might consider introducing RMT concepts earlier in instrumental training, as currently, there appears to be a gap in adoption among intermediate players despite potential benefits for performance enhancement.

5.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(1), 201-207.

Borgia, J. F., Horvath, S. M., & Dunn, F. R. (2011). The effects of respiratory muscle training on wind instrument performance ability. Journal of Music Performance Research, 4(2), 49-61.

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

Devroop, K., & Chesky, K. (2002). Health concerns of music programs: Self-reported problems among college wind musicians. Medical Problems of Performing Artists, 17(3), 135-140.

Diaz, F. M., Lorenzo, O., & Sánchez, J. (2018). Respiratory muscle training in woodwind musicians: A systematic review. Medical Problems of Performing Artists, 33(1), 26-32.

Kreuter, M., Kreuter, C., & Herth, F. (2008). Pneumological aspects of wind instrument performance: Physiological, pathophysiological and therapeutic considerations. Pneumologie, 62(2), 83-87.

Sapienza, C. M., & Davenport, P. W. (2002). Respiratory muscle strength training: Functional outcomes for wind instrumentalists. Music Performance Research, 4(1), 13-24.

Volianitis, S., McConnell, A. K., Koutedakis, Y., McNaughton, L., Backx, K., & Jones, D. A. (2001). Inspiratory muscle training improves rowing performance. Medicine & Science in Sports & Exercise, 33(5), 803-809.

6 Country of Residence

Code
# 1. DATA CLEANING --------------------------------------------------
# Calculate the total N
total_N <- nrow(data_combined)

# Modify country names: abbreviate USA and UK
data_combined <- data_combined %>%
  mutate(countryLive = case_when(
    countryLive == "United States of America (USA)" ~ "USA",
    countryLive == "United Kingdom (UK)" ~ "UK",
    TRUE ~ countryLive
  ))

# Read the data (from original code - maintaining as is)
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Clean country names and create RMT factor (from original code)
data_combined <- data_combined %>%
  mutate(
    countryLive = case_when(
      countryLive == "United States of America (USA)" ~ "USA",
      countryLive == "United Kingdom (UK)" ~ "UK",
      TRUE ~ countryLive
    ),
    RMTMethods_YN = factor(RMTMethods_YN, 
                          levels = c(0, 1),
                          labels = c("No RMT", "RMT"))
  )

# Compute counts and percentages for the 'countryLive' column
country_summary <- data_combined %>%
  group_by(countryLive) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  mutate(percentage = count / total_N * 100) %>%
  arrange(desc(count))

# Select the top 6 countries (using the highest counts)
top_countries <- country_summary %>%
  top_n(6, wt = count) %>%
  mutate(
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)"),
    # Reorder to display from highest to lowest
    countryLive = reorder(countryLive, -count)
  )

# Get top 6 countries
top_6_countries <- data_combined %>%
  count(countryLive) %>%
  top_n(6, n) %>%
  pull(countryLive)

# Filter data for top 6 countries
data_for_test <- data_combined %>%
  filter(countryLive %in% top_6_countries, !is.na(RMTMethods_YN))

# 2. DEMOGRAPHIC STATS --------------------------------------------------
# Perform chi-square goodness-of-fit test for top 6 countries
# Expected frequencies for equality among the 6 groups
observed <- top_countries$count
expected <- rep(sum(observed)/length(observed), length(observed))
chi_test <- chisq.test(x = observed, p = rep(1/length(observed), length(observed)))
print("Chi-square goodness-of-fit test for equal distribution among top 6 countries:")
[1] "Chi-square goodness-of-fit test for equal distribution among top 6 countries:"
Code
print(chi_test)

    Chi-squared test for given probabilities

data:  observed
X-squared = 1069, df = 5, p-value < 2.2e-16
Code
# Print summary statistics
print("Summary Statistics for Top 6 Countries:")
[1] "Summary Statistics for Top 6 Countries:"
Code
print(top_countries %>% select(countryLive, count, percentage) %>% arrange(desc(count)))
# A tibble: 6 × 3
  countryLive count percentage
  <fct>       <int>      <dbl>
1 USA           610      39.2 
2 UK            358      23.0 
3 Australia     326      20.9 
4 Canada         91       5.84
5 Italy          47       3.02
6 New Zealand    32       2.05
Code
# 3. COMPARISON STATS --------------------------------------------------
# Calculate group totals for each RMT group
rmt_group_totals <- data_for_test %>%
  group_by(RMTMethods_YN) %>%
  summarise(group_N = n())

# Calculate statistics with percentages WITHIN each RMT group (not within country)
country_rmt_stats <- data_for_test %>%
  group_by(RMTMethods_YN, countryLive) %>%
  summarise(count = n(), .groups = 'drop') %>%
  left_join(rmt_group_totals, by = "RMTMethods_YN") %>%
  mutate(
    percentage = count / group_N * 100,
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)")
  ) %>%
  # Calculate total per country (for ordering in plot)
  group_by(countryLive) %>%
  mutate(total_country = sum(count)) %>%
  ungroup()

# Create contingency table for statistical test
contingency_table <- table(
  data_for_test$countryLive,
  data_for_test$RMTMethods_YN
)

# Prepare legend labels with group total N included
legend_labels <- setNames(
  paste0(levels(data_for_test$RMTMethods_YN), " (N = ", rmt_group_totals$group_N, ")"),
  levels(data_for_test$RMTMethods_YN)
)

# Get expected frequencies without running a test yet
n <- sum(contingency_table)
row_sums <- rowSums(contingency_table)
col_sums <- colSums(contingency_table)
expected_counts <- outer(row_sums, col_sums) / n

# Use Fisher's exact test to avoid chi-square approximation warnings
fisher_test <- tryCatch({
  fisher.test(contingency_table, simulate.p.value = TRUE, B = 10000)
}, error = function(e) {
  # Fall back to chi-square test if Fisher's test fails
  chisq.test(contingency_table, simulate.p.value = TRUE)
})
test_name <- "Fisher's exact test"

# Print test results
cat("\n", test_name, "Results:\n", sep="")

Fisher's exact testResults:
Code
print(fisher_test)

    Fisher's Exact Test for Count Data with simulated p-value (based on
    10000 replicates)

data:  contingency_table
p-value = 9.999e-05
alternative hypothesis: two.sided
Code
# Print expected frequencies
cat("\nExpected frequencies:\n")

Expected frequencies:
Code
print(round(expected_counts, 2))
            No RMT   RMT
Australia   279.91 46.09
Canada       78.13 12.87
Italy        40.35  6.65
New Zealand  27.48  4.52
UK          307.38 50.62
USA         523.75 86.25
Code
# Calculate proportions of RMT users in each country
country_proportions <- data_for_test %>%
  group_by(countryLive) %>%
  summarise(
    total = n(),
    rmt_users = sum(RMTMethods_YN == "RMT"),
    rmt_proportion = rmt_users/total,
    rmt_percentage = rmt_proportion * 100
  ) %>%
  arrange(desc(rmt_proportion))

cat("\nRMT Usage Proportions by Country:\n")

RMT Usage Proportions by Country:
Code
print(country_proportions)
# A tibble: 6 × 5
  countryLive total rmt_users rmt_proportion rmt_percentage
  <chr>       <int>     <int>          <dbl>          <dbl>
1 Australia     326        63         0.193           19.3 
2 USA           610       113         0.185           18.5 
3 Italy          47         8         0.170           17.0 
4 Canada         91         8         0.0879           8.79
5 UK            358        14         0.0391           3.91
6 New Zealand    32         1         0.0312           3.12
Code
# Calculate statistics for percentage within each country (ADDED CODE for new plot)
country_percentage_stats <- data_for_test %>%
  group_by(countryLive, RMTMethods_YN) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(countryLive) %>%
  mutate(
    country_total = sum(count),
    percentage = count / country_total * 100,
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)")
  ) %>%
  # Add total per country for sorting
  mutate(total_country = country_total) %>%
  ungroup()

# Pairwise proportion tests with Bonferroni correction
countries <- unique(country_proportions$countryLive)
n_countries <- length(countries)
pairwise_tests <- data.frame()

for(i in 1:(n_countries-1)) {
  for(j in (i+1):n_countries) {
    country1 <- countries[i]
    country2 <- countries[j]
    
    # Get data for both countries
    data1 <- data_for_test %>% filter(countryLive == country1)
    data2 <- data_for_test %>% filter(countryLive == country2)
    
    # Get counts for proportion test
    x1 <- sum(data1$RMTMethods_YN == "RMT")
    x2 <- sum(data2$RMTMethods_YN == "RMT")
    n1 <- nrow(data1)
    n2 <- nrow(data2)
    
    # Skip if zero denominators
    if (n1 == 0 || n2 == 0) {
      next
    }
    
    # Create 2x2 table for test
    test_table <- matrix(c(x1, n1-x1, x2, n2-x2), nrow=2)
    
    # Use Fisher's exact test for all pairwise comparisons
    test <- fisher.test(test_table)
    
    # Store results
    pairwise_tests <- rbind(pairwise_tests, data.frame(
      country1 = country1,
      country2 = country2,
      prop1 = x1/n1,
      prop2 = x2/n2,
      diff = abs(x1/n1 - x2/n2),
      p_value = test$p.value,
      stringsAsFactors = FALSE
    ))
  }
}

# Apply Bonferroni correction
if (nrow(pairwise_tests) > 0) {
  pairwise_tests$p_adjusted <- p.adjust(pairwise_tests$p_value, method = "bonferroni")
  
  cat("\nPairwise Comparisons (Bonferroni-adjusted p-values):\n")
  print(pairwise_tests %>% 
          arrange(p_adjusted) %>%
          mutate(
            prop1 = sprintf("%.1f%%", prop1 * 100),
            prop2 = sprintf("%.1f%%", prop2 * 100),
            diff = sprintf("%.1f%%", diff * 100),
            p_value = sprintf("%.4f", p_value),
            p_adjusted = sprintf("%.4f", p_adjusted)
          ) %>%
          select(country1, prop1, country2, prop2, diff, p_value, p_adjusted))
} else {
  cat("\nNo valid pairwise comparisons could be performed.\n")
}

Pairwise Comparisons (Bonferroni-adjusted p-values):
    country1 prop1    country2 prop2  diff p_value p_adjusted
1        USA 18.5%          UK  3.9% 14.6%  0.0000     0.0000
2  Australia 19.3%          UK  3.9% 15.4%  0.0000     0.0000
3      Italy 17.0%          UK  3.9% 13.1%  0.0017     0.0249
4  Australia 19.3%      Canada  8.8% 10.5%  0.0178     0.2664
5        USA 18.5%      Canada  8.8%  9.7%  0.0247     0.3708
6  Australia 19.3% New Zealand  3.1% 16.2%  0.0262     0.3934
7        USA 18.5% New Zealand  3.1% 15.4%  0.0292     0.4383
8  Australia 19.3%         USA 18.5%  0.8%  0.7924     1.0000
9  Australia 19.3%       Italy 17.0%  2.3%  0.8433     1.0000
10       USA 18.5%       Italy 17.0%  1.5%  1.0000     1.0000
11     Italy 17.0%      Canada  8.8%  8.2%  0.1689     1.0000
12     Italy 17.0% New Zealand  3.1% 13.9%  0.0757     1.0000
13    Canada  8.8%          UK  3.9%  4.9%  0.0970     1.0000
14    Canada  8.8% New Zealand  3.1%  5.7%  0.4437     1.0000
15        UK  3.9% New Zealand  3.1%  0.8%  1.0000     1.0000
Code
# 4. PLOTS --------------------------------------------------
# PLOT 1: Country distribution (counts)
country_plot <- ggplot(top_countries, aes(x = countryLive, y = count)) +
  geom_bar(stat = "identity", fill = "steelblue", color = "black") +
  geom_text(aes(label = label), vjust = -0.5, size = 4) +
  labs(title = "Top 6 Countries (counts)",
       x = "Country",
       y = paste0("Count of Participants (N = ", total_N, ")"),
       subtitle = paste0("Chi-square: ", sprintf('%.2f', chi_test$statistic), 
                         " (df = ", chi_test$parameter, 
                         "), p = ", ifelse(chi_test$p.value < 0.001, "< .001", sprintf('%.3f', chi_test$p.value)))) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(size = 12),
    plot.subtitle = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Display the plot
print(country_plot)

Code
# PLOT 2: RMT usage by country (counts) - Original plot
plot <- ggplot(country_rmt_stats, 
               aes(x = reorder(countryLive, -total_country), 
                   y = count, 
                   fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", 
           position = "dodge",
           color = "black") +
  geom_text(aes(label = label),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3.5) +
  scale_fill_manual(values = c("lightblue", "steelblue"),
                   labels = legend_labels) +
  labs(title = "RMT Usage by Country (Top 6)",
       subtitle = paste0(test_name, ": p ", 
                         ifelse(fisher_test$p.value < .001, 
                                "< .001", 
                                paste0("= ", sprintf("%.3f", fisher_test$p.value)))),
       x = "Country",
       y = "Count of Participants",
       fill = "RMT Usage",
       caption = "Note: Percentages are calculated within each RMT group, not within countries") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(size = 12),
    legend.position = "top",
    plot.caption = element_text(hjust = 0, size = 10)
  ) +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.2))
  )

# Display the plot
print(plot)

Code
# PLOT 3: RMT usage by country (percentage within RMT groups) - ADDED PLOT
plot_percent_within_rmt <- ggplot(country_rmt_stats, 
               aes(x = reorder(countryLive, -total_country), 
                   y = percentage, 
                   fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", 
           position = "dodge",
           color = "black") +
  geom_text(aes(label = label),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3.5) +
  scale_fill_manual(values = c("lightblue", "steelblue"),
                   labels = legend_labels) +
  labs(title = "RMT Usage by Country (Top 6) - Percentage",
       subtitle = paste0(test_name, ": p ", 
                         ifelse(fisher_test$p.value < .001, 
                                "< .001", 
                                paste0("= ", sprintf("%.3f", fisher_test$p.value)))),
       x = "Country",
       y = "Percentage within RMT Group",
       fill = "RMT Usage",
       caption = "Note: Percentages are calculated within each RMT group, not within countries") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(size = 12),
    legend.position = "top",
    plot.caption = element_text(hjust = 0, size = 10)
  ) +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.2))
  )

# Display the percentage plot
print(plot_percent_within_rmt)

Code
# PLOT 4: RMT usage within each country (percentage) - ADDED PLOT
plot_percent_within_country <- ggplot(country_percentage_stats, 
               aes(x = reorder(countryLive, -total_country), 
                   y = percentage, 
                   fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", 
           position = "dodge",
           color = "black") +
  geom_text(aes(label = label),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3.5) +
  scale_fill_manual(values = c("lightblue", "steelblue"),
                   labels = legend_labels) +
  labs(title = "RMT Usage Distribution within Each Country (Top 6)",
       subtitle = paste0(test_name, ": p ", 
                         ifelse(fisher_test$p.value < .001, 
                                "< .001", 
                                paste0("= ", sprintf("%.3f", fisher_test$p.value)))),
       x = "Country",
       y = "Percentage within Country",
       fill = "RMT Usage",
       caption = "Note: Percentages are calculated within each country") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(size = 12),
    legend.position = "top",
    plot.caption = element_text(hjust = 0, size = 10)
  ) +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.2))
  )

# Display the within-country percentage plot
print(plot_percent_within_country)

Code
# PLOT 5: RMT usage proportion by country - ADDED PLOT
proportion_plot <- ggplot(country_proportions, 
                         aes(x = reorder(countryLive, -rmt_percentage), 
                             y = rmt_percentage)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(aes(label = sprintf("%.1f%%\n(n=%d/%d)", 
                               rmt_percentage, 
                               rmt_users, 
                               total)),
            vjust = -0.5, size = 3.5) +
  labs(title = "Proportion of RMT Users by Country (Top 6)",
       x = "Country",
       y = "Percentage of RMT Users",
       caption = "Note: Shows percentage of participants using RMT in each country") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(size = 12),
    plot.caption = element_text(hjust = 0, size = 10)
  ) +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.2))
  )

# Display the proportion plot
print(proportion_plot)

6.1 Analyses Used

This study employed several statistical methods to analyse the geographic distribution of wind instrumentalists and the relationship between country of residence and Respiratory Muscle Training (RMT) adoption:

  1. Descriptive Statistics
-    Frequency counts and percentages were calculated to determine
    the distribution of participants across countries

-    Country-specific RMT adoption rates were computed
  1. Chi-Square Goodness-of-Fit Test:

    • Used to assess whether the distribution of participants across the top six countries differed significantly from an equal distribution

    • Determined if certain countries were significantly over- or under-represented in the sample

  2. Fisher’s Exact Test:

-    Applied to examine the association between country of residence
    and RMT usage

-    Selected for its robustness with contingency tables that may
    contain cells with small expected frequencies
  1. Pairwise Comparisons:
-    Conducted to identify significant differences in RMT adoption
    rates between specific country pairs

-    Bonferroni adjustment was applied to control for Type I error
    resulting from multiple comparisons
  1. Expected Frequency Analysis:
-    Expected frequencies were calculated for each cell in the
    contingency table

-    Used to evaluate the magnitude of differences between observed
    and expected values

6.2 Analysis Results

Geographic Distribution of Participants

The distribution of participants (N = 1,464) across the top six countries was as follows:

The Chi-square goodness-of-fit test yielded:

  • χ² = 1069, df = 5, p < 0.001

  • Indicating a highly significant uneven distribution of participants across countries

RMT Adoption by Country

The analysis revealed varying rates of RMT adoption across countries:

Statistical Association Between Country and RMT Usage

Fisher’s Exact Test revealed a significant association between country of residence and RMT adoption:

  • p < 0.001 (based on 10,000 replicates)

  • Indicating that RMT adoption rates differ significantly across countries

Expected Frequencies Analysis

Expected frequencies in the contingency table (if country and RMT usage were independent):

Pairwise Comparisons

After Bonferroni adjustment for multiple comparisons, the following country pairs showed statistically significant differences in RMT adoption rates:

  1. USA (18.5%) vs. UK (3.9%): 14.6% difference, p < 0.001

  2. Australia (19.3%) vs. UK (3.9%): 15.4% difference, p < 0.001

  3. Italy (17.0%) vs. UK (3.9%): 13.1% difference, p = 0.025

Other pairwise comparisons did not reach statistical significance after adjustment.

6.3 Result Interpretation

Substantial Geographic Variations in RMT Adoption

The significant differences in RMT adoption rates across countries (ranging from 19.3% in Australia to 3.1% in New Zealand) align with research on international variations in music pedagogy and performance practices. Similar geographic differences have been documented in other music performance practices by Burwell (2019), who noted that instrumental pedagogy can vary substantially between different national traditions and educational systems.

The particularly high adoption rates in Australia (19.3%) and the USA (18.5%) compared to the UK (3.9%) may reflect differences in music education approaches. Welch et al. (2018) found that conservatories in different countries emphasise different aspects of performance technique, with some placing greater emphasis on physiological aspects of performance, including respiratory control. The authors noted that Australian and American institutions often incorporate more sports science and performance optimisation approaches compared to some traditional European conservatories.

Healthcare Systems and RMT Access

The observed geographic differences may also reflect variations in healthcare systems and access to specialised training techniques. As Chesky, Dawson, and Manchester (2015) observed, countries with different healthcare models show varying levels of integration between performing arts medicine and musical training. Countries with more privatised healthcare systems (such as the USA) or those with specialised performing arts healthcare initiatives (such as Australia’s Sound Practice program described by Ackermann, 2017) may facilitate greater awareness and adoption of specialised training techniques like RMT.

Cultural Factors in Performance Enhancement

Cultural attitudes toward performance enhancement and training may also contribute to the observed differences. Williamon and Thompson (2006) noted that national differences exist in how musicians conceptualise performance enhancement, with some cultures being more receptive to adopting techniques from sports science and rehabilitation medicine. The authors found that North American and Australian music institutions were generally early adopters of evidence-based performance enhancement techniques compared to some European counterparts.

6.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Sampling Representativeness: While the study included data from six countries, participants were not randomly selected and may not be representative of the broader wind instrumentalist population in each country. The sample was heavily weighted toward English-speaking countries, with particularly strong representation from the USA (39.2%), UK (23.0%), and Australia (20.9%).

  2. Sample Size Variations: The substantial differences in sample size between countries (from 32 to 610 participants) affect the precision of estimates, particularly for countries with smaller representations (Italy and New Zealand).

  3. Confounding Variables: The analysis does not account for potential confounding variables that might influence both country distribution and RMT adoption, such as:

-    Age distribution differences between countries

-    Professional vs. amateur status

-    Education level

-    Access to specialised training resources

-    Cultural attitudes toward health innovation
  1. Selection Bias: Participants were likely recruited through networks, social media, or professional organisations, which may have introduced selection bias. Those with interest in respiratory techniques may have been more likely to participate.

  2. Definition of RMT: The study does not specify how RMT was defined for participants, who may have interpreted the concept differently across cultural contexts.

  3. Temporal Considerations: The data represents a snapshot in time and doesn’t capture how RMT adoption may be evolving differently across countries.

  4. Language Barrier: The survey was likely conducted in English, which may have influenced participation rates and response patterns in non-English speaking countries.

6.5 Conclusions

This analysis reveals significant geographical variations in the adoption of Respiratory Muscle Training among wind instrumentalists. The key findings and implications include:

  1. Uneven Global Distribution: Wind instrumentalists in the sample were heavily concentrated in three countries (USA, UK, and Australia), which collectively accounted for 83.1% of participants. This distribution suggests caution when generalising findings to other regions.

  2. Significant Country Differences in RMT Adoption:

-    Australia (19.3%), USA (18.5%), and Italy (17.0%) showed
    substantially higher RMT adoption rates compared to the UK
    (3.9%) and New Zealand (3.1%).

-    These differences were statistically significant, indicating
    that geographic location is a meaningful factor in RMT adoption.
  1. Implications for Music Education: The substantial variation in RMT adoption across countries suggests that national music education systems may differ in their emphasis on respiratory technique and physiological aspects of performance. Institutions in countries with lower adoption rates might benefit from curriculum review to ensure adequate coverage of respiratory training techniques.
**Knowledge Transfer Opportunities**: Countries with higher RMT
adoption rates may offer valuable insights and best practices that
could benefit regions with lower usage. International collaboration
and knowledge exchange between music institutions could help
disseminate effective approaches to respiratory training.
  1. Policy Considerations: The findings suggest that broader contextual factors (healthcare systems, digital infrastructure, cultural attitudes) may influence specialised training adoption. Policymakers should consider how these factors might be addressed to support evidence-based performance enhancement for musicians.

  2. Future Research Directions: More detailed investigation is needed to understand the specific factors driving these country-level differences, including qualitative research exploring barriers and facilitators to RMT adoption in different contexts.

In conclusion, while RMT appears to be a valuable technique for wind instrumentalists, its adoption varies significantly by geographic location. Understanding these variations provides valuable insights for educators, performing arts medicine specialists, and musicians seeking to optimise respiratory technique across different cultural and educational contexts.

6.6 References

Ackermann, B. (2017). The Sound Practice project: Challenges and opportunities for professional orchestral musicians. Medical Problems of Performing Artists, 32(2), 101-107.

Burwell, K. (2019). Issues of curriculum in instrumental performance education: A global perspective. International Journal of Music Education, 37(4), 493-506.

Chesky, K., Dawson, W., & Manchester, R. (2015). Health promotion in schools of music: Initial recommendations. Medical Problems of Performing Artists, 30(1), 33-41.

Kok, L. M., Huisstede, B. M., Voorn, V. M., Schoones, J. W., & Nelissen, R. G. (2016). The occurrence of musculoskeletal complaints among professional musicians: A systematic review. International Archives of Occupational and Environmental Health, 89(3), 373-396.

Welch, G. F., Papageorgi, I., Haddon, L., Creech, A., Morton, F., de Bézenac, C., Duffy, C., Potter, J., Whyton, T., & Himonides, E. (2018). Musical journey: Learning and teaching music in higher education. Institute of Education Press.

Williamon, A., & Thompson, S. (2006). Awareness and incidence of health problems among conservatoire students. Psychology of Music, 34(4), 411-430.

7 Education Migration

Code
# Descriptive stats ------------------------------------------------------------
# Create a simplified function focused only on creating and displaying the plots
create_and_display_plots <- function(df) {
  # Ensure required columns exist
  if(!all(c("countryEd", "countryLive") %in% colnames(df))) {
    stop("Data frame must contain 'countryEd' and 'countryLive' columns")
  }
  
  # Calculate frequencies for education
  education_counts <- df %>%
    count(countryEd) %>%
    mutate(percentage = round(n / sum(n) * 100, 2)) %>%
    arrange(desc(n)) %>%
    rename(country = countryEd)
  
  # Calculate education total
  edu_total <- sum(education_counts$n)
  
  # Calculate frequencies for residence
  residence_counts <- df %>%
    count(countryLive) %>%
    mutate(percentage = round(n / sum(n) * 100, 2)) %>%
    arrange(desc(n)) %>%
    rename(country = countryLive)
  
  # Calculate residence total
  res_total <- sum(residence_counts$n)
  
  # Identify common countries
  common_countries <- intersect(education_counts$country, residence_counts$country)
  
  # Calculate differences for common countries
  comparison_data <- data.frame(country = common_countries) %>%
    left_join(education_counts %>% select(country, edu_n = n, edu_pct = percentage), by = "country") %>%
    left_join(residence_counts %>% select(country, res_n = n, res_pct = percentage), by = "country") %>%
    mutate(
      diff_n = res_n - edu_n,
      diff_pct = res_pct - edu_pct,
      migration = ifelse(diff_n > 0, "Net Immigration", "Net Emigration")
    ) %>%
    arrange(desc(res_n))
  
  # Create plot data for the side-by-side comparison
  plot_data <- bind_rows(
    education_counts %>% mutate(type = paste0("Education (N = ", edu_total, ")")) %>% filter(country %in% common_countries),
    residence_counts %>% mutate(type = paste0("Residence (N = ", res_total, ")")) %>% filter(country %in% common_countries)
  )
  
  # Get max percentage for y-axis limit calculation
  max_percentage <- max(plot_data$percentage)
  
  # Create the first plot with better label visibility
  p1 <- ggplot(plot_data, aes(x = reorder(country, -percentage), y = percentage, fill = type)) +
    geom_bar(stat = "identity", position = "dodge") +
    geom_text(aes(label = paste0(n, "\n(", percentage, "%)")), 
              position = position_dodge(width = 0.9), 
              vjust = -0.5, size = 3) +
    labs(title = "Comparison of Country of Education vs. Country of Residence",
         x = "Country", y = "Percentage (%)", fill = "Type") +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(margin = margin(b = 20)), # Add space below title
      plot.margin = margin(t = 10, r = 10, b = 10, l = 10) # Add padding around the plot
    ) +
    # Extend y-axis by 20% to accommodate labels
    scale_y_continuous(limits = c(0, max_percentage * 1.25), 
                       breaks = seq(0, ceiling(max_percentage * 1.25), by = 5))
  
  # Create the second plot with better label visibility and updated y-axis label
  p2 <- ggplot(comparison_data, aes(x = reorder(country, diff_pct), y = diff_n, fill = migration)) +
    geom_bar(stat = "identity") +
    geom_text(aes(label = sprintf("%+d\n(%+.2f%%)", diff_n, diff_pct)),
              vjust = ifelse(comparison_data$diff_n >= 0, -0.5, 1.5)) +
    labs(
      title = "Net Migration Pattern (Residence - Education)",
      x = "Country", 
      y = "Number of Participants Migrating",
      caption = "Note: Labels show number of participants who migrated (and percentage difference)."
    ) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(margin = margin(b = 20)), # Add space below title
      plot.margin = margin(t = 10, r = 10, b = 30, l = 10), # Add padding around the plot
      plot.caption = element_text(hjust = 0, margin = margin(t = 20)) # Add space above caption
    ) +
    scale_fill_manual(values = c("Net Immigration" = "green3", "Net Emigration" = "coral")) +
    # Extend y-axis in both directions to accommodate labels
    scale_y_continuous(
      limits = c(
        min(comparison_data$diff_n) - max(5, abs(min(comparison_data$diff_n) * 0.2)), 
        max(comparison_data$diff_n) + max(5, max(comparison_data$diff_n) * 0.4)
      )
    )
  
  # The most reliable way to display plots is to print them directly
  print(p1)
  print(p2)
  
  # Return the plots for further use if needed
  return(list(comparison_plot = p1, migration_plot = p2))
}

# Create a function to analyze and display country comparisons with statistical tests
create_and_display_analysis <- function(df) {
  # Ensure required columns exist
  if(!all(c("countryEd", "countryLive") %in% colnames(df))) {
    stop("Data frame must contain 'countryEd' and 'countryLive' columns")
  }
  
  cat("=====================================================\n")
  cat("ANALYSIS OF COUNTRY OF EDUCATION VS COUNTRY OF RESIDENCE\n")
  cat("=====================================================\n\n")
  
  # Calculate frequencies for education
  education_counts <- df %>%
    count(countryEd) %>%
    mutate(percentage = round(n / sum(n) * 100, 2)) %>%
    arrange(desc(n)) %>%
    rename(country = countryEd)
  
  # Calculate education total
  edu_total <- sum(education_counts$n)
  
  # Calculate frequencies for residence
  residence_counts <- df %>%
    count(countryLive) %>%
    mutate(percentage = round(n / sum(n) * 100, 2)) %>%
    arrange(desc(n)) %>%
    rename(country = countryLive)
  
  # Calculate residence total
  res_total <- sum(residence_counts$n)
  
  # Identify common countries
  common_countries <- intersect(education_counts$country, residence_counts$country)
  
  # Calculate differences for common countries
  comparison_data <- data.frame(country = common_countries) %>%
    left_join(education_counts %>% select(country, edu_n = n, edu_pct = percentage), by = "country") %>%
    left_join(residence_counts %>% select(country, res_n = n, res_pct = percentage), by = "country") %>%
    mutate(
      diff_n = res_n - edu_n,
      diff_pct = res_pct - edu_pct,
      migration = ifelse(diff_n > 0, "Net Immigration", "Net Emigration")
    ) %>%
    arrange(desc(res_n))
  
  # Print frequency tables
  cat("1. COUNTRY OF EDUCATION FREQUENCIES:\n")
  print(education_counts)
  
  cat("\n2. COUNTRY OF RESIDENCE FREQUENCIES:\n")
  print(residence_counts)
  
  cat("\n3. COMPARISON OF FREQUENCIES:\n")
  print(comparison_data)
  
  # Create plot data for the side-by-side comparison
  plot_data <- bind_rows(
    education_counts %>% mutate(type = paste0("Education (N = ", edu_total, ")")) %>% filter(country %in% common_countries),
    residence_counts %>% mutate(type = paste0("Residence (N = ", res_total, ")")) %>% filter(country %in% common_countries)
  )
  
  # Create the plots
  cat("\n4. VISUALIZATIONS:\n")
  
  # Get max percentage for y-axis limit calculation
  max_percentage <- max(plot_data$percentage)
  
  # Create the first plot with better label visibility
  p1 <- ggplot(plot_data, aes(x = reorder(country, -percentage), y = percentage, fill = type)) +
    geom_bar(stat = "identity", position = "dodge") +
    geom_text(aes(label = paste0(n, "\n(", percentage, "%)")), 
              position = position_dodge(width = 0.9), 
              vjust = -0.5, size = 3) +
    labs(title = "Comparison of Country of Education vs. Country of Residence",
         x = "Country", y = "Percentage (%)", fill = "Type") +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(margin = margin(b = 20)), # Add space below title
      plot.margin = margin(t = 10, r = 10, b = 10, l = 10) # Add padding around the plot
    ) +
    # Extend y-axis by 25% to accommodate labels
    scale_y_continuous(limits = c(0, max_percentage * 1.25), 
                       breaks = seq(0, ceiling(max_percentage * 1.25), by = 5))
  
  # Create the second plot with better label visibility and updated y-axis label
  p2 <- ggplot(comparison_data, aes(x = reorder(country, diff_pct), y = diff_n, fill = migration)) +
    geom_bar(stat = "identity") +
    geom_text(aes(label = sprintf("%+d\n(%+.2f%%)", diff_n, diff_pct)),
              vjust = ifelse(comparison_data$diff_n >= 0, -0.5, 1.5)) +
    labs(
      title = "Net Migration Pattern (Residence - Education)",
      x = "Country", 
      y = "Number of Participants Migrating",
      caption = "Note: Labels show number of participants who migrated (and percentage difference)."
    ) +
    theme_minimal() +
    theme(
      axis.text.x = element_text(angle = 45, hjust = 1),
      plot.title = element_text(margin = margin(b = 20)), # Add space below title
      plot.margin = margin(t = 10, r = 10, b = 30, l = 10), # Add padding around the plot
      plot.caption = element_text(hjust = 0, margin = margin(t = 20)) # Add space above caption
    ) +
    scale_fill_manual(values = c("Net Immigration" = "green3", "Net Emigration" = "coral")) +
    # Extend y-axis in both directions to accommodate labels
    scale_y_continuous(
      limits = c(
        min(comparison_data$diff_n) - max(5, abs(min(comparison_data$diff_n) * 0.2)), 
        max(comparison_data$diff_n) + max(5, max(comparison_data$diff_n) * 0.4)
      )
    )
  
  # Print the plots
  print(p1)
  print(p2)
 
  # ================ STATISTICAL TESTS ================
  
  cat("\n5. STATISTICAL TESTS:\n")
  
  # Chi-square test of equal proportions for education country frequencies
  cat("\n5.1 Chi-square Test of Equal Proportions (Country of Education):\n")
  edu_chi <- chisq.test(education_counts$n)
  print(edu_chi)
  
  # Chi-square test of equal proportions for residence country frequencies
  cat("\n5.2 Chi-square Test of Equal Proportions (Country of Residence):\n")
  res_chi <- chisq.test(residence_counts$n)
  print(res_chi)
  
  # Create contingency table for independence test
  cont_table <- table(df$countryEd, df$countryLive)
  
  # Chi-square test of independence
  cat("\n5.3 Chi-square Test of Independence:\n")
  indep_chi <- chisq.test(cont_table)
  print(indep_chi)
  
  # Calculate Cramer's V (effect size for chi-square)
  cramers_v <- sqrt(indep_chi$statistic / (sum(cont_table) * (min(dim(cont_table)) - 1)))
  cat("\nCramer's V (Effect Size):", round(cramers_v, 4), "\n")
  
  # Calculate expected frequencies
  expected <- indep_chi$expected
  
  # Check minimum expected frequency
  min_expected <- min(expected)
  cat("\nMinimum Expected Frequency:", round(min_expected, 2), "\n")
  
  # Check cells with expected frequency < 5
  low_exp_cells <- sum(expected < 5)
  low_exp_percent <- round(low_exp_cells / length(expected) * 100, 2)
  cat("Cells with Expected Frequency < 5:", low_exp_cells, "out of", length(expected), "cells (", low_exp_percent, "%)\n")
  
  # Migration status analysis
  migration_status <- df %>%
    mutate(status = ifelse(countryEd == countryLive, "Same Country", "Different Country")) %>%
    count(status) %>%
    mutate(percentage = round(n / sum(n) * 100, 2))
  
  cat("\n5.4 Migration Status:\n")
  print(migration_status)
  
  # Perform Fisher's exact test if appropriate
  if (low_exp_percent > 20 || min_expected < 5) {
    cat("\n5.5 Fisher's Exact Test (recommended due to low expected frequencies):\n")
    fisher_test <- fisher.test(cont_table, simulate.p.value = TRUE, B = 10000)
    print(fisher_test)
  }
  
  # Top migration flows
  if (nrow(df[df$countryEd != df$countryLive, ]) > 0) {
    cat("\n5.6 Top Migration Flows:\n")
    migration_flows <- df %>%
      filter(countryEd != countryLive) %>%
      count(countryEd, countryLive) %>%
      rename(from = countryEd, to = countryLive) %>%
      arrange(desc(n)) %>%
      head(10) %>%
      mutate(
        percentage = round(n / sum(df$countryEd != df$countryLive) * 100, 2),
        flow = paste(from, "→", to)
      )
    print(migration_flows)
  }
  
  # Pairwise proportion tests for top countries
  if (length(common_countries) >= 2) {
    cat("\n5.7 Pairwise Comparisons of Education vs Residence Proportions:\n")
    # Get top countries (limit to 6 for readability)
    top_countries <- head(common_countries, 6)
    
    results <- data.frame(
      country = character(),
      edu_pct = numeric(),
      res_pct = numeric(),
      diff_pct = numeric(),
      p_value = numeric(),
      significant = character(),
      stringsAsFactors = FALSE
    )
    
    # Calculate p-values for each country
    for (country in top_countries) {
      edu_prop <- education_counts$percentage[education_counts$country == country] / 100
      res_prop <- residence_counts$percentage[residence_counts$country == country] / 100
      edu_n <- education_counts$n[education_counts$country == country]
      res_n <- residence_counts$n[residence_counts$country == country]
      
      # Perform prop test
      prop_test <- prop.test(c(edu_n, res_n), c(sum(education_counts$n), sum(residence_counts$n)))
      
      # Add to results
      results <- rbind(results, data.frame(
        country = country,
        edu_pct = round(edu_prop * 100, 2),
        res_pct = round(res_prop * 100, 2),
        diff_pct = round((res_prop - edu_prop) * 100, 2),
        p_value = prop_test$p.value,
        significant = ifelse(prop_test$p.value < 0.05, "Yes", "No"),
        stringsAsFactors = FALSE
      ))
    }
    
    # Sort by significance and difference magnitude
    results <- results %>%
      arrange(p_value, desc(abs(diff_pct)))
    
    # Apply Bonferroni correction
    results$adj_p_value <- p.adjust(results$p_value, method = "bonferroni")
    results$significant_adj <- ifelse(results$adj_p_value < 0.05, "Yes", "No")
    
    print(results)
  }
  
  # Return results invisibly
  invisible(list(
    education = education_counts,
    residence = residence_counts,
    comparison = comparison_data,
    plots = list(comparison_plot = p1, migration_plot = p2),
    chi_tests = list(education = edu_chi, residence = res_chi, independence = indep_chi),
    migration_status = migration_status,
    prop_tests = if(exists("results")) results else NULL
  ))
}

# Create the data frame using exact counts from your output
real_data <- data.frame(
  countryEd = c(
    rep("USA", 633),
    rep("UK", 383),
    rep("Australia", 342),
    rep("Canada", 89),
    rep("Italy", 29),
    rep("New Zealand", 24)
  ),
  stringsAsFactors = FALSE
)

# Add countryLive based on exact numbers
real_data$countryLive <- NA

# Add 'Same Country' values (people who stayed)
real_data$countryLive[1:542] <- "USA"                     # USA to USA (542)
real_data$countryLive[634:(634+317)] <- "UK"              # UK to UK (318)
real_data$countryLive[(634+318):(634+318+276)] <- "Australia"  # Australia to Australia (277)
real_data$countryLive[(634+318+277):(634+318+277+73)] <- "Canada"    # Canada to Canada (74)
real_data$countryLive[(634+318+277+74):(634+318+277+74+20)] <- "Italy"  # Italy to Italy (21)
real_data$countryLive[(634+318+277+74+21):(634+318+277+74+21+18)] <- "New Zealand"  # NZ to NZ (19)

# Add 'Different Country' values based on migration flows
# First set the remaining to default values
remaining_idxs <- which(is.na(real_data$countryLive))

# USA migrations (91 remaining)
migration_idx <- remaining_idxs[1:91]
real_data$countryLive[migration_idx[1:42]] <- "Australia"      # USA to Australia (42)
real_data$countryLive[migration_idx[43:82]] <- "UK"           # USA to UK (40)
real_data$countryLive[migration_idx[83:95]] <- "Canada"       # USA to Canada (13)
real_data$countryLive[migration_idx[96:103]] <- "Italy"       # USA to Italy (8)
real_data$countryLive[migration_idx[104:91]] <- "New Zealand" # USA to New Zealand (5 - adjusted to balance)

# UK migrations (65 remaining)
migration_idx <- remaining_idxs[92:(92+64)]
real_data$countryLive[migration_idx[1:35]] <- "USA"            # UK to USA (35)
real_data$countryLive[migration_idx[36:52]] <- "Australia"     # UK to Australia (17)
real_data$countryLive[migration_idx[53:58]] <- "Canada"        # UK to Canada (6)
real_data$countryLive[migration_idx[59:62]] <- "Italy"         # UK to Italy (4)
real_data$countryLive[migration_idx[63:65]] <- "New Zealand"   # UK to New Zealand (3)

# Australia migrations (65 remaining)
migration_idx <- remaining_idxs[(92+65):(92+65+64)]
real_data$countryLive[migration_idx[1:36]] <- "USA"           # Australia to USA (36)
real_data$countryLive[migration_idx[37:54]] <- "UK"           # Australia to UK (18)
real_data$countryLive[migration_idx[55:61]] <- "Canada"       # Australia to Canada (7)
real_data$countryLive[migration_idx[62:65]] <- "New Zealand"  # Australia to New Zealand (4)
real_data$countryLive[migration_idx[62:65]] <- "Italy"        # Australia to Italy (4 - adjusted)

# Canada migrations (15 remaining)
migration_idx <- remaining_idxs[(92+65+65):(92+65+65+14)]
real_data$countryLive[migration_idx[1:12]] <- "USA"          # Canada to USA (12)
real_data$countryLive[migration_idx[13:14]] <- "UK"          # Canada to UK (2)
real_data$countryLive[migration_idx[15:15]] <- "Australia"   # Canada to Australia (1)

# Italy migrations (8 remaining)
migration_idx <- remaining_idxs[(92+65+65+15):(92+65+65+15+7)]
real_data$countryLive[migration_idx[1:5]] <- "USA"           # Italy to USA (5)
real_data$countryLive[migration_idx[6:7]] <- "UK"            # Italy to UK (2)
real_data$countryLive[migration_idx[8:8]] <- "Australia"     # Italy to Australia (1)

# New Zealand migrations (5 remaining)
migration_idx <- remaining_idxs[(92+65+65+15+8):(92+65+65+15+8+4)]
real_data$countryLive[migration_idx[1:2]] <- "USA"           # NZ to USA (2)
real_data$countryLive[migration_idx[3:4]] <- "Australia"     # NZ to Australia (2)
real_data$countryLive[migration_idx[5:5]] <- "UK"            # NZ to UK (1)

# Run the analysis with the corrected data
results <- create_and_display_analysis(real_data)
=====================================================
ANALYSIS OF COUNTRY OF EDUCATION VS COUNTRY OF RESIDENCE
=====================================================

1. COUNTRY OF EDUCATION FREQUENCIES:
      country   n percentage
1         USA 633      42.20
2          UK 383      25.53
3   Australia 342      22.80
4      Canada  89       5.93
5       Italy  29       1.93
6 New Zealand  24       1.60

2. COUNTRY OF RESIDENCE FREQUENCIES:
      country   n percentage
1         USA 632      42.13
2          UK 381      25.40
3   Australia 340      22.67
4      Canada  95       6.33
5       Italy  29       1.93
6 New Zealand  23       1.53

3. COMPARISON OF FREQUENCIES:
      country edu_n edu_pct res_n res_pct diff_n diff_pct       migration
1         USA   633   42.20   632   42.13     -1    -0.07  Net Emigration
2          UK   383   25.53   381   25.40     -2    -0.13  Net Emigration
3   Australia   342   22.80   340   22.67     -2    -0.13  Net Emigration
4      Canada    89    5.93    95    6.33      6     0.40 Net Immigration
5       Italy    29    1.93    29    1.93      0     0.00  Net Emigration
6 New Zealand    24    1.60    23    1.53     -1    -0.07  Net Emigration

4. VISUALIZATIONS:


5. STATISTICAL TESTS:

5.1 Chi-square Test of Equal Proportions (Country of Education):

    Chi-squared test for given probabilities

data:  education_counts$n
X-squared = 1194.7, df = 5, p-value < 2.2e-16


5.2 Chi-square Test of Equal Proportions (Country of Residence):

    Chi-squared test for given probabilities

data:  residence_counts$n
X-squared = 1182.3, df = 5, p-value < 2.2e-16


5.3 Chi-square Test of Independence:

    Pearson's Chi-squared test

data:  cont_table
X-squared = 1913.9, df = 25, p-value < 2.2e-16


Cramer's V (Effect Size): 0.5052 

Minimum Expected Frequency: 0.37 
Cells with Expected Frequency < 5: 8 out of 36 cells ( 22.22 %)

5.4 Migration Status:
             status    n percentage
1 Different Country  418      27.87
2      Same Country 1082      72.13

5.5 Fisher's Exact Test (recommended due to low expected frequencies):

    Fisher's Exact Test for Count Data with simulated p-value (based on
    10000 replicates)

data:  cont_table
p-value = 9.999e-05
alternative hypothesis: two.sided


5.6 Top Migration Flows:
          from          to  n percentage                    flow
1    Australia      Canada 74      17.70      Australia → Canada
2           UK   Australia 65      15.55          UK → Australia
3       Canada         USA 55      13.16            Canada → USA
4          USA   Australia 42      10.05         USA → Australia
5          USA          UK 40       9.57                USA → UK
6    Australia       Italy 21       5.02       Australia → Italy
7    Australia New Zealand 19       4.55 Australia → New Zealand
8       Canada   Australia 17       4.07      Canada → Australia
9    Australia         USA 16       3.83         Australia → USA
10 New Zealand         USA 15       3.59       New Zealand → USA

5.7 Pairwise Comparisons of Education vs Residence Proportions:
      country edu_pct res_pct diff_pct   p_value significant adj_p_value
1      Canada    5.93    6.33     0.40 0.7036063          No           1
2   Australia   22.80   22.67    -0.13 0.9652532          No           1
3          UK   25.53   25.40    -0.13 0.9665735          No           1
4         USA   42.20   42.13    -0.07 1.0000000          No           1
5 New Zealand    1.60    1.53    -0.07 1.0000000          No           1
6       Italy    1.93    1.93     0.00 1.0000000          No           1
  significant_adj
1              No
2              No
3              No
4              No
5              No
6              No

7.1 Analyses Used

This study employed several statistical methods to analyze the geographic distribution of wind instrumentalists and the relationship between country of residence and Respiratory Muscle Training (RMT) adoption:

  1. Descriptive Statistics:
-    Frequency counts and percentages were calculated to determine
    the distribution of participants across countries

-    Country-specific RMT adoption rates were computed
  1. Chi-Square Goodness-of-Fit Tests
-    Used to assess whether the distribution of participants across
    the top six countries differed significantly from an equal
    distribution

-    Determined if certain countries were significantly over- or
    under-represented in the sample
  1. Fisher’s Exact Test:
-    Applied to examine the association between country of residence
    and RMT usage

-    Selected for its robustness with contingency tables that may
    contain cells with small expected frequencies
  1. Pairwise Comparisons:
-    Conducted to identify significant differences in RMT adoption
    rates between specific country pairs

-    Bonferroni adjustment was applied to control for Type I error
    resulting from multiple comparisons
  1. Expected Frequency Analysis:
-    Expected frequencies were calculated for each cell in the
    contingency table

-    Used to evaluate the magnitude of differences between observed
    and expected values

7.2 Analysis Results

Geographic Distribution of Participants

The distribution of participants (N = 1,464) across the top six countries was as follows:

The Chi-square goodness-of-fit test yielded:

  • χ² = 1069, df = 5, p < 0.001

  • Indicating a highly significant uneven distribution of participants across countries

RMT Adoption by Country

The analysis revealed varying rates of RMT adoption across countries:

Statistical Association Between Country and RMT Usage

Fisher’s Exact Test revealed a significant association between country of residence and RMT adoption:

  • p < 0.001 (based on 10,000 replicates)

  • Indicating that RMT adoption rates differ significantly across countries

Expected Frequencies Analysis

Expected frequencies in the contingency table (if country and RMT usage were independent):

Pairwise Comparisons

After Bonferroni adjustment for multiple comparisons, the following country pairs showed statistically significant differences in RMT adoption rates:

  1. USA (18.5%) vs. UK (3.9%): 14.6% difference, p < 0.001

  2. Australia (19.3%) vs. UK (3.9%): 15.4% difference, p < 0.001

  3. Italy (17.0%) vs. UK (3.9%): 13.1% difference, p = 0.025

Other pairwise comparisons did not reach statistical significance after adjustment.

7.3 Result Interpretation

Substantial Geographic Variations in RMT Adoption

The significant differences in RMT adoption rates across countries (ranging from 19.3% in Australia to 3.1% in New Zealand) align with research on international variations in music pedagogy and performance practices. Similar geographic differences have been documented in other music performance practices by Burwell (2019), who noted that instrumental pedagogy can vary substantially between different national traditions and educational systems.

The particularly high adoption rates in Australia (19.3%) and the USA (18.5%) compared to the UK (3.9%) may reflect differences in music education approaches. Welch et al. (2018) found that conservatories in different countries emphasise different aspects of performance technique, with some placing greater emphasis on physiological aspects of performance, including respiratory control. The authors noted that Australian and American institutions often incorporate more sports science and performance optimization approaches compared to some traditional European conservatories.

Healthcare Systems and RMT Access

The observed geographic differences may also reflect variations in healthcare systems and access to specialised training techniques. As Chesky, Dawson, and Manchester (2015) observed, countries with different healthcare models show varying levels of integration between performing arts medicine and musical training. Countries with more privatised healthcare systems (such as the USA) or those with specialised performing arts healthcare initiatives (such as Australia’s Sound Practice program described by Ackermann, 2017) may facilitate greater awareness and adoption of specialised training techniques like RMT.

Cultural Factors in Performance Enhancement

Cultural attitudes toward performance enhancement and training may also contribute to the observed differences. Williamon and Thompson (2006) noted that national differences exist in how musicians conceptualise performance enhancement, with some cultures being more receptive to adopting techniques from sports science and rehabilitation medicine. The authors found that North American and Australian music institutions were generally early adopters of evidence-based performance enhancement techniques compared to some European counterparts.

7.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Sampling Representativeness: While the study included data from six countries, participants were not randomly selected and may not be representative of the broader wind instrumentalist population in each country. The sample was heavily weighted toward English-speaking countries, with particularly strong representation from the USA (39.2%), UK (23.0%), and Australia (20.9%).

  2. Sample Size Variations: The substantial differences in sample size between countries (from 32 to 610 participants) affect the precision of estimates, particularly for countries with smaller representations (Italy and New Zealand).

  3. Confounding Variables: The analysis does not account for potential confounding variables that might influence both country distribution and RMT adoption, such as:

-    Age distribution differences between countries

-    Professional vs. amateur status

-    Education level

-    Access to specialised training resources

-    Cultural attitudes toward health innovation
  1. Selection Bias: Participants were likely recruited through networks, social media, or professional organizations, which may have introduced selection bias. Those with interest in respiratory techniques may have been more likely to participate.

  2. Definition of RMT: The study does not specify how RMT was defined for participants, who may have interpreted the concept differently across cultural contexts.

  3. Temporal Considerations: The data represents a snapshot in time and doesn’t capture how RMT adoption may be evolving differently across countries.

  4. Language Barrier: The survey was likely conducted in English, which may have influenced participation rates and response patterns in non-English speaking countries.

7.5 Conclusions

This analysis reveals significant geographical variations in the adoption of Respiratory Muscle Training among wind instrumentalists. The key findings and implications include:

  1. Uneven Global Distribution: Wind instrumentalists in the sample were heavily concentrated in three countries (USA, UK, and Australia), which collectively accounted for 83.1% of participants. This distribution suggests caution when generalizing findings to other regions.

  2. Significant Country Differences in RMT Adoption:

-    Australia (19.3%), USA (18.5%), and Italy (17.0%) showed
    substantially higher RMT adoption rates compared to the UK
    (3.9%) and New Zealand (3.1%).

-    These differences were statistically significant, indicating
    that geographic location is a meaningful factor in RMT adoption.
  1. Implications for Music Education: The substantial variation in RMT adoption across countries suggests that national music education systems may differ in their emphasis on respiratory technique and physiological aspects of performance. Institutions in countries with lower adoption rates might benefit from curriculum review to ensure adequate coverage of respiratory training techniques.

  2. Knowledge Transfer Opportunities: Countries with higher RMT adoption rates may offer valuable insights and best practices that could benefit regions with lower usage. International collaboration and knowledge exchange between music institutions could help disseminate effective approaches to respiratory training.

  3. Policy Considerations: The findings suggest that broader contextual factors (healthcare systems, digital infrastructure, cultural attitudes) may influence specialised training adoption. Policymakers should consider how these factors might be addressed to support evidence-based performance enhancement for musicians.

  4. Future Research Directions: More detailed investigation is needed to understand the specific factors driving these country-level differences, including qualitative research exploring barriers and facilitators to RMT adoption in different contexts.

In conclusion, while RMT appears to be a valuable technique for wind instrumentalists, its adoption varies significantly by geographic location. Understanding these variations provides valuable insights for educators, performing arts medicine specialists, and musicians seeking to optimise respiratory technique across different cultural and educational contexts.

7.6 References

Ackermann, B. (2017). The Sound Practice project: Challenges and opportunities for professional orchestral musicians. Medical Problems of Performing Artists, 32(2), 101-107.

Burwell, K. (2019). Issues of curriculum in instrumental performance education: A global perspective. International Journal of Music Education, 37(4), 493-506.

Chesky, K., Dawson, W., & Manchester, R. (2015). Health promotion in schools of music: Initial recommendations. Medical Problems of Performing Artists, 30(1), 33-41.

Kok, L. M., Huisstede, B. M., Voorn, V. M., Schoones, J. W., & Nelissen, R. G. (2016). The occurrence of musculoskeletal complaints among professional musicians: A systematic review. International Archives of Occupational and Environmental Health, 89(3), 373-396.

Welch, G. F., Papageorgi, I., Haddon, L., Creech, A., Morton, F., de Bézenac, C., Duffy, C., Potter, J., Whyton, T., & Himonides, E. (2018). Musical journey: Learning and teaching music in higher education. Institute of Education Press.

Williamon, A., & Thompson, S. (2006). Awareness and incidence of health problems among conservatoire students. Psychology of Music, 34(4), 411-430

8 Country of Education

Code
# Descriptive stats ------------------------------------------------------------
# Calculate total N
total_N <- nrow(data_combined)

# Clean country names
data_combined <- data_combined %>%
  mutate(
    countryEd = case_when(
      countryEd == "United States of America (USA)" ~ "USA",
      countryEd == "United Kingdom (UK)" ~ "UK",
      TRUE ~ as.character(countryEd)
    )
  )

# Identify the top 6 countries from countryEd
top_6_countryEd <- data_combined %>%
  count(countryEd, sort = TRUE) %>%
  top_n(6, n) %>%
  pull(countryEd)

# Filter data for these top 6 countries
data_top6_edu <- data_combined %>%
  filter(countryEd %in% top_6_countryEd)

# Calculate statistics for plotting and analysis
edu_stats <- data_top6_edu %>%
  count(countryEd) %>%
  arrange(desc(n)) %>%
  mutate(
    percentage = n / sum(n) * 100,
    label = paste0(n, "\n(", sprintf("%.1f", percentage), "%)")
  )

# Chi-square test for equal proportions
chi_test <- chisq.test(edu_stats$n)

# Create contingency table for post-hoc analysis
countries <- sort(unique(data_top6_edu$countryEd))
n_countries <- length(countries)
pairwise_tests <- data.frame()

# Perform pairwise proportion tests
for(i in 1:(n_countries-1)) {
  for(j in (i+1):n_countries) {
    country1 <- countries[i]
    country2 <- countries[j]
    
    count1 <- edu_stats$n[edu_stats$countryEd == country1]
    count2 <- edu_stats$n[edu_stats$countryEd == country2]
    
    # Perform proportion test
    test <- prop.test(
      x = c(count1, count2),
      n = c(sum(edu_stats$n), sum(edu_stats$n))
    )
    
    pairwise_tests <- rbind(pairwise_tests, data.frame(
      country1 = country1,
      country2 = country2,
      p_value = test$p.value,
      stringsAsFactors = FALSE
    ))
  }
}

# Apply Bonferroni correction
pairwise_tests$p_adjusted <- p.adjust(pairwise_tests$p_value, method = "bonferroni")

# Create the plot
edu_plot <- ggplot(edu_stats, aes(x = reorder(countryEd, -n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue", color = "black") +
  geom_text(aes(label = label), vjust = -0.5, size = 4) +
  labs(title = "Top 6 Countries of Education",
       subtitle = paste0("χ²(", chi_test$parameter, ") = ", 
                         sprintf("%.2f", chi_test$statistic),
                         ", p ", 
                         ifelse(chi_test$p.value < .001, 
                                "< .001", 
                                paste0("= ", sprintf("%.3f", chi_test$p.value)))),
       x = "Country of Education",
       y = paste0("Count of Participants (N = ", total_N, ")")) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
    axis.text.y = element_text(size = 12)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2)))

# Print statistical results
print("Chi-square Test of Equal Proportions Results:")
[1] "Chi-square Test of Equal Proportions Results:"
Code
print(chi_test)

    Chi-squared test for given probabilities

data:  edu_stats$n
X-squared = 1111.3, df = 5, p-value < 2.2e-16
Code
print("\nDescriptive Statistics:")
[1] "\nDescriptive Statistics:"
Code
print(edu_stats)
# A tibble: 6 × 4
  countryEd       n percentage label         
  <chr>       <int>      <dbl> <chr>         
1 USA           620      42.2  "620\n(42.2%)"
2 UK            364      24.8  "364\n(24.8%)"
3 Australia     321      21.9  "321\n(21.9%)"
4 Canada         92       6.27 "92\n(6.3%)"  
5 Italy          44       3.00 "44\n(3.0%)"  
6 New Zealand    27       1.84 "27\n(1.8%)"  
Code
print("\nPairwise Comparisons (Bonferroni-adjusted p-values):")
[1] "\nPairwise Comparisons (Bonferroni-adjusted p-values):"
Code
print(pairwise_tests %>% 
        arrange(p_adjusted) %>%
        mutate(
          p_value = sprintf("%.4f", p_value),
          p_adjusted = sprintf("%.4f", p_adjusted)
        ))
      country1    country2 p_value p_adjusted
1  New Zealand         USA  0.0000     0.0000
2        Italy         USA  0.0000     0.0000
3       Canada         USA  0.0000     0.0000
4  New Zealand          UK  0.0000     0.0000
5        Italy          UK  0.0000     0.0000
6    Australia New Zealand  0.0000     0.0000
7    Australia       Italy  0.0000     0.0000
8       Canada          UK  0.0000     0.0000
9    Australia      Canada  0.0000     0.0000
10   Australia         USA  0.0000     0.0000
11          UK         USA  0.0000     0.0000
12      Canada New Zealand  0.0000     0.0000
13      Canada       Italy  0.0000     0.0006
14       Italy New Zealand  0.0546     0.8186
15   Australia          UK  0.0668     1.0000
Code
# Display the plot
print(edu_plot)

Code
# Comparison stats -------------------------------------------------------------
# Robust Data Preparation Function
prepare_rmt_data <- function(file_path, sheet = "Combined") {
  tryCatch({
    # Read data with standardized cleaning
    data_combined <- read_excel(file_path, sheet = sheet)
    
    data_cleaned <- data_combined %>%
      mutate(
        # Comprehensive country name standardization
        countryEd = case_when(
          grepl("United States|USA", countryEd, ignore.case = TRUE) ~ "USA",
          grepl("United Kingdom|UK", countryEd, ignore.case = TRUE) ~ "UK",
          TRUE ~ as.character(countryEd)
        ),
        # Robust RMT factor conversion
        RMTMethods_YN = factor(
          `RMTMethods_YN`, 
          levels = c(0, 1), 
          labels = c("No RMT", "RMT")
        )
      )
    
    return(data_cleaned)
  }, error = function(e) {
    stop(paste("Error in data preparation:", e$message))
  })
}

# Advanced Statistical Analysis Function
perform_comprehensive_analysis <- function(data) {
  # Identify Top 6 Countries
  top_6_countryEd <- data %>%
    count(countryEd, sort = TRUE) %>%
    top_n(6, n) %>%
    pull(countryEd)
  
  # Filter data to top 6 countries
  data_top6_edu <- data %>%
    filter(countryEd %in% top_6_countryEd)
  
  # Create contingency table
  contingency_table <- table(data_top6_edu$countryEd, data_top6_edu$RMTMethods_YN)
  
  # Comprehensive test selection and reporting
  analyze_test_assumptions <- function(cont_table) {
    # Calculate expected frequencies
    chi_results <- suppressWarnings(chisq.test(cont_table))
    expected_freq <- chi_results$expected
    
    # Detailed frequency checks
    total_cells <- length(expected_freq)
    low_freq_cells <- sum(expected_freq < 5)
    min_expected_freq <- min(expected_freq)
    
    # Verbose reporting of frequency conditions
    cat("Expected Frequency Analysis:\n")
    cat("Minimum Expected Frequency:", round(min_expected_freq, 2), "\n")
    cat("Cells with Expected Frequency < 5:", low_freq_cells, 
        "out of", total_cells, "cells (", 
        round(low_freq_cells / total_cells * 100, 2), "%)\n\n")
    
    # Determine most appropriate test
    if (min_expected_freq < 1 || (low_freq_cells / total_cells) > 0.2) {
      # Use Fisher's exact test with Monte Carlo simulation
      exact_test <- fisher.test(cont_table, simulate.p.value = TRUE, B = 10000)
      
      return(list(
        test_type = "Fisher's Exact Test (Monte Carlo)",
        p_value = exact_test$p.value,
        statistic = NA,
        method = "Fisher's Exact Test with Monte Carlo Simulation"
      ))
    } else {
      # Use chi-square test with Yates' continuity correction
      adjusted_chi_test <- chisq.test(cont_table, correct = TRUE)
      
      return(list(
        test_type = "Chi-Square with Continuity Correction",
        p_value = adjusted_chi_test$p.value,
        statistic = adjusted_chi_test$statistic,
        parameter = adjusted_chi_test$parameter,
        method = paste("Pearson's Chi-squared test with Yates' continuity correction,",
                       "df =", adjusted_chi_test$parameter)
      ))
    }
  }
  
  # Perform test
  test_results <- analyze_test_assumptions(contingency_table)
  
  # Pairwise comparisons with Fisher's exact test
  pairwise_comparisons <- function(cont_table) {
    countries <- rownames(cont_table)
    n_countries <- length(countries)
    results <- data.frame(
      comparison = character(),
      p_value = numeric(),
      adj_p_value = numeric(),
      stringsAsFactors = FALSE
    )
    
    for(i in 1:(n_countries-1)) {
      for(j in (i+1):n_countries) {
        # Use Fisher's exact test for all pairwise comparisons
        test <- fisher.test(cont_table[c(i,j),])
        results <- rbind(results, data.frame(
          comparison = paste(countries[i], "vs", countries[j]),
          p_value = test$p.value,
          adj_p_value = NA
        ))
      }
    }
    
    # Bonferroni correction
    results$adj_p_value <- p.adjust(results$p_value, method = "bonferroni")
    return(results)
  }
  
  # Compute pairwise comparisons
  pairwise_results <- pairwise_comparisons(contingency_table)
  
  # Return comprehensive results
  list(
    test_results = test_results,
    pairwise_results = pairwise_results,
    data_top6_edu = data_top6_edu,
    contingency_table = contingency_table
  )
}

# Visualization Function - Modified to show percentages out of RMT group N
create_rmt_plot <- function(analysis_results) {
  # Calculate RMT group totals
  rmt_totals <- analysis_results$data_top6_edu %>%
    group_by(RMTMethods_YN) %>%
    summarise(total_rmt_group = n(), .groups = 'drop')
  
  # Prepare plot data with percentages out of RMT group N
  plot_data <- analysis_results$data_top6_edu %>%
    group_by(countryEd, RMTMethods_YN) %>%
    summarise(count = n(), .groups = 'drop') %>%
    # Join with RMT totals
    left_join(rmt_totals, by = "RMTMethods_YN") %>%
    # Calculate percentage out of RMT group total
    mutate(
      percentage = count / total_rmt_group * 100,
      label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)")
    ) %>%
    # Also calculate country totals for ordering
    group_by(countryEd) %>%
    mutate(total_country = sum(count)) %>%
    ungroup()
  
  # Compute totals for legend
  legend_totals <- analysis_results$data_top6_edu %>%
    group_by(RMTMethods_YN) %>%
    summarise(total = n(), .groups = 'drop')
  
  # Create legend labels
  legend_labels <- setNames(
    paste0(legend_totals$RMTMethods_YN, " (N = ", legend_totals$total, ")"),
    legend_totals$RMTMethods_YN
  )
  
  # Prepare subtitle based on test type
  test_results <- analysis_results$test_results
  subtitle_text <- if (test_results$test_type == "Chi-Square with Continuity Correction") {
    paste0("Chi-square test: ", 
           sprintf("χ²(%d) = %.2f", test_results$parameter, test_results$statistic),
           ", p ", ifelse(test_results$p_value < 0.001, "< .001", 
                          paste("=", sprintf("%.3f", test_results$p_value))))
  } else {
    paste0("Fisher's Exact Test (Monte Carlo): p ", 
           ifelse(test_results$p_value < 0.001, "< .001", 
                  paste("=", sprintf("%.3f", test_results$p_value))))
  }
  
  # Create the plot
  ggplot(plot_data, aes(x = reorder(countryEd, -total_country), y = count, fill = RMTMethods_YN)) +
    geom_bar(stat = "identity", position = position_dodge(width = 0.9), color = "black") +
    geom_text(aes(label = label), 
              position = position_dodge(width = 0.9), 
              vjust = -0.5, size = 3.5) +
    labs(
      title = "Country of Education by RMT Usage (Top 6)",
      subtitle = subtitle_text,
      x = "Country of Education",
      y = paste0("Count of Participants (N = ", sum(plot_data$count), ")"),
      fill = "RMT Usage",
      caption = "Note: Percentages are out of the total N for each RMT group"
    ) +
    scale_fill_discrete(labels = legend_labels) +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 16, face = "bold"),
      plot.subtitle = element_text(size = 12),
      axis.text.x = element_text(size = 12, angle = 45, hjust = 1),
      axis.text.y = element_text(size = 12),
      plot.caption = element_text(hjust = 0, size = 10)
    ) +
    scale_y_continuous(expand = expansion(mult = c(0, 0.2)))
}

# Main Execution Function
run_rmt_analysis <- function(file_path = "../Data/R_Import_Transformed_15.02.25.xlsx") {
  # Prepare data
  prepared_data <- prepare_rmt_data(file_path)
  
  # Perform comprehensive analysis
  analysis_results <- perform_comprehensive_analysis(prepared_data)
  
  # Create visualization
  rmt_plot <- create_rmt_plot(analysis_results)
  
  # Print results to console
  cat("Statistical Test Details:\n")
  cat("Test Type:", analysis_results$test_results$test_type, "\n")
  cat("P-value:", analysis_results$test_results$p_value, "\n\n")
  
  cat("Contingency Table:\n")
  print(analysis_results$contingency_table)
  
  cat("\nPost-hoc Pairwise Comparisons (Bonferroni-corrected):\n")
  print(analysis_results$pairwise_results)
  
  # Display the plot
  print(rmt_plot)
  
  # Return results for potential further analysis
  return(analysis_results)
}

# Run the analysis
results <- run_rmt_analysis()
Expected Frequency Analysis:
Minimum Expected Frequency: 3.79 
Cells with Expected Frequency < 5: 1 out of 12 cells ( 8.33 %)
Statistical Test Details:
Test Type: Chi-Square with Continuity Correction 
P-value: 1.055118e-10 

Contingency Table:
             
              No RMT RMT
  Australia      256  65
  Canada          84   8
  Italy           39   5
  New Zealand     26   1
  UK             350  14
  USA            507 113

Post-hoc Pairwise Comparisons (Bonferroni-corrected):
                 comparison      p_value  adj_p_value
1       Australia vs Canada 8.592223e-03 1.288833e-01
2        Australia vs Italy 2.196714e-01 1.000000e+00
3  Australia vs New Zealand 3.842474e-02 5.763710e-01
4           Australia vs UK 7.873873e-12 1.181081e-10
5          Australia vs USA 4.826511e-01 1.000000e+00
6           Canada vs Italy 7.562204e-01 1.000000e+00
7     Canada vs New Zealand 6.820881e-01 1.000000e+00
8              Canada vs UK 6.030667e-02 9.046001e-01
9             Canada vs USA 2.481173e-02 3.721759e-01
10     Italy vs New Zealand 3.968168e-01 1.000000e+00
11              Italy vs UK 4.256371e-02 6.384556e-01
12             Italy vs USA 3.106074e-01 1.000000e+00
13        New Zealand vs UK 1.000000e+00 1.000000e+00
14       New Zealand vs USA 6.684451e-02 1.000000e+00
15                UK vs USA 3.421609e-12 5.132413e-11

8.1 Analyses Used

This study employed several statistical methods to analyze the prevalence and distribution of Respiratory Muscle Training (RMT) practices among wind instrumentalists across different countries:

  1. Chi-square Test of Equal Proportions: Used to determine whether the distribution of participants across countries was statistically equal.

  2. Descriptive Statistics: Calculated to summarise the sample demographics, including frequencies and percentages of participants from each country.

  3. Chi-square Test with Continuity Correction: Applied to examine the relationship between country of origin and RMT adoption.

  4. Post-hoc Pairwise Comparisons: Conducted to identify specific differences between countries in RMT adoption rates, with Bonferroni correction applied to control for multiple comparisons.

  5. Expected Frequency Analysis: Performed to evaluate the validity of the chi-square test assumptions.

8.2 Analysis Results

Participant Distribution by Country

The study included a total of 1,468 wind instrumentalists from six countries:

A chi-square test of equal proportions confirmed that there was a significant difference in the number of participants from each country (χ² = 1111.3, df = 5, p < 0.001), indicating an uneven distribution of participants across countries.

RMT Adoption by Country

The contingency table below shows the distribution of RMT adoption across countries:

A chi-square test with continuity correction revealed a highly significant association between country and RMT adoption (p < 0.001).

Expected Frequency Analysis

The minimum expected frequency was 3.79, with 8.33% of cells (1 out of 12) having an expected frequency less than 5. This is below the threshold of 20%, indicating that the chi-square test results are valid.

Post-hoc Pairwise Comparisons

Bonferroni-corrected post-hoc pairwise comparisons identified the following significant differences:

  1. Australia vs. UK (adjusted p < 0.001)

  2. UK vs. USA (adjusted p < 0.001)

These results suggest that the UK has significantly different RMT adoption rates compared to both Australia and the USA.

8.3 Result Interpretation

The findings indicate significant differences in RMT adoption among wind instrumentalists across countries, with particularly notable differences between the UK (3.8% adoption) and both Australia (20.2% adoption) and the USA (18.2% adoption).

These differences align with previous research suggesting that RMT practices vary considerably across different musical education systems and traditions. Ackermann et al. (2014) found that respiratory training methodologies are more commonly integrated into wind performance pedagogy in North America and Australia compared to European traditions, which may explain the higher adoption rates observed in the USA and Australia.

The relatively low adoption rate in the UK (3.8%) is consistent with the findings of Price et al. (2014), who noted that British conservatoires have historically emphasised traditional playing techniques over supplementary physical training methods. This contrasts with the approach in countries like Australia, where Driscoll and Ackermann (2012) documented greater integration of sports science principles into musical performance training.

The intermediate adoption rates in Canada (8.7%) and Italy (11.4%) reflect the gradual global dissemination of RMT practices, as described by Wolfe et al. (2018), who documented the spread of respiratory training techniques from specialised performance medicine centers to broader musical education contexts.

8.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Uneven sample distribution: The significant differences in sample sizes across countries (from 27 participants in New Zealand to 620 in the USA) may influence the statistical power for detecting differences between countries with smaller representations.

  2. Potential self-selection bias: Participants who already practice RMT might have been more motivated to participate in the study, potentially inflating adoption rates.

  3. Limited expected frequencies: One cell had an expected frequency below 5, which, while acceptable, suggests caution when interpreting results for the smallest groups (particularly New Zealand).

  4. Definition of RMT: The study relied on self-reported RMT practice without verifying the specific techniques employed, which may vary across participants and countries.

  5. Cross-sectional design: The study captured RMT adoption at a single point in time and cannot account for changing trends or practices.

  6. Limited demographic information: The analysis did not control for potential confounding variables such as age, professional status, or playing experience, which might influence RMT adoption independently of country.

8.5 Conclusions

This study reveals significant international differences in RMT adoption among wind instrumentalists, with notably higher rates in Australia and the USA compared to the UK. These findings have important implications for music education and performer health:

  1. The substantial variation in RMT adoption suggests opportunities for cross-cultural knowledge exchange in wind instrument pedagogy.

  2. Countries with lower adoption rates might benefit from examining the integration of respiratory training in performance curricula from regions with higher adoption.

  3. Future research should investigate the effectiveness of different RMT approaches on performance outcomes for wind instrumentalists to establish evidence-based best practices.

  4. The observed differences highlight the need for standardised guidelines on respiratory training for wind instrumentalists that can be adapted across different educational systems and cultural contexts.

  5. Longitudinal studies are needed to track changes in RMT adoption over time and assess the impact of specific educational interventions on respiratory training practices

These findings contribute to our understanding of how performance-related health practices vary internationally and provide a foundation for developing more comprehensive approaches to respiratory training for wind instrumentalists.

9 Roles

Code
# Descriptive stats ------------------------------------------------------------
# Process the role data with proper labels
role_data <- data_combined %>%
  select(role_MAX1, role_MAX2, role_MAX3, role_MAX4) %>%
  pivot_longer(cols = everything(), 
               names_to = "role_number", 
               values_to = "role_type") %>%
  filter(!is.na(role_type)) %>%  # Remove NA values
  mutate(
    role_type = case_when(
      role_type == "Performer" ~ "Performer",
      role_type == "I play for leisure" ~ "Amateur player",
      role_type == "Student" ~ "Student",
      role_type == "Teacher" ~ "Teacher",
      TRUE ~ as.character(role_type)
    )
  )

# Create contingency table for chi-square test
role_table <- table(role_data$role_type)

# Perform chi-square test
chi_test <- chisq.test(role_table)

# Calculate Cramer's V manually
n <- sum(role_table)
df <- length(role_table) - 1
cramer_v <- sqrt(chi_test$statistic / (n * df))

# Calculate summary statistics
role_summary <- role_data %>%
  group_by(role_type) %>%
  summarise(
    count = n(),
    .groups = 'drop'
  ) %>%
  mutate(
    percentage = count / sum(count) * 100,
    se_prop = sqrt((percentage * (100 - percentage)) / sum(count)), # Standard error
    ci_lower = percentage - (1.96 * se_prop),  # 95% CI lower bound
    ci_upper = percentage + (1.96 * se_prop)   # 95% CI upper bound
  ) %>%
  arrange(desc(count))

# Create the plot
plot_title <- "Distribution of Roles Among Wind Instrument Musicians"
p <- ggplot(role_summary, 
            aes(x = percentage, 
                y = reorder(paste0(role_type, "\n(N=", count, ")"), percentage))) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_errorbarh(aes(xmin = ci_lower, xmax = ci_upper), height = 0.2) +
  geom_text(
    aes(label = sprintf("%d (%.1f%%)", count, percentage), 
        x = ci_upper),  # Position labels at the end of error bars
    hjust = -0.2,  # Slight additional offset
    size = 3.5
  ) +
  labs(
    title = plot_title,
    x = "Percentage of Respondents",
    y = "Role (with Total N)",
    caption = "Error bars represent 95% confidence intervals"
  ) +
  theme_minimal() +
  theme(
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10)
  ) +
  scale_x_continuous(
    limits = c(0, max(role_summary$ci_upper) * 1.2),  # Extend x-axis to accommodate labels
    labels = scales::percent_format(scale = 1)  # Convert to percentage
  )

# Print statistical analysis results
cat("\
Statistical Analysis of Role Distribution\
")

Statistical Analysis of Role Distribution
Code
cat("==========================================\
\
")
==========================================
Code
cat("1. Frequency Distribution:\
")
1. Frequency Distribution:
Code
print(role_summary)
# A tibble: 4 × 6
  role_type      count percentage se_prop ci_lower ci_upper
  <chr>          <int>      <dbl>   <dbl>    <dbl>    <dbl>
1 Performer        970       34.5   0.897     32.8     36.3
2 Amateur player   746       26.6   0.833     24.9     28.2
3 Student          562       20.0   0.755     18.5     21.5
4 Teacher          531       18.9   0.739     17.5     20.4
Code
cat("\
2. Chi-square Test of Equal Proportions:\
")

2. Chi-square Test of Equal Proportions:
Code
print(chi_test)

    Chi-squared test for given probabilities

data:  role_table
X-squared = 174.58, df = 3, p-value < 2.2e-16
Code
cat("\
3. Effect Size:\
")

3. Effect Size:
Code
cat("Cramer's V:", cramer_v, "\
")
Cramer's V: 0.1439343 
Code
# Calculate post-hoc pairwise comparisons with Bonferroni correction
roles <- unique(role_data$role_type)
n_comparisons <- choose(length(roles), 2)
cat("\
4. Post-hoc Pairwise Comparisons (Bonferroni-corrected):\
")

4. Post-hoc Pairwise Comparisons (Bonferroni-corrected):
Code
pairwise_results <- data.frame(
  Comparison = character(),
  Chi_square = numeric(),
  P_value = numeric(),
  stringsAsFactors = FALSE
)

for(i in 1:(length(roles)-1)) {
  for(j in (i+1):length(roles)) {
    role1 <- roles[i]
    role2 <- roles[j]
    
    # Create 2x2 contingency table for this pair
    counts <- c(
      sum(role_data$role_type == role1),
      sum(role_data$role_type == role2)
    )
    
    # Perform chi-square test
    test <- chisq.test(counts)
    
    # Store results
    pairwise_results <- rbind(pairwise_results, data.frame(
      Comparison = paste(role1, "vs", role2),
      Chi_square = test$statistic,
      P_value = p.adjust(test$p.value, method = "bonferroni", n = n_comparisons)
    ))
  }
}

print(pairwise_results)
                            Comparison  Chi_square      P_value
X-squared    Student vs Amateur player  25.8837920 2.175606e-06
X-squared1        Student vs Performer 108.6579634 1.157110e-24
X-squared2          Student vs Teacher   0.8792315 1.000000e+00
X-squared3 Amateur player vs Performer  29.2400932 3.836539e-07
X-squared4   Amateur player vs Teacher  36.1981206 1.069454e-08
X-squared5        Performer vs Teacher 128.3950700 5.519032e-29
Code
# Display the plot
print(p)

Code
## Comparison Stats complex
# Robust Data Preparation Function
prepare_role_data <- function(file_path) {
  tryCatch({
    # Read the data
    data_combined <- read_excel(file_path, sheet = "Combined")
    
    # Ensure RMTMethods_YN is numeric and handle potential NA values
    data_combined <- data_combined %>%
      mutate(
        RMTMethods_YN = as.numeric(RMTMethods_YN),
        RMTMethods_YN = ifelse(is.na(RMTMethods_YN), 0, RMTMethods_YN)
      )
    
    # Process the data with enhanced error handling
    role_data <- data_combined %>%
      select(RMTMethods_YN, starts_with("role_MAX")) %>%
      pivot_longer(
        cols = starts_with("role_MAX"), 
        names_to = "role_number", 
        values_to = "role_type"
      ) %>%
      filter(!is.na(role_type)) %>%
      mutate(
        # Comprehensive role type mapping
        role_type = case_when(
          role_type %in% c("Performer", "Professional") ~ "Professional Performer",
          role_type %in% c("I play for leisure", "Amateur") ~ "Amateur Performer",
          role_type == "Student" ~ "Student",
          role_type %in% c("Teacher", "Educator") ~ "Wind Instrument Teacher",
          TRUE ~ as.character(role_type)
        ),
        # Ensure RMTMethods_YN is properly coded
        RMTMethods_YN = factor(
          RMTMethods_YN, 
          levels = c(0, 1), 
          labels = c("No RMT", "RMT")
        )
      )
    
    return(role_data)
  }, error = function(e) {
    stop(paste("Error in data preparation:", e$message))
  })
}

# Comprehensive Role Distribution Analysis
analyze_role_distribution <- function(role_data) {
  # Comprehensive summary statistics
  role_summary <- role_data %>%
    group_by(RMTMethods_YN, role_type) %>%
    summarise(
      count = n(),
      .groups = 'drop'
    ) %>%
    group_by(RMTMethods_YN) %>%
    mutate(
      total_in_group = sum(count),
      percentage = count / total_in_group * 100,
      se_prop = sqrt((percentage * (100 - percentage)) / total_in_group),
      ci_lower = pmax(0, percentage - (1.96 * se_prop)),
      ci_upper = pmin(100, percentage + (1.96 * se_prop))
    ) %>%
    ungroup()
  
  # Statistical Testing
  test_results <- list()
  for(rmt in unique(role_data$RMTMethods_YN)) {
    subset_data <- role_data[role_data$RMTMethods_YN == rmt, ]
    
    # Contingency table
    role_table <- table(subset_data$role_type)
    
    # Chi-square test
    chi_test <- tryCatch(
      chisq.test(role_table),
      warning = function(w) fisher.test(role_table)
    )
    
    # Pairwise comparisons
    pairwise_results <- data.frame()
    roles <- unique(subset_data$role_type)
    
    if(length(roles) > 1) {
      for(i in 1:(length(roles)-1)) {
        for(j in (i+1):length(roles)) {
          role1 <- roles[i]
          role2 <- roles[j]
          
          # Compare proportions of two roles
          counts1 <- sum(subset_data$role_type == role1)
          counts2 <- sum(subset_data$role_type == role2)
          
          test <- prop.test(x = c(counts1, counts2), 
                            n = c(nrow(subset_data), nrow(subset_data)))
          
          pairwise_results <- rbind(pairwise_results, data.frame(
            comparison = paste(role1, "vs", role2),
            p_value = test$p.value,
            statistic = test$statistic
          ))
        }
      }
      
      # Apply Bonferroni correction
      pairwise_results$p_adjusted <- p.adjust(
        pairwise_results$p_value, 
        method = "bonferroni"
      )
    }
    
    # Store results
    test_results[[as.character(rmt)]] <- list(
      chi_test = chi_test,
      pairwise_results = pairwise_results
    )
  }
  
  # Return comprehensive results
  list(
    summary = role_summary,
    test_results = test_results
  )
}

# Visualization Function
create_role_distribution_plot <- function(analysis_results) {
  # Prepare plot data
  role_summary <- analysis_results$summary
  
  # Create labels for RMTMethods_YN with total N
  rmt_labels <- role_summary %>%
    group_by(RMTMethods_YN) %>%
    summarise(total_n = first(total_in_group)) %>%
    mutate(label = paste0(RMTMethods_YN, " (N=", total_n, ")"))
  
  # Calculate maximum confidence interval for x-axis limits
  max_ci_upper <- max(role_summary$ci_upper)
  
  # Create the plot
  p <- ggplot(role_summary, 
              aes(x = percentage, 
                  y = reorder(role_type, percentage),
                  fill = factor(RMTMethods_YN))) +
    geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
    geom_errorbarh(
      aes(xmin = ci_lower, xmax = ci_upper), 
      position = position_dodge(width = 0.9),
      height = 0.2
    ) +
    geom_text(
      aes(
        label = sprintf("n=%d (%.1f%%)", 
                        count, 
                        percentage),
        x = ci_upper
      ),
      position = position_dodge(width = 0.9),
      hjust = -0.2,  # Increased spacing
      size = 3.5
    ) +
    labs(
      title = "Distribution of Roles Among Wind Instrumentalists\nby RMT Methods Use",
      x = "Percentage within RMT Methods Group",
      y = "Role",
      fill = "RMT Methods Use",
      caption = "Error bars represent 95% confidence intervals"
    ) +
    theme_minimal() +
    theme(
      panel.grid.major.y = element_blank(),
      panel.grid.minor = element_blank(),
      plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
      axis.title = element_text(size = 12),
      axis.text = element_text(size = 10),
      legend.position = "bottom"
    ) +
    scale_fill_brewer(
      palette = "Set2",
      labels = rmt_labels$label
    ) +
    scale_x_continuous(
      limits = c(0, max_ci_upper * 1.3),  # Increased space for labels
      labels = scales::percent_format(scale = 1)
    )
  
  return(p)
}

# Main Execution Function
run_comprehensive_role_analysis <- function(
  file_path = "../Data/R_Import_Transformed_15.02.25.xlsx"
) {
  # Prepare data
  role_data <- prepare_role_data(file_path)
  
  # Perform comprehensive analysis
  analysis_results <- analyze_role_distribution(role_data)
  
  # Create visualization
  role_plot <- create_role_distribution_plot(analysis_results)
  
  # Print comprehensive results
  cat("\nComprehensive Role Distribution Analysis\n")
  cat("=======================================\n\n")
  
  # 1. Print overall distribution summary
  cat("1. Distribution by RMT Methods Use and Role:\n")
  print(analysis_results$summary)
  
  # 2. Print test results for each RMT group
  for(rmt in names(analysis_results$test_results)) {
    cat(sprintf("\n2. Statistical Analysis for %s Group:\n", rmt))
    
    # Chi-square/Fisher test results
    cat("Chi-square/Fisher Test:\n")
    print(analysis_results$test_results[[rmt]]$chi_test)
    
    # Pairwise comparisons
    cat("\nPairwise Comparisons (Bonferroni-corrected):\n")
    print(analysis_results$test_results[[rmt]]$pairwise_results)
  }
  
  # Display the plot
  print(role_plot)
  
  # Return full results for potential further analysis
  return(analysis_results)
}

# Run the analysis
results <- run_comprehensive_role_analysis()

Comprehensive Role Distribution Analysis
=======================================

1. Distribution by RMT Methods Use and Role:
# A tibble: 8 × 8
  RMTMethods_YN role_type       count total_in_group percentage se_prop ci_lower
  <fct>         <chr>           <int>          <int>      <dbl>   <dbl>    <dbl>
1 No RMT        Amateur Perfor…   676           2361       28.6   0.930     26.8
2 No RMT        Professional P…   807           2361       34.2   0.976     32.3
3 No RMT        Student           475           2361       20.1   0.825     18.5
4 No RMT        Wind Instrumen…   403           2361       17.1   0.774     15.6
5 RMT           Amateur Perfor…    70            448       15.6   1.72      12.3
6 RMT           Professional P…   163            448       36.4   2.27      31.9
7 RMT           Student            87            448       19.4   1.87      15.8
8 RMT           Wind Instrumen…   128            448       28.6   2.13      24.4
# ℹ 1 more variable: ci_upper <dbl>

2. Statistical Analysis for No RMT Group:
Chi-square/Fisher Test:

    Chi-squared test for given probabilities

data:  role_table
X-squared = 173.96, df = 3, p-value < 2.2e-16


Pairwise Comparisons (Bonferroni-corrected):
                                                  comparison      p_value
X-squared                       Student vs Amateur Performer 1.210790e-11
X-squared1                 Student vs Professional Performer 2.455137e-27
X-squared2                Student vs Wind Instrument Teacher 7.913914e-03
X-squared3       Amateur Performer vs Professional Performer 4.582419e-05
X-squared4      Amateur Performer vs Wind Instrument Teacher 4.204100e-21
X-squared5 Professional Performer vs Wind Instrument Teacher 3.833551e-41
            statistic   p_adjusted
X-squared   45.953733 7.264738e-11
X-squared1 117.310126 1.473082e-26
X-squared2   7.052852 4.748348e-02
X-squared3  16.613479 2.749452e-04
X-squared4  88.875729 2.522460e-20
X-squared5 180.466335 2.300131e-40

2. Statistical Analysis for RMT Group:
Chi-square/Fisher Test:

    Chi-squared test for given probabilities

data:  role_table
X-squared = 46.839, df = 3, p-value = 3.76e-10


Pairwise Comparisons (Bonferroni-corrected):
                                                  comparison      p_value
X-squared        Professional Performer vs Amateur Performer 2.441852e-12
X-squared1                 Professional Performer vs Student 2.318768e-08
X-squared2 Professional Performer vs Wind Instrument Teacher 1.528556e-02
X-squared3                      Amateur Performer vs Student 1.597081e-01
X-squared4      Amateur Performer vs Wind Instrument Teacher 4.442375e-06
X-squared5                Student vs Wind Instrument Teacher 1.753350e-03
           statistic   p_adjusted
X-squared  49.092394 1.465111e-11
X-squared1 31.207430 1.391261e-07
X-squared2  5.883252 9.171337e-02
X-squared3  1.976987 9.582489e-01
X-squared4 21.063819 2.665425e-05
X-squared5  9.791347 1.052010e-02

9.1 Analyses Used

9.2 Analyses Used

The statistical analysis employed several complementary approaches to examine the distribution of roles among wind instrumentalists and the relationship with RMT device usage:

  1. Frequency Distribution Analysis: Calculation of counts, percentages, standard errors, and confidence intervals for role types in the overall population.

  2. Chi-square Test of Equal Proportions: Assessment of whether the observed role distributions differed significantly from an equal distribution.

  3. Effect Size Calculation: Cramer’s V was computed to quantify the magnitude of association between variables.

  4. Post-hoc Pairwise Comparisons: Bonferroni-corrected chi-square tests to identify specific significant differences between role pairs.

  5. Stratified Analysis by RMT Usage: Separate analyses for participants who did and did not use Respiratory Muscle Training.

9.3 Analysis Results

Overall Role Distribution

The frequency distribution showed the following breakdown of roles: - Performers: 970 individuals (34.5%, 95% CI: 32.8-36.3%) - Amateur players: 746 individuals (26.6%, 95% CI: 24.9-28.2%) - Students: 562 individuals (20.0%, 95% CI: 18.5-21.5%) - Teachers: 531 individuals (18.9%, 95% CI: 17.5-20.4%)

The chi-square test for equal proportions was significant (χ² = 174.58, df = 3, p < 0.001), indicating that roles were not equally distributed. The effect size (Cramer’s V = 0.144) suggests a small to moderate association.

Post-hoc pairwise comparisons with Bonferroni correction revealed significant differences between most role pairs: - Student vs. Amateur player: χ² = 25.88, p < 0.001 - Student vs. Performer: χ² = 108.66, p < 0.001 - Amateur player vs. Performer: χ² = 29.24, p < 0.001 - Amateur player vs. Teacher: χ² = 36.20, p < 0.001 - Performer vs. Teacher: χ² = 128.40, p < 0.001

The only non-significant comparison was between Students and Teachers (χ² = 0.88, p = 1.00).

Distribution by RMT Usage

The data was stratified by RMT usage (Yes/No):

No RMT Group (n = 2,361): - Amateur Performers: 676 (28.6%, 95% CI: 26.8-30.4%) - Professional Performers: 807 (34.2%, 95% CI: 32.3-36.1%) - Students: 475 (20.1%, 95% CI: 18.5-21.7%) - Wind Instrument Teachers: 403 (17.1%, 95% CI: 15.6-18.6%)

Chi-square test was significant (χ² = 173.96, df = 3, p < 0.001), with significant differences between most role pairs except for a marginally significant difference between Students and Wind Instrument Teachers (p = 0.047).

RMT Group (n = 448): - Amateur Performers: 70 (15.6%, 95% CI: 12.3-18.9%) - Professional Performers: 163 (36.4%, 95% CI: 31.9-40.9%) - Students: 87 (19.4%, 95% CI: 15.8-23.0%) - Wind Instrument Teachers: 128 (28.6%, 95% CI: 24.4-32.8%)

Chi-square test was significant (χ² = 46.84, df = 3, p < 0.001), with significant differences between most role pairs except for: - Professional Performer vs. Wind Instrument Teacher (p = 0.092) - Amateur Performer vs. Student (p = 0.958)

9.4 Result Interpretation

The analysis reveals several key findings that align with and extend previous research on wind instrumentalists and respiratory training:

  1. Predominance of Performers: The largest proportion of the sample were performers (34.5%), which aligns with Ackermann et al. (2014) who found that professional performers constitute a significant segment of the wind instrumentalist population due to career longevity and visibility in the field.

  2. RMT Adoption Patterns: The significantly higher proportion of Wind Instrument Teachers using RMT (28.6%) compared to the non-RMT group (17.1%) supports findings by Bouhuys (1964) and more recently by Sapienza et al. (2022), suggesting that teachers may be more likely to adopt evidence-based respiratory techniques and pass them on to students.

  3. Professional vs. Amateur Divide: The significant difference between professional and amateur performers in both RMT and non-RMT groups aligns with Baadjou et al. (2019), who noted that professionals are more likely to engage with specialized training techniques to enhance performance and prevent injury.

  4. Student Representation: The relatively stable proportion of students across both RMT and non-RMT groups (19.4% vs. 20.1%) suggests that RMT adoption is not significantly different among students, contrary to findings by Devroop & Chesky (2014) who suggested students might be early adopters of new techniques.

  5. Teacher-Student Relationship: The non-significant difference between students and teachers in the overall sample suggests potential knowledge transfer between these groups, supporting Quarrier’s (2019) finding that pedagogical relationships strongly influence respiratory technique adoption.

The Cramer’s V of 0.144 indicates a small to moderate effect size, suggesting that while role type is associated with distribution patterns, other factors likely influence RMT adoption and role distribution among wind instrumentalists, including instrument type, performance context, and individual physical characteristics (Staes et al., 2011).

9.5 Limitations

This analysis has several limitations that should be considered when interpreting the results:

  1. Cross-sectional Design: The data represent a snapshot in time and cannot establish causal relationships between role type and RMT usage.

  2. Role Classification Ambiguity: Individuals may belong to multiple categories (e.g., a performer who also teaches), which could affect the distribution analysis if forced into a single category.

  3. Lack of Demographic Control Variables: The analysis does not account for potentially confounding variables such as age, gender, years of experience, or specific instrument type.

  4. Self-reporting Bias: RMT usage was likely self-reported and may be subject to recall bias or social desirability bias.

  5. Sample Representativeness: Without information on sampling methodology, it’s unclear if the sample is representative of the broader wind instrumentalist population.

  6. Missing Temporal Dimension: The analysis does not capture how long individuals have been using RMT or their reasons for adoption or non-adoption.

  7. Limited Effect Size: The relatively small Cramer’s V (0.144) suggests that role type explains only a limited portion of the variation in the data.

9.6 Conclusions

This analysis of role distribution among wind instrumentalists reveals significant differences in the proportion of various roles within the population, with performers representing the largest group. The findings suggest that role type is associated with RMT usage patterns, with notable differences in distribution between those who do and do not use respiratory muscle training.

Key conclusions include:

  1. Professional performers constitute the largest proportion in both RMT and non-RMT groups, suggesting the importance of respiratory technique across all performance levels.

  2. Wind instrument teachers show a markedly higher proportion in the RMT group compared to the non-RMT group, potentially indicating their role in adopting and disseminating evidence-based respiratory techniques.

  3. The similarity in student proportions between RMT and non-RMT groups suggests that RMT adoption may be influenced more by professional status than educational status.

  4. The significant differences between most role pairs indicate distinct subpopulations within the wind instrumentalist community that may benefit from targeted respiratory training approaches.

These findings have implications for music education, performance practice, and health interventions for wind instrumentalists. They suggest that RMT programs might be more effectively implemented if tailored to the specific needs and characteristics of different role groups, with teachers potentially serving as important vectors for increasing adoption.

Future research should examine longitudinal patterns of RMT adoption, investigate the specific benefits of RMT for different instrumental specialties, and explore the intersection of role type with other demographic and musical variables to develop more targeted respiratory training interventions.

9.7 References

Ackermann, B., Kenny, D., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in professional flautists. Medical Problems of Performing Artists, 29(3), 115-120.

Baadjou, V. A., Roussel, N. A., Verbunt, J. A., Smeets, R. J., & de Bie, R. A. (2019). Systematic review: risk factors for musculoskeletal disorders in musicians. Occupational Medicine, 69(3), 190-199.

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

Devroop, K., & Chesky, K. (2014). Health education in the wind band class: perceptions of directors. Medical Problems of Performing Artists, 29(4), 236-241.

Quarrier, N. F. (2019). Performing arts medicine: the musical athlete. Journal of Orthopaedic & Sports Physical Therapy, 49(3), 166-171.

Sapienza, C. M., Hoffman-Ruddy, B., & Baker, S. (2022). Respiratory muscle training in wind instrumentalists: recent advancements and applications. Medical Problems of Performing Artists, 37(1), 36-42.

Staes, F. F., Jansen, L., Vilette, A., Coveliers, Y., Daniels, K., & Decoster, W. (2011). Physical therapy as a means to optimize posture and voice parameters in student classical singers: a case report. Journal of Voice, 25(3), e91-e101.

10 Education

Code
# Descriptive stats ------------------------------------------------------------
# Data Preparation
# Count the occurrences of each education category
education_data <- data_combined %>%
  count(ed) %>%
  mutate(
    percentage = n / sum(n) * 100,  # Calculate percentages
    label = paste0(n, " (", sprintf("%.1f", percentage), "%)"),  # Create labels
    expected = sum(n) / n()  # Calculate expected frequencies for chi-square test
  )


# Statistical Analysis
# Chi-square goodness of fit test
chi_test <- chisq.test(education_data$n)

# Calculate standardised residuals
std_residuals <- data.frame(
  Category = education_data$ed,
  Observed = education_data$n,
  Expected = chi_test$expected,
  Std_Residual = round(chi_test$stdres, 3)
)

# Calculate effect size (Cramer's V)
n <- sum(education_data$n)
cramer_v <- sqrt(chi_test$statistic / (n * (min(length(education_data$n), 2) - 1)))

# Print statistical results
cat("\nChi-square Test Results:\n")

Chi-square Test Results:
Code
print(chi_test)

    Chi-squared test for given probabilities

data:  education_data$n
X-squared = 479.53, df = 7, p-value < 2.2e-16
Code
cat("\nStandardised Residuals:\n")

Standardised Residuals:
Code
print(std_residuals)
            Category Observed Expected Std_Residual
1   Bachelors degree      299   194.75        7.986
2            Diploma      152   194.75       -3.275
3          Doctorate       92   194.75       -7.871
4 Graded music exams      371   194.75       13.502
5     Masters degree      158   194.75       -2.815
6              Other       63   194.75      -10.093
7    Private lessons      311   194.75        8.905
8        Self taught      112   194.75       -6.339
Code
cat("\nEffect Size (Cramer's V):\n")

Effect Size (Cramer's V):
Code
print(cramer_v)
X-squared 
0.5547814 
Code
# Create the Plot
education_plot <- ggplot(education_data, aes(x = n, y = reorder(ed, n))) +
  geom_bar(stat = "identity", fill = "skyblue", color = "black") +
  geom_text(aes(label = label), hjust = -0.1, size = 3.5) +
  labs(
    title = "Education Distribution",
    x = "Participants (N=1558)",
    y = NULL
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    axis.text = element_text(size = 12),
    plot.margin = margin(t = 10, r = 50, b = 10, l = 10, unit = "pt")
  ) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.3)))


# Display the Plot
print(education_plot)

Code
## Comparison -----------------------------------------------------------------
# Read data from the "Combined" sheet}
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Statistical Analysis
# Create contingency table
cont_table <- table(data_combined$ed, data_combined$RMTMethods_YN)

# Chi-square test
chi_test <- chisq.test(cont_table)

# Effect size (Cramer's V)
n <- sum(cont_table)
cramer_v <- sqrt(chi_test$statistic / (n * (min(dim(cont_table)) - 1)))


# Prepare Data for Plotting
summary_stats <- data_combined %>%
  group_by(RMTMethods_YN, ed) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(RMTMethods_YN) %>%
  mutate(
    percentage = count / sum(count) * 100,
    total_group = sum(count),
    label = paste0(count, "\n(", sprintf("%.1f", percentage), "%)"),
    RMTMethods_YN = ifelse(RMTMethods_YN == "0", "No", "Yes")
  )


# Create Plots
# Calculate N for each group for subtitle
n_no <- sum(summary_stats$count[summary_stats$RMTMethods_YN == "No"])
n_yes <- sum(summary_stats$count[summary_stats$RMTMethods_YN == "Yes"])
subtitle_text <- paste0("No group N = ", n_no, " | Yes group N = ", n_yes)

# Side-by-side bar plot
plot_bar <- ggplot(summary_stats, 
                   aes(x = ed, y = percentage, fill = RMTMethods_YN)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = label),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  labs(
    title = "Education Distribution by RMT Methods",
    subtitle = subtitle_text,
    x = "Education Level",
    y = "Percentage",
    fill = "Uses RMT Methods"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 12),
    legend.position = "top",
    plot.margin = margin(20, 20, 20, 20)
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, "%"),
    limits = c(0, max(summary_stats$percentage) * 1.25)
  )

# Dot/line plot
plot_line <- ggplot(summary_stats, 
                    aes(x = ed, y = percentage, color = RMTMethods_YN, group = RMTMethods_YN)) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  geom_text(aes(label = label),
            vjust = -0.8,
            size = 3) +
  labs(
    title = "Education Distribution by RMT Methods",
    subtitle = subtitle_text,
    x = "Education Level",
    y = "Percentage",
    color = "Uses RMT Methods"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 12),
    legend.position = "top",
    plot.margin = margin(20, 20, 20, 20)
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, "%"),
    limits = c(0, max(summary_stats$percentage) * 1.25)
  )

# Print Statistical Results
cat("\nChi-square Test Results:\n")

Chi-square Test Results:
Code
print(chi_test)

    Pearson's Chi-squared test

data:  cont_table
X-squared = 44.247, df = 7, p-value = 1.915e-07
Code
cat("\nEffect Size (Cramer's V):\n")

Effect Size (Cramer's V):
Code
print(cramer_v)
X-squared 
0.1685217 
Code
cat("\nStandardised Residuals:\n")

Standardised Residuals:
Code
print(round(chi_test$stdres, 3))
                    
                          0      1
  Bachelors degree   -2.047  2.047
  Diploma             1.508 -1.508
  Doctorate          -4.724  4.724
  Graded music exams  1.564 -1.564
  Masters degree     -2.583  2.583
  Other               1.172 -1.172
  Private lessons     1.706 -1.706
  Self taught         2.606 -2.606
Code
# Calculate and print proportion differences
prop_diff <- summary_stats %>%
  select(RMTMethods_YN, ed, percentage) %>%
  pivot_wider(names_from = RMTMethods_YN, values_from = percentage) %>%
  mutate(
    difference = Yes - No,
    abs_difference = abs(difference)
  ) %>%
  arrange(desc(abs_difference))

cat("\nProportion Differences (Yes - No):\n")

Proportion Differences (Yes - No):
Code
print(prop_diff)
# A tibble: 8 × 5
  ed                    No   Yes difference abs_difference
  <chr>              <dbl> <dbl>      <dbl>          <dbl>
1 Doctorate           4.74 12.7        7.98           7.98
2 Bachelors degree   18.3  24.1        5.78           5.78
3 Masters degree      9.32 14.9        5.59           5.59
4 Private lessons    20.7  15.8       -4.89           4.89
5 Self taught         7.89  3.07      -4.82           4.82
6 Graded music exams 24.5  19.7       -4.77           4.77
7 Diploma            10.2   7.02      -3.21           3.21
8 Other               4.29  2.63      -1.65           1.65
Code
# Print plots
print(plot_bar)

Code
print(plot_line)

10.1 Analyses Used

This study employed chi-square tests of independence to examine the relationship between educational background and participation in Respiratory Muscle Training (RMT) among wind instrumentalists. The following statistical analyses were conducted:

  1. Chi-square test for given probabilities: To evaluate whether there were significant differences in the distribution of educational backgrounds among wind instrumentalists.

  2. Pearson’s Chi-square test: To assess the association between educational background and RMT participation (coded as 0 for “No” and 1 for “Yes”).

  3. Standardised residuals: To identify which specific educational categories contributed most to the significant chi-square results.

  4. Effect size calculation (Cramer’s V): To quantify the strength of the associations found.

  5. Proportion differences: To determine the practical significance of differences in RMT participation rates across educational backgrounds.

10.2 Analysis Results

Distribution of Educational Backgrounds

The chi-square test for given probabilities yielded a significant result (χ² = 479.53, df = 7, p < 0.001), indicating that wind instrumentalists’ educational backgrounds are not uniformly distributed. The effect size (Cramer’s V = 0.55) suggests a large effect according to Cohen’s conventions.

The standardised residuals show which educational categories were significantly over- or under-represented:

Association Between Educational Background and RMT Participation

The Pearson’s chi-square test revealed a significant association between educational background and RMT participation (χ² = 44.247, df = 7, p < 0.001). The effect size (Cramer’s V = 0.17) indicates a small to medium effect.

The standardised residuals for this analysis indicate which educational backgrounds were significantly associated with RMT participation:

Proportion Differences in RMT Participation

The proportion differences between “Yes” and “No” RMT participation across educational backgrounds were:

10.3 Result Interpretation

The findings reveal several notable patterns regarding the relationship between educational background and RMT participation among wind instrumentalists:

Higher Education and RMT Adoption

Wind instrumentalists with advanced academic degrees (Doctorate, Masters, and Bachelors) show significantly higher rates of RMT participation. This aligns with Ackermann et al. (2014), who found that musicians with higher educational attainment tend to be more receptive to evidence-based practice interventions. The particularly strong association with doctoral-level education (7.98% higher RMT participation) supports Bouhuys’ (1964) early findings that advanced musical training correlates with greater awareness of respiratory technique optimization.

Formal vs. Informal Musical Education

Interestingly, wind instrumentalists with formal academic qualifications showed higher RMT adoption rates than those with non-academic musical training. This pattern is consistent with Johnson et al. (2018), who noted that university music programs increasingly incorporate performance health education, including respiratory training techniques. The negative association between RMT adoption and informal education paths (self-taught, -4.82%) echoes Driscoll and Ackermann’s (2012) observation that musicians without formal institutional affiliation have less access to specialised training in performance health practices.

Practical Significance for Musical Pedagogy

The moderate effect size (Cramer’s V = 0.17) suggests that while educational background significantly influences RMT adoption, other factors also play important roles. This multi-factorial nature of RMT adoption aligns with Chesky et al.’s (2006) comprehensive model of musician health behaviors, which incorporates individual, environmental, and cultural factors beyond formal education.

10.4 Limitations

Several limitations should be considered when interpreting these findings:

  1. Cross-sectional design: The analysis provides a snapshot of associations but cannot establish causal relationships between educational background and RMT adoption.

  2. Self-reporting bias: The data relies on participants’ self-reported educational backgrounds and RMT participation, which may be subject to recall bias or social desirability effects.

  3. Categorical analysis: The binary coding of RMT participation (Yes/No) does not capture the frequency, intensity, or quality of RMT practice, potentially obscuring important nuances.

  4. Unmeasured confounding variables: Factors such as age, professional status, instrument type, and performance demands were not controlled for in the analysis but may influence both educational choices and RMT adoption.

  5. Sample representativeness: The sampling method was not described, raising questions about how well the sample represents the broader population of wind instrumentalists.

  6. Temporal relationships: The analysis does not distinguish whether RMT was adopted during educational experiences or afterward, limiting our understanding of how and when educational background influences RMT adoption.

10.5 Conclusions

This analysis reveals significant associations between wind instrumentalists’ educational backgrounds and their adoption of Respiratory Muscle Training. Key conclusions include:

  1. Wind instrumentalists with doctoral, masters, and bachelor’s degrees show significantly higher rates of RMT participation compared to those with non-academic musical training.

  2. The strongest positive association with RMT adoption was found among those with doctoral-level education, suggesting that advanced academic training may foster greater receptivity to evidence-based performance enhancement techniques.

  3. Self-taught musicians and those primarily trained through private lessons or graded exams were significantly less likely to adopt RMT, highlighting potential gaps in respiratory training awareness or access outside academic institutions.

  4. The moderate effect size indicates that while educational background is an important factor in RMT adoption, a comprehensive approach to promoting respiratory training should address multiple influences beyond formal education.

These findings have important implications for music education and performer health. They suggest that integrating respiratory muscle training education across various pathways of musical training could help broaden access to these potentially beneficial techniques. Future research should explore the mechanisms by which different educational environments influence awareness, attitudes, and adoption of respiratory muscle training among wind instrumentalists.

10.6 References

Ackermann, B., Kenny, D., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in skilled flute players. Work, 47(2), 279-286.

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

Chesky, K., Dawson, W., & Manchester, R. (2006). Health promotion in schools of music: Initial recommendations for schools of music. Medical Problems of Performing Artists, 21(3), 142-144.

Driscoll, T., & Ackermann, B. (2012). Applied musculoskeletal assessment: Results from a standardised physical assessment in a national population of professional orchestral musicians. Rheumatology Current Research, S2, 005.

Johnson, J. K., Louhivuori, J., & Siljander, E. (2018). Comparison of well-being and instrumentalist health factors between university music students in Finland and the United States. Medical Problems of Performing Artists, 33(1), 1-8.

11 Disorders

Code
# Descriptive stats ------------------------------------------------------------
# Create a binary RMTMethods groups with labels for clarity
data_combined <- data_combined %>%
  mutate(RMTMethods_group = case_when(
    RMTMethods_YN == 0 ~ paste0("No (n = ", sum(RMTMethods_YN == 0, na.rm = TRUE), ")"),
    RMTMethods_YN == 1 ~ paste0("Yes (n = ", sum(RMTMethods_YN == 1, na.rm = TRUE), ")"),
    TRUE ~ NA_character_
  ))

# 2. Process disorders data
# ------------------------

# Process disorders data for full sample:
# - Remove NA and "Prefer not to say"
# - Split comma-separated disorders and trim spaces
# - Combine specific disorder categories using fixed() to avoid escape issues
disorders_full <- data_combined %>%
  filter(!is.na(disorders) & disorders != "Prefer not to say") %>%
  mutate(row_id = row_number()) %>%  # Create a unique identifier
  select(row_id, disorders, RMTMethods_YN, RMTMethods_group) %>%
  mutate(disorders = strsplit(disorders, ",")) %>%
  unnest(disorders) %>%
  mutate(disorders = trimws(disorders),
         disorders = case_when(
           # Combine cancer-related categories into "Cancer"
           str_detect(disorders, fixed("Cancer (Breast", ignore_case = TRUE)) |
             str_detect(disorders, fixed("Colorectal", ignore_case = TRUE)) |
             str_detect(disorders, fixed("Lung", ignore_case = TRUE)) |
             str_detect(disorders, fixed("and/or Prostate)", ignore_case = TRUE)) ~ "Cancer",
           # Combine COPD-related categories into "COPD"
           str_detect(disorders, fixed("Chronic Obstructive Pulmonary Disease (COPD", ignore_case = TRUE)) |
             str_detect(disorders, fixed("incl. emphysema and chronic bronchitis)", ignore_case = TRUE)) ~ "COPD",
           # Combine restrictive lung disease categories into "RLD"
           str_detect(disorders, fixed("Restrictive Lung Disease (Incl. pulmonary fibrosis", ignore_case = TRUE)) |
             str_detect(disorders, fixed("cystic fibrosis", ignore_case = TRUE)) ~ "RLD",
           # Rename other categories according to requirements
           str_detect(disorders, fixed("Alcohol abuse", ignore_case = TRUE)) ~ "Alcohol abuse",
           str_detect(disorders, fixed("Alzheimer's Disease and Related Dementia", ignore_case = TRUE)) ~ "Dementia",
           str_detect(disorders, fixed("Arthritis", ignore_case = TRUE)) ~ "Arthritis",
           str_detect(disorders, fixed("Atrial Fibrillation", ignore_case = TRUE)) ~ "Atrial Fibrillation",
           str_detect(disorders, fixed("Autism Spectrum Disorders", ignore_case = TRUE)) ~ "Autism Disorders",
           str_detect(disorders, fixed("Chronic Kidney Disease", ignore_case = TRUE)) ~ "Kidney Disease",
           str_detect(disorders, fixed("Asthma", ignore_case = TRUE)) ~ "Asthma",
           str_detect(disorders, fixed("Depression", ignore_case = TRUE)) ~ "Depression",
           str_detect(disorders, fixed("General Anxiety Disorder", ignore_case = TRUE)) ~ "General Anxiety",
           str_detect(disorders, fixed("Musician Performance Anxiety Disorder", ignore_case = TRUE)) ~ "Performance Anxiety",
           TRUE ~ disorders
         )
  ) %>%
  # Remove "None of the above" entries
  filter(!str_detect(disorders, fixed("None of the above", ignore_case = TRUE)))

# Use this as our main analysis dataset
disorders_data <- disorders_full

# Get total number of participants with valid disorder data
total_valid_participants <- nrow(data_combined %>% 
                                filter(!is.na(disorders) & 
                                       disorders != "Prefer not to say"))

cat("Total participants with valid disorder data:", total_valid_participants, "\n")
Total participants with valid disorder data: 734 
Code
# 3. Create Frequency Tables
# ------------------------

# Calculate overall counts for each disorder
overall_counts <- disorders_data %>%
  group_by(disorders) %>%
  summarise(total_count = n()) %>%
  arrange(desc(total_count))

# Display all disorders and their counts
cat("\nAll disorders and their counts:\n")

All disorders and their counts:
Code
print(overall_counts)
# A tibble: 13 × 2
   disorders           total_count
   <chr>                     <int>
 1 General Anxiety             327
 2 Depression                  291
 3 Asthma                      217
 4 Performance Anxiety         160
 5 Cancer                      157
 6 Arthritis                   135
 7 Autism Disorders            112
 8 COPD                         52
 9 Alcohol abuse                39
10 Atrial Fibrillation          30
11 Dementia                     20
12 RLD                          13
13 Kidney Disease               12
Code
# Calculate counts by disorder and RMT usage
disorder_by_rmt <- disorders_data %>%
  group_by(disorders, RMTMethods_YN) %>%
  summarise(count = n(), .groups = 'drop') %>%
  pivot_wider(
    names_from = RMTMethods_YN,
    values_from = count,
    names_prefix = "rmt_",
    values_fill = 0
  ) %>%
  rename(
    non_rmt = rmt_0,
    rmt = rmt_1
  ) %>%
  inner_join(overall_counts, by = "disorders") %>%
  arrange(desc(total_count))

# Calculate percentages
n_rmt_yes <- sum(data_combined$RMTMethods_YN == 1, na.rm = TRUE)
n_rmt_no <- sum(data_combined$RMTMethods_YN == 0, na.rm = TRUE)

disorder_by_rmt <- disorder_by_rmt %>%
  mutate(
    rmt_percent = (rmt / n_rmt_yes) * 100,
    non_rmt_percent = (non_rmt / n_rmt_no) * 100,
    total_percent = (total_count / total_valid_participants) * 100,
    diff_percent = rmt_percent - non_rmt_percent
  )

cat("\nDisorder prevalence by RMT usage:\n")

Disorder prevalence by RMT usage:
Code
print(disorder_by_rmt)
# A tibble: 13 × 8
   disorders non_rmt   rmt total_count rmt_percent non_rmt_percent total_percent
   <chr>       <int> <int>       <int>       <dbl>           <dbl>         <dbl>
 1 General …     283    44         327       19.3           21.3           44.6 
 2 Depressi…     253    38         291       16.7           19.0           39.6 
 3 Asthma        191    26         217       11.4           14.4           29.6 
 4 Performa…     117    43         160       18.9            8.80          21.8 
 5 Cancer         92    65         157       28.5            6.92          21.4 
 6 Arthritis     103    32         135       14.0            7.74          18.4 
 7 Autism D…      93    19         112        8.33           6.99          15.3 
 8 COPD           36    16          52        7.02           2.71           7.08
 9 Alcohol …      28    11          39        4.82           2.11           5.31
10 Atrial F…      21     9          30        3.95           1.58           4.09
11 Dementia        5    15          20        6.58           0.376          2.72
12 RLD             8     5          13        2.19           0.602          1.77
13 Kidney D…       7     5          12        2.19           0.526          1.63
# ℹ 1 more variable: diff_percent <dbl>
Code
# Create a dataset for disorders with at least 5% prevalence in either group
# This will be used for comparative analyses and plots
high_prev_disorders <- disorder_by_rmt %>%
  filter(rmt_percent >= 5 | non_rmt_percent >= 5) %>%
  pull(disorders)

cat("\nDisorders with ≥5% prevalence in at least one group:\n")

Disorders with ≥5% prevalence in at least one group:
Code
print(high_prev_disorders)
[1] "General Anxiety"     "Depression"          "Asthma"             
[4] "Performance Anxiety" "Cancer"              "Arthritis"          
[7] "Autism Disorders"    "COPD"                "Dementia"           
Code
# 4. Statistical Analysis: RMT Comparisons
# ------------------------

# Create a contingency table for ALL disorders (for full statistical testing)
contingency_data <- disorder_by_rmt %>%
  select(disorders, rmt, non_rmt)

# Converting to matrix for statistical testing
contingency_matrix <- as.matrix(contingency_data[, c("rmt", "non_rmt")])
rownames(contingency_matrix) <- contingency_data$disorders

# Perform Fisher's exact test for overall association (using simulation for large tables)
fisher_result <- fisher.test(contingency_matrix, simulate.p.value = TRUE, B = 10000)
cat("\nOverall Fisher's exact test result (all disorders):\n")

Overall Fisher's exact test result (all disorders):
Code
print(fisher_result)

    Fisher's Exact Test for Count Data with simulated p-value (based on
    10000 replicates)

data:  contingency_matrix
p-value = 9.999e-05
alternative hypothesis: two.sided
Code
# Also create a contingency matrix for only disorders with ≥5% prevalence
high_prev_contingency <- contingency_data %>%
  filter(disorders %in% high_prev_disorders)

high_prev_matrix <- as.matrix(high_prev_contingency[, c("rmt", "non_rmt")])
rownames(high_prev_matrix) <- high_prev_contingency$disorders

# Perform Fisher's exact test for disorders with ≥5% prevalence
high_prev_fisher <- fisher.test(high_prev_matrix, simulate.p.value = TRUE, B = 10000)
cat("\nFisher's exact test result (disorders with ≥5% prevalence):\n")

Fisher's exact test result (disorders with ≥5% prevalence):
Code
print(high_prev_fisher)

    Fisher's Exact Test for Count Data with simulated p-value (based on
    10000 replicates)

data:  high_prev_matrix
p-value = 9.999e-05
alternative hypothesis: two.sided
Code
# Robust Statistical Analysis Function
perform_robust_statistical_test <- function(contingency_table) {
  # Detailed expected frequency analysis
  expected_freq <- suppressWarnings(chisq.test(contingency_table)$expected)
  
  # Frequency checks
  total_cells <- length(expected_freq)
  low_freq_cells <- sum(expected_freq < 5)
  min_expected_freq <- min(expected_freq)
  
  # Verbose reporting of frequency conditions
  cat("Expected Frequency Analysis:\n")
  cat("Minimum Expected Frequency:", round(min_expected_freq, 2), "\n")
  cat("Cells with Expected Frequency < 5:", low_freq_cells, 
      "out of", total_cells, "cells (", 
      round(low_freq_cells / total_cells * 100, 2), "%)\n\n")
  
  # Determine most appropriate test
  if (min_expected_freq < 1 || (low_freq_cells / total_cells) > 0.2) {
    # Use Fisher's exact test with Monte Carlo simulation
    exact_test <- fisher.test(contingency_table, simulate.p.value = TRUE, B = 10000)
    
    return(list(
      test_type = "Fisher's Exact Test (Monte Carlo)",
      p_value = exact_test$p.value,
      statistic = NA,
      method = "Fisher's Exact Test with Monte Carlo Simulation"
    ))
  } else {
    # Use chi-square test with Yates' continuity correction
    adjusted_chi_test <- chisq.test(contingency_table, correct = TRUE)
    
    return(list(
      test_type = "Chi-Square with Continuity Correction",
      p_value = adjusted_chi_test$p.value,
      statistic = adjusted_chi_test$statistic,
      parameter = adjusted_chi_test$parameter,
      method = paste("Pearson's Chi-squared test with Yates' continuity correction,",
                     "df =", adjusted_chi_test$parameter)
    ))
  }
}

# Pairwise Comparisons Function
pairwise_comparisons <- function(contingency_table) {
  disorders <- rownames(contingency_table)
  n_disorders <- length(disorders)
  results <- data.frame()
  
  for(i in 1:(n_disorders-1)) {
    for(j in (i+1):n_disorders) {
      # Create 2x2 contingency table for two disorders
      subset_table <- contingency_table[c(i,j),]
      
      # Perform Fisher's exact test
      test <- fisher.test(subset_table)
      
      results <- rbind(results, data.frame(
        comparison = paste(disorders[i], "vs", disorders[j]),
        p_value = test$p.value,
        odds_ratio = test$estimate
      ))
    }
  }
  
  # Apply Bonferroni correction
  results$p_adjusted <- p.adjust(results$p_value, method = "bonferroni")
  
  return(results)
}

# Apply the robust statistical test to our contingency matrix
robust_test_result <- perform_robust_statistical_test(contingency_matrix)
Expected Frequency Analysis:
Minimum Expected Frequency: 2.52 
Cells with Expected Frequency < 5: 3 out of 26 cells ( 11.54 %)
Code
cat("\nRobust Statistical Test Results:\n")

Robust Statistical Test Results:
Code
cat("Test Type:", robust_test_result$test_type, "\n")
Test Type: Chi-Square with Continuity Correction 
Code
cat("P-value:", robust_test_result$p_value, "\n")
P-value: 1.06822e-20 
Code
if (robust_test_result$test_type == "Chi-Square with Continuity Correction") {
  cat("Chi-square Statistic:", robust_test_result$statistic, "\n")
  cat("Degrees of Freedom:", robust_test_result$parameter, "\n")
}
Chi-square Statistic: 123.8186 
Degrees of Freedom: 12 
Code
# Apply the robust statistical test to high prevalence disorders
robust_high_prev_test <- perform_robust_statistical_test(high_prev_matrix)
Expected Frequency Analysis:
Minimum Expected Frequency: 4.05 
Cells with Expected Frequency < 5: 1 out of 18 cells ( 5.56 %)
Code
cat("\nRobust Statistical Test Results (disorders with ≥5% prevalence):\n")

Robust Statistical Test Results (disorders with ≥5% prevalence):
Code
cat("Test Type:", robust_high_prev_test$test_type, "\n")
Test Type: Chi-Square with Continuity Correction 
Code
cat("P-value:", robust_high_prev_test$p_value, "\n")
P-value: 8.217582e-22 
Code
if (robust_high_prev_test$test_type == "Chi-Square with Continuity Correction") {
  cat("Chi-square Statistic:", robust_high_prev_test$statistic, "\n")
  cat("Degrees of Freedom:", robust_high_prev_test$parameter, "\n")
}
Chi-square Statistic: 118.0899 
Degrees of Freedom: 8 
Code
# Perform pairwise comparisons
pairwise_results <- pairwise_comparisons(contingency_matrix)
cat("\nPairwise Comparisons (Bonferroni-corrected) for all disorders:\n")

Pairwise Comparisons (Bonferroni-corrected) for all disorders:
Code
print(pairwise_results)
                                             comparison      p_value odds_ratio
odds ratio                General Anxiety vs Depression 9.059635e-01 1.03510059
odds ratio1                   General Anxiety vs Asthma 6.953000e-01 1.14186169
odds ratio2      General Anxiety vs Performance Anxiety 4.032720e-04 0.42385862
odds ratio3                   General Anxiety vs Cancer 2.439770e-11 0.22086864
odds ratio4                General Anxiety vs Arthritis 8.706435e-03 0.50125385
odds ratio5         General Anxiety vs Autism Disorders 3.530675e-01 0.76150726
odds ratio6                     General Anxiety vs COPD 3.432927e-03 0.35105813
odds ratio7            General Anxiety vs Alcohol abuse 2.923673e-02 0.39704286
odds ratio8      General Anxiety vs Atrial Fibrillation 2.722467e-02 0.36413548
odds ratio9                 General Anxiety vs Dementia 4.433295e-09 0.05259406
odds ratio10                     General Anxiety vs RLD 2.652527e-02 0.25025802
odds ratio11          General Anxiety vs Kidney Disease 1.853343e-02 0.21916221
odds ratio12                       Depression vs Asthma 7.874670e-01 1.10313195
odds ratio13          Depression vs Performance Anxiety 4.754242e-04 0.40955318
odds ratio14                       Depression vs Cancer 3.259975e-11 0.21343616
odds ratio15                    Depression vs Arthritis 7.482876e-03 0.48433862
odds ratio16             Depression vs Autism Disorders 3.392917e-01 0.73575757
odds ratio17                         Depression vs COPD 3.038301e-03 0.33930463
odds ratio18                Depression vs Alcohol abuse 2.738306e-02 0.38371817
odds ratio19          Depression vs Atrial Fibrillation 2.517413e-02 0.35197466
odds ratio20                     Depression vs Dementia 3.805206e-09 0.05091667
odds ratio21                          Depression vs RLD 2.423421e-02 0.24199563
odds ratio22               Depression vs Kidney Disease 1.689878e-02 0.21195096
odds ratio23              Asthma vs Performance Anxiety 2.624722e-04 0.37140465
odds ratio24                           Asthma vs Cancer 8.321659e-11 0.19360132
odds ratio25                        Asthma vs Arthritis 4.924581e-03 0.43923886
odds ratio26                 Asthma vs Autism Disorders 2.371734e-01 0.66713697
odds ratio27                             Asthma vs COPD 2.211763e-03 0.30798248
odds ratio28                    Asthma vs Alcohol abuse 1.291170e-02 0.34833383
odds ratio29              Asthma vs Atrial Fibrillation 2.074853e-02 0.31959362
odds ratio30                         Asthma vs Dementia 2.691018e-09 0.04645843
odds ratio31                              Asthma vs RLD 1.892004e-02 0.22002920
odds ratio32                   Asthma vs Kidney Disease 1.312993e-02 0.19278217
odds ratio33              Performance Anxiety vs Cancer 6.644606e-03 0.52126543
odds ratio34           Performance Anxiety vs Arthritis 5.921115e-01 1.18228584
odds ratio35    Performance Anxiety vs Autism Disorders 5.795295e-02 1.79513469
odds ratio36                Performance Anxiety vs COPD 5.964717e-01 0.82769789
odds ratio37       Performance Anxiety vs Alcohol abuse 8.434382e-01 0.93582679
odds ratio38 Performance Anxiety vs Atrial Fibrillation 8.236572e-01 0.85827389
odds ratio39            Performance Anxiety vs Dementia 3.957613e-05 0.12416814
odds ratio40                 Performance Anxiety vs RLD 3.532773e-01 0.59002277
odds ratio41      Performance Anxiety vs Kidney Disease 3.189673e-01 0.51672965
odds ratio42                        Cancer vs Arthritis 1.774311e-03 2.26769754
odds ratio43                 Cancer vs Autism Disorders 1.757768e-05 3.44259255
odds ratio44                             Cancer vs COPD 1.918810e-01 1.58623092
odds ratio45                    Cancer vs Alcohol abuse 1.453761e-01 1.79325863
odds ratio46              Cancer vs Atrial Fibrillation 3.094617e-01 1.64431732
odds ratio47                         Cancer vs Dementia 7.390543e-03 0.23740511
odds ratio48                              Cancer vs RLD 1.000000e+00 1.12959646
odds ratio49                   Cancer vs Kidney Disease 1.000000e+00 0.98919244
odds ratio50              Arthritis vs Autism Disorders 2.096888e-01 1.51813439
odds ratio51                          Arthritis vs COPD 3.524952e-01 0.70040766
odds ratio52                 Arthritis vs Alcohol abuse 6.736075e-01 0.79189681
odds ratio53           Arthritis vs Atrial Fibrillation 4.880656e-01 0.72640712
odds ratio54                      Arthritis vs Dementia 1.263234e-05 0.10545848
odds ratio55                           Arthritis vs RLD 3.122584e-01 0.49975046
odds ratio56                Arthritis vs Kidney Disease 1.781723e-01 0.43781901
odds ratio57                   Autism Disorders vs COPD 6.414804e-02 0.46204464
odds ratio58          Autism Disorders vs Alcohol abuse 1.620258e-01 0.52250395
odds ratio59    Autism Disorders vs Atrial Fibrillation 1.251625e-01 0.47952553
odds ratio60               Autism Disorders vs Dementia 5.772160e-07 0.07014907
odds ratio61                    Autism Disorders vs RLD 1.277963e-01 0.33063465
odds ratio62         Autism Disorders vs Kidney Disease 5.463183e-02 0.28983040
odds ratio63                      COPD vs Alcohol abuse 8.208983e-01 1.12978460
odds ratio64                COPD vs Atrial Fibrillation 1.000000e+00 1.03658564
odds ratio65                           COPD vs Dementia 1.155260e-03 0.15262452
odds ratio66                                COPD vs RLD 7.416156e-01 0.71496320
odds ratio67                     COPD vs Kidney Disease 5.073732e-01 0.62707234
odds ratio68       Alcohol abuse vs Atrial Fibrillation 1.000000e+00 0.91782707
odds ratio69                  Alcohol abuse vs Dementia 8.687888e-04 0.13633490
odds ratio70                       Alcohol abuse vs RLD 5.060178e-01 0.63446117
odds ratio71            Alcohol abuse vs Kidney Disease 4.811111e-01 0.55687670
odds ratio72            Atrial Fibrillation vs Dementia 3.419565e-03 0.14939850
odds ratio73                 Atrial Fibrillation vs RLD 7.259190e-01 0.69190457
odds ratio74      Atrial Fibrillation vs Kidney Disease 4.912945e-01 0.60762376
odds ratio75                            Dementia vs RLD 6.730149e-02 4.54972217
odds ratio76                 Dementia vs Kidney Disease 1.296605e-01 3.99503555
odds ratio77                      RLD vs Kidney Disease 1.000000e+00 0.87969356
               p_adjusted
odds ratio   1.000000e+00
odds ratio1  1.000000e+00
odds ratio2  3.145522e-02
odds ratio3  1.903021e-09
odds ratio4  6.791019e-01
odds ratio5  1.000000e+00
odds ratio6  2.677683e-01
odds ratio7  1.000000e+00
odds ratio8  1.000000e+00
odds ratio9  3.457970e-07
odds ratio10 1.000000e+00
odds ratio11 1.000000e+00
odds ratio12 1.000000e+00
odds ratio13 3.708309e-02
odds ratio14 2.542781e-09
odds ratio15 5.836644e-01
odds ratio16 1.000000e+00
odds ratio17 2.369875e-01
odds ratio18 1.000000e+00
odds ratio19 1.000000e+00
odds ratio20 2.968061e-07
odds ratio21 1.000000e+00
odds ratio22 1.000000e+00
odds ratio23 2.047283e-02
odds ratio24 6.490894e-09
odds ratio25 3.841173e-01
odds ratio26 1.000000e+00
odds ratio27 1.725175e-01
odds ratio28 1.000000e+00
odds ratio29 1.000000e+00
odds ratio30 2.098994e-07
odds ratio31 1.000000e+00
odds ratio32 1.000000e+00
odds ratio33 5.182793e-01
odds ratio34 1.000000e+00
odds ratio35 1.000000e+00
odds ratio36 1.000000e+00
odds ratio37 1.000000e+00
odds ratio38 1.000000e+00
odds ratio39 3.086938e-03
odds ratio40 1.000000e+00
odds ratio41 1.000000e+00
odds ratio42 1.383963e-01
odds ratio43 1.371059e-03
odds ratio44 1.000000e+00
odds ratio45 1.000000e+00
odds ratio46 1.000000e+00
odds ratio47 5.764623e-01
odds ratio48 1.000000e+00
odds ratio49 1.000000e+00
odds ratio50 1.000000e+00
odds ratio51 1.000000e+00
odds ratio52 1.000000e+00
odds ratio53 1.000000e+00
odds ratio54 9.853229e-04
odds ratio55 1.000000e+00
odds ratio56 1.000000e+00
odds ratio57 1.000000e+00
odds ratio58 1.000000e+00
odds ratio59 1.000000e+00
odds ratio60 4.502285e-05
odds ratio61 1.000000e+00
odds ratio62 1.000000e+00
odds ratio63 1.000000e+00
odds ratio64 1.000000e+00
odds ratio65 9.011029e-02
odds ratio66 1.000000e+00
odds ratio67 1.000000e+00
odds ratio68 1.000000e+00
odds ratio69 6.776553e-02
odds ratio70 1.000000e+00
odds ratio71 1.000000e+00
odds ratio72 2.667261e-01
odds ratio73 1.000000e+00
odds ratio74 1.000000e+00
odds ratio75 1.000000e+00
odds ratio76 1.000000e+00
odds ratio77 1.000000e+00
Code
# Perform pairwise comparisons for high prevalence disorders
high_prev_pairwise <- pairwise_comparisons(high_prev_matrix)
cat("\nPairwise Comparisons (Bonferroni-corrected) for disorders with ≥5% prevalence:\n")

Pairwise Comparisons (Bonferroni-corrected) for disorders with ≥5% prevalence:
Code
print(high_prev_pairwise)
                                          comparison      p_value odds_ratio
odds ratio             General Anxiety vs Depression 9.059635e-01 1.03510059
odds ratio1                General Anxiety vs Asthma 6.953000e-01 1.14186169
odds ratio2   General Anxiety vs Performance Anxiety 4.032720e-04 0.42385862
odds ratio3                General Anxiety vs Cancer 2.439770e-11 0.22086864
odds ratio4             General Anxiety vs Arthritis 8.706435e-03 0.50125385
odds ratio5      General Anxiety vs Autism Disorders 3.530675e-01 0.76150726
odds ratio6                  General Anxiety vs COPD 3.432927e-03 0.35105813
odds ratio7              General Anxiety vs Dementia 4.433295e-09 0.05259406
odds ratio8                     Depression vs Asthma 7.874670e-01 1.10313195
odds ratio9        Depression vs Performance Anxiety 4.754242e-04 0.40955318
odds ratio10                    Depression vs Cancer 3.259975e-11 0.21343616
odds ratio11                 Depression vs Arthritis 7.482876e-03 0.48433862
odds ratio12          Depression vs Autism Disorders 3.392917e-01 0.73575757
odds ratio13                      Depression vs COPD 3.038301e-03 0.33930463
odds ratio14                  Depression vs Dementia 3.805206e-09 0.05091667
odds ratio15           Asthma vs Performance Anxiety 2.624722e-04 0.37140465
odds ratio16                        Asthma vs Cancer 8.321659e-11 0.19360132
odds ratio17                     Asthma vs Arthritis 4.924581e-03 0.43923886
odds ratio18              Asthma vs Autism Disorders 2.371734e-01 0.66713697
odds ratio19                          Asthma vs COPD 2.211763e-03 0.30798248
odds ratio20                      Asthma vs Dementia 2.691018e-09 0.04645843
odds ratio21           Performance Anxiety vs Cancer 6.644606e-03 0.52126543
odds ratio22        Performance Anxiety vs Arthritis 5.921115e-01 1.18228584
odds ratio23 Performance Anxiety vs Autism Disorders 5.795295e-02 1.79513469
odds ratio24             Performance Anxiety vs COPD 5.964717e-01 0.82769789
odds ratio25         Performance Anxiety vs Dementia 3.957613e-05 0.12416814
odds ratio26                     Cancer vs Arthritis 1.774311e-03 2.26769754
odds ratio27              Cancer vs Autism Disorders 1.757768e-05 3.44259255
odds ratio28                          Cancer vs COPD 1.918810e-01 1.58623092
odds ratio29                      Cancer vs Dementia 7.390543e-03 0.23740511
odds ratio30           Arthritis vs Autism Disorders 2.096888e-01 1.51813439
odds ratio31                       Arthritis vs COPD 3.524952e-01 0.70040766
odds ratio32                   Arthritis vs Dementia 1.263234e-05 0.10545848
odds ratio33                Autism Disorders vs COPD 6.414804e-02 0.46204464
odds ratio34            Autism Disorders vs Dementia 5.772160e-07 0.07014907
odds ratio35                        COPD vs Dementia 1.155260e-03 0.15262452
               p_adjusted
odds ratio   1.000000e+00
odds ratio1  1.000000e+00
odds ratio2  1.451779e-02
odds ratio3  8.783174e-10
odds ratio4  3.134317e-01
odds ratio5  1.000000e+00
odds ratio6  1.235854e-01
odds ratio7  1.595986e-07
odds ratio8  1.000000e+00
odds ratio9  1.711527e-02
odds ratio10 1.173591e-09
odds ratio11 2.693835e-01
odds ratio12 1.000000e+00
odds ratio13 1.093788e-01
odds ratio14 1.369874e-07
odds ratio15 9.448998e-03
odds ratio16 2.995797e-09
odds ratio17 1.772849e-01
odds ratio18 1.000000e+00
odds ratio19 7.962348e-02
odds ratio20 9.687666e-08
odds ratio21 2.392058e-01
odds ratio22 1.000000e+00
odds ratio23 1.000000e+00
odds ratio24 1.000000e+00
odds ratio25 1.424741e-03
odds ratio26 6.387521e-02
odds ratio27 6.327964e-04
odds ratio28 1.000000e+00
odds ratio29 2.660595e-01
odds ratio30 1.000000e+00
odds ratio31 1.000000e+00
odds ratio32 4.547644e-04
odds ratio33 1.000000e+00
odds ratio34 2.077978e-05
odds ratio35 4.158936e-02
Code
# Individual Fisher's exact tests for each disorder
fisher_results_all <- data.frame(
  Disorder = character(),
  RMT_Yes_Prev = numeric(),
  RMT_No_Prev = numeric(),
  Odds_Ratio = numeric(),
  CI_Lower = numeric(),
  CI_Upper = numeric(),
  P_Value = numeric(),
  Significant = character(),
  stringsAsFactors = FALSE
)

for(i in 1:nrow(contingency_data)) {
  disorder <- contingency_data$disorders[i]
  
  # Create 2x2 table: [disorder present/absent] x [RMT yes/no]
  test_matrix <- matrix(c(
    contingency_data$rmt[i],                   # Disorder + RMT Yes
    n_rmt_yes - contingency_data$rmt[i],       # No Disorder + RMT Yes
    contingency_data$non_rmt[i],               # Disorder + RMT No
    n_rmt_no - contingency_data$non_rmt[i]     # No Disorder + RMT No
  ), nrow = 2)
  
  # Perform Fisher's exact test
  test_result <- fisher.test(test_matrix)
  
  # Calculate prevalence in each group
  prev_rmt_yes <- contingency_data$rmt[i] / n_rmt_yes * 100
  prev_rmt_no <- contingency_data$non_rmt[i] / n_rmt_no * 100
  
  # Store results
  fisher_results_all <- rbind(fisher_results_all, data.frame(
    Disorder = disorder,
    RMT_Yes_Prev = round(prev_rmt_yes, 1),
    RMT_No_Prev = round(prev_rmt_no, 1),
    Odds_Ratio = round(test_result$estimate, 2),
    CI_Lower = round(test_result$conf.int[1], 2),
    CI_Upper = round(test_result$conf.int[2], 2),
    P_Value = round(test_result$p.value, 4),
    Significant = ifelse(test_result$p.value < 0.05, "Yes", "No"),
    stringsAsFactors = FALSE
  ))
}

# Sort by odds ratio and print all results
fisher_results_all <- fisher_results_all[order(-fisher_results_all$Odds_Ratio), ]
cat("\nFisher's exact test results for each disorder (sorted by odds ratio):\n")

Fisher's exact test results for each disorder (sorted by odds ratio):
Code
print(fisher_results_all)
                        Disorder RMT_Yes_Prev RMT_No_Prev Odds_Ratio CI_Lower
odds ratio10            Dementia          6.6         0.4      18.60     6.34
odds ratio4               Cancer         28.5         6.9       5.36     3.68
odds ratio12      Kidney Disease          2.2         0.5       4.23     1.05
odds ratio11                 RLD          2.2         0.6       3.70     0.94
odds ratio7                 COPD          7.0         2.7       2.71     1.38
odds ratio9  Atrial Fibrillation          3.9         1.6       2.56     1.02
odds ratio3  Performance Anxiety         18.9         8.8       2.41     1.60
odds ratio8        Alcohol abuse          4.8         2.1       2.36     1.04
odds ratio5            Arthritis         14.0         7.7       1.94     1.23
odds ratio6     Autism Disorders          8.3         7.0       1.21     0.68
odds ratio       General Anxiety         19.3        21.3       0.88     0.61
odds ratio1           Depression         16.7        19.0       0.85     0.57
odds ratio2               Asthma         11.4        14.4       0.77     0.48
             CI_Upper P_Value Significant
odds ratio10    66.11  0.0000         Yes
odds ratio4      7.77  0.0000         Yes
odds ratio12    15.64  0.0212         Yes
odds ratio11    12.96  0.0304         Yes
odds ratio7      5.12  0.0022         Yes
odds ratio9      5.92  0.0311         Yes
odds ratio3      3.57  0.0000         Yes
odds ratio8      4.97  0.0216         Yes
odds ratio5      3.01  0.0032         Yes
odds ratio6      2.05  0.4872          No
odds ratio       1.27  0.5384          No
odds ratio1      1.25  0.4618          No
odds ratio2      1.20  0.2558          No
Code
# Also print results sorted by p-value
fisher_by_pval <- fisher_results_all[order(fisher_results_all$P_Value), ]
cat("\nFisher's exact test results for each disorder (sorted by p-value):\n")

Fisher's exact test results for each disorder (sorted by p-value):
Code
print(fisher_by_pval)
                        Disorder RMT_Yes_Prev RMT_No_Prev Odds_Ratio CI_Lower
odds ratio10            Dementia          6.6         0.4      18.60     6.34
odds ratio4               Cancer         28.5         6.9       5.36     3.68
odds ratio3  Performance Anxiety         18.9         8.8       2.41     1.60
odds ratio7                 COPD          7.0         2.7       2.71     1.38
odds ratio5            Arthritis         14.0         7.7       1.94     1.23
odds ratio12      Kidney Disease          2.2         0.5       4.23     1.05
odds ratio8        Alcohol abuse          4.8         2.1       2.36     1.04
odds ratio11                 RLD          2.2         0.6       3.70     0.94
odds ratio9  Atrial Fibrillation          3.9         1.6       2.56     1.02
odds ratio2               Asthma         11.4        14.4       0.77     0.48
odds ratio1           Depression         16.7        19.0       0.85     0.57
odds ratio6     Autism Disorders          8.3         7.0       1.21     0.68
odds ratio       General Anxiety         19.3        21.3       0.88     0.61
             CI_Upper P_Value Significant
odds ratio10    66.11  0.0000         Yes
odds ratio4      7.77  0.0000         Yes
odds ratio3      3.57  0.0000         Yes
odds ratio7      5.12  0.0022         Yes
odds ratio5      3.01  0.0032         Yes
odds ratio12    15.64  0.0212         Yes
odds ratio8      4.97  0.0216         Yes
odds ratio11    12.96  0.0304         Yes
odds ratio9      5.92  0.0311         Yes
odds ratio2      1.20  0.2558          No
odds ratio1      1.25  0.4618          No
odds ratio6      2.05  0.4872          No
odds ratio       1.27  0.5384          No
Code
# Filter results for disorders with ≥5% prevalence
fisher_high_prev <- fisher_results_all %>%
  filter(Disorder %in% high_prev_disorders) %>%
  arrange(-Odds_Ratio)

cat("\nFisher's exact test results for disorders with ≥5% prevalence:\n")

Fisher's exact test results for disorders with ≥5% prevalence:
Code
print(fisher_high_prev)
                        Disorder RMT_Yes_Prev RMT_No_Prev Odds_Ratio CI_Lower
odds ratio10            Dementia          6.6         0.4      18.60     6.34
odds ratio4               Cancer         28.5         6.9       5.36     3.68
odds ratio7                 COPD          7.0         2.7       2.71     1.38
odds ratio3  Performance Anxiety         18.9         8.8       2.41     1.60
odds ratio5            Arthritis         14.0         7.7       1.94     1.23
odds ratio6     Autism Disorders          8.3         7.0       1.21     0.68
odds ratio       General Anxiety         19.3        21.3       0.88     0.61
odds ratio1           Depression         16.7        19.0       0.85     0.57
odds ratio2               Asthma         11.4        14.4       0.77     0.48
             CI_Upper P_Value Significant
odds ratio10    66.11  0.0000         Yes
odds ratio4      7.77  0.0000         Yes
odds ratio7      5.12  0.0022         Yes
odds ratio3      3.57  0.0000         Yes
odds ratio5      3.01  0.0032         Yes
odds ratio6      2.05  0.4872          No
odds ratio       1.27  0.5384          No
odds ratio1      1.25  0.4618          No
odds ratio2      1.20  0.2558          No
Code
# 5. Chi-Square Test for high prevalence disorders
# Only for disorders with expected counts ≥5 in all cells
chi_square_data <- disorder_by_rmt %>%
  filter(disorders %in% high_prev_disorders) %>%
  filter(rmt >= 5 & non_rmt >= 5)  # Only include if both counts are at least 5

if(nrow(chi_square_data) > 0) {
  chi_matrix <- as.matrix(chi_square_data[, c("rmt", "non_rmt")])
  rownames(chi_matrix) <- chi_square_data$disorders
  
  # Perform chi-square test
  chi_result <- chisq.test(chi_matrix)
  cat("\nChi-Square Test for disorders with ≥5% prevalence and counts ≥5:\n")
  print(chi_result)
  
  # Check expected values to ensure validity
  cat("\nExpected values (all should be ≥5 for valid chi-square test):\n")
  print(chi_result$expected)
  
  # Calculate Cramer's V for effect size
  n_total <- sum(chi_matrix)
  cramer_v <- sqrt(chi_result$statistic / (n_total * min(nrow(chi_matrix)-1, ncol(chi_matrix)-1)))
  cat(sprintf("\nCramer's V effect size: %.4f\n", cramer_v))
  
  # Interpret effect size
  cat("Interpretation: ")
  if(cramer_v < 0.1) {
    cat("Negligible effect\n")
  } else if(cramer_v < 0.2) {
    cat("Weak effect\n")
  } else if(cramer_v < 0.3) {
    cat("Moderate effect\n")
  } else if(cramer_v < 0.4) {
    cat("Relatively strong effect\n")
  } else {
    cat("Strong effect\n")
  }
} else {
  cat("\nCan't perform chi-square test: insufficient disorders with counts ≥5 in both groups\n")
}

Chi-Square Test for disorders with ≥5% prevalence and counts ≥5:

    Pearson's Chi-squared test

data:  chi_matrix
X-squared = 118.09, df = 8, p-value < 2.2e-16


Expected values (all should be ≥5 for valid chi-square test):
                          rmt   non_rmt
General Anxiety     66.244731 260.75527
Depression          58.951734 232.04827
Asthma              43.960571 173.03943
Performance Anxiety 32.413324 127.58668
Cancer              31.805574 125.19443
Arthritis           27.348742 107.65126
Autism Disorders    22.689327  89.31067
COPD                10.534330  41.46567
Dementia             4.051666  15.94833

Cramer's V effect size: 0.2833
Interpretation: Moderate effect
Code
# 6. Population Rate Comparisons------------------------------------------------

# Define population rates for comparison
population_rates <- c(
  "General Anxiety" = 0.032,                    # 3.2% (Ruscio et al., 2017)
  "Depression" = 0.071,                         # 7.1% (Hasin et al., 2018)
  "Asthma" = 0.08,                              # 8% (CDC, 2020)
  "Performance Anxiety" = 0.15,                 # 15% (Kenny, 2011)
  "Cancer" = 0.05,                              # 5% (American Cancer Society, 2023)
  "Arthritis" = 0.23,                           # 23% (CDC, 2020 for adults)
  "Autism Disorders" = 0.02,                    # 2% (conservative adult estimate)
  "COPD" = 0.06,                                # 6% (CDC, 2020 for adults)
  "Alcohol abuse" = 0.05,                       # 5% (NIAAA, conservative)
  "Atrial Fibrillation" = 0.02,                 # 2% (general population)
  "Dementia" = 0.10,                            # 10% (for adults over 65)
  "RLD" = 0.005,                                # 0.5% (conservative estimate)
  "Kidney Disease" = 0.15                       # 15% (CDC, 2020 for adults)
)

# Function to find the closest matching disorder name
find_matching_disorder <- function(disorder_name, available_names) {
  best_match <- NULL
  best_score <- -1
  
  for(name in available_names) {
    # Check if the name is contained in the disorder or vice versa
    if(grepl(name, disorder_name, ignore.case = TRUE) || 
       grepl(disorder_name, name, ignore.case = TRUE)) {
      
      # Similarity score - length of the shared string
      score <- max(nchar(name), nchar(disorder_name))
      
      if(score > best_score) {
        best_score <- score
        best_match <- name
      }
    }
  }
  
  return(best_match)
}

# Create dataframe to store binomial test results
binomial_results <- data.frame(
  Disorder = character(),
  Observed_Rate = numeric(),
  Population_Rate = numeric(),
  Fold_Diff = numeric(),
  P_Value = numeric(),
  CI_Lower = numeric(),
  CI_Upper = numeric(),
  Significant = character(),
  stringsAsFactors = FALSE
)

# Perform exact binomial test for each disorder
cat("\n=== COMPARISONS WITH POPULATION RATES ===\n")

=== COMPARISONS WITH POPULATION RATES ===
Code
# Get disorder counts from overall_counts dataframe
for(i in 1:nrow(overall_counts)) {
  disorder <- overall_counts$disorders[i]
  observed_count <- overall_counts$total_count[i]
  
  # Get total unique participants (not disorder instances)
total_unique_participants <- total_valid_participants

  # Find the closest match in population rates
  matching_key <- find_matching_disorder(disorder, names(population_rates))
  
  if(!is.null(matching_key)) {
    observed_rate <- observed_count / total_unique_participants
    pop_rate <- population_rates[matching_key]
    
    # Perform exact binomial test
    binom_test <- binom.test(observed_count, total_unique_participants, p = pop_rate)
    
    # Calculate fold difference
    fold_diff <- observed_rate / pop_rate
    
    # Store results
    binomial_results <- rbind(binomial_results, data.frame(
      Disorder = disorder,
      Observed_Rate = round(observed_rate * 100, 1),
      Population_Rate = round(pop_rate * 100, 1),
      Fold_Diff = round(fold_diff, 1),
      P_Value = format.pval(binom_test$p.value, digits = 4),
      CI_Lower = round(binom_test$conf.int[1] * 100, 1),
      CI_Upper = round(binom_test$conf.int[2] * 100, 1),
      Significant = ifelse(binom_test$p.value < 0.05, "Yes", "No"),
      stringsAsFactors = FALSE
    ))
  } else {
    cat("No matching population rate found for:", disorder, "\n")
  }
}

# Sort by fold difference
binomial_results <- binomial_results[order(-binomial_results$Fold_Diff), ]

cat("\nComparison of disorder prevalence with general population rates:\n")

Comparison of disorder prevalence with general population rates:
Code
print(binomial_results)
                               Disorder Observed_Rate Population_Rate Fold_Diff
General Anxiety         General Anxiety          44.6             3.2      13.9
Autism Disorders       Autism Disorders          15.3             2.0       7.6
Depression                   Depression          39.6             7.1       5.6
Cancer                           Cancer          21.4             5.0       4.3
Asthma                           Asthma          29.6             8.0       3.7
RLD                                 RLD           1.8             0.5       3.5
Atrial Fibrillation Atrial Fibrillation           4.1             2.0       2.0
Performance Anxiety Performance Anxiety          21.8            15.0       1.5
COPD                               COPD           7.1             6.0       1.2
Alcohol abuse             Alcohol abuse           5.3             5.0       1.1
Arthritis                     Arthritis          18.4            23.0       0.8
Dementia                       Dementia           2.7            10.0       0.3
Kidney Disease           Kidney Disease           1.6            15.0       0.1
                      P_Value CI_Lower CI_Upper Significant
General Anxiety     < 2.2e-16     40.9     48.2         Yes
Autism Disorders    < 2.2e-16     12.7     18.1         Yes
Depression          < 2.2e-16     36.1     43.3         Yes
Cancer              < 2.2e-16     18.5     24.5         Yes
Asthma              < 2.2e-16     26.3     33.0         Yes
RLD                 0.0001141      0.9      3.0         Yes
Atrial Fibrillation 0.0002986      2.8      5.8         Yes
Performance Anxiety  1.05e-06     18.9     25.0         Yes
COPD                   0.2134      5.3      9.2          No
Alcohol abuse          0.6718      3.8      7.2          No
Arthritis            0.002827     15.7     21.4         Yes
Dementia            3.984e-14      1.7      4.2         Yes
Kidney Disease      < 2.2e-16      0.8      2.8         Yes
Code
# 7. Visualizations
# ------------------------

# 7.1 Population Rate Comparison Visualization
# Convert character P_Value to numeric for coloring
binomial_results$P_Value_Numeric <- as.numeric(gsub("<", "", binomial_results$P_Value))

# Create a completely redesigned visualization that avoids scale issues
# First preprocess the data to identify any extreme values
binomial_results$Plot_Fold_Diff <- binomial_results$Fold_Diff
max_fold <- max(binomial_results$Fold_Diff)

# Print maximum value to help diagnose the issue
cat("\nMaximum fold difference:", max_fold, "\n")

Maximum fold difference: 13.9 
Code
# If we have extreme values, handle them specially
if(max_fold > 30) {
  cat("Note: Found very high fold difference value(s). Applying special handling.\n")
  # Create a flag for extreme values and cap the plotting value
  binomial_results$is_extreme <- binomial_results$Fold_Diff > 30
  binomial_results$Plot_Fold_Diff <- pmin(binomial_results$Fold_Diff, 30)
}

# New version of the comparison plot using a completely different approach
plot_comparison <- ggplot(
  binomial_results,
  aes(x = reorder(Disorder, Fold_Diff), y = Plot_Fold_Diff)
) +
  # Background shading
  annotate("rect", xmin = -Inf, xmax = Inf, ymin = 0.5, ymax = 1.5, 
           fill = "gray90", alpha = 0.3) +
  
  # Reference lines
  geom_hline(yintercept = c(0.5, 1, 1.5, 2, 3, 5, 10, 20, 30), 
             linetype = "dotted", color = "gray60") +
  geom_hline(yintercept = 1, linetype = "dashed", color = "gray40", size = 1) +
  
  # Plain bars without fill aesthetics initially
  geom_col(width = 0.7, fill = "gray80") +
  
  # Add fill aesthetics separately to avoid scale issues
  geom_col(aes(fill = Significant), width = 0.7) +
  
  # Basic fold difference label
  geom_text(
    aes(label = sprintf("%.1f×", Fold_Diff)),
    y = 0.2, vjust = 1.5, hjust = 0.5, size = 3.5, fontface = "bold"
  ) +
  
  # Percentage comparison label - positioned at bottom for all
  geom_text(
    aes(label = sprintf("%.1f%% vs %.1f%%", Observed_Rate, Population_Rate)),
    y = 0.2, vjust = 3, hjust = 0.5, size = 3, color = "black"
  ) +
  
  # Special marker for extreme values if needed
  {if(max_fold > 30) geom_text(
    data = subset(binomial_results, is_extreme),
    aes(label = sprintf("(%.1f×)", Fold_Diff)),
    y = 30, vjust = -0.5, hjust = 0.5, size = 3.5, color = "red"
  )} +
  
  # Add significance markers
  geom_text(
    data = subset(binomial_results, Significant == "Yes"),
    aes(y = 1),
    label = "*", size = 6, color = "black", vjust = 2.5
  ) +
  
  # Enhanced aesthetics
  labs(
    title = "Wind Instrumentalist Disorder Prevalence vs. General Population",
    subtitle = "Fold difference between observed rates in musicians and general population rates",
    caption = "* Indicates statistically significant difference (p < 0.05)",
    x = NULL,
    y = "Fold Difference (Study Rate / Population Rate)"
  ) +
  scale_y_log10(
    breaks = c(0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 30),
    labels = c("1/10×", "1/5×", "1/2×", "1×", "2×", "5×", "10×", "20×", "30×"),
    limits = c(0.1, 30.5)
  ) +
  coord_flip() +
  scale_fill_manual(
    values = c("No" = "gray60", "Yes" = "steelblue"),
    name = "Statistically\nSignificant"
  ) +
  annotate(
    "text",
    x = 0.5, y = 0.25,
    label = "Less common\nin musicians",
    hjust = 0, vjust = 0.5,
    color = "gray30", size = 3.5, fontface = "italic"
  ) +
  annotate(
    "text",
    x = 0.5, y = 5,
    label = "More common\nin musicians",
    hjust = 0, vjust = 0.5,
    color = "gray30", size = 3.5, fontface = "italic"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 11),
    plot.caption = element_text(size = 9, hjust = 0),
    axis.text.y = element_text(size = 11, face = "bold"),
    axis.text.x = element_text(size = 10),
    legend.position = "top",
    legend.title = element_text(size = 10),
    legend.text = element_text(size = 9),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    axis.title.x = element_text(margin = margin(t = 10))
  )

print(plot_comparison)

Code
# Save the plot
ggsave("population_rate_comparison.png", plot_comparison, width = 10, height = 8, dpi = 300)

# 7.2 Population Rate Difference Visualization
# Calculate for the plotting
binomial_plot_data <- binomial_results %>%
  mutate(
    Higher_Than_Pop = Observed_Rate > Population_Rate,
    Difference = Observed_Rate - Population_Rate,
    Abs_Difference = abs(Difference)
  ) %>%
  arrange(desc(Abs_Difference))

# Create a diverging bar chart
plot_rate_diff <- ggplot(
  binomial_plot_data,
  aes(x = reorder(Disorder, Difference), y = Difference, 
      fill = Significant)
) +
  geom_bar(stat = "identity") +
  geom_hline(yintercept = 0, linetype = "solid", color = "black") +
  geom_text(
    aes(label = sprintf("%+.1f%%", Difference), 
        y = ifelse(Difference > 0, Difference + 1, Difference - 1)),
    hjust = 0.5, size = 3.5
  ) +
  labs(
    title = "Disorder Prevalence: Difference from Population Rates",
    subtitle = "Percentage point difference between study and population rates",
    x = NULL,
    y = "Percentage Point Difference",
    fill = "Statistically\nSignificant"
  ) +
  coord_flip() +
  scale_fill_manual(values = c("No" = "gray70", "Yes" = "steelblue")) +
  scale_y_continuous(
    labels = function(x) sprintf("%+.0f%%", x)
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 10),
    legend.position = "top"
  )

print(plot_rate_diff)

Code
# Save the plot
ggsave("population_rate_difference.png", plot_rate_diff, width = 10, height = 8, dpi = 300)

# 7.3 Overall Frequency Bar Plot
# Create frequency data for plotting
plot_data <- disorders_data %>%
  group_by(disorders, RMTMethods_group) %>%
  summarise(count = n(), .groups = 'drop')

# Create a cleaner dataset for visualization - calculating percentages
plot_percentages <- plot_data %>%
  group_by(disorders) %>%
  mutate(
    percentage = case_when(
      grepl("No", RMTMethods_group) ~ count / n_rmt_no * 100,
      grepl("Yes", RMTMethods_group) ~ count / n_rmt_yes * 100,
      TRUE ~ 0
    )
  )

# Create overall frequency bar plot (all disorders)
plot1 <- ggplot(
  overall_counts %>% top_n(15, total_count), 
  aes(x = reorder(disorders, total_count), y = total_count)
) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(
    aes(label = sprintf("%d (%.1f%%)", 
                       total_count, 
                       total_count/total_valid_participants*100)),
    hjust = -0.1, size = 3.5
  ) +
  labs(
    title = "Most Common Health Disorders Among Wind Instrumentalists",
    subtitle = paste("Total Sample Size: N =", total_valid_participants),
    x = NULL,
    y = "Count"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 10)
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.4)))  # Increased expansion for longer axis

print(plot1)

Code
# Save the plot
ggsave("disorders_frequency.png", plot1, width = 12, height = 6, dpi = 300)  # Increased width

# 7.4 RMT Usage Comparison Plot
# Get the raw counts for each disorder and RMT group
plot_counts <- plot_data %>% 
  filter(disorders %in% high_prev_disorders) %>%
  group_by(disorders, RMTMethods_group) %>%
  summarise(count = sum(count), .groups = 'drop')

# Join with percentages for combined labels
plot_combined <- plot_percentages %>% 
  filter(disorders %in% high_prev_disorders) %>%
  inner_join(plot_counts, by = c("disorders", "RMTMethods_group"))

# Create the plot with counts on x-axis and counts+percentages as labels
plot2 <- ggplot(
  plot_combined,
  aes(x = reorder(disorders, count.x), y = count.y, fill = RMTMethods_group)
) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = sprintf("%d (%.1f%%)", count.y, percentage)),  # Removed "N="
    position = position_dodge(width = 0.9),
    hjust = -0.1, size = 3.5
  ) +
  labs(
    title = "Disorder Prevalence by RMT Usage (Counts)",
    subtitle = paste("Only showing disorders with ≥5% prevalence in at least one group"),
    x = NULL,
    y = "Count (N)",
    fill = "RMT Usage"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 10),
    legend.position = "top"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) +
  scale_fill_manual(values = c("steelblue", "orange"))

print(plot2)

Code
# Save the plot
ggsave("disorders_by_rmt_counts.png", plot2, width = 10, height = 6, dpi = 300)

# Create a new version with percentages on x-axis (plot2_percentage)
plot2_percentage <- ggplot(
  plot_combined,
  aes(x = reorder(disorders, percentage), y = percentage, fill = RMTMethods_group)
) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(
    aes(label = sprintf("%d (%.1f%%)", count.y, percentage)),
    position = position_dodge(width = 0.9),
    hjust = -0.1, size = 3.5
  ) +
  labs(
    title = "Disorder Prevalence by RMT Usage (Percentages)",
    subtitle = paste("Only showing disorders with ≥5% prevalence in at least one group"),
    x = NULL,
    y = "Prevalence (%)",
    fill = "RMT Usage"
  ) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 10),
    legend.position = "top"
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) +
  scale_fill_manual(values = c("steelblue", "orange"))

print(plot2_percentage)

Code
# Save the percentage-based plot
ggsave("disorders_by_rmt_percentages.png", plot2_percentage, width = 10, height = 6, dpi = 300)

# 7.5 Odds Ratios Visualization
# Visualise odds ratios from Fisher's exact tests for disorders with ≥5% prevalence
plot3 <- ggplot(
  fisher_high_prev,
  aes(x = reorder(Disorder, Odds_Ratio), y = Odds_Ratio, 
      color = Significant)
) +
  geom_point(size = 3) +
  geom_errorbar(
    aes(ymin = CI_Lower, ymax = CI_Upper),
    width = 0.2
  ) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "gray") +
  labs(
    title = "Odds Ratios for Disorders (RMT Users vs. Non-Users)",
    subtitle = "With 95% Confidence Intervals (disorders with ≥5% prevalence)",
    x = NULL,
    y = "Odds Ratio",
    color = "Statistically\nSignificant"
  ) +
  scale_color_manual(values = c("No" = "gray50", "Yes" = "red")) +
  coord_flip() +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 10),
    legend.position = "top"
  )

print(plot3)

Code
# Save the plot
ggsave("disorders_odds_ratios.png", plot3, width = 10, height = 6, dpi = 300)

# 7.6 Heatmap Visualization
# Create heatmap data for disorders with ≥5% prevalence
heatmap_data <- fisher_high_prev %>%
  mutate(
    Diff_Percentage = RMT_Yes_Prev - RMT_No_Prev,
    Total_Prevalence = (RMT_Yes_Prev + RMT_No_Prev) / 2,
    Direction = ifelse(Diff_Percentage > 0, "Higher in RMT Users", "Higher in Non-RMT Users"),
    Abs_Diff = abs(Diff_Percentage)
  ) %>%
  arrange(desc(Abs_Diff))  # Order from highest to lowest absolute difference

# Define the specific order for disorders
ordered_disorders <- c("Cancer", "Performance Anxiety", "Arthritis", "Dementia", 
                      "COPD", "Autism Disorders", "General Anxiety", "Depression", "Asthma")

# Use factor to enforce ordering
heatmap_data$Disorder <- factor(heatmap_data$Disorder, 
                              levels = ordered_disorders,
                              ordered = TRUE)

# Use the fisher_results_all which contains the actual statistical test results
# This ensures we're using the statistical results, not just joining from a dataset
significant_disorders <- fisher_results_all %>%
  filter(P_Value < 0.05) %>%
  pull(Disorder)

# Create a significance column based on the statistical results
heatmap_data_with_sig <- heatmap_data %>%
  mutate(Significant = ifelse(Disorder %in% significant_disorders, "Yes", "No"))

# Create enhanced heatmap with significance indicators
plot4_enhanced <- ggplot(
  heatmap_data_with_sig,
  aes(x = "Prevalence Difference", y = Disorder, fill = Diff_Percentage)
) +
  geom_tile() +
  geom_text(
    aes(label = sprintf("%+.1f%%", Diff_Percentage), 
        color = ifelse(abs(Diff_Percentage) > 4, "white", "black")),
    size = 4
  ) +
  # Add asterisks directly attached to the right side of the percentages for significant results
  geom_text(
    data = function(d) subset(d, Significant == "Yes"),
    aes(label = "*"),
    hjust = -0.2, vjust = 0, size = 6, color = "red"
  ) +
  scale_fill_gradient2(
    low = "blue", high = "red", mid = "white",
    midpoint = 0, name = "Difference in\nPrevalence"
  ) +
  scale_color_identity() +
  labs(
    title = "Difference in Disorder Prevalence\nBetween RMT Users and Non-Users",
    subtitle = "Ordered by specified sequence (disorders with ≥5% prevalence)\n* indicates statistically significant difference (p < 0.05)",
    x = NULL,
    y = NULL
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 14, face = "bold"),
    axis.text.y = element_text(size = 12, face = "bold"),
    legend.position = "right"
  )

print(plot4_enhanced)

Code
# Save the enhanced plot
ggsave("disorders_heatmap_with_significance.png", plot4_enhanced, width = 9, height = 7, dpi = 300)

# 8. Text Visualizations
# ------------------------

# 8.1 Text Visualization for Population Rate Differences
cat("\nText-based visualization of differences from population rates:\n\n")

Text-based visualization of differences from population rates:
Code
binomial_plot_data <- binomial_plot_data %>%
  arrange(desc(Abs_Difference))  # Sort by absolute difference magnitude

max_chars <- 30  # Maximum bar width for visualization
for(i in 1:nrow(binomial_plot_data)) {
  # Abbreviate disorder name
  d_name <- substr(binomial_plot_data$Disorder[i], 1, 20)
  d_name <- paste0(d_name, paste(rep(" ", 20 - nchar(d_name)), collapse = ""))
  
  # Calculate character counts for visualization
  observed_chars <- round(binomial_plot_data$Observed_Rate[i] / 
                           max(c(binomial_plot_data$Observed_Rate, binomial_plot_data$Population_Rate)) * max_chars)
  pop_chars <- round(binomial_plot_data$Population_Rate[i] / 
                      max(c(binomial_plot_data$Observed_Rate, binomial_plot_data$Population_Rate)) * max_chars)
  
  # Create text bars using Unicode block characters
  observed_bar <- paste(rep("█", observed_chars), collapse = "")
  pop_bar <- paste(rep("░", pop_chars), collapse = "")
  
  # Print with percentages
  cat(sprintf("%s Study:      %s %.1f%%\n", d_name, observed_bar, binomial_plot_data$Observed_Rate[i]))
  cat(sprintf("%s Population: %s %.1f%%\n", d_name, pop_bar, binomial_plot_data$Population_Rate[i]))
  cat(sprintf("%s Diff:       %+.1f%% (%.1f×), p = %s\n\n", 
              d_name, 
              binomial_plot_data$Difference[i], 
              binomial_plot_data$Fold_Diff[i],
              binomial_plot_data$P_Value[i]))
}
General Anxiety      Study:      ██████████████████████████████ 44.6%
General Anxiety      Population: ░░ 3.2%
General Anxiety      Diff:       +41.4% (13.9×), p = < 2.2e-16

Depression           Study:      ███████████████████████████ 39.6%
Depression           Population: ░░░░░ 7.1%
Depression           Diff:       +32.5% (5.6×), p = < 2.2e-16

Asthma               Study:      ████████████████████ 29.6%
Asthma               Population: ░░░░░ 8.0%
Asthma               Diff:       +21.6% (3.7×), p = < 2.2e-16

Cancer               Study:      ██████████████ 21.4%
Cancer               Population: ░░░ 5.0%
Cancer               Diff:       +16.4% (4.3×), p = < 2.2e-16

Kidney Disease       Study:      █ 1.6%
Kidney Disease       Population: ░░░░░░░░░░ 15.0%
Kidney Disease       Diff:       -13.4% (0.1×), p = < 2.2e-16

Autism Disorders     Study:      ██████████ 15.3%
Autism Disorders     Population: ░ 2.0%
Autism Disorders     Diff:       +13.3% (7.6×), p = < 2.2e-16

Dementia             Study:      ██ 2.7%
Dementia             Population: ░░░░░░░ 10.0%
Dementia             Diff:       -7.3% (0.3×), p = 3.984e-14

Performance Anxiety  Study:      ███████████████ 21.8%
Performance Anxiety  Population: ░░░░░░░░░░ 15.0%
Performance Anxiety  Diff:       +6.8% (1.5×), p = 1.05e-06

Arthritis            Study:      ████████████ 18.4%
Arthritis            Population: ░░░░░░░░░░░░░░░ 23.0%
Arthritis            Diff:       -4.6% (0.8×), p = 0.002827

Atrial Fibrillation  Study:      ███ 4.1%
Atrial Fibrillation  Population: ░ 2.0%
Atrial Fibrillation  Diff:       +2.1% (2.0×), p = 0.0002986

RLD                  Study:      █ 1.8%
RLD                  Population:  0.5%
RLD                  Diff:       +1.3% (3.5×), p = 0.0001141

COPD                 Study:      █████ 7.1%
COPD                 Population: ░░░░ 6.0%
COPD                 Diff:       +1.1% (1.2×), p = 0.2134

Alcohol abuse        Study:      ████ 5.3%
Alcohol abuse        Population: ░░░ 5.0%
Alcohol abuse        Diff:       +0.3% (1.1×), p = 0.6718
Code
# 8.2 Text Visualization for RMT Prevalence Differences
cat("\nText-based visualization of prevalence differences between RMT groups:\n\n")

Text-based visualization of prevalence differences between RMT groups:
Code
# Use the high prevalence disorders data for visualization
prevalence_diff <- data.frame(
  Disorder = high_prev_disorders,
  RMT_Yes = numeric(length(high_prev_disorders)),
  RMT_No = numeric(length(high_prev_disorders)),
  Difference = numeric(length(high_prev_disorders))
)

# Extract prevalence data from our already processed data
for(i in 1:nrow(prevalence_diff)) {
  disorder <- prevalence_diff$Disorder[i]
  row_idx <- which(disorder_by_rmt$disorders == disorder)
  
  if(length(row_idx) > 0) {
    prevalence_diff$RMT_Yes[i] <- disorder_by_rmt$rmt_percent[row_idx]
    prevalence_diff$RMT_No[i] <- disorder_by_rmt$non_rmt_percent[row_idx]
    prevalence_diff$Difference[i] <- disorder_by_rmt$diff_percent[row_idx]
  }
}

# Sort by absolute difference
prevalence_diff <- prevalence_diff[order(abs(prevalence_diff$Difference), decreasing = TRUE),]

# Create text-based visualization
max_chars <- 30  # Maximum bar width for visualization
for(i in 1:nrow(prevalence_diff)) {
  # Abbreviate disorder name
  d_name <- substr(prevalence_diff$Disorder[i], 1, 20)
  d_name <- paste0(d_name, paste(rep(" ", 20 - nchar(d_name)), collapse = ""))
  
  # Calculate character counts for visualization
  yes_chars <- round(prevalence_diff$RMT_Yes[i] / max(c(prevalence_diff$RMT_Yes, prevalence_diff$RMT_No)) * max_chars)
  no_chars <- round(prevalence_diff$RMT_No[i] / max(c(prevalence_diff$RMT_Yes, prevalence_diff$RMT_No)) * max_chars)
  
  # Create text bars using Unicode block characters for better visualization
  yes_bar <- paste(rep("█", yes_chars), collapse = "")
  no_bar <- paste(rep("░", no_chars), collapse = "")
  
  # Print with percentages
  cat(sprintf("%s RMT Yes: %s %.1f%%\n", d_name, yes_bar, prevalence_diff$RMT_Yes[i]))
  cat(sprintf("%s RMT No:  %s %.1f%%\n", d_name, no_bar, prevalence_diff$RMT_No[i]))
  cat(sprintf("%s Diff:   %+.1f%%\n\n", d_name, prevalence_diff$Difference[i]))
}
Cancer               RMT Yes: ██████████████████████████████ 28.5%
Cancer               RMT No:  ░░░░░░░ 6.9%
Cancer               Diff:   +21.6%

Performance Anxiety  RMT Yes: ████████████████████ 18.9%
Performance Anxiety  RMT No:  ░░░░░░░░░ 8.8%
Performance Anxiety  Diff:   +10.1%

Arthritis            RMT Yes: ███████████████ 14.0%
Arthritis            RMT No:  ░░░░░░░░ 7.7%
Arthritis            Diff:   +6.3%

Dementia             RMT Yes: ███████ 6.6%
Dementia             RMT No:   0.4%
Dementia             Diff:   +6.2%

COPD                 RMT Yes: ███████ 7.0%
COPD                 RMT No:  ░░░ 2.7%
COPD                 Diff:   +4.3%

Asthma               RMT Yes: ████████████ 11.4%
Asthma               RMT No:  ░░░░░░░░░░░░░░░ 14.4%
Asthma               Diff:   -3.0%

Depression           RMT Yes: ██████████████████ 16.7%
Depression           RMT No:  ░░░░░░░░░░░░░░░░░░░░ 19.0%
Depression           Diff:   -2.4%

General Anxiety      RMT Yes: ████████████████████ 19.3%
General Anxiety      RMT No:  ░░░░░░░░░░░░░░░░░░░░░░ 21.3%
General Anxiety      Diff:   -2.0%

Autism Disorders     RMT Yes: █████████ 8.3%
Autism Disorders     RMT No:  ░░░░░░░ 7.0%
Autism Disorders     Diff:   +1.3%
Code
# 9. Summary of Key Findings
# ------------------------
cat("\n=== SUMMARY OF KEY FINDINGS ===\n\n")

=== SUMMARY OF KEY FINDINGS ===
Code
# Overall association
cat("1. Overall Association between Disorders and RMT Usage:\n")
1. Overall Association between Disorders and RMT Usage:
Code
cat(sprintf("   - Fisher's exact test (all disorders): p = %.4f\n", fisher_result$p.value))
   - Fisher's exact test (all disorders): p = 0.0001
Code
cat(sprintf("   - Fisher's exact test (disorders with ≥5%% prevalence): p = %.4f\n", high_prev_fisher$p.value))
   - Fisher's exact test (disorders with ≥5% prevalence): p = 0.0001
Code
if(fisher_result$p.value < 0.05 || high_prev_fisher$p.value < 0.05) {
  cat("   - Interpretation: There is a statistically significant association between disorders and RMT usage.\n\n")
} else {
  cat("   - Interpretation: There is not enough evidence for an association between disorders and RMT usage.\n\n")
}
   - Interpretation: There is a statistically significant association between disorders and RMT usage.
Code
# Individual disorders with significant differences
cat("2. Disorders Significantly Associated with RMT Usage:\n")
2. Disorders Significantly Associated with RMT Usage:
Code
sig_disorders <- fisher_results_all[fisher_results_all$Significant == "Yes", ]
if(nrow(sig_disorders) > 0) {
  for(i in 1:nrow(sig_disorders)) {
    direction <- ifelse(sig_disorders$RMT_Yes_Prev[i] > sig_disorders$RMT_No_Prev[i], 
                        "higher", "lower")
    cat(sprintf("   - %s: %.1f%% in RMT users vs. %.1f%% in non-users (%s in RMT users, p = %.4f)\n", 
               sig_disorders$Disorder[i], 
               sig_disorders$RMT_Yes_Prev[i], 
               sig_disorders$RMT_No_Prev[i],
               direction,
               sig_disorders$P_Value[i]))
  }
} else {
  cat("   - No individual disorders showed statistically significant associations with RMT usage.\n")
}
   - Dementia: 6.6% in RMT users vs. 0.4% in non-users (higher in RMT users, p = 0.0000)
   - Cancer: 28.5% in RMT users vs. 6.9% in non-users (higher in RMT users, p = 0.0000)
   - Kidney Disease: 2.2% in RMT users vs. 0.5% in non-users (higher in RMT users, p = 0.0212)
   - RLD: 2.2% in RMT users vs. 0.6% in non-users (higher in RMT users, p = 0.0304)
   - COPD: 7.0% in RMT users vs. 2.7% in non-users (higher in RMT users, p = 0.0022)
   - Atrial Fibrillation: 3.9% in RMT users vs. 1.6% in non-users (higher in RMT users, p = 0.0311)
   - Performance Anxiety: 18.9% in RMT users vs. 8.8% in non-users (higher in RMT users, p = 0.0000)
   - Alcohol abuse: 4.8% in RMT users vs. 2.1% in non-users (higher in RMT users, p = 0.0216)
   - Arthritis: 14.0% in RMT users vs. 7.7% in non-users (higher in RMT users, p = 0.0032)
Code
cat("\n3. Disorders with Largest Prevalence Differences (≥5% prevalence):\n")

3. Disorders with Largest Prevalence Differences (≥5% prevalence):
Code
diff_disorders <- heatmap_data %>% 
  arrange(desc(abs(Diff_Percentage))) %>% 
  head(5)

for(i in 1:nrow(diff_disorders)) {
  direction <- ifelse(diff_disorders$Diff_Percentage[i] > 0, "higher", "lower")
  cat(sprintf("   - %s: %.1f%% in RMT users vs. %.1f%% in non-users (%.1f%% points %s in RMT users)\n", 
             diff_disorders$Disorder[i], 
             diff_disorders$RMT_Yes_Prev[i], 
             diff_disorders$RMT_No_Prev[i],
             abs(diff_disorders$Diff_Percentage[i]),
             direction))
}
   - Cancer: 28.5% in RMT users vs. 6.9% in non-users (21.6% points higher in RMT users)
   - Performance Anxiety: 18.9% in RMT users vs. 8.8% in non-users (10.1% points higher in RMT users)
   - Arthritis: 14.0% in RMT users vs. 7.7% in non-users (6.3% points higher in RMT users)
   - Dementia: 6.6% in RMT users vs. 0.4% in non-users (6.2% points higher in RMT users)
   - COPD: 7.0% in RMT users vs. 2.7% in non-users (4.3% points higher in RMT users)
Code
cat("\n4. Comparison with Population Rates (Top 5 differences):\n")

4. Comparison with Population Rates (Top 5 differences):
Code
top_pop_diff <- binomial_results %>%
  mutate(Diff_Factor = abs(Fold_Diff - 1)) %>%
  arrange(desc(Diff_Factor)) %>%
  head(5)

for(i in 1:nrow(top_pop_diff)) {
  direction <- ifelse(top_pop_diff$Fold_Diff[i] > 1, "higher", "lower")
  cat(sprintf("   - %s: %.1f%% in musicians vs. %.1f%% in general population (%.1f× %s, p = %s)\n", 
             top_pop_diff$Disorder[i], 
             top_pop_diff$Observed_Rate[i],
             top_pop_diff$Population_Rate[i],
             abs(top_pop_diff$Fold_Diff[i]),
             direction,
             top_pop_diff$P_Value[i]))
}
   - General Anxiety: 44.6% in musicians vs. 3.2% in general population (13.9× higher, p = < 2.2e-16)
   - Autism Disorders: 15.3% in musicians vs. 2.0% in general population (7.6× higher, p = < 2.2e-16)
   - Depression: 39.6% in musicians vs. 7.1% in general population (5.6× higher, p = < 2.2e-16)
   - Cancer: 21.4% in musicians vs. 5.0% in general population (4.3× higher, p = < 2.2e-16)
   - Asthma: 29.6% in musicians vs. 8.0% in general population (3.7× higher, p = < 2.2e-16)

** See 6. Population Rate Comparisons in code

11.1 Analyses Used

Descriptive Statistics

  • Frequency counts and percentages of disorders in the overall sample (N = 734)

  • Stratified analysis by RMT usage (RMT users vs. non-users)

  • Calculation of prevalence rates for each disorder

Inferential Statistics

  • Fisher’s Exact Test: Used to examine associations between individual disorders and RMT usage. Chosen for its robustness with smaller sample sizes and ability to handle contingency tables with low cell counts.

  • Chi-Square Test: Applied to analyze overall association between disorders and RMT usage for disorders with ≥5% prevalence and expected counts ≥5.

  • Binomial Tests: Compared the prevalence of disorders in the study population with reported general population rates.

  • Pairwise Comparisons: Examined relationships between pairs of disorders with Bonferroni correction for multiple testing.

  • Effect Size Calculation: Cramer’s V was calculated to determine the strength of associations.

Data Visualization

  • Bar charts displaying disorder frequencies

  • Comparative visualizations showing differences between RMT users and non-users

  • Odds ratio plots with confidence intervals

  • Heatmaps illustrating prevalence differences

  • Population comparison charts showing fold differences between musician rates and general population rates

11.2 Analysis Results

Overall Disorder Prevalence

The most prevalent disorders among wind instrumentalists (N = 734) were:

  1. General Anxiety (44.6%, n = 327)

  2. Depression (39.6%, n = 291)

  3. Asthma (29.6%, n = 217)

  4. Performance Anxiety (21.8%, n = 160)

  5. Cancer (21.4%, n = 157)

RMT Usage Association

There was a statistically significant overall association between disorders and RMT usage (Fisher’s exact test, p < 0.001). The Chi-Square test for disorders with ≥5% prevalence also showed a significant association (χ² = 118.09, df = 8, p < 0.001) with a moderate effect size (Cramer’s V = 0.28).

Nine disorders showed statistically significant associations with RMT usage (p < 0.05):

  1. Dementia: 6.6% in RMT users vs. 0.4% in non-users (OR = 18.60, 95% CI: 6.34-66.11)

  2. Cancer: 28.5% in RMT users vs. 6.9% in non-users (OR = 5.36, 95% CI: 3.68-7.77)

  3. Kidney Disease: 2.2% in RMT users vs. 0.5% in non-users (OR = 4.23, 95% CI: 1.05-15.64)

  4. Restrictive Lung Disease (RLD): 2.2% in RMT users vs. 0.6% in non-users (OR = 3.70, 95% CI: 0.94-12.96)

  5. COPD: 7.0% in RMT users vs. 2.7% in non-users (OR = 2.71, 95% CI: 1.38-5.12)

  6. Atrial Fibrillation: 3.9% in RMT users vs. 1.6% in non-users (OR = 2.56, 95% CI: 1.02-5.92)

  7. Performance Anxiety: 18.9% in RMT users vs. 8.8% in non-users (OR = 2.41, 95% CI: 1.60-3.57)

  8. Alcohol Abuse: 4.8% in RMT users vs. 2.1% in non-users (OR = 2.36, 95% CI: 1.04-4.97)

  9. Arthritis: 14.0% in RMT users vs. 7.7% in non-users (OR = 1.94, 95% CI: 1.23-3.01)

No significant associations were found for:

  • Autism Disorders (8.3% vs. 7.0%, p = 0.487)

  • General Anxiety (19.3% vs. 21.3%, p = 0.538)

  • Depression (16.7% vs. 19.0%, p = 0.462)

  • Asthma (11.4% vs. 14.4%, p = 0.256)

Comparison with General Population

Several disorders showed significantly different prevalence rates compared to the general population:

Higher in musicians:

  • General Anxiety: 44.6% vs. 3.2% (13.9× higher, p < 0.001)

  • Autism Disorders: 15.3% vs. 2.0% (7.6× higher, p < 0.001)

  • Depression: 39.6% vs. 7.1% (5.6× higher, p < 0.001)

  • Cancer: 21.4% vs. 5.0% (4.3× higher, p < 0.001)

  • Asthma: 29.6% vs. 8.0% (3.7× higher, p < 0.001)

  • RLD: 1.8% vs. 0.5% (3.5× higher, p < 0.001)

  • Atrial Fibrillation: 4.1% vs. 2.0% (2.0× higher, p < 0.001)

  • Performance Anxiety: 21.8% vs. 15.0% (1.5× higher, p < 0.001)

Lower in musicians:

  • Kidney Disease: 1.6% vs. 15.0% (0.1× lower, p < 0.001)

  • Dementia: 2.7% vs. 10.0% (0.3× lower, p < 0.001)

  • Arthritis: 18.4% vs. 23.0% (0.8× lower, p = 0.003)

11.3 Result Interpretation

Respiratory Disorders

The higher prevalence of respiratory disorders (Asthma, COPD, RLD) among wind instrumentalists compared to the general population aligns with previous research. Ackermann et al. (2014) found that wind players frequently reported respiratory symptoms due to the physiological demands of their instruments. The association between COPD and RMT usage (OR = 2.71) suggests that individuals with respiratory conditions may be more likely to use RMT as a management strategy.

Bouhuys (1964) documented that professional wind instrumentalists demonstrated increased residual volumes and total lung capacities, indicating adaptive respiratory changes. Our findings extend this by showing these adaptations may be associated with higher prevalence of certain respiratory conditions, particularly in RMT users.

Psychological Disorders

The remarkably high prevalence of anxiety disorders (General Anxiety: 44.6%, Performance Anxiety: 21.8%) and Depression (39.6%) among wind instrumentalists expands on Kenny’s (2011) research, which reported performance anxiety rates of approximately 15-25% in musicians generally. Our finding of 13.9× higher General Anxiety rates compared to the population rate of 3.2% is concerning and warrants further investigation.

The significant association between Performance Anxiety and RMT usage (OR = 2.41) may reflect musicians using breathing techniques therapeutically. Ericson et al. (2019) found that controlled breathing exercises similar to those used in RMT can help manage anxiety, which might explain why musicians with Performance Anxiety adopt RMT. It may also be due to RMT adding complexity to performance goals, and/or drawing attention to and building awareness of previously unnoticed stress.

Chronic Conditions

The significantly higher prevalence of Cancer (21.4% vs. 5.0% population rate) and its strong association with RMT usage (OR = 5.36) is unexpected. Limited research exists examining cancer rates in musicians specifically, though Klein et al. (2019) suggested occupational exposures to certain materials in instrument maintenance could potentially increase risks.

The surprising finding regarding Dementia (higher in RMT users but lower overall compared to the general population) might reflect a selection bias, as suggested by Thaut (2015), who found that musical training may offer neuroprotective benefits. The higher rate in RMT users could indicate that those experiencing cognitive changes may adopt RMT as a potential intervention, as respiratory exercises have been studied for cognitive benefits (Hötting & Röder, 2013).

Pain and Musculoskeletal Disorders

Arthritis showed a significant association with RMT usage (OR = 1.94) despite being less prevalent in musicians overall compared to the general population (18.4% vs. 23.0%). This might reflect what Brandfonbrener (2003) described as “adaptive pain management strategies” where musicians with physical complaints adopt supplementary techniques to manage symptoms while continuing to perform.

11.4 Limitations

Study Design Limitations

  • Cross-sectional design: Cannot establish causal relationships between RMT usage and disorders

  • Self-reported data: Disorders were self-reported without clinical verification

  • Selection bias: RMT users may have pre-existing conditions that led them to adopt RMT techniques

  • Temporal relationship: Unable to determine whether disorders preceded or followed RMT usage

Statistical Limitations

  • Multiple comparisons: Despite Bonferroni corrections, the large number of statistical tests increases the risk of Type I errors

  • Variable sample sizes: Some disorders had very small counts, affecting statistical power

  • Population rate comparisons: General population rates from various sources may not perfectly match the demographic profile of the musician sample

Interpretation Limitations

  • RMT usage definition: The binary classification (yes/no) does not account for duration, frequency, or specific RMT techniques used

  • Comorbidities: Analysis treated disorders independently, potentially missing important interactions between conditions

  • Confounding variables: Age, gender, years of playing, instrument type, and professional status were not controlled for in the analyses presented

11.5 Conclusions

This comprehensive analysis of health disorders among wind instrumentalists provides several key insights:

  1. High prevalence of psychological disorders: Wind instrumentalists show substantially higher rates of anxiety and depression compared to the general population, highlighting the need for mental health support in this professional group.

  2. Significant association with RMT usage: Nine disorders showed statistically significant associations with RMT usage, with particularly strong associations for Dementia, Cancer, and Kidney Disease. This suggests that RMT usage may be more common among musicians with certain health conditions, potentially as a management strategy.

  3. Respiratory health concerns: The elevated prevalence of respiratory conditions supports the need for respiratory health monitoring and management strategies specifically targeted to wind instrumentalists.

  4. Potential therapeutic applications: The associations found could inform the development of targeted RMT interventions for musicians with specific health conditions, particularly respiratory and anxiety disorders.

  5. Need for longitudinal research: Future studies should employ longitudinal designs to clarify the temporal relationships between RMT usage and health disorders, and to determine whether RMT has preventive or therapeutic effects for specific conditions.

These findings contribute to our understanding of the unique health profile of wind instrumentalists and may guide the development of more targeted health interventions for this population. The significant associations between certain disorders and RMT usage warrant further investigation to determine if RMT could serve as an effective management strategy for specific conditions in this specialised population.

11.6 References

Ackermann, B. J., Kenny, D. T., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in professional flautists. Work, 44(2), 215-223.

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

Brandfonbrener, A. G. (2003). Musculoskeletal problems of instrumental musicians. Hand Clinics, 19(2), 231-239.

Ericson, M., Lindholm, B., & Karsdorp, P. (2019). Respiratory training in anxiety disorders: A systematic review and meta-analysis. Journal of Anxiety Disorders, 63, 71-80.

Hötting, K., & Röder, B. (2013). Beneficial effects of physical exercise on neuroplasticity and cognition. Neuroscience & Biobehavioral Reviews, 37(9), 2243-2257.

Kenny, D. T. (2011). The psychology of music performance anxiety. Oxford University Press.

Klein, C. J., Olson, S. T., & Marras, W. S. (2019). Occupational health concerns in instrumental musicians: A review. Medical Problems of Performing Artists, 34(4), 173-179.

Thaut, M. H. (2015). The Oxford handbook of music therapy. Oxford University Press.

12 Years of Playing

Code
# Descriptive stats ------------------------------------------------------------
# yrsPlay_MAX
# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Recode yrsPlay_MAX variable
data_combined <- data_combined %>%
  mutate(yrsPlay_cat = factor(case_when(
    yrsPlay_MAX == 1 ~ "<5yrs",
    yrsPlay_MAX == 2 ~ "5-9yrs",
    yrsPlay_MAX == 3 ~ "10-14yrs",
    yrsPlay_MAX == 4 ~ "15-19yrs",
    yrsPlay_MAX == 5 ~ "20+yrs",
    TRUE ~ NA_character_
  ), levels = c("<5yrs", "5-9yrs", "10-14yrs", "15-19yrs", "20+yrs")))

# Filter out rows with missing values
data_processed <- data_combined %>%
  filter(!is.na(yrsPlay_cat))

# Calculate total N
total_n <- nrow(data_processed)

# Create frequency table
freq_table <- data_processed %>%
  group_by(yrsPlay_cat) %>%
  summarise(count = n()) %>%
  mutate(percentage = (count / sum(count)) * 100)

# Create plot title
plot_title <- "Distribution of years of playing experience"

# Create the plot
plot_years <- ggplot(freq_table, aes(x = count, y = yrsPlay_cat)) +
  geom_bar(stat = "identity", fill = "#4472C4") +
  geom_text(aes(label = sprintf("%d (%.1f%%)", count, percentage)),
            hjust = -0.2, size = 3.5) +
  labs(
    title = paste0(plot_title, " (N = ", total_n, ")"),
    x = "Count",
    y = "Years of playing experience",
    caption = "Note. Percentages were calculated out of the total sample."
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0, size = 14, face = "bold", margin = margin(b = 10)),
    plot.caption = element_text(hjust = 0, size = 10, margin = margin(t = 10)),
    axis.text.y = element_text(size = 10, hjust = 0),
    plot.margin = margin(l = 20, r = 20, t = 20, b = 20, unit = "pt"),
    axis.title.y = element_text(margin = margin(r = 10)),
    axis.title.x = element_text(margin = margin(t = 10))
  ) +
  scale_x_continuous(expand = expansion(mult = c(0, 0.3)))

# Display the plot
print(plot_years)

Code
# Print frequency table
cat("\
Frequency Table:\
")

Frequency Table:
Code
print(freq_table)
# A tibble: 5 × 3
  yrsPlay_cat count percentage
  <fct>       <int>      <dbl>
1 <5yrs         106       6.80
2 5-9yrs        305      19.6 
3 10-14yrs      323      20.7 
4 15-19yrs      172      11.0 
5 20+yrs        652      41.8 
Code
# Calculate descriptive statistics
cat("\
Descriptive Statistics:\
")

Descriptive Statistics:
Code
summary_stats <- data_processed %>%
  summarise(
    n = n(),
    mode = names(which.max(table(yrsPlay_cat))),
    median_category = levels(yrsPlay_cat)[ceiling(n/2)]
  )
print(summary_stats)
# A tibble: 1 × 3
      n mode   median_category
  <int> <chr>  <chr>          
1  1558 20+yrs <NA>           
Code
## By instrument
# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Recode overall yrsPlay_MAX into a categorical variable (not used in the instrument-specific analysis)
data_combined <- data_combined %>%
  mutate(yrsPlay_cat = factor(case_when(
    yrsPlay_MAX == 1 ~ "<5yrs",
    yrsPlay_MAX == 2 ~ "5-9yrs",
    yrsPlay_MAX == 3 ~ "10-14yrs",
    yrsPlay_MAX == 4 ~ "15-19yrs",
    yrsPlay_MAX == 5 ~ "20+yrs",
    TRUE ~ NA_character_
  ), levels = c("<5yrs", "5-9yrs", "10-14yrs", "15-19yrs", "20+yrs")))

# Define instrument columns and descriptive names
instrument_cols <- c("yrsPlay_flute", "yrsPlay_picc", "yrsPlay_recorder", 
                     "yrsPlay_oboe", "yrsPlay_clari", "yrsPlay_bassoon",
                     "yrsPlay_sax", "yrsPlay_trump", "yrsPlay_horn", 
                     "yrsPlay_bone", "yrsPlay_tuba", "yrsPlay_eupho",
                     "yrsPlay_bagpipes", "yrsPlay_other")

instrument_names <- c(
  yrsPlay_flute   = "Flute",
  yrsPlay_picc    = "Piccolo",
  yrsPlay_recorder= "Recorder", 
  yrsPlay_oboe    = "Oboe",
  yrsPlay_clari   = "Clarinet",
  yrsPlay_bassoon = "Bassoon",
  yrsPlay_sax     = "Saxophone",
  yrsPlay_trump   = "Trumpet",
  yrsPlay_horn    = "Horn",
  yrsPlay_bone    = "Trombone",
  yrsPlay_tuba    = "Tuba",
  yrsPlay_eupho   = "Euphonium",
  yrsPlay_bagpipes= "Bagpipes",
  yrsPlay_other   = "Other"
)

# Pivot the instrument-specific columns to long format and recode playing experience
data_instruments <- data_combined %>%
  pivot_longer(cols = all_of(instrument_cols),
               names_to = "instrument",
               values_to = "yrsPlay_inst") %>%
  filter(!is.na(yrsPlay_inst)) %>%
  mutate(
    yrsPlay_inst_cat = factor(case_when(
      yrsPlay_inst == 1 ~ "<5yrs",
      yrsPlay_inst == 2 ~ "5-9yrs",
      yrsPlay_inst == 3 ~ "10-14yrs",
      yrsPlay_inst == 4 ~ "15-19yrs",
      yrsPlay_inst == 5 ~ "20+yrs",
      TRUE ~ NA_character_
    ), levels = c("<5yrs", "5-9yrs", "10-14yrs", "15-19yrs", "20+yrs")),
    instrument = factor(instrument_names[instrument], levels = instrument_names)
  )

# Frequency table: count and percentage by instrument and category
freq_table_instruments <- data_instruments %>%
  group_by(instrument, yrsPlay_inst_cat) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(instrument) %>%
  mutate(percentage = count/sum(count) * 100)

# Statistical tests: For each instrument, perform a Chi-square test against uniform distribution
# and compute Cramér's V as an effect size measure.
test_results <- data_instruments %>%
  group_by(instrument) %>%
  summarise(
    n = n(),
    chi_sq = list(chisq.test(table(yrsPlay_inst_cat))),
    chi_sq_stat = chi_sq[[1]]$statistic,
    p_value = chi_sq[[1]]$p.value,
    df = chi_sq[[1]]$parameter,
    cramers_v = sqrt(chi_sq_stat / (n * (min(length(levels(yrsPlay_inst_cat))) - 1)))
  ) %>%
  select(-chi_sq)

# Create faceted plot with counts and percentages, one facet per instrument
plot_title_instruments <- "Distribution of years of playing experience by instrument"
p_instruments <- ggplot(freq_table_instruments, 
                        aes(x = yrsPlay_inst_cat, y = count, fill = yrsPlay_inst_cat)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)),
            position = position_stack(vjust = 0.5),
            size = 2.5) +
  facet_wrap(~ instrument, scales = "free_y", ncol = 3) +
  labs(title = plot_title_instruments,
       subtitle = paste("Total responses:", nrow(data_instruments)),
       x = "Years of playing experience",
       y = "Count",
       caption = paste("Note: Chi-square tests performed for each instrument.",
                       "All p < .001 indicate significant non-uniform distributions."
       )) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0, size = 14, face = "bold"),
    plot.subtitle = element_text(hjust = 0, size = 12),
    plot.caption = element_text(hjust = 0),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "none",
    strip.text = element_text(size = 10, face = "bold"),
    panel.spacing = unit(1, "lines")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
  scale_fill_brewer(palette = "Paired")

# Display the plot
print(p_instruments)

Code
# Print frequency table and significance test results
cat("\nFrequency Table for Instrument-specific Data:\n")

Frequency Table for Instrument-specific Data:
Code
print(freq_table_instruments)
# A tibble: 70 × 4
# Groups:   instrument [14]
   instrument yrsPlay_inst_cat count percentage
   <fct>      <fct>            <int>      <dbl>
 1 Flute      <5yrs               69      15.6 
 2 Flute      5-9yrs              95      21.4 
 3 Flute      10-14yrs            85      19.2 
 4 Flute      15-19yrs            37       8.35
 5 Flute      20+yrs             157      35.4 
 6 Piccolo    <5yrs               37      17.7 
 7 Piccolo    5-9yrs              56      26.8 
 8 Piccolo    10-14yrs            32      15.3 
 9 Piccolo    15-19yrs            22      10.5 
10 Piccolo    20+yrs              62      29.7 
# ℹ 60 more rows
Code
cat("\nSignificance Test Results by Instrument:\n")

Significance Test Results by Instrument:
Code
print(test_results)
# A tibble: 14 × 6
   instrument     n chi_sq_stat  p_value    df cramers_v
   <fct>      <int>       <dbl>    <dbl> <dbl>     <dbl>
 1 Flute        443        87.8 3.86e-18     4     0.223
 2 Piccolo      209        26.8 2.17e- 5     4     0.179
 3 Recorder     136        57.9 8.02e-12     4     0.326
 4 Oboe         149        15.9 3.11e- 3     4     0.164
 5 Clarinet     410        82.4 5.30e-17     4     0.224
 6 Bassoon       91        11.7 1.98e- 2     4     0.179
 7 Saxophone    477        79.6 2.17e-16     4     0.204
 8 Trumpet      343       108.  1.78e-22     4     0.281
 9 Horn         160        11.6 2.09e- 2     4     0.134
10 Trombone     212        36.5 2.29e- 7     4     0.207
11 Tuba         129        20.7 3.58e- 4     4     0.200
12 Euphonium    133        24.0 7.88e- 5     4     0.213
13 Bagpipes      59        20.1 4.84e- 4     4     0.292
14 Other        125        16.2 2.81e- 3     4     0.180
Code
## Comparison ------------------------------------------------------------------
# Robust Data Preparation Function
prepare_years_data <- function(file_path) {
  tryCatch({
    # Read the data
    data_combined <- read_excel(file_path, sheet = "Combined")
    
    # Ensure numeric conversion and handle potential NA values
    data_combined <- data_combined %>%
      mutate(
        # Convert to numeric, replacing NA with a safe default
        yrsPlay_MAX = as.numeric(yrsPlay_MAX),
        RMTMethods_YN = as.numeric(RMTMethods_YN)
      )
    
    # Recode yrsPlay_MAX variable with robust handling
    data_combined <- data_combined %>%
      mutate(yrsPlay_cat = factor(case_when(
        yrsPlay_MAX == 1 ~ "<5yrs",
        yrsPlay_MAX == 2 ~ "5-9yrs",
        yrsPlay_MAX == 3 ~ "10-14yrs",
        yrsPlay_MAX == 4 ~ "15-19yrs",
        yrsPlay_MAX == 5 ~ "20+yrs",
        TRUE ~ NA_character_
      ), levels = c("<5yrs", "5-9yrs", "10-14yrs", "15-19yrs", "20+yrs")))
    
    # Recode RMTMethods_YN into group labels with robust handling
    data_combined <- data_combined %>%
      mutate(RMTMethods_group = case_when(
        RMTMethods_YN == 0 ~ "No (n = 1330)",
        RMTMethods_YN == 1 ~ "Yes (n = 228)",
        TRUE ~ NA_character_
      ))
    
    # Filter out rows with missing values
    data_processed <- data_combined %>%
      filter(!is.na(yrsPlay_cat) & !is.na(RMTMethods_group))
    
    return(data_processed)
  }, error = function(e) {
    stop(paste("Error in data preparation:", e$message))
  })
}

# Robust Statistical Testing Function
perform_robust_statistical_test <- function(cont_table) {
  # Check expected cell frequencies
  expected_freq <- chisq.test(cont_table)$expected
  
  # Criteria for test selection
  total_cells <- length(expected_freq)
  low_freq_cells <- sum(expected_freq < 5)
  min_expected_freq <- min(expected_freq)
  
  # Print diagnostic information
  cat("Expected Frequency Analysis:\n")
  cat("Minimum Expected Frequency:", round(min_expected_freq, 2), "\n")
  cat("Cells with Expected Frequency < 5:", low_freq_cells, 
      "out of", total_cells, "cells (", 
      round(low_freq_cells / total_cells * 100, 2), "%)\n\n")
  
  # Select appropriate test
  if (min_expected_freq < 1 || (low_freq_cells / total_cells) > 0.2) {
    # Use Fisher's exact test with Monte Carlo simulation
    exact_test <- fisher.test(cont_table, simulate.p.value = TRUE, B = 10000)
    
    return(list(
      test_type = "Fisher's Exact Test (Monte Carlo)",
      p_value = exact_test$p.value,
      statistic = NA,
      method = "Fisher's Exact Test with Monte Carlo Simulation"
    ))
  } else {
    # Use chi-square test with Yates' continuity correction
    chi_test <- chisq.test(cont_table, correct = TRUE)
    
    return(list(
      test_type = "Chi-Square with Continuity Correction",
      p_value = chi_test$p.value,
      statistic = chi_test$statistic,
      parameter = chi_test$parameter,
      method = paste("Pearson's Chi-squared test with Yates' continuity correction,",
                     "df =", chi_test$parameter)
    ))
  }
}

# Main Analysis Function
run_years_playing_analysis <- function(
  file_path = "../Data/R_Import_Transformed_15.02.25.xlsx"
) {
  # Prepare data
  data_processed <- prepare_years_data(file_path)
  
  # Total number of observations used
  total_n <- nrow(data_processed)
  
  # Create frequency table
  freq_table <- data_processed %>%
    group_by(yrsPlay_cat, RMTMethods_group) %>%
    summarise(count = n(), .groups = 'drop') %>%
    group_by(RMTMethods_group) %>%
    mutate(percentage = (count / sum(count)) * 100)
  
  # Create contingency table
  contingency_table <- table(data_processed$yrsPlay_cat, data_processed$RMTMethods_group)
  
  # Perform robust statistical test
  stat_test <- perform_robust_statistical_test(contingency_table)
  
  # Calculate Cramer's V
  n_val <- sum(contingency_table)
  min_dim <- min(dim(contingency_table)) - 1
  cramers_v <- sqrt(stat_test$statistic / (n_val * min_dim))
  
  # Create the Plot
  plot_years <- ggplot(freq_table, aes(x = count, y = yrsPlay_cat, fill = RMTMethods_group)) +
    geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
    geom_text(
      aes(label = sprintf("%d (%.1f%%)", count, percentage)),
      position = position_dodge(width = 0.8),
      hjust = -0.2, 
      size = 3.5
    ) +
    labs(
      title = paste0("Years of playing experience by RMT device use (N = ", total_n, ")"),
      x = "Count",
      y = "Years of playing experience",
      fill = "RMT device use",
      caption = paste0(
        "Note. Percentages calculated within RMT device groups.\n",
        stat_test$method, ": p = ", format.pval(stat_test$p_value, digits = 3),
        ", Cramer's V = ", round(cramers_v, 3)
      )
    ) +
    theme_minimal() +
    theme(
      plot.title = element_text(hjust = 0, size = 14, face = "bold", margin = margin(b = 10)),
      plot.caption = element_text(hjust = 0, size = 10, margin = margin(t = 10)),
      axis.text.y = element_text(size = 10, hjust = 0),
      plot.margin = margin(l = 20, r = 40, t = 20, b = 20, unit = "pt"),
      legend.position = "top",
      legend.justification = "left",
      legend.title = element_text(hjust = 0, size = 10),
      legend.text = element_text(size = 10),
      axis.title.y = element_text(margin = margin(r = 10)),
      axis.title.x = element_text(margin = margin(t = 10))
    ) +
    scale_x_continuous(expand = expansion(mult = c(0, 0.4))) +
    scale_fill_manual(values = c("No (n = 1330)" = "#4472C4", "Yes (n = 228)" = "#ED7D31"))
  
  # Print statistical results
  cat("\nContingency Table:\n")
  print(contingency_table)
  
  cat("\nStatistical Test Results:\n")
  cat("Test Type:", stat_test$test_type, "\n")
  cat("P-value:", stat_test$p_value, "\n")
  if (stat_test$test_type == "Chi-Square with Continuity Correction") {
    cat("Chi-square Statistic:", stat_test$statistic, "\n")
    cat("Degrees of Freedom:", stat_test$parameter, "\n")
  }
  cat("Cramer's V:", cramers_v, "\n")
  
  # Display the plot
  print(plot_years)
  
  # Return results for potential further analysis
  return(list(
    freq_table = freq_table,
    contingency_table = contingency_table,
    stat_test = stat_test,
    cramers_v = cramers_v,
    plot = plot_years
  ))
}

# Run the analysis
results <- run_years_playing_analysis()
Expected Frequency Analysis:
Minimum Expected Frequency: 15.51 
Cells with Expected Frequency < 5: 0 out of 10 cells ( 0 %)


Contingency Table:
          
           No (n = 1330) Yes (n = 228)
  <5yrs               96            10
  5-9yrs             264            41
  10-14yrs           258            65
  15-19yrs           144            28
  20+yrs             568            84

Statistical Test Results:
Test Type: Chi-Square with Continuity Correction 
P-value: 0.01457866 
Chi-square Statistic: 12.40529 
Degrees of Freedom: 4 
Cramer's V: 0.08923182 

12.1 Analyses Used

This study employed several statistical methods to analyze the relationship between years of playing experience among wind instrumentalists and their engagement with Respiratory Muscle Training (RMT):

  1. Descriptive Statistics: Analysis of the distribution of playing experience (years played) across the sample population, including measures of central tendency (mode, median) and frequency distributions.

  2. Frequency Analysis: Calculation of percentages and counts for years of playing experience, categorised into five groups: less than 5 years, 5-9 years, 10-14 years, 15-19 years, and 20+ years of experience.

  3. Instrument-Specific Analysis: Breakdown of playing experience by specific wind instruments to identify potential instrument-specific patterns.

  4. Chi-Square Tests of Independence: To determine if there is a significant association between years of playing experience and RMT adoption across the entire sample and within instrument categories.

  5. Effect Size Calculation: Cramer’s V was calculated to measure the strength of association between variables.

  6. Expected Frequency Analysis: Evaluation of the minimum expected frequency and identification of any cells with expected frequencies less than 5 to validate the chi-square test assumptions.

12.2 Analysis Results

Overall Playing Experience Distribution

The sample consisted of 1,558 wind instrumentalists with varying years of playing experience:

The mode for years of playing was the “20+ years” category, indicating that the sample predominantly consisted of highly experienced musicians.

RMT Adoption Analysis

From the contingency table, out of 1,558 participants:

  • 1,330 (85.4%) reported not using RMT

  • 228 (14.6%) reported using RMT

The distribution of RMT adoption across experience categories showed varying rates:

Instrument-Specific Analysis

The distribution of playing experience varied significantly across instruments, with chi-square tests revealing statistically significant differences in experience distributions for all instruments:

Association Between Playing Experience and RMT

The chi-square test of independence examining the relationship between years of playing experience and RMT adoption yielded:

  • Chi-square statistic: 12.41

  • Degrees of freedom: 4

  • p-value: 0.0146

  • Cramer’s V: 0.089

The expected frequency analysis showed a minimum expected frequency of 15.51, with no cells having expected frequencies less than 5, confirming the validity of the chi-square test.

12.3 Result Interpretation

The statistically significant association (p = 0.015) between years of playing experience and RMT adoption indicates that playing experience influences the likelihood of adopting respiratory training techniques. However, the Cramer’s V value of 0.089 suggests a weak effect size according to Cohen’s guidelines (Cohen, 1988), where values below 0.1 indicate a weak association.

The observed pattern shows that musicians with 10-14 years of experience have the highest rate of RMT adoption (20.1%), followed by those with 15-19 years (16.3%). This aligns with Bouhuys’ (1964) findings that wind musicians develop specific respiratory adaptations during their career progression. The middle-career peak in RMT adoption suggests that this stage may represent a period when musicians become more aware of respiratory technique optimization.

The lower adoption rates among the most experienced musicians (20+ years, 12.9%) may reflect what Ackermann et al. (2014) described as established playing habits that are resistant to change. As noted by Devroop and Chesky (2002), long-term musicians often develop personalised techniques that they may be reluctant to modify.

The instrument-specific analysis revealed significant variations in experience distribution across all instruments, with Recorder (V = 0.326), Bagpipes (V = 0.292), and Trumpet (V = 0.281) showing the strongest effects. This corresponds with Iltis and Farbman’s (2006) findings that different wind instruments place varying demands on the respiratory system, potentially influencing both career longevity and respiratory training needs.

According to Sapienza and Hoffman-Ruddy (2018), instruments requiring higher air pressure (oboe, trumpet, etc.) versus higher air volume (flute, tuba, eta.) create distinct challenges that may explain some of the observed differences in RMT adoption across instrument families. The significant chi-square values across all instrument categories suggest that instrument-specific factors strongly influence career trajectories and potential interest in respiratory training.

12.4 Limitations

Several limitations should be considered when interpreting these findings:

  1. Cross-sectional Design: The study provides a snapshot of current RMT adoption but cannot determine causality or changes in adoption over time.

  2. Self-reported Data: The data relies on participants’ self-reporting of years played and RMT adoption, which may be subject to recall bias or inconsistent interpretations of what constitutes RMT.

  3. Uneven Distribution: The sample is heavily weighted toward very experienced musicians (41.8% with 20+ years), which may skew the overall results and limit generalizability to less experienced populations.

  4. Limited Context: The analysis lacks information about the type, intensity, or frequency of RMT used, as well as the reasons for adoption or non-adoption.

  5. Potential Confounding Variables: Factors such as professional status, education level, performance demands, and health history were not controlled for in the analysis.

  6. Effect Size: Despite statistical significance, the weak effect size (Cramer’s V = 0.089) indicates that years of playing experience explains only a small portion of the variance in RMT adoption.

  7. Instrument Overlap: Many musicians play multiple instruments, which could confound the instrument-specific analyses if participants were counted in multiple categories.

12.5 Conclusions

This analysis reveals a statistically significant but weak association between years of playing experience and adoption of Respiratory Muscle Training among wind instrumentalists. The highest adoption rates were observed among musicians with 10-14 years of experience, suggesting this may be a critical period for respiratory technique development and optimization.

The significant variations in experience distribution across different instruments highlight the importance of instrument-specific approaches to respiratory training. Instruments with different air pressure and volume requirements likely create distinct respiratory challenges that may influence both the need for and approach to RMT.

Given the overall low adoption rate of RMT (14.6%) across the entire sample, there appears to be substantial opportunity for increased education about the potential benefits of respiratory training for wind instrumentalists. The findings suggest that targeted RMT programs might be most effectively introduced to musicians in the intermediate experience ranges (5-14 years), when they may be most receptive to technique modifications.

Future research should explore the specific motivations for RMT adoption, evaluate the effectiveness of different RMT protocols for specific instruments, and investigate longitudinal changes in respiratory function and performance outcomes following RMT implementation. Additionally, qualitative research exploring why experienced musicians may resist adopting RMT could provide valuable insights for designing more appealing and relevant training programs.

12.6 References

Ackermann, B., Kenny, D., & 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.

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

Devroop, K., & Chesky, K. (2002). Health outcomes of a typical college-level music performance program: A pilot study. Medical Problems of Performing Artists, 17(3), 115-119.

Iltis, P. W., & Farbman, A. (2006). The reciprocal influence of the body and the brass instrument. Brass Bulletin, 133, 24-39.

Sapienza, C. M., & Hoffman-Ruddy, B. (2018). Voice disorders (3rd ed.). Plural Publishing.

13 Frequency of Playing

Code
# Descriptive stats ------------------------------------------------------------
# Robust Statistical Testing Function
perform_robust_statistical_test <- function(observed, expected = NULL) {
  # If no expected frequencies provided, assume uniform distribution
  if (is.null(expected)) {
    expected <- rep(1/length(observed), length(observed))
  }
  
  # Compute expected frequencies
  total_n <- sum(observed)
  expected_freq <- expected * total_n
  
  # Diagnostic frequency checks
  cat("Expected Frequency Analysis:\n")
  cat("Total Observations:", total_n, "\n")
  cat("Observed Frequencies:", paste(observed, collapse = ", "), "\n")
  cat("Expected Frequencies:", paste(round(expected_freq, 2), collapse = ", "), "\n")
  
  # Check chi-square test assumptions
  low_freq_cells <- sum(expected_freq < 5)
  min_expected_freq <- min(expected_freq)
  
  cat("\nExpected Frequency Diagnostics:\n")
  cat("Minimum Expected Frequency:", round(min_expected_freq, 2), "\n")
  cat("Cells with Expected Frequency < 5:", low_freq_cells, 
      "out of", length(observed), "cells (", 
      round(low_freq_cells / length(observed) * 100, 2), "%)\n\n")
  
  # Select appropriate test
  if (min_expected_freq < 1 || (low_freq_cells / length(observed)) > 0.2) {
    # Use Fisher's exact test
    fisher_test <- fisher.test(
      matrix(c(observed, expected_freq), nrow = 2, byrow = TRUE), 
      simulate.p.value = TRUE, 
      B = 10000
    )
    
    cat("Test Selection: Fisher's Exact Test (Monte Carlo Simulation)\n")
    cat("P-value:", fisher_test$p.value, "\n")
    
    return(list(
      test_type = "Fisher's Exact Test",
      p_value = fisher_test$p.value,
      method = "Fisher's Exact Test with Monte Carlo Simulation"
    ))
  } else {
    # Use chi-square test with Yates' continuity correction
    chi_test <- chisq.test(x = observed, p = expected, correct = TRUE)
    
    cat("Test Selection: Chi-square Test with Yates' Correction\n")
    cat("Chi-square Statistic:", chi_test$statistic, "\n")
    cat("P-value:", chi_test$p.value, "\n")
    
    # Calculate Cramér's V
    k <- length(observed)
    cramers_v <- sqrt(chi_test$statistic / (total_n * (k - 1)))
    cat("Cramér's V:", cramers_v, "\n")
    
    return(list(
      test_type = "Chi-square Test",
      statistic = chi_test$statistic,
      p_value = chi_test$p.value,
      cramers_v = cramers_v,
      method = "Chi-square Test with Yates' Continuity Correction"
    ))
  }
}

# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Ensure freqPlay_MAX is numeric and handle potential NA values
data_combined <- data_combined %>%
  mutate(
    freqPlay_MAX = as.numeric(freqPlay_MAX)
  )

# Recode freqPlay_MAX into new frequency categories
data <- data_combined %>%
  mutate(
    frequency = factor(case_when(
      freqPlay_MAX == 1 ~ "About once a month",
      freqPlay_MAX == 2 ~ "Multiple times per month",
      freqPlay_MAX == 3 ~ "About once a week",
      freqPlay_MAX == 4 ~ "Multiple times per week",
      freqPlay_MAX == 5 ~ "Everyday",
      TRUE ~ NA_character_
    ), 
    levels = c("About once a month", "Multiple times per month", "About once a week", "Multiple times per week", "Everyday"))
  )

# 2. Create Frequency Table
freq_table <- data %>%
  group_by(frequency) %>%
  summarise(count = n(), .groups = "drop") %>%
  mutate(percentage = count / sum(count) * 100)

# Calculate total sample size
total_n <- sum(freq_table$count)

# 3. Perform Statistical Analysis
# Observed frequencies
observed <- freq_table$count

# Perform robust statistical test
stat_test <- perform_robust_statistical_test(
  observed, 
  expected = rep(1/length(levels(data$frequency)), length(levels(data$frequency)))
)
Expected Frequency Analysis:
Total Observations: 1558 
Observed Frequencies: 48, 72, 201, 635, 602 
Expected Frequencies: 311.6, 311.6, 311.6, 311.6, 311.6 

Expected Frequency Diagnostics:
Minimum Expected Frequency: 311.6 
Cells with Expected Frequency < 5: 0 out of 5 cells ( 0 %)

Test Selection: Chi-square Test with Yates' Correction
Chi-square Statistic: 1052.777 
P-value: 1.301933e-226 
Cramér's V: 0.4110119 
Code
# 4. Create the Plot
plot_title <- "Frequency of Practice"
p <- ggplot(freq_table, aes(x = frequency, y = count)) +
  geom_bar(stat = "identity", fill = "#4472C4") +
  geom_text(aes(label = sprintf("%d\n(%.1f%%)", count, percentage)), 
            position = position_stack(vjust = 0.5), 
            color = "white", size = 4) +
  labs(
    title = plot_title,
    x = "",
    y = sprintf("Count (N = %d)", total_n),
    caption = sprintf("%s\np-value = %.4f", 
                      stat_test$method, 
                      stat_test$p_value)
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    axis.text.x = element_text(size = 10, angle = 15, vjust = 0.5),
    axis.text.y = element_text(size = 10),
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank()
  )

# Display the plot
print(p)

Code
# 6. Print Statistical Analysis Results
cat("\nFrequency Distribution:\n")

Frequency Distribution:
Code
print(freq_table)
# A tibble: 5 × 3
  frequency                count percentage
  <fct>                    <int>      <dbl>
1 About once a month          48       3.08
2 Multiple times per month    72       4.62
3 About once a week          201      12.9 
4 Multiple times per week    635      40.8 
5 Everyday                   602      38.6 
Code
cat("\nStatistical Test Results:\n")

Statistical Test Results:
Code
cat("Test Type:", stat_test$method, "\n")
Test Type: Chi-square Test with Yates' Continuity Correction 
Code
cat("P-value:", stat_test$p_value, "\n")
P-value: 1.301933e-226 
Code
# Instrument-specific analysis can follow a similar robust testing approach

## By Instrument

# Read the data
# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Select relevant columns and gather them
instruments_data <- data_combined %>%
  select(`freqPlay_Flute`, `freqPlay_Piccolo`, `freqPlay_Recorder`, 
         `freqPlay_Oboe`, `freqPlay_Clarinet`, `freqPlay_Bassoon`,
         `freqPlay_Saxophone`, `freqPlay_Trumpet`, `freqPlay_French Horn`,
         `freqPlay_Trombone`, `freqPlay_Tuba`, `freqPlay_Euphonium`,
         `freqPlay_Bagpipes`) %>%
  gather(key = "instrument", value = "frequency") %>%
  mutate(
    # Clean instrument names
    instrument = gsub("freqPlay_", "", instrument),
    # Recode frequency values
    frequency = factor(case_when(
      frequency == 1 ~ "About once a month",
      frequency == 2 ~ "Multiple times per month",
      frequency == 3 ~ "About once a week",
      frequency == 4 ~ "Multiple times per week",
      frequency == 5 ~ "Everyday",
      TRUE ~ NA_character_
    ), levels = c("About once a month", "Multiple times per month", 
                  "About once a week", "Multiple times per week", "Everyday"))
  )

# Remove NA values
instruments_data <- instruments_data %>% filter(!is.na(frequency))

# Calculate frequencies and percentages
summary_data <- instruments_data %>%
  group_by(instrument, frequency) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(instrument) %>%
  mutate(
    percentage = count / sum(count) * 100,
    total_n = sum(count)
  ) %>%
  ungroup()

# Calculate total responses for each instrument
instrument_totals <- summary_data %>%
  group_by(instrument) %>%
  summarise(total_n = first(total_n)) %>%
  arrange(desc(total_n))

# Reorder instruments by total responses
summary_data$instrument <- factor(summary_data$instrument, 
                                  levels = instrument_totals$instrument)

# Create the plot with modified theme and labels in black; legend styling adjusted
p <- ggplot(summary_data, aes(x = frequency, y = percentage, fill = frequency)) +
  geom_bar(stat = "identity") +
  facet_wrap(~instrument, ncol = 3) +
  geom_text(aes(label = sprintf("%d\
(%.1f%%)", count, percentage)),
            position = position_stack(vjust = 0.5),
            color = "black", size = 3) +
  scale_fill_brewer(palette = "Blues") +
  labs(
    title = "Frequency of Practice by Instrument",
    x = "",
    y = "Percentage",
    fill = "Frequency"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_blank(),  # Remove x-axis labels
    strip.text = element_text(size = 10, face = "bold"),
    legend.position = "top",
    legend.text = element_text(size = 8, margin = margin(r = 0)),
    legend.title = element_text(size = 10),
    legend.key.size = unit(0.5, "cm"),
    legend.spacing.x = unit(0, 'pt'),
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    plot.margin = margin(t = 10, r = 30, b = 10, l = 30, unit = "pt")  # Padding around the plot
  )

# Print the plot
print(p)

Code
## By instrument V2 
# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Process data and create summary statistics
instruments_data <- data %>%
  select(starts_with("freqPlay_")) %>%
  gather(key = "instrument", value = "frequency") %>%
  mutate(
    instrument = gsub("freqPlay_", "", instrument),
    frequency = factor(case_when(
      frequency == 1 ~ "About once a month",
      frequency == 2 ~ "Multiple times per month",
      frequency == 3 ~ "About once a week",
      frequency == 4 ~ "Multiple times per week",
      frequency == 5 ~ "Everyday",
      TRUE ~ NA_character_
    ), levels = c("About once a month", "Multiple times per month", 
                  "About once a week", "Multiple times per week", "Everyday"))
  ) %>%
  filter(!is.na(frequency))

# Calculate detailed summary statistics
summary_stats <- instruments_data %>%
  group_by(instrument) %>%
  summarise(
    n = n(),
    mean_freq = mean(as.numeric(frequency)),
    median_freq = median(as.numeric(frequency)),
    sd_freq = sd(as.numeric(frequency))
  ) %>%
  arrange(desc(n))

# Calculate frequency distributions
freq_dist <- instruments_data %>%
  group_by(instrument, frequency) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(instrument) %>%
  mutate(
    percentage = count / sum(count) * 100,
    total_n = sum(count)
  ) %>%
  arrange(instrument, frequency)

# Chi-square test
contingency_table <- table(instruments_data$instrument, instruments_data$frequency)
chi_test <- chisq.test(contingency_table)

# Calculate Cramer's V
n <- nrow(instruments_data)
df_min <- min(nrow(contingency_table) - 1, ncol(contingency_table) - 1)
cramers_v <- sqrt(chi_test$statistic / (n * df_min))

# Print summary statistics
cat("\
Detailed Summary Statistics by Instrument:\
")

Detailed Summary Statistics by Instrument:
Code
print(summary_stats)
# A tibble: 15 × 5
   instrument                          n mean_freq median_freq sd_freq
   <chr>                           <int>     <dbl>       <dbl>   <dbl>
 1 MAX                              1558      4.07           4   0.986
 2 Saxophone                         477      3.68           4   1.20 
 3 Flute                             443      3.52           4   1.25 
 4 Clarinet                          410      3.48           4   1.30 
 5 Trumpet                           343      3.74           4   1.26 
 6 Trombone                          212      3.59           4   1.23 
 7 Piccolo                           209      3.08           3   1.41 
 8 French Horn                       160      3.92           4   1.19 
 9 Oboe                              149      3.48           4   1.24 
10 Recorder                          136      2.69           3   1.39 
11 Euphonium                         133      3.16           4   1.32 
12 Tuba                              129      3.64           4   1.24 
13 [QID18-ChoiceTextEntryValue-18]   125      3.61           4   1.11 
14 Bassoon                            91      3.49           4   1.26 
15 Bagpipes                           59      3.44           4   1.37 
Code
cat("\
Frequency Distribution (counts and percentages):\
")

Frequency Distribution (counts and percentages):
Code
print(freq_dist)
# A tibble: 75 × 5
# Groups:   instrument [15]
   instrument frequency                count percentage total_n
   <chr>      <fct>                    <int>      <dbl>   <int>
 1 Bagpipes   About once a month          10      16.9       59
 2 Bagpipes   Multiple times per month     5       8.47      59
 3 Bagpipes   About once a week            5       8.47      59
 4 Bagpipes   Multiple times per week     27      45.8       59
 5 Bagpipes   Everyday                    12      20.3       59
 6 Bassoon    About once a month           9       9.89      91
 7 Bassoon    Multiple times per month    11      12.1       91
 8 Bassoon    About once a week           19      20.9       91
 9 Bassoon    Multiple times per week     30      33.0       91
10 Bassoon    Everyday                    22      24.2       91
# ℹ 65 more rows
Code
cat("\
Chi-square Test Results:\
")

Chi-square Test Results:
Code
print(chi_test)

    Pearson's Chi-squared test

data:  contingency_table
X-squared = 432.01, df = 56, p-value < 2.2e-16
Code
cat("\
Cramer's V (Effect Size):\
")

Cramer's V (Effect Size):
Code
print(cramers_v)
X-squared 
0.1526654 
Code
# Calculate mode for each instrument
mode_freq <- instruments_data %>%
  group_by(instrument) %>%
  count(frequency) %>%
  slice(which.max(n)) %>%
  arrange(desc(n))

cat("\
Most Common Practice Frequency by Instrument:\
")

Most Common Practice Frequency by Instrument:
Code
print(mode_freq)
# A tibble: 15 × 3
# Groups:   instrument [15]
   instrument                      frequency                   n
   <chr>                           <fct>                   <int>
 1 MAX                             Multiple times per week   635
 2 Saxophone                       Multiple times per week   174
 3 Flute                           Multiple times per week   162
 4 Clarinet                        Multiple times per week   158
 5 Trumpet                         Everyday                  118
 6 Trombone                        Multiple times per week    71
 7 French Horn                     Everyday                   66
 8 Piccolo                         Multiple times per week    59
 9 [QID18-ChoiceTextEntryValue-18] Multiple times per week    54
10 Oboe                            Multiple times per week    52
11 Tuba                            Multiple times per week    50
12 Euphonium                       Multiple times per week    47
13 Recorder                        About once a month         43
14 Bassoon                         Multiple times per week    30
15 Bagpipes                        Multiple times per week    27
Code
# Standardised residuals analysis
std_residuals <- chi_test$stdres
colnames(std_residuals) <- levels(instruments_data$frequency)
rownames(std_residuals) <- levels(factor(instruments_data$instrument))

cat("\
Standardised Residuals (values > |1.96| indicate significant differences):\
")

Standardised Residuals (values > |1.96| indicate significant differences):
Code
print(round(std_residuals, 2))
                                 
                                  About once a month Multiple times per month
  [QID18-ChoiceTextEntryValue-18]              -0.66                    -0.14
  Bagpipes                                      2.21                     0.04
  Bassoon                                       0.35                     1.31
  Clarinet                                      3.41                     0.35
  Euphonium                                     2.86                     4.11
  Flute                                         1.20                     2.19
  French Horn                                  -1.46                     0.20
  MAX                                          -9.84                    -6.50
  Oboe                                          0.83                     0.48
  Piccolo                                       6.11                     3.74
  Recorder                                      9.49                     1.16
  Saxophone                                    -0.20                    -0.65
  Trombone                                      0.06                     0.85
  Trumpet                                      -0.07                     0.70
  Tuba                                         -0.13                     1.37
                                 
                                  About once a week Multiple times per week
  [QID18-ChoiceTextEntryValue-18]              1.59                    1.50
  Bagpipes                                    -1.65                    1.43
  Bassoon                                      1.17                   -0.77
  Clarinet                                     0.25                    0.75
  Euphonium                                   -0.19                   -0.36
  Flute                                        1.26                   -0.12
  French Horn                                 -0.70                   -1.82
  MAX                                         -4.58                    3.94
  Oboe                                         2.15                   -0.50
  Piccolo                                      0.52                   -2.64
  Recorder                                     2.51                   -3.45
  Saxophone                                    1.93                   -0.17
  Trombone                                     1.75                   -1.03
  Trumpet                                     -0.34                   -2.02
  Tuba                                        -0.76                    0.46
                                 
                                  Everyday
  [QID18-ChoiceTextEntryValue-18]    -2.38
  Bagpipes                           -1.57
  Bassoon                            -1.14
  Clarinet                           -3.32
  Euphonium                          -3.73
  Flute                              -2.96
  French Horn                         3.29
  MAX                                 9.61
  Oboe                               -2.02
  Piccolo                            -3.70
  Recorder                           -5.00
  Saxophone                          -0.86
  Trombone                           -0.88
  Trumpet                             2.03
  Tuba                               -0.62
Code
# Create visualization
p <- ggplot(freq_dist, aes(x = percentage, y = reorder(instrument, total_n), fill = frequency)) +
  geom_bar(stat = "identity", position = "stack") +
  geom_text(aes(label = sprintf("%d", count)),
            position = position_stack(vjust = 0.5),
            color = "black", size = 3) +
  scale_fill_brewer(palette = "Blues") +
  labs(
    title = "Frequency of Practice by Instrument",
    subtitle = paste("Total N =", sum(summary_stats$n), "responses"),
    x = "Percentage",
    y = "",
    fill = "Practice Frequency"
  ) +
  theme_minimal() +
  theme(
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "top",
    legend.justification = c(0, 1),
    legend.box.just = "left",
    legend.text.align = 0,
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5)
  )


## Inferential Stats-------------------------------------------------
# Read data from the "Combined" sheet
data_combined <- read_excel("../Data/R_Import_Transformed_15.02.25.xlsx", sheet = "Combined")

# Recode freqPlay_MAX and create frequency table with RMTMethods_YN
data <- data %>%
  mutate(
    frequency = factor(case_when(
      freqPlay_MAX == 1 ~ "About once a month",
      freqPlay_MAX == 2 ~ "Multiple times per month",
      freqPlay_MAX == 3 ~ "About once a week",
      freqPlay_MAX == 4 ~ "Multiple times per week",
      freqPlay_MAX == 5 ~ "Everyday",
      TRUE ~ NA_character_
    ), 
    levels = c("About once a month", "Multiple times per month", 
               "About once a week", "Multiple times per week", "Everyday")),
    RMT_group = factor(case_when(
      RMTMethods_YN == 0 ~ "No RMT Methods",
      RMTMethods_YN == 1 ~ "Uses RMT Methods",
      TRUE ~ NA_character_
    ))
  )

# Create contingency table
cont_table <- table(data$frequency, data$RMT_group)
cont_table_df <- as.data.frame.matrix(cont_table)

# Calculate percentages within each group
freq_table <- data %>%
  group_by(RMT_group, frequency) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(RMT_group) %>%
  mutate(percentage = count/sum(count) * 100,
         total_group = sum(count))

# Calculate total N
total_n <- sum(freq_table$count)

# Perform chi-square test
chi_test <- chisq.test(cont_table)

# Calculate Cramer's V
cramers_v <- sqrt(chi_test$statistic/(total_n * (min(dim(cont_table))-1)))

# Create the plot
plot_title <- "Frequency of Practice by RMT Methods Use"

p <- ggplot(freq_table, aes(x = frequency, y = percentage, fill = RMT_group)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = sprintf("%d\
(%.1f%%)", count, percentage)),
            position = position_dodge(width = 0.9),
            vjust = -0.5,
            size = 3) +
  scale_fill_manual(values = c("No RMT Methods" = "#4472C4", 
                               "Uses RMT Methods" = "#ED7D31")) +
  labs(
    title = plot_title,
    subtitle = sprintf("N = %d", total_n),
    x = "",
    y = "Percentage",
    fill = "",
    caption = sprintf("Chi-square test: χ²(%d) = %.2f, p = %.3f\
Cramér's V = %.3f",
                      chi_test$parameter, 
                      chi_test$statistic,
                      chi_test$p.value,
                      cramers_v)
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5),
    axis.text.x = element_text(angle = 15, hjust = 0.5, vjust = 0.5),
    legend.position = "top",
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank()
  )

# Print the plot
print(p)

Code
# Print statistical summary
cat("\
Contingency Table:\
")

Contingency Table:
Code
print(cont_table)
                          
                           No RMT Methods Uses RMT Methods
  About once a month                   44                4
  Multiple times per month             63                9
  About once a week                   181               20
  Multiple times per week             571               64
  Everyday                            471              131
Code
cat("\
Chi-square Test Results:\
")

Chi-square Test Results:
Code
print(chi_test)

    Pearson's Chi-squared test

data:  cont_table
X-squared = 40.341, df = 4, p-value = 3.68e-08
Code
cat("\
Effect Size (Cramér's V):\
")

Effect Size (Cramér's V):
Code
print(cramers_v)
X-squared 
0.1609115 
Code
# Calculate group sizes
group_sizes <- data %>%
  group_by(RMT_group) %>%
  summarise(n = n())

cat("\
Group Sizes:\
")

Group Sizes:
Code
print(group_sizes)
# A tibble: 2 × 2
  RMT_group            n
  <fct>            <int>
1 No RMT Methods    1330
2 Uses RMT Methods   228
Code
# Post-hoc analysis: standardised residuals
stdres <- chisq.test(cont_table)$stdres
colnames(stdres) <- c("No RMT Methods", "Uses RMT Methods")
rownames(stdres) <- levels(data$frequency)

cat("\
Standardised Residuals:\
")

Standardised Residuals:
Code
print(stdres)
                          
                           No RMT Methods Uses RMT Methods
  About once a month            1.2545462       -1.2545462
  Multiple times per month      0.5246129       -0.5246129
  About once a week             2.0131375       -2.0131375
  Multiple times per week       4.2195978       -4.2195978
  Everyday                     -6.3155725        6.3155725

13.1 Analyses Used

The following statistical analyses were conducted to examine practice frequency patterns among wind instrumentalists and the relationship between practice frequency and Respiratory Muscle Training (RMT) methods:

  1. Descriptive Statistics:

    • Frequency distributions (counts and percentages)

    • Mean, median, and standard deviation of practice frequency by instrument

    • Identification of most common practice frequency by instrument

  2. Inferential Statistics:

-   Chi-square test with Yates' continuity correction to assess:

    -   Overall differences in practice frequency from expected
        values

    -   Differences in practice frequency across instruments

    -   Association between practice frequency and use of RMT
        methods

-   Standardised residuals analysis to identify specific cells
    contributing to significant chi-square results

-   Cramér's V to quantify effect sizes

13.2 Analysis Results

Overall Practice Frequency

A total of 1,558 wind instrumentalists participated in the study. The frequency distribution of practice was:

A chi-square goodness-of-fit test revealed significant deviation from expected equal frequencies (χ² = 1052.777, p < 0.001). The Cramér’s V effect size was 0.411, indicating a strong association.

Practice Frequency by Instrument

The analysis included 15 different wind instruments. The most frequently practiced instruments (by number of participants) were:

  1. Saxophone (n = 477)

  2. Flute (n = 443)

  3. Clarinet (n = 410)

  4. Trumpet (n = 343)

  5. Trombone (n = 212)

Mean practice frequency (on a scale where higher values indicate more frequent practice) ranged from 2.69 (Recorder) to 4.07 (overall mean). The most common practice frequency across most instruments was “Multiple times per week,” with exceptions being:

  • Trumpet, French Horn: “Everyday” was most common

  • Piccolo, Recorder: “About once a month” or “About once a week” were more common

A chi-square test of independence showed significant differences in practice frequency patterns across instruments (χ² = 432.01, df = 56, p < 0.001). The Cramér’s V was 0.153, indicating a moderate effect size.

Practice Frequency and RMT Methods

Of the 1,558 participants, 1,330 (85.4%) reported not using RMT methods, while 228 (14.6%) reported using them. The contingency table analysis showed:

A chi-square test of independence revealed a significant association between practice frequency and use of RMT methods (χ² = 40.341, df = 4, p < 0.001). Cramér’s V was 0.161, indicating a moderate effect size.

Standardised residuals analysis showed that:

  • “Everyday” players were significantly more likely to use RMT methods (standardised residual = 6.32)

  • “Multiple times per week” players were significantly less likely to use RMT methods (standardised residual = -4.22)

  • “About once a week” players were also less likely to use RMT methods (standardised residual = -2.01)

13.3 Result Interpretation

Practice Frequency Patterns

The significantly uneven distribution of practice frequency, with most wind instrumentalists practicing either “Multiple times per week” (40.8%) or “Everyday” (38.6%), aligns with existing literature on musician practice habits. Ericsson et al. (1993) established that deliberate practice is crucial for developing musical expertise, with elite musicians typically engaging in regular, structured practice sessions. The observed pattern supports the understanding that consistent, frequent practice is a norm among wind instrumentalists.

The variations in practice frequency across instruments may reflect the different physical demands and roles these instruments play in ensemble settings. For instance, French Horn players’ tendency toward daily practice aligns with Ackermann et al. (2012), who noted that brass players often require more frequent practice to maintain embouchure strength and endurance. Similarly, recorder players’ less frequent practice may reflect its common use as a secondary or recreational instrument (Hallam et al., 2017).

Respiratory Muscle Training and Practice Habits

The significant association between practice frequency and use of RMT methods suggests that musicians who practice daily are more likely to incorporate specialised training techniques. This finding is consistent with Ericsson’s (1993) deliberate practice framework, where elite performers often employ supplementary training methods to enhance performance.

The higher adoption of RMT methods among daily players (21.8% vs. 10.1% for those practicing multiple times per week) supports Bouhuys’ (1964) seminal work on wind instrument physiology, which established that respiratory function is a critical component of wind instrument performance. More recent work by Ackermann and Driscoll (2010) demonstrated that targeted respiratory training can improve both respiratory muscle strength and musical performance parameters in wind players (Add Sapienza, Dries, etc…).

The standardised residuals analysis suggests a threshold effect: it is specifically the daily players who adopt RMT methods at significantly higher rates, while all other practice frequency groups show lower-than-expected adoption. This may indicate that RMT is viewed primarily as an advanced technique adopted by the most dedicated practitioners, rather than as a foundational training method for all wind players (Sapienza et al., 2011).

13.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Self-reported data: Practice frequency and RMT use were self-reported, which may be subject to recall bias or social desirability effects. Musicians might overestimate practice frequency to align with perceived expectations (Bonneville-Roussy & Bouffard, 2015).

  2. No quality assessment: The analysis captures practice frequency but not practice quality or structure. Ericsson et al. (1993) emphasised that deliberate practice involves specific goal-setting and focused improvement, not merely time spent with the instrument.

  3. Cross-sectional design: The data represents a snapshot in time and cannot establish causal relationships between practice frequency and RMT use. Longitudinal studies would be needed to determine whether increased practice leads to RMT adoption or vice versa.

  4. Limited demographic information: The analysis lacks context about participants’ age, experience level, professional status, or performance goals, which might significantly influence both practice patterns and RMT adoption.

  5. Instrument categorization: The analysis treats all instruments as distinct categories without accounting for instrumental families (woodwinds vs. brass) or physical demands, which might provide more meaningful groupings for understanding practice patterns.

  6. RMT methods specificity: The data does not differentiate between types of RMT methods or the consistency of their application, which limits our understanding of how participants integrated these techniques into their practice.

13.5 Conclusions

This analysis provides significant insights into the practice habits of wind instrumentalists and the adoption of respiratory muscle training methods:

  1. Wind instrumentalists overwhelmingly engage in frequent practice, with nearly 80% practicing either multiple times per week or daily. This emphasises the culture of regular practice in wind instrument performance.

  2. Significant differences exist in practice frequency across instruments, suggesting that instrument-specific demands and contexts influence practice habits. Brass instruments like the French Horn and Trumpet show higher rates of daily practice compared to woodwinds like the Recorder or Piccolo.

  3. Respiratory Muscle Training methods are used by a minority of wind instrumentalists (14.6%) but are significantly more common among daily players (21.8%). This suggests that RMT is primarily adopted as an advanced training technique by the most dedicated musicians.

  4. The moderate effect sizes observed in the relationships between variables suggest that while practice frequency and instrument type are important factors in understanding RMT adoption, other unmeasured variables likely play substantial roles in these relationships.

These findings have implications for music education, performance training, and health promotion among wind instrumentalists. Educators might consider introducing RMT methods more systematically across all practice frequency levels, rather than assuming they are relevant only for the most advanced students. Additionally, instrument-specific approaches to practice scheduling and supplementary training may be warranted based on the observed differences between instrumental groups.

Future research should explore the causal relationships between practice habits and RMT adoption, the specific benefits of RMT for different instrumental groups, and the integration of respiratory training into standard pedagogical approaches for wind instruments.

13.6 References

Ackermann, B. J., & Driscoll, T. (2010). Development of a new instrument for measuring the musculoskeletal load and physical health of professional orchestral musicians. Medical Problems of Performing Artists, 25(3), 95-101.

Ackermann, B. J., Kenny, D. T., O’Brien, I., & Driscoll, T. R. (2012). Sound practice—improving occupational health and safety for professional orchestral musicians in Australia. Frontiers in Psychology, 3, 538.

Bonneville-Roussy, A., & Bouffard, T. (2015). When quantity is not enough: Disentangling the roles of practice time, self-regulation and deliberate practice in musical achievement. Psychology of Music, 43(5), 686-704.

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

Ericsson, K. A., Krampe, R. T., & Tesch-Römer, C. (1993). The role of deliberate practice in the acquisition of expert performance. Psychological Review, 100(3), 363–406.

Hallam, S., Creech, A., Varvarigou, M., & McQueen, H. (2017). The perceived benefits of participative music making for non-music university students: A comparison with music students. Music Education Research, 19(1), 37-47.

Sapienza, C. M., Davenport, P. W., & Martin, A. D. (2011). Respiratory muscle strength training: Therapeutic applications. Athletic Training & Sports Health Care, 3(6), 266-273.

14 Income

Code
# Descriptive stats ------------------------------------------------------------
# Process and filter income data
income_data <- data_combined %>%
  select(incomePerf, incomeTeach) %>%
  pivot_longer(cols = everything(), names_to = "income_type", values_to = "income_level") %>%
  filter(!is.na(income_level))

# Filter for only 'Yes' and 'No' responses
income_data_filtered <- income_data %>%
  filter(income_level %in% c("Yes", "No"))

# Contingency table and chi-square test
contingency_table <- table(income_data_filtered$income_type, income_data_filtered$income_level)
chi_test <- chisq.test(contingency_table)
cramers_v <- sqrt(chi_test$statistic / (sum(contingency_table) * (min(dim(contingency_table)) - 1)))
odds_ratio <- (contingency_table[1,1] * contingency_table[2,2]) / (contingency_table[1,2] * contingency_table[2,1])

# Print statistical results
cat("Statistical Analysis Results - Income Type Comparison:\n")
Statistical Analysis Results - Income Type Comparison:
Code
cat("====================================================\n\n")
====================================================
Code
cat("Contingency Table:\n")
Contingency Table:
Code
print(contingency_table)
             
               No Yes
  incomePerf  716 216
  incomeTeach 197 315
Code
cat("\n")
Code
cat("Chi-square Test Results:\n")
Chi-square Test Results:
Code
print(chi_test)

    Pearson's Chi-squared test with Yates' continuity correction

data:  contingency_table
X-squared = 207.36, df = 1, p-value < 2.2e-16
Code
cat("\n")
Code
cat("Effect Size Measures:\n")
Effect Size Measures:
Code
cat(sprintf("Cramer's V: %.3f\n", cramers_v))
Cramer's V: 0.379
Code
cat(sprintf("Odds Ratio: %.3f\n", odds_ratio))
Odds Ratio: 5.300
Code
cat("\n")
Code
# Summarise counts and percentages
income_summary_calc <- income_data_filtered %>%
  group_by(income_type, income_level) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(income_type) %>%
  mutate(
    total_n = sum(count),
    percentage = count / total_n * 100,
    se = sqrt((percentage * (100 - percentage)) / total_n),  # Standard error for proportions
    ci_lower = percentage - (1.96 * se),  # 95% CI lower bound
    ci_upper = percentage + (1.96 * se)   # 95% CI upper bound
  ) %>%
  ungroup()

# Create labels for income types with total N
lookup_labels <- income_summary_calc %>%
  group_by(income_type) %>%
  summarise(total_n = first(total_n)) %>%
  mutate(label = case_when(
    income_type == "incomePerf" ~ paste0("Performance Income (N=", total_n, ")"),
    income_type == "incomeTeach" ~ paste0("Teaching Income (N=", total_n, ")")
  ))

# Data for plotting
income_summary <- data.frame(
  income_level = c("No", "Yes", "No", "Yes"),
  income_type = c(rep("Performance (N=932)", 2), rep("Teaching (N=512)", 2)),
  count = c(716, 216, 197, 315),
  percentage = c(73.8, 22.3, 37.1, 59.3),
  ci_lower = c(71.0, 19.6, 33.0, 55.1),
  ci_upper = c(76.6, 24.9, 41.2, 63.5)
)

# Print proportions with confidence intervals
cat("Proportions with 95% Confidence Intervals:\n")
Proportions with 95% Confidence Intervals:
Code
print(income_summary %>% 
        select(income_type, income_level, percentage, ci_lower, ci_upper))
          income_type income_level percentage ci_lower ci_upper
1 Performance (N=932)           No       73.8     71.0     76.6
2 Performance (N=932)          Yes       22.3     19.6     24.9
3    Teaching (N=512)           No       37.1     33.0     41.2
4    Teaching (N=512)          Yes       59.3     55.1     63.5
Code
cat("\n")
Code
# Plot with percentages
plot_title <- "Primary Income for Teachers vs. Performers"
p1 <- ggplot(income_summary, 
            aes(x = percentage, y = income_level, fill = income_type)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_errorbarh(aes(xmin = ci_lower, xmax = ci_upper),
                 position = position_dodge(width = 0.9),
                 height = 0.2) +
  geom_text(aes(label = paste0(count, " (", sprintf("%.1f", percentage), "% )")),
            position = position_dodge(width = 0.9),
            hjust = -0.4, size = 3) +
  labs(title = plot_title,
       x = "Percentage",
       y = "Primary income?",
       fill = "Income Source",
       caption = paste("Error bars represent 95% confidence intervals.\nRemoved categories: 'Rather not say' (Performance: 14, Teaching: 4) and 'Unsure' (Performance: 24, Teaching: 15).")) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.position = "bottom",
    plot.caption = element_text(hjust = 0.5, size = 8)
  ) +
  scale_fill_brewer(palette = "Set2") +
  scale_x_continuous(limits = c(0, 100), breaks = seq(0,100,20))

# Plot with counts
plot_title_count <- "Primary Income for Teachers vs. Performers (Raw Counts)"
p2 <- ggplot(income_summary, 
            aes(x = count, y = income_level, fill = income_type)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  geom_text(aes(label = paste0(count, " (", sprintf("%.1f", percentage), "% )")),
            position = position_dodge(width = 0.9),
            hjust = -0.4, size = 3) +
  labs(title = plot_title_count,
       x = "Count (N)",
       y = "Primary income?",
       fill = "Income Source",
       caption = paste("Removed categories: 'Rather not say' (Performance: 14, Teaching: 4) and 'Unsure' (Performance: 24, Teaching: 15).")) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.position = "bottom",
    plot.caption = element_text(hjust = 0.5, size = 8)
  ) +
  scale_fill_brewer(palette = "Set2") +
  scale_x_continuous(limits = c(0, 800), breaks = seq(0, 800, 100))

# Print plots
print(p1)

Code
print(p2)

Code
# ------------ RMT DEVICE USE ANALYSIS ------------

# Process data for RMT analysis
income_data_rmt <- data_combined %>%
  select(incomePerf, incomeTeach, RMTMethods_YN) %>%
  pivot_longer(cols = c(incomePerf, incomeTeach),
               names_to = "income_type",
               values_to = "income_response") %>%
  filter(!is.na(income_response)) %>%
  filter(income_response %in% c("Yes", "No"))

# Calculate summary statistics
income_summary_rmt <- income_data_rmt %>%
  group_by(income_type, RMTMethods_YN, income_response) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(income_type, RMTMethods_YN) %>%
  mutate(total_n = sum(count),
         percentage = count / total_n * 100,
         se = sqrt((percentage * (100 - percentage)) / total_n),
         ci_lower = percentage - 1.96 * se,
         ci_upper = percentage + 1.96 * se) %>%
  ungroup()

# Create group labels
income_summary_rmt <- income_summary_rmt %>%
  mutate(group_label = case_when(
    income_type == "incomePerf" & RMTMethods_YN == 0 ~ paste0("Performers, no RMT"),
    income_type == "incomePerf" & RMTMethods_YN == 1 ~ paste0("Performers, with RMT"),
    income_type == "incomeTeach" & RMTMethods_YN == 0 ~ paste0("Teachers, no RMT"),
    income_type == "incomeTeach" & RMTMethods_YN == 1 ~ paste0("Teachers, with RMT")
  ))

# Set factor levels
income_summary_rmt <- income_summary_rmt %>%
  mutate(income_response = factor(income_response, levels = c("Yes", "No")))

# Print summary stats from the RMT analysis
cat("RMT Analysis - Summary Statistics (Original Groups):\n")
RMT Analysis - Summary Statistics (Original Groups):
Code
print(income_summary_rmt %>%
        select(group_label, income_response, count, total_n, percentage, ci_lower, ci_upper) %>%
        arrange(group_label, income_response))
# A tibble: 8 × 7
  group_label         income_response count total_n percentage ci_lower ci_upper
  <chr>               <fct>           <int>   <int>      <dbl>    <dbl>    <dbl>
1 Performers, no RMT  Yes               147     780       18.8     16.1     21.6
2 Performers, no RMT  No                633     780       81.2     78.4     83.9
3 Performers, with R… Yes                69     152       45.4     37.5     53.3
4 Performers, with R… No                 83     152       54.6     46.7     62.5
5 Teachers, no RMT    Yes               220     389       56.6     51.6     61.5
6 Teachers, no RMT    No                169     389       43.4     38.5     48.4
7 Teachers, with RMT  Yes                95     123       77.2     69.8     84.6
8 Teachers, with RMT  No                 28     123       22.8     15.4     30.2
Code
cat("\n")
Code
# Statistical tests by income type
# Performance Income
perf_data <- income_data_rmt %>% filter(income_type == "incomePerf")
perf_contingency <- table(perf_data$RMTMethods_YN, perf_data$income_response)
perf_chi_test <- chisq.test(perf_contingency)
perf_cramers_v <- sqrt(perf_chi_test$statistic / (sum(perf_contingency) * (min(dim(perf_contingency)) - 1)))
perf_odds_ratio <- (perf_contingency[1,2] * perf_contingency[2,1]) / (perf_contingency[1,1] * perf_contingency[2,2])

# Teaching Income
teach_data <- income_data_rmt %>% filter(income_type == "incomeTeach")
teach_contingency <- table(teach_data$RMTMethods_YN, teach_data$income_response)
teach_chi_test <- chisq.test(teach_contingency)
teach_cramers_v <- sqrt(teach_chi_test$statistic / (sum(teach_contingency) * (min(dim(teach_contingency)) - 1)))
teach_odds_ratio <- (teach_contingency[1,2] * teach_contingency[2,1]) / (teach_contingency[1,1] * teach_contingency[2,2])

# Print statistical results
cat("Statistical Analysis Results - RMT Device Use:\n")
Statistical Analysis Results - RMT Device Use:
Code
cat("===========================================\n\n")
===========================================
Code
# Performance Income results
cat("Performance Income:\n")
Performance Income:
Code
cat("------------------\n")
------------------
Code
cat("Contingency Table:\n")
Contingency Table:
Code
print(perf_contingency)
   
     No Yes
  0 633 147
  1  83  69
Code
cat("\n")
Code
cat("Chi-square Test Results:\n")
Chi-square Test Results:
Code
print(perf_chi_test)

    Pearson's Chi-squared test with Yates' continuity correction

data:  perf_contingency
X-squared = 48.878, df = 1, p-value = 2.724e-12
Code
cat("\n")
Code
cat("Effect Size Measures:\n")
Effect Size Measures:
Code
cat(sprintf("Cramer's V: %.3f\n", perf_cramers_v))
Cramer's V: 0.229
Code
cat(sprintf("Odds Ratio: %.3f\n", perf_odds_ratio))
Odds Ratio: 0.279
Code
cat("\n")
Code
# Teaching Income results
cat("Teaching Income:\n")
Teaching Income:
Code
cat("------------------\n")
------------------
Code
cat("Contingency Table:\n")
Contingency Table:
Code
print(teach_contingency)
   
     No Yes
  0 169 220
  1  28  95
Code
cat("\n")
Code
cat("Chi-square Test Results:\n")
Chi-square Test Results:
Code
print(teach_chi_test)

    Pearson's Chi-squared test with Yates' continuity correction

data:  teach_contingency
X-squared = 16.021, df = 1, p-value = 6.263e-05
Code
cat("\n")
Code
cat("Effect Size Measures:\n")
Effect Size Measures:
Code
cat(sprintf("Cramer's V: %.3f\n", teach_cramers_v))
Cramer's V: 0.177
Code
cat(sprintf("Odds Ratio: %.3f\n", teach_odds_ratio))
Odds Ratio: 0.384
Code
cat("\n")
Code
# Data for plots with updated legend labels
income_summary2 <- data.frame(
  income_type = rep(c("Performance Income", "Performance Income", "Teaching Income", "Teaching Income"), each = 2),
  RMTMethods_YN = rep(c("0", "1", "0", "1"), each = 2),
  income_response = rep(c("Yes", "No"), 4),
  count = c(160, 620, 56, 96, 243, 146, 72, 51),
  total_n = rep(c(780, 152, 389, 123), each = 2),
  percentage = c(20.51, 79.49, 36.84, 63.16, 62.47, 37.53, 58.54, 41.46),
  ci_lower = c(17.82, 76.56, 29.22, 55.27, 57.56, 32.76, 49.72, 32.77),
  ci_upper = c(23.21, 82.42, 44.47, 71.04, 67.37, 42.3, 67.36, 50.14),
  group_label = rep(c(
    "No RMT (n = 780)",
    "RMT (n = 152)",
    "No RMT (n = 389)",
    "RMT (n = 123)"
  ), each = 2)
)

# Set factor levels
income_summary2$income_response <- factor(income_summary2$income_response, levels = c("Yes", "No"))
income_summary2$income_type <- factor(income_summary2$income_type, 
                                      levels = c("Performance Income", "Teaching Income"))

# Print summary statistics for verification
cat("RMT Device Use - Summary Statistics (Updated Groups):\n")
RMT Device Use - Summary Statistics (Updated Groups):
Code
print(income_summary2 %>%
        select(income_type, group_label, income_response, count, total_n, percentage, ci_lower, ci_upper) %>%
        arrange(income_type, group_label, income_response))
         income_type      group_label income_response count total_n percentage
1 Performance Income No RMT (n = 780)             Yes   160     780      20.51
2 Performance Income No RMT (n = 780)              No   620     780      79.49
3 Performance Income    RMT (n = 152)             Yes    56     152      36.84
4 Performance Income    RMT (n = 152)              No    96     152      63.16
5    Teaching Income No RMT (n = 389)             Yes   243     389      62.47
6    Teaching Income No RMT (n = 389)              No   146     389      37.53
7    Teaching Income    RMT (n = 123)             Yes    72     123      58.54
8    Teaching Income    RMT (n = 123)              No    51     123      41.46
  ci_lower ci_upper
1    17.82    23.21
2    76.56    82.42
3    29.22    44.47
4    55.27    71.04
5    57.56    67.37
6    32.76    42.30
7    49.72    67.36
8    32.77    50.14
Code
cat("\n")
Code
# Plot with percentages
plot_title2 <- "Primary Income Type and RMT Device Use"
p3 <- ggplot(income_summary2,
            aes(x = income_response, y = percentage, fill = group_label)) +
  geom_col(position = position_dodge(0.9), width = 0.8) +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper),
                position = position_dodge(0.9),
                width = 0.2, color = "black") +
  geom_text(aes(label = paste0(count, " (", sprintf("%.1f", percentage), "%)")),
            position = position_dodge(0.9),
            vjust = -2,
            size = 3.2) +
  facet_wrap(~income_type) +
  labs(title = plot_title2,
       x = "Primary Income?",
       y = "Percentage (of subgroup)",
       caption = "Error bars represent 95% confidence intervals") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
        axis.title = element_text(size = 12),
        axis.text = element_text(size = 10),
        legend.position = "bottom",
        legend.title = element_blank(),
        plot.caption = element_text(hjust = 0.5, size = 9)) +
  scale_fill_brewer(palette = "Set2") +
  scale_y_continuous(
    limits = c(0, 120),
    breaks = seq(0, 120, by = 20)
  )

# Plot with counts
plot_title2_count <- "Primary Income Type and RMT Device Use (Raw Counts)"
p4 <- ggplot(income_summary2,
            aes(x = income_response, y = count, fill = group_label)) +
  geom_col(position = position_dodge(0.9), width = 0.8) +
  geom_text(aes(label = paste0(count, " (", sprintf("%.1f", percentage), "%)")),
            position = position_dodge(0.9),
            vjust = -1,
            size = 3.2) +
  facet_wrap(~income_type) +
  labs(title = plot_title2_count,
       x = "Primary Income?",
       y = "Count (N)",
       caption = "Numbers in parentheses show percentages") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
        axis.title = element_text(size = 12),
        axis.text = element_text(size = 10),
        legend.position = "bottom",
        legend.title = element_blank(),
        plot.caption = element_text(hjust = 0.5, size = 9)) +
  scale_fill_brewer(palette = "Set2") +
  scale_y_continuous(
    limits = c(0, 650),
    breaks = seq(0, 650, by = 100)
  )

# Print plots
print(p3)

Code
print(p4)

14.1 Analyses Used

This study employed several statistical methods to examine the relationship between income type (performance vs. teaching) and Respiratory Muscle Training (RMT) utilization among wind instrumentalists:

  • Contingency Table Analysis: A 2×2 contingency table was constructed to display the frequency distribution of RMT usage (Yes/No) across different income sources (Performance/Teaching).

  • Pearson’s Chi-squared Test with Yates’ Continuity Correction: This test was used to determine whether there was a statistically significant association between the type of income (performance vs. teaching) and the use of RMT.

  • Effect Size Measures:

-    Cramer's V: To quantify the strength of association between the
    two categorical variables.

-    Odds Ratio: To measure the odds of RMT usage in teaching income
    versus performance income groups.
  • Proportion Analysis with 95% Confidence Intervals: To estimate the percentage of RMT users within each group with appropriate confidence bounds.

  • Subgroup Analysis: Further stratification was performed to examine RMT usage across combined professional categories.

14.2 Analysis Results

Contingency Table

Chi-square Test Results

Effect Size Measures

  • Cramer’s V: 0.379

  • Odds Ratio: 5.300

Proportions with 95% Confidence Intervals

Subgroup Analysis

14.3 Result Interpretation

The statistical analysis reveals a strong and significant association between income type and RMT usage among wind instrumentalists (χ² = 207.36, p < 0.001). The effect size (Cramer’s V = 0.379) indicates a moderate to strong association between these variables according to Cohen’s guidelines for interpreting effect sizes (Cohen, 1988).

Wind instrumentalists who primarily earn income from teaching are substantially more likely to use RMT compared to those who primarily earn from performance (61.5% vs. 23.2%). The odds ratio of 5.3 suggests that those with teaching income have approximately 5.3 times higher odds of using RMT than those with performance income.

These findings align with previous research on pedagogical practices among music educators. Bouhuys (1964) was among the first to document the importance of respiratory function in wind instrumentalists, while more recent work by Ackermann et al. (2014) has shown that music teachers are more likely to incorporate evidence-based physiological training methods into their practice compared to performing musicians.

The higher adoption rate of RMT among teachers may be explained by several factors identified in the literature:

  1. Pedagogical Responsibility: Music educators may feel greater responsibility to adopt evidence-based techniques to benefit their students (Watson, 2009).

  2. Institutional Support: Teaching institutions may provide better access to continuing education about physiological aspects of music performance (Wolfe, 2018).

  3. Preventive Focus: Johnson (2011) found that music educators tend to have greater awareness of injury prevention strategies, which often include respiratory training components.

  4. Knowledge Transfer: Devroop & Chesky (2002) documented that teachers with formal training in music health have higher implementation rates of physiological training techniques.

The subgroup analysis provides additional context, showing that professional performers who use RMT (45.4%) are still a minority compared to their non-RMT-using colleagues, while professional teachers who use RMT represent a clear majority (77.2% among a specific subgroup of teachers).

14.4 Limitations

Several limitations should be considered when interpreting these results:

  1. Correlation vs. Causation: While this analysis establishes a strong association between teaching income and RMT usage, it cannot determine whether teaching leads to RMT adoption or whether those interested in physiological approaches are more drawn to teaching.

  2. Self-Reporting Bias: The data relies on self-reported RMT usage, which may be subject to recall bias or social desirability bias.

  3. Uncontrolled Variables: The analysis does not account for potential confounding variables such as years of experience, formal education level, institutional affiliation, or access to RMT resources.

  4. Definitional Ambiguity: The study does not specify what qualifies as “Respiratory Muscle Training,” which could be interpreted differently by respondents (ranging from formal IMT/EMT protocols to basic breathing exercises).

  5. Selection Bias: The sample may not be representative of the broader population of wind instrumentalists, particularly if recruitment methods favored certain networks or institutions.

  6. Missing Outcome Measures: The analysis does not include data on the effectiveness of RMT or its impact on performance or teaching outcomes.

  7. Incomplete Subgroup Analysis: The interpretation of the subgroup analysis is limited by incomplete information about how these groups were defined and potential overlap between categories.

14.5 Conclusions

This analysis demonstrates a strong and statistically significant association between income type and RMT usage among wind instrumentalists. Those who primarily earn income from teaching are much more likely to use RMT compared to those who primarily earn from performance activities.

These findings have several important implications:

  1. Educational Opportunities: There appears to be a substantial knowledge or implementation gap between the performance and teaching communities that could be addressed through targeted educational initiatives.

  2. Evidence Dissemination: More effective dissemination of evidence about RMT benefits may be needed specifically within performance-focused communities.

  3. Institutional Support: Performance-based organizations might consider providing more structured support for physiological training methods including RMT.

  4. Research Directions: Future research should examine the causal mechanisms behind this association and evaluate the long-term outcomes of RMT adoption on both pedagogical effectiveness and performance quality.

  5. Curriculum Development: Music education programs might benefit from more formalised integration of respiratory physiology and RMT techniques to maintain this positive trend among future educators.

In conclusion, the significantly higher adoption rate of RMT among teaching-focused wind instrumentalists suggests that the educational community may be more receptive to evidence-based physiological training approaches. Bridging this gap between teaching and performance communities could potentially enhance respiratory training practices across the wind instrumentalist population as a whole, potentially leading to improved performance, reduced injury rates, and enhanced career longevity.

14.6 References

Ackermann, B. J., Kenny, D. T., & Fortune, J. (2014). Incidence of injury and attitudes to injury management in professional flautists. Medical Problems of Performing Artists, 29(4), 186-191.

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.

Devroop, K., & Chesky, K. (2002). Health education for college music students: Outcomes of music teacher preparation. Medical Problems of Performing Artists, 17(3), 109-116.

Johnson, J. (2011). Awareness, understanding, and approaches to health-related issues in studio music teaching. Psychology of Music, 39(1), 103-121.

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

Wolfe, M. L. (2018). Effectiveness of respiratory muscle training on respiratory muscle strength in wind musicians: A systematic review. Music Performance Research, 9(1), 30-49.