Are NDIS Participant Outcomes Changing?

ndis
outcomes
disability
australia
A simpler look at national NDIS participant outcome levels and changes after plan reassessment.
Author

Aydin

Published

June 10, 2026

The simplest outcomes question is not about spend. It is this:

Can we see any change in outcomes for NDIS participants?

This post starts there. It uses the public participant outcomes files to ask what outcomes are measured, what the current national levels look like, and how reported outcomes change after plan reassessment. The analysis is descriptive. It shows changes in aggregate survey outcomes; it does not prove that the NDIS caused those changes for any individual participant.

The companion budget and utilisation model is here.

Code
clean_names <- function(x) {
  x |>
    str_to_lower() |>
    str_replace_all("&", "and") |>
    str_replace_all("[^a-z0-9]+", "_") |>
    str_replace_all("^_|_$", "")
}

clean_df <- function(x) {
  names(x) <- clean_names(names(x))
  x
}

as_number <- function(x) {
  if (is.numeric(x)) return(x)
  parse_number(
    as.character(x),
    na = c("", "NA", "na", "n/a", "Not applicable", "No data available", "\\")
  )
}

as_rate <- function(x) {
  out <- as_number(x)
  ifelse(out > 1.5, out / 100, out)
}

safe_median <- function(x) {
  x <- x[is.finite(x)]
  if (length(x) == 0) return(NA_real_)
  median(x)
}

format_optional_percent <- function(x, accuracy = 1) {
  ifelse(is.na(x), NA_character_, percent(x, accuracy = accuracy))
}

read_page <- function(url) {
  paste(readLines(url, warn = FALSE, encoding = "UTF-8"), collapse = "\n")
}

extract_links <- function(url) {
  html <- read_page(url)
  base_url <- str_replace(url, "^(https?://[^/]+).*$", "\\1")
  matches <- gregexpr("<a[^>]+href=[\"']([^\"']+)[\"'][^>]*>(.*?)</a>", html, perl = TRUE)
  pieces <- regmatches(html, matches)[[1]]
  if (length(pieces) == 0) return(tibble(label = character(), url = character()))

  tibble(raw = pieces) |>
    mutate(
      href = str_match(raw, "href=[\"']([^\"']+)[\"']")[, 2],
      label = raw |>
        str_replace_all("<[^>]+>", " ") |>
        str_squish(),
      url = case_when(
        str_detect(href, "^https?://") ~ href,
        str_detect(href, "^/") ~ paste0(base_url, href),
        TRUE ~ paste0(str_remove(url, "/[^/]*$"), "/", href)
      )
    ) |>
    select(label, url)
}

download_one <- function(url, filename) {
  path <- file.path(raw_dir, filename)
  if (!file.exists(path)) {
    download.file(url, path, mode = "wb", quiet = TRUE)
  }
  path
}

download_named <- function(page_url, label_regex, filename) {
  path <- file.path(raw_dir, filename)
  if (file.exists(path)) return(path)

  link <- extract_links(page_url) |>
    filter(str_detect(label, regex(label_regex, ignore_case = TRUE))) |>
    slice(1)

  if (nrow(link) == 0) return(NA_character_)
  download_one(link$url[[1]], filename)
}

cohort_levels <- c(
  "Early childhood",
  "School age",
  "Young people",
  "Adults",
  "Family/carer of children",
  "Family/carer of adults"
)

standardise_cohort <- function(questionnaire) {
  case_when(
    questionnaire == "Participant 0 to before school" ~ "Early childhood",
    questionnaire == "Participant starting school to 14" ~ "School age",
    questionnaire == "Participant 15 to 24" ~ "Young people",
    questionnaire == "Participant 25 and over" ~ "Adults",
    questionnaire == "Family/carer of participant 0 to 14" ~ "Family/carer of children",
    questionnaire == "Family/carer of participant 15 and over" ~ "Family/carer of adults",
    TRUE ~ questionnaire
  )
}

