Welcome To STEM MA Quantitative methods in Educational Research Blog 2025

news
Author

Richard Brock and Peter Kemp

Published

October 22, 2024

Welcome to the 2025 STEM MA Quantitative methods in Educational Research Blog. Following the success of the blog last year we will continue to use the blog to publish student work from the MA module Quantitative methods in Educational Research. You can see the course book here MASTEMR

An example: Food poverty and achievement in PISA 2022 data

An item on the PISA 2022 survey (ST258Q01JA) asked respondents: “In the past 30 days, how often did you not eat because there was not enough money to buy food?” giving the following response options:

  • “Never or almost never”
  • “About once a week”
  • “2 to 3 times a week”
  • “4 to 5 times a week”
  • “Every day or almost every day”
  • (“Valid Skip” / “Not Applicable” / “Invalid” / “No Response”)

The missing responses were removed and the number of responses in the other categories counted and plotted by country.

PISA_2022_food_poverty  <- PISA_2022 %>%
  select(ST258Q01JA, CNT) %>%
  filter(!is.na(ST258Q01JA))

never_counts <- PISA_2022_food_poverty %>%
  group_by(CNT, ST258Q01JA) %>%
  summarise(n = n()) %>%
  mutate(prop_never = n / sum(n)) %>%
  filter(ST258Q01JA == "Never or almost never") %>%
  select(CNT, prop_never) 

plot_data <- PISA_2022_food_poverty %>% 
  group_by(CNT, ST258Q01JA) %>% 
  summarise(n = n()) %>% 
  mutate(prop = n / sum(n)) %>%
  left_join(never_counts, by = "CNT") %>%
  mutate(CNT = factor(CNT, levels = never_counts$CNT[order(-never_counts$prop_never)])) %>%
  filter(!is.na(CNT))


ggplot(plot_data, aes(x = CNT, y = prop, fill = ST258Q01JA)) +
  geom_bar(stat = "identity") +
  labs(x = "Country", y = "Proportion", fill = "Frequency") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 7)) +
  scale_fill_brewer(palette = "Reds") +
  theme(legend.position = "top", legend.text = element_text(size = 6))

The mean achievement score (across reading, science and mathematics) was calculated for each country and a mean food poverty score created (Where, “Never or almost never” ~ 0, “About once a week” ~ 1, …. “Every day or almost every day” ~ 4). The relationship between the mean food poverty score and the mean achievement score was then plotted by country.

PISA_2022_food_poverty <- PISA_2022 %>%
  select(ST258Q01JA, PV1SCIE, PV1MATH, PV1READ, CNT) %>%
  filter(!is.na(ST258Q01JA)) %>%
  mutate(pv_overall = (PV1SCIE + PV1MATH + PV1READ) / 3) %>%
  mutate(food_poverty = case_when(
    ST258Q01JA == "Never or almost never" ~ 0,
    ST258Q01JA == "About once a week" ~     1,
    ST258Q01JA == "2 to 3 times a week" ~   2,
    ST258Q01JA == "4 to 5 times a week" ~   3,
    ST258Q01JA == "Every day or almost every day" ~ 4,
    .default = NA
  )) %>%
  group_by(CNT) %>%
  summarise(mean_pv_overall = mean(pv_overall), mean_food_poverty = mean(food_poverty))

ggplot(PISA_2022_food_poverty, aes(y = mean_pv_overall, x = mean_food_poverty, colour = mean_food_poverty)) +
  geom_point() +
  geom_text_repel(aes(label = CNT), size = 2) +
  labs(title = "Mean Food Poverty vs Overal PISA 2022 score", y = "PISA Overall Score", x = "Food Poverty") +
  theme_minimal() +
  theme(legend.position = "none")

The plot shows a broadly negative relationship between food poverty and achievement score, with countries with higher food poverty scores having lower achievement scores. The plot also shows that there is a wide range of achievement scores for countries with the same food poverty score, suggesting that other factors are also important in determining achievement scores.