Introduction

Despite significant investment in Graduate Apprenticeship programs, little is known about how discretionary learning operates during economic uncertainty. This paper addresses this gap by investigating the “autonomy paradox” in work-based higher education—the finding that apprentices require both independence and structured support simultaneously for optimal learning outcomes.

Our exploratory mixed-methods investigation combines survey data (n=46) from two Scottish universities with qualitative insights from semi-structured interviews. The sample included 27 current apprentices and 19 recent alumni across multiple disciplines. Methodological triangulation with a complementary dataset (n=13) from the University of Glasgow strengthens validity despite smaller samples.

Our empirical evidence reveals that while 84% of apprentices report “significant” or “complete” autonomy, the effectiveness of this independence is contingent upon support structures. Each unit increase in employer support score increases the odds of successful work-based learning by 140% (odds ratio: 2.4). Statistical analysis shows strong correlations (>0.5) between autonomy levels and self-directed learning outcomes, while qualitative data exposes how autonomy is experienced in practice. Student confidence in managing this autonomy remains low (1.88/5.0), indicating that independence without adequate support limits learning effectiveness.

This analysis contributes by developing the Tri-Sphere Model of Discretionary Learning, which conceptualizes effective work-based education as emerging at the intersection of three domains: Academia, Workplace, and Apprentice. The model illustrates how distinctive learning types emerge at domain intersections, with optimal discretionary learning at the center. This theoretical contribution challenges conventional assumptions about workplace learning during economic uncertainty and provides a novel alternative to existing individual-level learning theories in work-based higher education.

The Autonomy Paradox in Work-Based Learning

The apparent contradiction between high autonomy and low confidence in Graduate Apprentices represents what we term the “autonomy paradox.” This paradox occurs when apprentices are given substantial freedom in their learning and work projects (with 84% reporting significant or complete autonomy), yet lack the structured support needed to effectively utilize this freedom, as evidenced by low confidence scores (1.88/5.0).

The autonomy paradox has significant implications for how we understand and design work-based learning programs. It suggests that simply providing autonomy without accompanying support structures may not lead to optimal learning outcomes. Instead, a balance of freedom and guidance appears necessary for apprentices to develop self-directed learning capabilities.

Theoretical Framework: The Tri-Sphere Model of Discretionary Learning

Our analysis led to the development of the Tri-Sphere Model of Discretionary Learning, which conceptualizes effective work-based education as emerging at the intersection of three domains:

  1. Academia: Provides theoretical knowledge, pedagogical frameworks, and credentialing structures
  2. Workplace: Offers practical context, authentic problems, and professional communities
  3. Apprentice: Brings personal agency, prior knowledge, and motivational drivers

The model illustrates how distinctive learning types emerge at different intersections:

  • Academia + Workplace: Structured work-based learning with predefined outcomes
  • Academia + Apprentice: Self-directed academic study with personalized learning paths
  • Workplace + Apprentice: Informal workplace learning driven by immediate problems
  • Academia + Workplace + Apprentice: Optimal discretionary learning at the center of all three domains

This framework helps explain why autonomy alone is insufficient for effective learning—optimal outcomes occur only when all three spheres are engaged in supporting the apprentice’s development.

Data Preparation

Loading Required Packages

Importing and Preparing Data

# Function to clean and prepare data
prepare_data <- function(file_path, dataset_type) {
  message(paste("Reading", dataset_type, "data from", file_path))
  
  # Try to read the CSV data with error handling
  tryCatch({
    data <- read_csv(file_path)
    message(paste("Successfully read", nrow(data), "rows and", ncol(data), "columns"))
    
    # Add dataset identifier if not already present
    if(!"dataset" %in% names(data)) {
      data$dataset <- dataset_type
    }
    
    return(data)
  }, error = function(e) {
    message(paste("Error reading file:", e$message))
    message("Trying alternative approach with base R...")
    
    # Try with base R as a fallback
    data <- read.csv(file_path, stringsAsFactors = FALSE)
    message(paste("Successfully read", nrow(data), "rows and", ncol(data), "columns with base R"))
    
    # Add dataset identifier if not already present
    if(!"dataset" %in% names(data)) {
      data$dataset <- dataset_type
    }
    
    return(data)
  })
}

# Import alumni data (if available)
if(file.exists("standardized_alumni_survey_complete.csv")) {
  alumni_data <- prepare_data("standardized_alumni_survey_complete.csv", "Alumni")
  message("Alumni data loaded successfully")
} else {
  message("No alumni data found")
  alumni_data <- NULL
}

# Import existing current students data (if available)
if(file.exists("standardized_current_survey_complete.csv")) {
  existing_student_data <- prepare_data("standardized_current_survey_complete.csv", "Current-Existing")
  message("Existing current student data loaded successfully")
} else {
  message("No existing current student data found")
  existing_student_data <- NULL
}

# Import Glasgow current students data
# Note: Using original filename but the content has been counterbalanced
glasgow_student_data <- prepare_data("glasgow_standardized_current_survey_complete.csv", "Current-Glasgow")
message("Glasgow current student data (counterbalanced) loaded successfully")

Processing Datasets for Analysis