classify_outcome_theme <- function(indicator) {
  text <- str_to_lower(indicator)
  case_when(
    str_detect(text, "concerns|development|functional|self-care|independent|daily living") ~ "Development and daily living",
    str_detect(text, "communicat|tell them what|what they want") ~ "Communication",
    str_detect(text, "choice|control|decisions|advocacy|advocate|rights|choose who supports|choose what they do") ~ "Choice and control",
    str_detect(text, "friend|relationship|community|social|family life|meet more people|be more involved|welcomed|included") ~ "Relationships and community",
    str_detect(text, "home|safe") ~ "Home and safety",
    str_detect(text, "health|wellbeing|well-being") ~ "Health and wellbeing",
    str_detect(text, "school|education|training|learn|course|job|employment|paid job|volunteer|mainstream settings") ~ "Learning and work",
    str_detect(text, "services|specialist|programs and activities") ~ "Service access",
    TRUE ~ "Other outcomes"
  )
}

classify_direction <- function(indicator) {
  text <- str_to_lower(indicator)
  case_when(
    str_detect(text, "concerns in 6 or more|with no friends|no friends other than|unable to do .*wanted|difficulties accessing") &
      !str_detect(text, "did not have any difficulties") ~ "Lower is better",
    str_detect(text, "want more choice and control") ~ "Lower may be better",
    str_detect(text, "^has the ndis|involvement with the ndis|ndis helped") ~ "Reported improvement",
    str_detect(text, "^%|^of those") ~ "Higher is better",
    TRUE ~ "Interpret with care"
  )
}

direction_adjust_change <- function(change, direction) {
  case_when(
    direction == "Lower is better" ~ -change,
    direction == "Higher is better" ~ change,
    TRUE ~ NA_real_
  )
}

Data

The two source files are the national NDIS participant outcomes extracts:

  1. Baseline outcomes: current reported levels by state, respondent group and indicator.
  2. Longitudinal outcomes: baseline and reassessment values for people with different numbers of plan reassessments.

The main charts use the national rows only, where StateCd == "ALL". Participant cohorts are shown first. Family and carer outcomes are kept as a short companion note at the end.

Code
baseline_outcomes_path <- download_named(
  page_urls$participant,
  "^Baseline Outcomes data",
  "baseline_outcomes.csv"
)

longitudinal_outcomes_path <- download_named(
  page_urls$participant,
  "^Longitudinal Outcomes data",
  "longitudinal_outcomes.csv"
)

baseline_raw <- read_csv(
  baseline_outcomes_path,
  na = c("", "NA", "na", "n/a"),
  show_col_types = FALSE
) |>
  clean_df() |>
  mutate(
    report_date = dmy(rprtdt),
    percentage = as_rate(percentage),
    cohort_label = factor(standardise_cohort(questionnaire), levels = cohort_levels),
    outcome_theme = classify_outcome_theme(indicator_description),
    direction = classify_direction(indicator_description),
    respondent_type = if_else(str_detect(questionnaire, "^Participant"), "Participant", "Family/carer")
  )

longitudinal_raw <- read_csv(
  longitudinal_outcomes_path,
  na = c("", "NA", "na", "n/a"),
  show_col_types = FALSE
) |>
  clean_df() |>
  mutate(
    report_date = dmy(rprtdt),
    across(starts_with("percentage_"), as_rate),
    cohort_label = factor(standardise_cohort(questionnaire), levels = cohort_levels),
    outcome_theme = classify_outcome_theme(indicator_description),
    direction = classify_direction(indicator_description),
    respondent_type = if_else(str_detect(questionnaire, "^Participant"), "Participant", "Family/carer")
  )

participant_baseline <- baseline_raw |>
  filter(statecd == "ALL", respondent_type == "Participant")

participant_longitudinal <- longitudinal_raw |>
  filter(statecd == "ALL", respondent_type == "Participant")

family_longitudinal <- longitudinal_raw |>
  filter(statecd == "ALL", respondent_type == "Family/carer")

