Introduction

Predictive language comprehension - our ability to anticipate upcoming words based on context - is influenced by both cognitive and emotional factors. And, let’s be real - stress is stressful. So, this data set investigates how positive versus negative moods impact predictive language comprehension, generation, and verification.

How Did They Collect This Data?

Thirty-six participants were (A) induced into either a positive or negative mood via pre-selected film clips (participants were also surveyed on their mental state before and after the study); (B) shown a set of three non-verbal pictures with either a low, medium, or high constraint, where a higher constraint pointed towards a more specific semantic context; and (C) shown a word that either matched their semantic prediction or was an intentional mismatch.

The idea behind this multi-step experiment was to examine each participant’s N400 amplitude during Part B (context building); Stimulus Preceding Negativity, or “SPN”, amplitude between Parts B and C (prediction generation); and Late Frontal Positivity, or “LFP”, amplitude after Part C (prediction verification).

What Questions Does This Report Ask?

Research questions analyzed in this report:

  • Does the response time and accuracy of predictive language comprehension differ between positive and negative mood states?

  • How much brain power (N400) do different constraint levels require when in a bad mood vs. a good mood?

  • Does a positive (vs. negative) mood increase the average accuracy of predictive language comprehension across low-, medium-, and high-context constraints?

# Add libraries
library(tidyverse)
library(dplyr)
library(ggplot2)
library(readr)
library(scales)

# Name data set
# Separate pos and neg moods
# Make ACC categorical
dataset <- read_csv("PreMo_beh1.csv", show_col_types = FALSE) %>%
  group_by(mood) %>%
  mutate(ACC_mutated = case_when(
    ACC < 1 ~ "Incorrect",
    TRUE ~ "Correct"))

# Repeat setup for second research question
# Except I'm opening a new datafile even though it's from the same dataset
# They were all in a .zip
NEWNEWdataset <- read_csv("PreMo_post_N4.csv", show_col_types = FALSE) %>%
  group_by(type, chan, time, mood) %>%
  summarise(mean_amp = mean(amp, na.rm = TRUE))

# Repeat setup for third research question
dataset2 <- read_csv("PreMo_beh1.csv", show_col_types = FALSE) %>%
  group_by(mood, type) %>%
  summarise(
    mean_RT = mean(RT),
    se = sd(RT) / sqrt(n()),
    .groups = "drop")

1 - Comparing Response Accuracy Accross Response Times

Does the response time and accuracy of predictive language comprehension differ between positive and negative mood states? This question is examined in three violin visualizations: in Figure 1.1, this question is applied to only participants stimulated into a positive mood; in Figure 1.2, participants in a negative mood are graphed; and, in Figure 1.3, both the positive and negative state graphs are overlayed in order to compare findings. The variables graphed are the average time (in milliseconds) it took participants to respond with a semantically-related word after the third image’s reveal, the accuracy of the participant’s predicted word for the set (correct or incorrect), and the mood participants were induced into (positive or negative).

Figure 1.1 - Positive Mood

# Plot
dataPosACCvsRT <- dataset %>%
  filter(mood != "negative") %>%
  ggplot(aes(x = RT, y = ACC_mutated)) +
  geom_violin(na.rm = TRUE, fill = "cyan") +
  geom_boxplot(width = 0.1, na.rm = TRUE, fill = "cyan", outlier.size = 0.1) +
  stat_summary(fun = mean, geom = "point", shape = 24, size = 2, fill = "darkblue",
               aes(shape = "=  Mean Response Time", color = "=  Mean Response Time")) +
  scale_shape_manual(
    name = "Legend",
    values = c("=  Mean Response Time" = 24)) +
  scale_color_manual(
    name = "Legend",
    values = c("=  Mean Response Time" = "darkblue")) +
  labs(
    title = "Fig.1.1 Accuracy by Response Time in Positive Mood Participants",
    x = "Response Time (milliseconds)",
    y = "Response Accuracy") +
  scale_x_continuous(
    breaks = seq(
      from = min(dataset$RT, na.rm = TRUE),
      to = max(dataset$RT, na.rm = TRUE),
      by = 200),
    labels = label_number(suffix = " ms")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold"),
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10),
    legend.position = "right")
dataPosACCvsRT

Figure 1.2 - Negative Mood