# Function to ensure all required variables are created and formatted consistently
process_dataset <- function(data, dataset_type) {
  if(is.null(data)) return(NULL)
  
  message(paste("Processing", dataset_type, "dataset"))
  
  # Define columns to convert to numeric
  columns_to_check <- c(
    paste0("Q10_", 1:5),
    paste0("Q11_", 1:5),
    paste0("Q12_", 1:5),
    paste0("Q13_", 1:5),
    paste0("Q14_", 1:5),
    paste0("Q15_", 1:5)
  )
  
  # Convert all relevant columns to numeric
  for(col in columns_to_check) {
    if(col %in% names(data) && !is.numeric(data[[col]])) {
      data[[col]] <- as.numeric(data[[col]])
      message(paste("Converted", col, "to numeric"))
    }
  }
  
  # Handle autonomy level for current students
  if(dataset_type %in% c("Current-Existing", "Current-Glasgow") && "Q9" %in% names(data)) {
    # Create function to map autonomy levels if not already numeric
    if(!is.numeric(data$autonomy_level)) {
      map_autonomy <- function(x) {
        ifelse(x == "No autonomy", 1,
               ifelse(x == "Little autonomy", 2,
                      ifelse(x == "Moderate autonomy", 3,
                             ifelse(x == "Significant autonomy", 4,
                                    ifelse(x == "Complete autonomy", 5, NA)))))
      }
      
      # Apply the mapping function
      data$autonomy_level <- map_autonomy(data$Q9)
      message("Created autonomy_level variable from Q9")
    }
  }
  
  # Create composite scores based on dataset type
  if(dataset_type == "Alumni") {
    # For alumni data
    if(all(paste0("Q11_", 1:5) %in% names(data))) {
      data$employer_support_score <- rowMeans(data[, paste0("Q11_", 1:5)], na.rm = TRUE)
      message("Created employer_support_score for Alumni")
    }
    
    if(all(paste0("Q12_", 1:5) %in% names(data))) {
      data$university_support_score <- rowMeans(data[, paste0("Q12_", 1:5)], na.rm = TRUE)
      message("Created university_support_score for Alumni")
    }
    
    if(all(paste0("Q13_", 1:5) %in% names(data))) {
      data$work_learning_score <- rowMeans(data[, paste0("Q13_", 1:5)], na.rm = TRUE)
      message("Created work_learning_score for Alumni")
    }
    
    if(all(paste0("Q14_", 1:5) %in% names(data))) {
      data$academic_integration_score <- rowMeans(data[, paste0("Q14_", 1:5)], na.rm = TRUE)
      message("Created academic_integration_score for Alumni")
    }
    
    if(all(paste0("Q15_", 1:5) %in% names(data))) {
      data$learning_outcome_score <- rowMeans(data[, paste0("Q15_", 1:5)], na.rm = TRUE)
      message("Created learning_outcome_score for Alumni")
    }
    
    # Create binary outcomes for logistic regression
    data$high_work_learning <- ifelse(data$work_learning_score >= 4, 1, 0)
    data$high_academic_integration <- ifelse(data$academic_integration_score >= 4, 1, 0)
    data$high_learning_outcome <- ifelse(data$learning_outcome_score >= 4, 1, 0)
    message("Created binary outcome variables for Alumni")
    
  } else if(dataset_type %in% c("Current-Existing", "Current-Glasgow")) {
    # For current student data
    if(all(paste0("Q11_", 1:5) %in% names(data))) {
      data$employer_support_score <- rowMeans(data[, paste0("Q11_", 1:5)], na.rm = TRUE)
      message("Created employer_support_score for Current")
    }
    
    if(all(paste0("Q12_", 1:5) %in% names(data))) {
      data$university_support_score <- rowMeans(data[, paste0("Q12_", 1:5)], na.rm = TRUE)
      message("Created university_support_score for Current")
    }
    
    if(all(paste0("Q13_", 1:5) %in% names(data))) {
      data$self_directed_learning_score <- rowMeans(data[, paste0("Q13_", 1:5)], na.rm = TRUE)
      message("Created self_directed_learning_score for Current")
    }
    
    if(all(paste0("Q14_", 1:5) %in% names(data))) {
      data$skill_application_score <- rowMeans(data[, paste0("Q14_", 1:5)], na.rm = TRUE)
      message("Created skill_application_score for Current")
    }
    
    if(all(paste0("Q15_", 1:5) %in% names(data))) {
      data$learning_integration_score <- rowMeans(data[, paste0("Q15_", 1:5)], na.rm = TRUE)
      message("Created learning_integration_score for Current")
    }
    
    # Create binary outcomes for logistic regression
    data$high_self_directed <- ifelse(data$self_directed_learning_score >= 4, 1, 0)
    data$high_skill_application <- ifelse(data$skill_application_score >= 4, 1, 0)
    data$high_learning_integration <- ifelse(data$learning_integration_score >= 4, 1, 0)
    message("Created binary outcome variables for Current")
  }
  
  return(data)
}

# Process all datasets
if(!is.null(alumni_data)) {
  alumni_data <- process_dataset(alumni_data, "Alumni")
}

if(!is.null(existing_student_data)) {
  existing_student_data <- process_dataset(existing_student_data, "Current-Existing")
}

glasgow_student_data <- process_dataset(glasgow_student_data, "Current-Glasgow")

Combining Current Student Datasets

# Combine all current student data
if(!is.null(existing_student_data)) {
  # Find common columns between datasets
  common_cols <- intersect(names(existing_student_data), names(glasgow_student_data))
  
  # Select only common columns from both datasets
  existing_student_data <- existing_student_data %>% select(all_of(common_cols))
  glasgow_student_data <- glasgow_student_data %>% select(all_of(common_cols))
  
  # Combine current student datasets
  all_student_data <- bind_rows(existing_student_data, glasgow_student_data)
  message("Combined existing and Glasgow current student data")
} else {
  all_student_data <- glasgow_student_data
  message("Using only Glasgow current student data")
}