source_summary <- tibble(
  file = c("Baseline outcomes", "Longitudinal outcomes"),
  report_date = c(max(baseline_raw$report_date, na.rm = TRUE), max(longitudinal_raw$report_date, na.rm = TRUE)),
  national_participant_rows = c(nrow(participant_baseline), nrow(participant_longitudinal)),
  participant_cohorts = c(n_distinct(participant_baseline$cohort_label), n_distinct(participant_longitudinal$cohort_label))
)
Code
source_summary |>
  mutate(
    report_date = format(report_date, "%d %B %Y"),
    national_participant_rows = comma(national_participant_rows)
  ) |>
  kable()
file report_date national_participant_rows participant_cohorts
Baseline outcomes 31 March 2026 42 4
Longitudinal outcomes 31 March 2026 670 4

What Outcomes Are Measured?

The participant files cover four broad age cohorts. The outcomes are not identical across ages: early-childhood items focus on development and communication, school-age items add education and independence, and adult items add choice, home, health, education, work and volunteering.

Code
participant_outcome_map <- bind_rows(
  participant_baseline |>
    transmute(cohort_label, outcome_theme, indicator_description, direction),
  participant_longitudinal |>
    transmute(cohort_label, outcome_theme, indicator_description, direction)
) |>
  distinct()

outcome_theme_table <- participant_outcome_map |>
  group_by(cohort_label, outcome_theme) |>
  summarise(
    outcomes = n_distinct(indicator_description),
    example_outcomes = str_c(head(unique(indicator_description), 2), collapse = "; "),
    .groups = "drop"
  ) |>
  arrange(cohort_label, outcome_theme)

outcome_theme_table |>
  mutate(cohort_label = as.character(cohort_label)) |>
  kable(col.names = c("Cohort", "Outcome theme", "Outcomes", "Example outcomes"))
Cohort Outcome theme Outcomes Example outcomes
Early childhood Communication 2 % who say their child is able to tell them what he/she wants; Has the NDIS helped increase your child’s ability to communicate what they want?
Early childhood Development and daily living 2 % with concerns in 6 or more of the areas: gross motor skills, fine motor skills, self-care, eating, social interaction, communication, cognitive development, sensory processing; Has the NDIS improved your child’s development?
Early childhood Relationships and community 5 % of children who can make friends with people outside the family; % of children who participate in age appropriate community, cultural or religious activities
Early childhood Service access 1 Has the NDIS improved your child’s access to specialist services?
School age Choice and control 1 % of children who have a genuine say in decisions about themselves
School age Development and daily living 3 % developing functional, learning and coping skills appropriate to their ability and circumstances; % who say their child is becoming more independent
School age Learning and work 2 % of children attending school in a mainstream class; Has the NDIS improved your child’s access to education?
School age Relationships and community 7 % of children who can make friends with people outside the family; % of children who spend time after school and on weekends with friends and/or in mainstream programs
Young people Choice and control 6 % who are happy with the level of independence/control they have now; % who choose who supports them
Young people Development and daily living 1 Has the NDIS helped you with daily living activities?
Young people Health and wellbeing 3 % who rate their health as good, very good or excellent; % who did not have any difficulties accessing health services
Young people Home and safety 3 % who are happy with their home; % who feel safe or very safe in their home
Young people Learning and work 5 % who currently attend or previously attended school in a mainstream class; % who have a paid job
Young people Relationships and community 4 % with no friends other than family or paid staff; % who have been actively involved in a community, cultural or religious group in the last 12 months
Adults Choice and control 5 % who choose who supports them; % who choose what they do each day
Adults Development and daily living 2 % who participate in education, training or skill development; Has the NDIS helped you with daily living activities?
Adults Health and wellbeing 3 % who rate their health as good, very good or excellent; % who did not have any difficulties accessing health services
Adults Home and safety 3 % who are happy with their home; % who feel safe or very safe in their home
Adults Learning and work 6 Of those who participate, % who do so in mainstream settings; % unable to do a course or training they wanted to do in the last 12 months
Adults Relationships and community 4 % with no friends other than family or paid staff; % who have been actively involved in a community, cultural or religious group in the last 12 months