# Plot
dataNegACCvsRT <- dataset %>%
  filter(mood != "positive") %>%
  ggplot(aes(x = RT, y = ACC_mutated)) +
  geom_violin(na.rm = TRUE, fill = "yellow") +
  geom_boxplot(width = 0.1, na.rm = TRUE, fill = "yellow", outlier.size = 0.1) +
  stat_summary(fun = mean, geom = "point", shape = 24, size = 2, fill = "darkblue",
               aes(shape = "=  Mean Response Time", color = "=  Mean Response Time")) +
  scale_shape_manual(
    name = "Legend",
    values = c("=  Mean Response Time" = 24)) +
  scale_color_manual(
    name = "Legend",
    values = c("=  Mean Response Time" = "darkblue")) +
  labs(
    title = "Fig.1.2 Accuracy by Response Time in Negative Mood Participants",
    x = "Response Time (milliseconds)",
    y = "Response Accuracy") +
  scale_x_continuous(
    breaks = seq(
      from = min(dataset$RT, na.rm = TRUE),
      to = max(dataset$RT, na.rm = TRUE),
      by = 200),
    labels = label_number(suffix = " ms")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold"),
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10),
    legend.position = "right")
dataNegACCvsRT

Figure 1.3 - Comparing Positive vs. Negative Mood Visualizations

# Redefine ggplots into data frames
dataPosACCvsRT <- dataset %>%
  filter(mood != "negative")
dataNegACCvsRT <- dataset %>%
  filter(mood != "positive")

# Overlay both plots for clarity
dataOverlayACCvsRT <- ggplot(data = as.data.frame(dataPosACCvsRT),
                             aes(x = RT, y = ACC_mutated, fill = mood, linetype = mood, color = mood)) +
  geom_violin(alpha = 0.8, na.rm = TRUE) +
  geom_violin(data = as.data.frame(dataNegACCvsRT), alpha = 0.6, na.rm = TRUE) +
  geom_boxplot(alpha = 0.8, width = 0.1, na.rm = TRUE, outlier.size = 0.1) +
  geom_boxplot(data = as.data.frame(dataNegACCvsRT), alpha = 0.6, width = 0.1, na.rm = TRUE, outlier.size = 0.1) +
  labs(
    title = "Fig.1.3 Accuracy by Response Time in Positive vs. Negative Mood States",
    x = "Response Time (milliseconds)",
    y = "Response Accuracy",
    fill = "Mood State",
    linetype = "Mood State",
    color = "Mood State") +
  scale_fill_manual(values = c("positive" = "cyan", "negative" = "yellow")) +
  scale_linetype_manual(values = c("positive" = "dashed", "negative" = "solid")) +
  scale_color_manual(values = c("positive" = "blue", "negative" = "black")) +
  scale_x_continuous(
    breaks = seq(
      from = min(dataPosACCvsRT$RT, na.rm = TRUE),
      to = max(dataPosACCvsRT$RT, na.rm = TRUE),
      by = 200),
    labels = scales::label_number(suffix = " ms")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.title = element_text(face = "bold"),
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10),
    legend.position = "right")
dataOverlayACCvsRT

Figures 1.1, 1.2, and 1.3 may suggest that participants induced into positive moods produce slightly quicker response times, but the amount of overlap within the inner-quantile ranges also point to coincidence. The accuracy of semantically related one-word responses to the image sets appears to be high in both mood states. One might say that these violins provide preliminary evidence that mood may influence response speed and variability in predictive language comprehension, with participants in positive moods leaning toward slightly faster and more consistent responses. Though, most differences are minimal in Figures 1.1 and 1.2.

Figure 2 - Comparing Amplitude Over Time

How much brain power (N400) do different constraint levels require when in a bad mood vs a good mood? This question is examined in Figure 2 through a line graph visualization and four different variables at once: the time (in milliseconds) since the reveal of the third image in the sequence, mean centro-parietal amplitude (µV), mood induced into previously before study, and semantic contextual constraint level of image sets.

# Plot
dataPostN4 <- NEWNEWdataset %>%
  ggplot(aes(x = time, y = mean_amp)) +
  geom_line(aes(color = type), alpha = 0.5) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
  geom_vline(xintercept = 300, linetype = "solid", alpha = 0.5, color = "gray50") +
  geom_vline(xintercept = 500, linetype = "solid", alpha = 0.5, color = "gray50") +
  facet_wrap(~ mood, labeller = as_labeller(c(
    positive = "Positive Mood",
    negative = "Negative Mood")),
    nrow = 1) +
  labs(
    title = "Fig.2 Mean Centro-Parietal Over Time in Different Mood States",
    x = "Time (milliseconds)",
    y = "Mean Amplitude (µV)",
    color = "Context Constraint Level") +
  scale_color_manual(breaks = c("LC", "MC", "HC"),
                     labels = c("LC" = "Low Constraint", "MC" = "Medium Constraint", "HC" = "High Constraint"),
                     values = c("LC" = "magenta", "MC" = "gold", "HC" = "cyan")) +
  scale_x_continuous(
  breaks = seq(-200, 800, by = 200),
  labels = scales::label_number()) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(hjust = 1),
    axis.title = element_text(face = "bold"),
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10),
    legend.position = "right",
    panel.grid.minor = element_blank())