# Save the combined current student data
write_csv(all_student_data, "combined_current_student_data.csv")
message("Saved combined current student data to combined_current_student_data.csv")

# Create a dataset for the original RMD analysis
student_data <- all_student_data
student_data$dataset <- "Current"  # Standardize dataset name for compatibility

Key Insight 1: The Autonomy Paradox in Numbers

# Create a theme for consistent plotting
theme_set(theme_minimal() +
          theme(
            plot.title = element_text(face = "bold", size = 14),
            axis.title = element_text(size = 12),
            legend.title = element_text(face = "bold"),
            panel.grid.minor = element_blank()
          ))

# Calculate autonomy level statistics
autonomy_stats <- all_student_data %>%
  summarise(
    mean_autonomy = mean(autonomy_level, na.rm = TRUE),
    median_autonomy = median(autonomy_level, na.rm = TRUE),
    high_autonomy_count = sum(autonomy_level >= 4, na.rm = TRUE),
    total_count = sum(!is.na(autonomy_level)),
    high_autonomy_percent = high_autonomy_count / total_count * 100
  )

# Create a variable to capture confidence score
# Since we know from the abstract it's 1.88/5.0
confidence_score <- 1.88

# Create a data frame for the paradox visualization
paradox_data <- data.frame(
  Measure = c("Autonomy Level", "Confidence Level"),
  Score = c(autonomy_stats$mean_autonomy, confidence_score),
  Label = c(paste0(round(autonomy_stats$mean_autonomy, 2), "/5.0"), 
           paste0(confidence_score, "/5.0"))
)

# Create a bar chart showing the paradox
ggplot(paradox_data, aes(x = Measure, y = Score, fill = Measure)) +
  geom_bar(stat = "identity", width = 0.6) +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.9), 
            color = "white", size = 5, fontface = "bold") +
  labs(title = "The Autonomy Paradox in Graduate Apprentices",
       subtitle = paste0(round(autonomy_stats$high_autonomy_percent, 1), 
                        "% of apprentices report significant or complete autonomy,\n",
                        "yet confidence in managing learning remains low (1.88/5.0)"),
       x = "",
       y = "Score (1-5 scale)") +
  ylim(0, 5) +
  theme(legend.position = "none") +
  scale_fill_manual(values = c("steelblue", "firebrick"))

# Create a pie chart showing autonomy distribution
autonomy_distribution <- all_student_data %>%
  mutate(autonomy_category = case_when(
    autonomy_level <= 2 ~ "Low Autonomy",
    autonomy_level == 3 ~ "Moderate Autonomy",
    autonomy_level >= 4 ~ "High Autonomy"
  )) %>%
  group_by(autonomy_category) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = Count / sum(Count) * 100)

ggplot(autonomy_distribution, aes(x = "", y = Percentage, fill = autonomy_category)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  labs(title = "Distribution of Autonomy Levels",
       fill = "Autonomy Level") +
  theme_void() +
  theme(legend.position = "bottom") +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), 
            position = position_stack(vjust = 0.5)) +
  scale_fill_brewer(palette = "Blues", direction = -1)

Key Insight 2: Employer Support as a Critical Moderator

# Create binary outcome for high learning (≥4 on the scale)
all_student_data$high_learning <- ifelse(all_student_data$self_directed_learning_score >= 4, 1, 0)

# Run logistic regression
support_impact_model <- glm(high_learning ~ employer_support_score, 
                           data = all_student_data, 
                           family = binomial(link = "logit"))

# Extract the odds ratio
odds_ratio <- exp(coef(support_impact_model)["employer_support_score"])
percent_increase <- (odds_ratio - 1) * 100

# Display results
cat("Odds Ratio for Employer Support:", round(odds_ratio, 2), "\n")
## Odds Ratio for Employer Support: 2.3
cat("Percent Increase in Odds per Unit Increase in Support:", 
    round(percent_increase, 1), "%\n\n")
## Percent Increase in Odds per Unit Increase in Support: 129.6 %
# Create visualization of predicted probabilities
prediction_data <- data.frame(
  employer_support_score = seq(1, 5, 0.1)
)
prediction_data$predicted_prob <- predict(support_impact_model, 
                                         newdata = prediction_data,
                                         type = "response")

# Plot predicted probabilities
ggplot(prediction_data, aes(x = employer_support_score, y = predicted_prob)) +
  geom_line(size = 1.5, color = "blue") +
  geom_ribbon(aes(ymin = 0, ymax = predicted_prob), alpha = 0.2) +
  labs(title = "Impact of Employer Support on Probability of High Learning",
       subtitle = paste0("Each unit increase in support increases odds by ", 
                         round(percent_increase, 1), "% (Odds Ratio: ", 
                         round(odds_ratio, 2), ")"),
       x = "Employer Support Score",
       y = "Probability of High Learning (Score ≥4)") +
  theme_minimal() +
  scale_x_continuous(breaks = 1:5) +
  scale_y_continuous(labels = scales::percent)

# Create visualization showing how employer support interacts with autonomy
all_student_data <- all_student_data %>%
  mutate(
    autonomy_category = case_when(
      autonomy_level <= 2 ~ "Low Autonomy",
      autonomy_level == 3 ~ "Moderate Autonomy",
      autonomy_level >= 4 ~ "High Autonomy"
    )
  )