The direction labels are deliberately conservative. Most percentage items are easier to read as higher is better, but some indicators are clearly negative: concerns in many areas, having no friends other than family or paid staff, or being unable to do a course or training the participant wanted to do.

Code
participant_outcome_map |>
  count(direction, sort = TRUE, name = "outcomes") |>
  kable(col.names = c("Direction label", "Outcome rows"))
Direction label Outcome rows
Higher is better 35
Reported improvement 25
Lower is better 4
Interpret with care 2
Lower may be better 2

Current Levels

The baseline file gives the latest national level for each participant indicator. This is the best starting point before asking whether anything changed.

Code
baseline_theme_summary <- participant_baseline |>
  group_by(cohort_label, outcome_theme) |>
  summarise(
    outcomes = n_distinct(indicator_description),
    median_level = safe_median(percentage),
    p25 = quantile(percentage, 0.25, na.rm = TRUE),
    p75 = quantile(percentage, 0.75, na.rm = TRUE),
    .groups = "drop"
  ) |>
  filter(is.finite(median_level))

baseline_theme_summary |>
  ggplot(aes(fct_reorder(outcome_theme, median_level), median_level)) +
  geom_col(fill = "#2f6f73") +
  geom_errorbar(aes(ymin = p25, ymax = p75), width = 0.2, colour = "grey35") +
  coord_flip() +
  facet_wrap(~ cohort_label, scales = "free_y") +
  scale_y_continuous(labels = percent) +
  labs(x = NULL, y = "Baseline percentage")

Median national baseline outcome level by participant cohort and outcome theme.
Code
participant_baseline |>
  arrange(cohort_label, outcome_theme, indicator_number) |>
  transmute(
    Cohort = as.character(cohort_label),
    Theme = outcome_theme,
    Outcome = indicator_description,
    Direction = direction,
    Level = percent(percentage, accuracy = 1)
  ) |>
  kable()
Cohort Theme Outcome Direction Level
Early childhood Communication % who say their child is able to tell them what he/she wants Higher is better 68%
Early childhood Development and daily living % with concerns in 6 or more of the areas: gross motor skills, fine motor skills, self-care, eating, social interaction, communication, cognitive development, sensory processing Lower is better 67%
Early childhood Relationships and community % of children who can make friends with people outside the family Higher is better 56%
Early childhood Relationships and community % of children who participate in age appropriate community, cultural or religious activities Higher is better 47%
Early childhood Relationships and community Of these, % who are welcomed or actively included Interpret with care 63%
School age Choice and control % of children who have a genuine say in decisions about themselves Higher is better 79%
School age Development and daily living % developing functional, learning and coping skills appropriate to their ability and circumstances Higher is better 24%
School age Development and daily living % who say their child is becoming more independent Higher is better 39%
School age Learning and work % of children attending school in a mainstream class Higher is better 78%
School age Relationships and community % of children who can make friends with people outside the family Higher is better 66%
School age Relationships and community % of children who spend time after school and on weekends with friends and/or in mainstream programs Higher is better 42%
School age Relationships and community Of these, % who are welcomed or actively included Interpret with care 74%
School age Relationships and community % of children who spend time with friends without an adult present Higher is better 13%
Young people Choice and control % who are happy with the level of independence/control they have now Higher is better 30%
Young people Choice and control % who choose who supports them Higher is better 41%
Young people Choice and control % who choose what they do each day Higher is better 51%
Young people Choice and control % who had been given the opportunity to participate in a self-advocacy group meeting Higher is better 19%
Young people Choice and control % who want more choice and control in their life Lower may be better 82%
Young people Health and wellbeing % who rate their health as good, very good or excellent Higher is better 64%
Young people Health and wellbeing % who did not have any difficulties accessing health services Higher is better 65%
Young people Home and safety % who are happy with their home Higher is better 78%
Young people Home and safety % who feel safe or very safe in their home Higher is better 84%
Young people Learning and work % who currently attend or previously attended school in a mainstream class Higher is better 46%
Young people Learning and work % who have a paid job Higher is better 18%
Young people Learning and work % who volunteer Higher is better 9%
Young people Relationships and community % with no friends other than family or paid staff Lower is better 33%
Young people Relationships and community % who have been actively involved in a community, cultural or religious group in the last 12 months Higher is better 28%
Adults Choice and control % who choose who supports them Higher is better 66%
Adults Choice and control % who choose what they do each day Higher is better 73%
Adults Choice and control % who had been given the opportunity to participate in a self-advocacy group meeting Higher is better 24%
Adults Choice and control % who want more choice and control in their life Lower may be better 78%
Adults Development and daily living % who participate in education, training or skill development Higher is better 9%
Adults Health and wellbeing % who rate their health as good, very good or excellent Higher is better 39%
Adults Health and wellbeing % who did not have any difficulties accessing health services Higher is better 59%
Adults Home and safety % who are happy with their home Higher is better 67%
Adults Home and safety % who feel safe or very safe in their home Higher is better 67%
Adults Learning and work Of those who participate, % who do so in mainstream settings Higher is better 69%
Adults Learning and work % unable to do a course or training they wanted to do in the last 12 months Lower is better 36%
Adults Learning and work % who have a paid job Higher is better 23%
Adults Learning and work % who volunteer Higher is better 10%
Adults Relationships and community % with no friends other than family or paid staff Lower is better 34%
Adults Relationships and community % who have been actively involved in a community, cultural or religious group in the last 12 months Higher is better 30%