dataPostN4

Figure 2 shows the most variation out of any of the visuals presented in this report; the negative-mood chart hits the lowest point and the positive-mood chart reaches the highest point. The two grey lines on the x-intercept show the range (300-500 ms) where the researchers behind this data set know contextual building is occurring, hence the 400 in N400. Additionally, the dashed line across the y-intercept indicates that the more negative the mean amplitude is, then the greater a participant’s semantic processing difficulty will be. It can clearly be seen that there is more semantic processing difficulty in participants induced into negative moods, especially between 300 and 500 milliseconds when the contextual building blocks are being put into place for this test. The mean amplitude also tells us that processing semantic contexts was harder for the participants who were given images with a vague theme (low constraint); this appears to be why the pink line is so prominent on the bottom of the negative mood chart.

Figure 3 - Comparing Average Response Time and Context Constraint Levels

Does a positive (vs. negative) mood increase the average accuracy of predictive language comprehension across low-, medium-, and high-context constraints? This question is examined in Figure 3 through a scatter plot visualization. The variables graphed are the average time (in milliseconds) it took participants to respond with a semantically-related word after the third image’s reveal, the contextual constraint level of the image sets, and the mood participants were induced into.

# Plot
data2_RTvsConstraint <- dataset2 %>%
  mutate(type_reordered = factor(type, levels = c("LC", "MC", "HC"))) %>%
  ggplot(aes(x = type_reordered, y = mean_RT, color = type_reordered)) +
  geom_point(size = 3, shape = 21, fill = "white", stroke = 1.2) +
  geom_errorbar(
    aes(ymin = mean_RT - se, ymax = mean_RT + se, color = type_reordered),
    width = 0.15,
    linewidth = 0.8) +
  facet_wrap(~ mood, labeller = as_labeller(c(
  "positive" = "Positive Mood",
  "negative" = "Negative Mood"))) +
  scale_y_continuous(
    limits = c(300, 400),
    breaks = seq(300, 400, 25)) +
  scale_color_manual(
    labels = c("LC" = "Low Constraint", "MC" = "Medium Constraint", "HC" = "High Constraint"),
    values = c(
      "LC" = "magenta",
      "MC" = "gold",
      "HC" = "cyan")) +
  scale_x_discrete(
  labels = c(
    "LC" = "Low Constraint",
    "MC" = "Medium Constraint",
    "HC" = "High Constraint")) +
  labs(
    title = "Fig.3 Mean Response Time by Constraint in Different Mood States",
    x = "Context Constraint Level",
    y = "Mean Response Time (ms)",
    color = "Context Constraint Levels") +
  theme_minimal(base_size = 13) +
  theme(
    axis.text.x = element_text(angle = 17, hjust = 1),
    axis.title = element_text(face = "bold"),
    axis.title.x = element_text(vjust = -1.9),
    plot.title = element_text(face = "bold", hjust = 1),
    legend.position = "right",
    strip.text = element_text(face = "bold"),
    panel.grid.minor = element_blank())
data2_RTvsConstraint

The scatter plot in Figure 3 shows little-to-no variation between negative and positive mood responses in both low-context constraints and high-context constraints. However, positive moods do correlate to slightly faster response times in medium-context constraint situations. When looking at the box plots of mean response times across medium-level semantic constraints, the lower-quantile range for negative moods and the upper-quantile range for positive moods do overlap; therefore, some coincidence must be observed.

Even though predictive language comprehension, specifically response time, may not correlate to mood in this scatter plot, Figure 3 can answer a new question: is it quicker to predict and comprehend language when richer semantic context is provided? According to Figure 3, yes! And, there is little-to-no likelihood of coincidence.

6 - Works Cited

Naranowicz, M., Dr., & Krzysik, I. (2025, October 21). Positive vibes, predictive minds: Positive mood fuels predictive language comprehension in rich semantic contexts. https://doi.org/10.17605/OSF.IO/K7X8E