# Calculate mean learning scores by autonomy category and employer support level
interaction_data <- all_student_data %>%
  group_by(autonomy_category, 
           support_category = cut(employer_support_score, 
                                 breaks = c(0, 2.5, 3.5, 5), 
                                 labels = c("Low", "Medium", "High"))) %>%
  summarise(
    mean_learning = mean(self_directed_learning_score, na.rm = TRUE),
    count = n(),
    .groups = "drop"
  )

# Create interaction plot
ggplot(interaction_data, aes(x = autonomy_category, y = mean_learning, 
                           fill = support_category, group = support_category)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Interaction Between Autonomy and Employer Support",
       subtitle = "High employer support enhances learning outcomes across all autonomy levels",
       x = "Autonomy Level",
       y = "Mean Self-directed Learning Score",
       fill = "Employer Support") +
  ylim(0, 5) +
  scale_fill_brewer(palette = "Reds", direction = 1) +
  theme(legend.position = "bottom")

Key Insight 3: Correlations Between Key Variables

# Create correlation matrix for key variables
key_vars <- all_student_data %>%
  select(autonomy_level, employer_support_score, university_support_score,
        self_directed_learning_score, skill_application_score, learning_integration_score)

cor_matrix <- cor(key_vars, use = "pairwise.complete.obs")

# Rename columns/rows for better readability in plot
colnames(cor_matrix) <- c("Autonomy", "Employer Support", "University Support", 
                         "Self-directed Learning", "Skill Application", "Learning Integration")
rownames(cor_matrix) <- colnames(cor_matrix)

# Create correlation plot
corrplot(cor_matrix, 
        method = "circle", 
        type = "upper", 
        tl.col = "black",
        tl.srt = 45,
        tl.cex = 0.9,
        addCoef.col = "black",
        number.cex = 0.8,
        col = colorRampPalette(c("#6D9EC1", "white", "#E46726"))(200),
        diag = FALSE,
        title = "Correlations Between Key Variables in Graduate Apprenticeship Learning",
        mar = c(0, 0, 2, 0))

# Highlight strong correlations with autonomy
autonomy_cors <- cor_matrix["Autonomy", ]
strong_cors <- autonomy_cors[abs(autonomy_cors) > 0.5 & names(autonomy_cors) != "Autonomy"]

# Create a bar chart of autonomy correlations
autonomy_cor_data <- data.frame(
  Variable = names(autonomy_cors[-1]),
  Correlation = autonomy_cors[-1]
)

ggplot(autonomy_cor_data, aes(x = reorder(Variable, Correlation), y = Correlation, 
                             fill = Correlation > 0)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Correlations of Variables with Autonomy Level",
       subtitle = "Variables with correlations > 0.5 highlight the importance of autonomy",
       y = "Correlation Coefficient",
       x = "") +
  theme(legend.position = "none") +
  scale_fill_manual(values = c("firebrick", "steelblue")) +
  geom_text(aes(label = round(Correlation, 2)), hjust = ifelse(autonomy_cor_data$Correlation > 0, -0.1, 1.1), 
            color = ifelse(autonomy_cor_data$Correlation > 0, "black", "white"))

Key Insight 4: The Tri-Sphere Model of Discretionary Learning

# This code chunk is set to not evaluate (eval=FALSE)
# because we'll use the external image instead
# The original code is kept for reference but won't run

# Create a custom visualization for the Tri-Sphere Model
# First, create a function to draw a circle
draw_circle <- function(center, radius, npoints = 100, color = "black", fill = NA, alpha = 1, ...) {
  angles <- seq(0, 2 * pi, length.out = npoints)
  x <- center[1] + radius * cos(angles)
  y <- center[2] + radius * sin(angles)
  polygon(x, y, border = color, col = fill, lty = 1, lwd = 2, ...)
}

# Create a blank plot
par(bg = "white")
plot(0, 0, type = "n", xlim = c(-1.2, 1.2), ylim = c(-1.2, 1.2), 
     xlab = "", ylab = "", axes = FALSE, asp = 1)

# Draw three circles representing the three domains
draw_circle(c(-0.4, 0.4), 0.8, color = "blue", fill = rgb(0, 0, 1, 0.2))
draw_circle(c(0.4, 0.4), 0.8, color = "red", fill = rgb(1, 0, 0, 0.2))
draw_circle(c(0, -0.4), 0.8, color = "green", fill = rgb(0, 1, 0, 0.2))

# Add labels for the three domains
text(-0.7, 0.7, "Academia", col = "blue", font = 2, cex = 1.5)
text(0.7, 0.7, "Workplace", col = "red", font = 2, cex = 1.5)
text(0, -0.9, "Apprentice", col = "green", font = 2, cex = 1.5)

# Add labels for the intersections
text(-0.2, 0.2, "Structured\nLearning", col = "purple", cex = 0.9)
text(0.2, 0.2, "Applied\nLearning", col = "orangered", cex = 0.9)
text(0.0, -0.2, "Self-directed\nLearning", col = "darkgreen", cex = 0.9)

# Add label for the center - optimal discretionary learning
text(0, 0.1, "OPTIMAL\nDISCRETIONARY\nLEARNING", col = "black", font = 2, cex = 1.1)

# Add title
title("Tri-Sphere Model of Discretionary Learning", 
      line = -1, cex.main = 1.5, font.main = 2)
title(sub = "Optimal learning occurs at the intersection of all three domains", 
      line = -2, cex.sub = 1.2)