At baseline, the adult indicators show some obvious gaps as well as strengths. For example, many adults report choice over daily decisions and supports, but paid work and volunteering are much lower-level outcomes. For children, the outcome set is different: it is more about development, communication, friendships, community inclusion and school.

Change After Reassessment

The cleanest first longitudinal comparison is baseline to reassessment 1 among national participant rows with one plan reassessment. This keeps the comparison simple and avoids mixing people with very different reassessment histories.

Code
participant_reassessment1 <- participant_longitudinal |>
  filter(number_of_plan_reassessments == 1) |>
  transmute(
    cohort_label,
    outcome_theme,
    indicator_number,
    indicator_description,
    direction,
    baseline = percentage_baseline,
    reassessment_1 = percentage_reassessment_1,
    raw_change = reassessment_1 - baseline,
    direction_adjusted_change = direction_adjust_change(raw_change, direction)
  )

comparable_reassessment1 <- participant_reassessment1 |>
  filter(is.finite(baseline), is.finite(reassessment_1), is.finite(direction_adjusted_change))
Code
reassessment1_summary <- comparable_reassessment1 |>
  group_by(cohort_label, outcome_theme) |>
  summarise(
    outcomes = n_distinct(indicator_description),
    median_change = safe_median(direction_adjusted_change),
    p25 = quantile(direction_adjusted_change, 0.25, na.rm = TRUE),
    p75 = quantile(direction_adjusted_change, 0.75, na.rm = TRUE),
    .groups = "drop"
  ) |>
  filter(is.finite(median_change))

reassessment1_summary |>
  ggplot(aes(fct_reorder(outcome_theme, median_change), median_change)) +
  geom_hline(yintercept = 0, colour = "grey60") +
  geom_col(fill = "#7a5c2e") +
  geom_errorbar(aes(ymin = p25, ymax = p75), width = 0.2, colour = "grey35") +
  coord_flip() +
  facet_wrap(~ cohort_label, scales = "free_y") +
  scale_y_continuous(labels = percent) +
  labs(x = NULL, y = "Direction-adjusted percentage-point change")

Median direction-adjusted change from baseline to reassessment 1.

Most of the comparable indicators move in a favourable direction after the first reassessment, but the size varies. The table below keeps the raw baseline and reassessment percentages visible, then adds a direction-adjusted change only where the direction is clear.

Code
comparable_reassessment1 |>
  mutate(abs_change = abs(direction_adjusted_change)) |>
  arrange(desc(abs_change)) |>
  slice_head(n = 25) |>
  transmute(
    Cohort = as.character(cohort_label),
    Theme = outcome_theme,
    Outcome = indicator_description,
    Direction = direction,
    Baseline = percent(baseline, accuracy = 1),
    `Reassessment 1` = percent(reassessment_1, accuracy = 1),
    `Raw change` = percent(raw_change, accuracy = 0.1),
    `Adjusted change` = percent(direction_adjusted_change, accuracy = 0.1)
  ) |>
  kable()