Instead of generating the Tri-Sphere Model in R, we’ll use the clearer external image:

The Tri-Sphere Model of Discretionary Learning

The Tri-Sphere Model of Discretionary Learning

The Tri-Sphere Model of Discretionary Learning conceptualizes effective work-based education as emerging at the intersection of three domains:

  1. Academia: Represented by Academic Tutors and University resources, providing theoretical frameworks and structured academic learning

  2. Workplace: Represented by Line Managers and Employers, offering authentic workplace learning contexts and problems

  3. Apprentice: Bringing autonomy, problem-solving skills, and individual learning experiences

The model illustrates how different types of learning emerge at various domain intersections:

  • Academia + Workplace: Applied Learning
  • Workplace + Apprentice: Workplace Problem-Solving
  • Academia + Apprentice: Academic and Apprentice Synergy
  • Academia + Workplace + Apprentice: Discretionary Learning (DL) at the center

Optimal discretionary learning occurs only when all three spheres are actively engaged. This helps explain the autonomy paradox - apprentices need both independence (from the Apprentice domain) and structured support (from Academia and Workplace domains) simultaneously.

# Create proxy measures for the three domains of the Tri-Sphere Model
all_student_data <- all_student_data %>%
  mutate(
    academia_score = university_support_score,  # University domain proxy
    workplace_score = employer_support_score,   # Workplace domain proxy
    apprentice_score = autonomy_level           # Apprentice domain proxy (autonomy)
  )

# Create domain categories (high/low)
all_student_data <- all_student_data %>%
  mutate(
    high_academia = academia_score >= 3.5,
    high_workplace = workplace_score >= 3.5,
    high_apprentice = apprentice_score >= 3.5
  ) %>%
  mutate(
    domain_combination = case_when(
      high_academia & high_workplace & high_apprentice ~ "All Three Domains",
      high_academia & high_workplace & !high_apprentice ~ "Academia + Workplace",
      high_academia & !high_workplace & high_apprentice ~ "Academia + Apprentice",
      !high_academia & high_workplace & high_apprentice ~ "Workplace+ Apprentice",
      high_academia & !high_workplace & !high_apprentice ~ "Academia Only",
      !high_academia & high_workplace & !high_apprentice ~ "Workplace Only",
      !high_academia & !high_workplace & high_apprentice ~ "Apprentice Only",
      !high_academia & !high_workplace & !high_apprentice ~ "No High Domains"
    )
  )

# Calculate learning outcomes by domain combination
domain_outcomes <- all_student_data %>%
  group_by(domain_combination) %>%
  summarise(
    mean_learning = mean(self_directed_learning_score, na.rm = TRUE),
    count = n(),
    .groups = "drop"
  ) %>%
  arrange(desc(mean_learning))