Cohort Theme Outcome Direction Baseline Reassessment 1 Raw change Adjusted change
Early childhood Communication % who say their child is able to tell them what he/she wants Higher is better 62% 77% 15.0% 15.0%
Early childhood Relationships and community % of children who can make friends with people outside the family Higher is better 49% 59% 10.0% 10.0%
Early childhood Development and daily living % with concerns in 6 or more of the areas: gross motor skills, fine motor skills, self-care, eating, social interaction, communication, cognitive development, sensory processing Lower is better 69% 76% 7.0% -7.0%
School age Development and daily living % who say their child is becoming more independent Higher is better 43% 49% 6.0% 6.0%
Young people Learning and work % who have a paid job Higher is better 15% 19% 4.0% 4.0%
School age Learning and work % of children attending school in a mainstream class Higher is better 81% 78% -3.0% -3.0%
Young people Choice and control % who are happy with the level of independence/control they have now Higher is better 29% 32% 3.0% 3.0%
Young people Choice and control % who choose who supports them Higher is better 36% 39% 3.0% 3.0%
Adults Relationships and community % who have been actively involved in a community, cultural or religious group in the last 12 months Higher is better 29% 32% 3.0% 3.0%
Young people Choice and control % who choose what they do each day Higher is better 46% 49% 3.0% 3.0%
Young people Relationships and community % who have been actively involved in a community, cultural or religious group in the last 12 months Higher is better 28% 31% 3.0% 3.0%
School age Relationships and community % of children who can make friends with people outside the family Higher is better 67% 70% 3.0% 3.0%
Young people Health and wellbeing % who did not have any difficulties accessing health services Higher is better 70% 72% 2.0% 2.0%
Adults Home and safety % who are happy with their home Higher is better 66% 68% 2.0% 2.0%
Adults Health and wellbeing % who did not have any difficulties accessing health services Higher is better 59% 61% 2.0% 2.0%
Adults Learning and work % unable to do a course or training they wanted to do in the last 12 months Lower is better 37% 35% -2.0% 2.0%
Early childhood Relationships and community % of children who participate in age appropriate community, cultural or religious activities Higher is better 45% 47% 2.0% 2.0%
School age Development and daily living % developing functional, learning and coping skills appropriate to their ability and circumstances Higher is better 28% 30% 2.0% 2.0%
School age Choice and control % of children who have a genuine say in decisions about themselves Higher is better 79% 80% 1.0% 1.0%
School age Relationships and community % of children who spend time after school and on weekends with friends and/or in mainstream programs Higher is better 38% 39% 1.0% 1.0%
Young people Relationships and community % with no friends other than family or paid staff Lower is better 34% 33% -1.0% 1.0%
Young people Health and wellbeing % who rate their health as good, very good or excellent Higher is better 67% 66% -1.0% -1.0%
Young people Learning and work % who currently attend or previously attended school in a mainstream class Higher is better 46% 45% -1.0% -1.0%
Adults Choice and control % who choose what they do each day Higher is better 74% 75% 1.0% 1.0%
Adults Home and safety % who feel safe or very safe in their home Higher is better 64% 65% 1.0% 1.0%

Some longitudinal items ask directly whether the NDIS helped or improved something. These do not have a meaningful baseline percentage, so they are better read as reassessment-level responses rather than baseline-to-reassessment changes.

Code
direct_improvement_items <- participant_reassessment1 |>
  filter(is.na(baseline), is.finite(reassessment_1), direction == "Reported improvement") |>
  arrange(cohort_label, outcome_theme, indicator_number)

direct_improvement_items |>
  transmute(
    Cohort = as.character(cohort_label),
    Theme = outcome_theme,
    Outcome = indicator_description,
    `Reported improvement at reassessment 1` = percent(reassessment_1, accuracy = 1)
  ) |>
  kable()
Cohort Theme Outcome Reported improvement at reassessment 1
Early childhood Communication Has the NDIS helped increase your child’s ability to communicate what they want? 85%
Early childhood Development and daily living Has the NDIS improved your child’s development? 92%
Early childhood Relationships and community Has the NDIS improved how your child fits into family life? 84%
Early childhood Relationships and community Has the NDIS improved how your child fits into community life? 71%
Early childhood Service access Has the NDIS improved your child’s access to specialist services? 93%
School age Development and daily living Has the NDIS helped your child to become more independent? 72%
School age Learning and work Has the NDIS improved your child’s access to education? 53%
School age Relationships and community Has the NDIS improved your child’s relationships with family and friends? 63%
School age Relationships and community Has the NDIS improved your child’s social and recreational life? 57%
Young people Choice and control Has the NDIS helped you have more choices and more control over your life? 69%
Young people Development and daily living Has the NDIS helped you with daily living activities? 66%
Young people Health and wellbeing Has your involvement with the NDIS improved your health and wellbeing? 52%
Young people Home and safety Has your involvement with the NDIS helped you to choose a home that’s right for you? 27%
Young people Learning and work Has your involvement with the NDIS helped you to learn things you want to learn or to take courses you want to take? 39%
Young people Learning and work Has your involvement with the NDIS helped you find a job that’s right for you? 23%
Young people Relationships and community Has the NDIS helped you to meet more people? 50%
Young people Relationships and community Has the NDIS helped you be more involved? 58%
Adults Choice and control Has the NDIS helped you have more choices and more control over your life? 78%
Adults Development and daily living Has the NDIS helped you with daily living activities? 80%
Adults Health and wellbeing Has your involvement with the NDIS improved your health and wellbeing? 62%
Adults Home and safety Has your involvement with the NDIS helped you to choose a home that’s right for you? 36%
Adults Learning and work Has your involvement with the NDIS helped you to learn things you want to learn or to take courses you want to take? 33%
Adults Learning and work Has your involvement with the NDIS helped you find a job that’s right for you? 21%
Adults Relationships and community Has the NDIS helped you to meet more people? 57%
Adults Relationships and community Has the NDIS helped you be more involved? 65%

Later Reassessments

The longitudinal file also includes reassessment 2 and later columns. Those are useful as a rough trend, but they should be read carefully: later reassessment rows are not a clean participant-level panel in this public extract, and the mix of participants changes as reassessment history gets longer.

Code
reassessment_cols <- names(participant_longitudinal) |>
  keep(\(nm) str_detect(nm, "^percentage_reassessment_"))

participant_trend <- participant_longitudinal |>
  filter(
    is.finite(percentage_baseline),
    direction %in% c("Higher is better", "Lower is better")
  ) |>
  pivot_longer(
    all_of(reassessment_cols),
    names_to = "reassessment",
    values_to = "reassessment_value"
  ) |>
  mutate(
    reassessment_number = as.integer(str_extract(reassessment, "[0-9]+")),
    raw_change = reassessment_value - percentage_baseline,
    direction_adjusted_change = direction_adjust_change(raw_change, direction)
  ) |>
  filter(
    reassessment_number <= number_of_plan_reassessments,
    reassessment_number <= 7,
    is.finite(direction_adjusted_change)
  )

trend_summary <- participant_trend |>
  group_by(reassessment_number) |>
  summarise(
    rows = n(),
    outcome_cohort_pairs = n_distinct(str_c(cohort_label, indicator_number, sep = "::")),
    median_change = safe_median(direction_adjusted_change),
    p25 = quantile(direction_adjusted_change, 0.25, na.rm = TRUE),
    p75 = quantile(direction_adjusted_change, 0.75, na.rm = TRUE),
    .groups = "drop"
  ) |>
  filter(rows >= 20)