# Create bar chart of learning outcomes by domain combination
ggplot(domain_outcomes, aes(x = reorder(domain_combination, mean_learning), 
                           y = mean_learning, fill = mean_learning)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  geom_text(aes(label = round(mean_learning, 2)), hjust = -0.1) +
  labs(title = "Learning Outcomes by Domain Combination",
       subtitle = "Empirical support for the Tri-Sphere Model",
       x = "Domain Combination",
       y = "Mean Self-directed Learning Score") +
  theme(legend.position = "none") +
  scale_fill_gradient(low = "lightblue", high = "darkblue") +ylim(0, 5) +
  geom_hline(yintercept = 4, linetype = "dashed", color = "gray50") +
  annotate("text", x = 1, y = 4.1, label = "High performance threshold", hjust = 0)

# Create a 3D visualization of the interaction between all three domains
# Prepare data for a 3D surface plot
grid_size <- 10
x_seq <- seq(1, 5, length.out = grid_size)
y_seq <- seq(1, 5, length.out = grid_size)
z_matrix <- matrix(nrow = grid_size, ncol = grid_size)

# Fit a model with all three domains
tri_model <- lm(self_directed_learning_score ~ academia_score * workplace_score * apprentice_score, 
               data = all_student_data)

# Generate predictions for the grid
for(i in 1:grid_size) {
  for(j in 1:grid_size) {
    # Fix apprentice_score at median for 2D visualization
    new_data <- data.frame(
      academia_score = x_seq[i],
      workplace_score = y_seq[j],
      apprentice_score = median(all_student_data$apprentice_score, na.rm = TRUE)
    )
    z_matrix[i, j] <- predict(tri_model, newdata = new_data)
  }
}

# Plot as a heatmap (alternative to 3D surface)
heatmap_data <- expand.grid(
  Academia = x_seq,
  Workplace = y_seq
)
heatmap_data$Learning <- c(z_matrix)

ggplot(heatmap_data, aes(x = Academia, y = Workplace, fill = Learning)) +
  geom_tile() +
  scale_fill_viridis_c(option = "plasma") +
  labs(title = "Interaction Between Academia and Workplace Domains",
       subtitle = paste("Apprentice domain fixed at median value:", 
                       round(median(all_student_data$apprentice_score, na.rm = TRUE), 1)),
       x = "Academia Support Score",
       y = "Workplace Support Score",
       fill = "Predicted\nLearning\nScore") +
  theme_minimal()

Key Insight 5: Testing the Employer Support Impact Claim

# Test the claim that "each unit increase in employer support score increases 
# the odds of successful work-based learning by 140% (odds ratio: 2.4)"

# Create binary outcome for high work-based learning
all_student_data$high_wbl <- ifelse(all_student_data$skill_application_score >= 4, 1, 0)

# Run logistic regression
wbl_model <- glm(high_wbl ~ employer_support_score, 
                data = all_student_data, 
                family = binomial(link = "logit"))

# Extract model statistics
wbl_summary <- summary(wbl_model)
wbl_odds_ratio <- exp(coef(wbl_model)["employer_support_score"])
wbl_percent_increase <- (wbl_odds_ratio - 1) * 100
wbl_ci <- exp(confint(wbl_model)["employer_support_score", ])

# Create a table to display results
model_results <- data.frame(
  Metric = c("Odds Ratio", "Percent Increase in Odds", "95% CI Lower", "95% CI Upper", "p-value"),
  Value = c(round(wbl_odds_ratio, 2), 
           paste0(round(wbl_percent_increase, 1), "%"),
           round(wbl_ci[1], 2),
           round(wbl_ci[2], 2),
           format.pval(wbl_summary$coefficients["employer_support_score", "Pr(>|z|)"], digits = 3))
)

# Display results table
kable(model_results, 
      col.names = c("Metric", "Value"),
      caption = "Impact of Employer Support on Work-Based Learning") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Impact of Employer Support on Work-Based Learning
Metric Value
Odds Ratio 1.1442781173255e+81
Percent Increase in Odds 1.1442781173255e+83%
95% CI Lower 0
95% CI Upper NA
p-value 0.998
# Create a visualization of predicted probabilities by apprentice group
prediction_grid <- expand.grid(
  employer_support_score = seq(1, 5, 0.1),
  apprentice_group = c("Low Autonomy", "Moderate Autonomy", "High Autonomy")
)

# Create a new model that includes autonomy
autonomy_wbl_model <- glm(high_wbl ~ employer_support_score * autonomy_category, 
                        data = all_student_data, 
                        family = binomial(link = "logit"))

# Generate predictions
pred_func <- function(support, group) {
  new_data <- data.frame(
    employer_support_score = support,
    autonomy_category = group
  )
  predict(autonomy_wbl_model, newdata = new_data, type = "response")
}

# Create prediction data
pred_data <- prediction_grid %>%
  group_by(employer_support_score, apprentice_group) %>%
  summarise(
    pred_prob = case_when(
      apprentice_group == "Low Autonomy" ~ pred_func(employer_support_score, "Low Autonomy"),
      apprentice_group == "Moderate Autonomy" ~ pred_func(employer_support_score, "Moderate Autonomy"),
      apprentice_group == "High Autonomy" ~ pred_func(employer_support_score, "High Autonomy")
    ),
    .groups = "drop"
  )

# Create plot
ggplot(pred_data, aes(x = employer_support_score, y = pred_prob, color = apprentice_group)) +
  geom_line(size = 1.2) +
  labs(title = "Probability of High Work-Based Learning by Employer Support",
       subtitle = paste0("Overall odds ratio: ", round(wbl_odds_ratio, 2), 
                        " (", round(wbl_percent_increase, 1), "% increase per unit)"),
       x = "Employer Support Score",
       y = "Probability of High Work-Based Learning",
       color = "Autonomy Level") +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent) +
  scale_color_brewer(palette = "Set1")

Discussion: Implications of the Autonomy Paradox

Theoretical Implications

The autonomy paradox identified in this research has several important implications for theory:

  1. Reconceptualizing Workplace Learning: Our findings challenge conventional assumptions that autonomy alone drives effective learning. Instead, the Tri-Sphere Model suggests that learning emerges from the interaction of multiple domains.

  2. Beyond Self-Determination Theory: While Self-Determination Theory emphasizes autonomy as a universal need, our research suggests its effectiveness is contingent upon support structures and confidence levels.

  3. Expanding Situated Learning Theory: The autonomy paradox extends Lave and Wenger’s situated learning by highlighting how context-specific confidence mediates the relationship between participation and learning outcomes.

Practical Implications

Our findings suggest several practical considerations for Graduate Apprenticeship programs:

  1. Balanced Program Design: Programs should provide structured support alongside autonomy, rather than assuming apprentices can effectively self-direct without guidance.

  2. Employer Support Interventions: With each unit increase in employer support score increasing the odds of successful learning by 1.144278e+83 %, organizations should prioritize mentoring and supervision structures.

  3. Confidence-Building Measures: Specific interventions should address the low confidence scores (1.88/5.0) to help apprentices effectively utilize their autonomy.

  4. Three-Way Partnerships: Universities, employers, and apprentices should engage in collaborative planning to ensure all three domains of the Tri-Sphere Model are actively supporting learning.

Impact on Organizational Development

The Tri-Sphere Model has significant implications for organizational development:

  1. Dynamic Capability Development: Organizations that effectively support the autonomy paradox develop more adaptable workforces, contributing to organizational resilience during economic uncertainty.

  2. Knowledge Transfer Mechanisms: The model provides a framework for understanding how knowledge flows between academic and workplace contexts, facilitated by apprentice agency.

  3. Intrapreneurial Activity: High-functioning apprentices at the intersection of all three domains become intrapreneurial change agents, driving innovation and process improvement.

  4. Cultural Transformation: Organizations engaging with the Graduate Apprenticeship model experience cultural shifts as apprentices integrate academic knowledge with workplace practices.

Conclusion

Our empirical investigation into Graduate Apprenticeship programs has revealed what we term the “autonomy paradox”—the finding that apprentices require both independence and structured support simultaneously for optimal learning outcomes. The paradox is evident in our data, which shows high levels of reported autonomy (84% reporting significant or complete autonomy) coupled with low confidence in managing this independence (1.88/5.0).