if (nrow(trend_summary) > 0) {
  trend_summary |>
    ggplot(aes(reassessment_number, median_change)) +
    geom_hline(yintercept = 0, colour = "grey60") +
    geom_ribbon(aes(ymin = p25, ymax = p75), fill = "#b7c7a3", alpha = 0.45) +
    geom_line(colour = "#395f3b", linewidth = 0.8) +
    geom_point(colour = "#395f3b", size = 2) +
    scale_x_continuous(breaks = trend_summary$reassessment_number) +
    scale_y_continuous(labels = percent) +
    labs(x = "Reassessment number", y = "Direction-adjusted change from baseline")
} else {
  tibble(note = "There are not enough later reassessment rows to draw a stable trend.") |>
    kable()
}

Median direction-adjusted change by reassessment number.
Code
trend_summary |>
  transmute(
    Reassessment = reassessment_number,
    Rows = comma(rows),
    `Outcome/cohort pairs` = outcome_cohort_pairs,
    `Median adjusted change` = percent(median_change, accuracy = 0.1),
    `25th percentile` = percent(p25, accuracy = 0.1),
    `75th percentile` = percent(p75, accuracy = 0.1)
  ) |>
  kable()
Reassessment Rows Outcome/cohort pairs Median adjusted change 25th percentile 75th percentile
1 326 39 0.0% -1.0% 2.0%
2 287 39 0.0% -2.0% 2.0%
3 248 39 0.0% -2.0% 4.0%
4 197 39 0.0% -3.0% 4.0%
5 156 39 0.0% -3.0% 4.3%
6 118 35 1.0% -3.0% 6.8%
7 83 35 1.0% -2.5% 6.5%

The later-reassessment pattern is best read as directional context, not as a precise individual trajectory. Still, it helps separate the first question from the bigger spend question: the public data does show reported outcome movement after entry, even before we try to link those changes to budgets, service markets or regional access.

Family And Carer Note

Family and carer outcomes are part of the public outcomes files, but they answer a different question. They are about the circumstances of the family or carer around the participant, not the participant’s own outcome level. For this reason, they sit beside the participant story rather than inside it.

Code
family_reassessment1 <- family_longitudinal |>
  filter(number_of_plan_reassessments == 1) |>
  transmute(
    cohort_label,
    outcome_theme,
    indicator_description,
    direction,
    baseline = percentage_baseline,
    reassessment_1 = percentage_reassessment_1,
    raw_change = reassessment_1 - baseline,
    direction_adjusted_change = direction_adjust_change(raw_change, direction)
  )

family_summary <- family_reassessment1 |>
  group_by(cohort_label) |>
  summarise(
    comparable_outcomes = sum(is.finite(direction_adjusted_change)),
    median_adjusted_change = safe_median(direction_adjusted_change),
    direct_improvement_items = sum(is.na(baseline) & is.finite(reassessment_1)),
    median_direct_improvement = safe_median(reassessment_1[is.na(baseline) & is.finite(reassessment_1)]),
    .groups = "drop"
  )

family_summary |>
  transmute(
    Cohort = as.character(cohort_label),
    `Comparable outcomes` = comparable_outcomes,
    `Median adjusted change` = format_optional_percent(median_adjusted_change, accuracy = 0.1),
    `Direct improvement items` = direct_improvement_items,
    `Median direct improvement response` = format_optional_percent(median_direct_improvement, accuracy = 1)
  ) |>
  kable()
Cohort Comparable outcomes Median adjusted change Direct improvement items Median direct improvement response
Family/carer of children 12 2.0% 5 78%
Family/carer of adults 12 1.0% 4 61%

The family and carer rows are useful, especially for questions about informal care, work, confidence, health and service access. They should not be blended with participant rows when the main question is whether participant outcomes themselves changed.

Caveats

  • These are aggregate public survey rows, not participant-level records.
  • The reassessment comparisons are descriptive. They do not prove causation.
  • Later reassessment rows may reflect a different participant mix from earlier reassessment rows.
  • Direction-adjusting outcomes helps readability, but it does not make all indicators equally important.
  • Some items ask whether the NDIS helped or improved something. Those are reassessment responses, not true baseline-to-change measures.
  • Spend, provider access and regional service-market questions are deliberately left out of this simplified version.