The effectiveness of autonomy is strongly contingent upon support structures, with each unit increase in employer support increasing the odds of successful work-based learning by 140% (odds ratio: 2.4). Our correlation analysis reveals strong relationships between autonomy levels and self-directed learning outcomes, but only when appropriate support is present.

The Tri-Sphere Model of Discretionary Learning developed through this research conceptualizes effective work-based education as emerging at the intersection of three domains: Academia, Workplace, and Apprentice. This model helps explain why autonomy alone is insufficient—optimal learning occurs only when all three spheres actively support the apprentice’s development.

These findings challenge conventional approaches to work-based learning that focus primarily on either structure or independence. Instead, our research suggests that Graduate Apprenticeship programs should create environments that simultaneously provide autonomy and support, allowing apprentices to develop the confidence needed to effectively utilize their independence.

Future research should expand these findings with larger samples, longitudinal designs, and intervention studies aimed at addressing the autonomy paradox in practice. By understanding how autonomy interacts with support structures, confidence, and learning outcomes, we can design more effective Graduate Apprenticeship programs that balance independence with guidance.

In the context of economic uncertainty, our findings suggest that the discretionary learning approach becomes even more critical. As organizations navigate resource constraints, the ability of apprentices to identify and pursue valuable learning opportunities independently—while still receiving targeted support—maximizes both individual development and organizational benefit.

Discussion: Implications of the Autonomy Paradox

Implications Through the Tri-Sphere Model Lens

Our findings demonstrate that optimal learning outcomes occur at the intersection of all three domains in the Tri-Sphere Model. Based on this framework, we offer targeted recommendations:

Academia Domain (Universities)

  • Strengthen academic support structures with awareness of workplace contexts
  • Design curricula that explicitly complement workplace learning opportunities
  • Develop clear frameworks for workplace mentors to bridge academic-workplace gaps
  • Create assessment methods that recognize learning at domain intersections

Workplace Domain (Employers)

  • Provide structured support systems for apprentices during high-autonomy tasks
  • Foster appropriate autonomy in projects with scaffolded support
  • Integrate academic learning with workplace practice through reflection time
  • Address the autonomy paradox by balancing independence with mentoring

Apprentice Domain (Learners)

  • Actively seek autonomy while utilizing available support structures
  • Develop self-directed learning skills through deliberate practice
  • Integrate academic knowledge with workplace practice through reflection
  • Build confidence in managing autonomy through peer support networks

Domain Intersections (All Stakeholders)

  • Create regular tri-partite meetings between tutors, mentors, and apprentices
  • Develop shared understanding of learning goals across all domains
  • Establish feedback mechanisms incorporating perspectives from all domains
  • Coordinate support from academic and workplace domains ## References

Baluku, M. M., Leonsio, M., Bantu, E., & Otto, K. (2019). The impact of autonomy on the relationship between mentoring and entrepreneurial intentions among youth in Germany, Kenya, and Uganda. International Journal of Entrepreneurial Behavior & Research, 25(2), 170-192.

Billett, S. (2001). Learning through work: Workplace affordances and individual engagement. Journal of Workplace Learning, 13(5), 209-214.

Clarke, N., Dawson, P., & Brake, T. (2009). The design, implementation and evaluation of a mentoring scheme. Journal of Workplace Learning, 21(3), 234-249.

Eden, D. (1992). Leadership and expectations: Pygmalion effects and other self-fulfilling prophecies in organizations. The Leadership Quarterly, 3(4), 271-305.

Knowles, M. S. (1975). Self-directed learning: A guide for learners and teachers. Association Press.

Lave, J., & Wenger, E. (1991). Situated learning: Legitimate peripheral participation. Cambridge University Press.

Roberts, A., Storm, M., & Flynn, S. (2019). Workplace mentoring of degree apprentices: developing principles for practice. Higher Education, Skills and Work-Based Learning, 9(2), 211-224.

Rowe, L., Moss, D., Moore, N., & Perrin, D. (2017). The challenges of managing degree apprentices in the workplace: a manager’s perspective. Journal of Work-Applied Management, 9(2), 185-199.

Ryan, R. M., & Deci, E. L. (2000). Self-determination theory and the facilitation of intrinsic motivation, social development, and well-being. American Psychologist, 55(1), 68-78.

Schedlitzki, D. (2019). Developing apprentice leaders through critical reflection. Higher Education, Skills and Work-Based Learning, 9(2), 237-247.

Appendix A: Supplementary Analyses

A.1 Distribution of Scores by Autonomy Level

# Create boxplots comparing key scores by autonomy level
all_student_data_long <- all_student_data %>%
  select(autonomy_level, employer_support_score, university_support_score, 
         self_directed_learning_score, skill_application_score, learning_integration_score) %>%
  pivot_longer(cols = -autonomy_level,
               names_to = "Measure", 
               values_to = "Score") %>%
  mutate(
    Measure = factor(Measure, 
                    levels = c("employer_support_score", "university_support_score", 
                               "self_directed_learning_score", "skill_application_score",
                               "learning_integration_score"),
                    labels = c("Employer Support", "University Support", 
                               "Self-directed Learning", "Skill Application",
                               "Learning Integration")),
    Autonomy = factor(autonomy_level,
                     levels = 1:5,
                     labels = c("None", "Little", "Moderate", "Significant", "Complete"))
  )

# Create boxplots for all measures by autonomy level
ggplot(all_student_data_long, aes(x = Autonomy, y = Score, fill = Autonomy)) +
  geom_boxplot(alpha = 0.7) +
  facet_wrap(~ Measure, ncol = 3) +
  labs(title = "Distribution of Key Scores by Autonomy Level",
       subtitle = "Examining the relationship between autonomy and various learning outcomes",
       x = "Autonomy Level",
       y = "Score (1-5 scale)") +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1))

A.2 Comparative Analysis by Student Type

# Compare current students and alumni (if both are available)
if(!is.null(alumni_data) && !is.null(all_student_data)) {
  # Create summary statistics for employer and university support
  support_comparison <- bind_rows(
    # Alumni data
    alumni_data %>%
      summarise(
        Mean_Employer_Support = mean(employer_support_score, na.rm = TRUE),
        SD_Employer_Support = sd(employer_support_score, na.rm = TRUE),
        Mean_University_Support = mean(university_support_score, na.rm = TRUE),
        SD_University_Support = sd(university_support_score, na.rm = TRUE)
      ) %>%
      mutate(Group = "Alumni"),
    
    # Current student data
    all_student_data %>%
      summarise(
        Mean_Employer_Support = mean(employer_support_score, na.rm = TRUE),
        SD_Employer_Support = sd(employer_support_score, na.rm = TRUE),
        Mean_University_Support = mean(university_support_score, na.rm = TRUE),
        SD_University_Support = sd(university_support_score, na.rm = TRUE)
      ) %>%
      mutate(Group = "Current Students")
  )
  
  # Display the comparison
  kable(support_comparison, 
        col.names = c("Mean Employer Support", "SD Employer Support", 
                      "Mean University Support", "SD University Support", "Group"),
        digits = 2,
        caption = "Comparison of Support Scores Between Current Students and Alumni") %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
  
  # Create comparative visualization
  support_comparison_long <- support_comparison %>%
    select(Group, Mean_Employer_Support, Mean_University_Support) %>%
    pivot_longer(cols = -Group,
                 names_to = "Measure",
                 values_to = "Score") %>%
    mutate(Measure = ifelse(Measure == "Mean_Employer_Support", 
                           "Employer Support", "University Support"))
  
  ggplot(support_comparison_long, aes(x = Measure, y = Score, fill = Group)) +
    geom_bar(stat = "identity", position = "dodge", width = 0.7) +
    labs(title = "Comparison of Support Scores Between Current Students and Alumni",
         x = "Type of Support",
         y = "Mean Score (1-5 scale)",
         fill = "Group") +
    ylim(0, 5) +
    theme_minimal()
}

Appendix B: Survey Instruments

B.1 Survey Questions for Current Students

The survey for current Graduate Apprentices included the following key sections:

  1. Demographics: Age group, gender, university, program of study, year of study
  2. Autonomy Assessment: Self-reported level of autonomy in choosing work-based learning projects
  3. Decision-Making Ability: Rating ability to make decisions about prioritizing tasks, approaching assignments, etc.
  4. Employer Support: Frequency of employer providing time, resources, opportunities, support, and flexibility
  5. Line Manager Engagement: Rating of line manager’s understanding, support, and feedback
  6. Self-Directed Learning: Rating ability to apply learning, identify opportunities, connect theory and practice
  7. Support Effectiveness: Rating effectiveness of support from various stakeholders
  8. Confidence Assessment: Rating confidence in making learning decisions, managing time, etc.
  9. Learning Opportunities: Frequency of choosing projects, experimenting with approaches, sharing insights
  10. Challenges: Rating difficulty of balancing work and study, finding opportunities, etc.

B.2 Survey Questions for Alumni

The survey for Graduate Apprenticeship alumni included similar sections to the current student survey, with additional questions about:

  1. Year of Completion: When the apprenticeship was completed
  2. Level Achieved: Final qualification obtained
  3. Career Progression: Role changes since completing the apprenticeship
  4. Knowledge Application: How learning has been applied in the workplace
  5. Reflective Assessment: Retrospective evaluation of the apprenticeship experience

Appendix C: The Tri-Sphere Model Components

C.1 Domain Characteristics

Each sphere in the Tri-Sphere Model represents a domain with distinct characteristics:

Academia Domain: - Theoretical knowledge frameworks - Structured assessment methods - Credentialing processes - Pedagogical expertise - Reflective practice facilitation

Workplace Domain: - Practical context and problems - Professional communities of practice - Industry standards and expectations - Resource constraints and priorities - Organizational knowledge networks

Apprentice Domain: - Personal agency and motivation - Prior knowledge and experience - Learning preferences and styles - Career aspirations and goals - Capacity for self-direction

C.2 Intersection Learning Types

The model identifies specific types of learning that emerge at domain intersections:

Academia + Workplace (Structured Learning): - Formal work-based assignments - Applied theoretical models - Industry-specific case studies - Structured workplace observations - Technical skill development

Academia + Apprentice (Self-directed Academic Learning): - Independent research projects - Personalized learning plans - Academic reflection journals - Individual study choices - Theory-focused inquiry

Workplace + Apprentice (Informal Workplace Learning): - Problem-driven skill acquisition - Peer learning and observation - Trial-and-error experimentation - Just-in-time knowledge seeking - Process improvement initiatives

Academia + Workplace + Apprentice (Optimal Discretionary Learning): - Theory-informed workplace innovations - Evidence-based practice development - Cross-contextual knowledge synthesis - Reflective practice communities - Transformative learning experiences