Semantic Learning Task

Data Manipulations

# Load data (1 data frame)
slid_data <- read.csv(here("Semantic Learning & ID Data","Semantic Learning & ID Data","Semantic learning and identification data.csv"),stringsAsFactors=TRUE) # sentence length data

slid_data %<>%
  mutate(Participant.ID = factor(Participant.ID), 
         Group = factor(Child.or.adult), 
         SL.Meaning.Condition = factor(SL.Meaning.Condition), 
         SL.Correct.Response = factor(SL.Correct.Response),
         SL.Triplet.Number = as.numeric(SL.Triplet.Number),
         SL.Trial.Order.by.Task = as.numeric(SL.Trial.Order.by.Task),
         SL.Response = factor(SL.Response),
         SL.Response.Type = factor(SL.Response.Type),
         SL.Correct.Based.on.Only.SL. = as.numeric(SL.Correct.Based.on.Only.SL.),
         SL.Correct.Enough.for.IT. = as.numeric(SL.Correct.Enough.for.IT.),
         IT.Trial.Number = as.numeric(IT.Trial.Number),
         IT.Trial.Order.by.Task = as.numeric(IT.Trial.Order.by.Task),
         IT.Correct.Response = as.numeric(IT.Correct.Response),
         IT.Response = as.numeric(IT.Response),
         IT.Correct. = as.numeric(IT.Correct.),
         Exclude. = as.numeric(Exclude.),
         SL.Nonword = factor(SL.Nonword),
         SL.meaning.cond.c = as.numeric(SL.Meaning.Condition) - 1.5)
str(slid_data)
## 'data.frame':    4680 obs. of  36 variables:
##  $ Participant.ID                   : Factor w/ 156 levels "049b2dc2","070821_1f_10",..: 113 143 47 93 51 131 128 155 152 145 ...
##  $ Child.or.adult                   : Factor w/ 2 levels "A","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.block.or.condition            : Factor w/ 31 levels "apple_block",..: 25 25 25 25 25 25 25 25 25 25 ...
##  $ Task                             : Factor w/ 1 level "SL": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.Triplet.Number                : num  30 30 30 30 16 16 16 18 18 18 ...
##  $ SL.Trial.Order.by.Task           : num  4 22 24 27 3 11 19 4 8 13 ...
##  $ SL.Meaning.Condition             : Factor w/ 2 levels "M-","M+": 2 2 2 2 2 2 2 2 2 2 ...
##  $ SL.Nonword                       : Factor w/ 31 levels "bov","chaws",..: 21 21 21 21 18 18 18 15 15 15 ...
##  $ SL.Correct.Response              : Factor w/ 17 levels "apple","bed",..: 1 1 1 1 4 4 4 3 3 3 ...
##  $ SL.Response                      : Factor w/ 263 levels ""," ","  nice",..: 7 163 7 7 175 97 208 20 106 20 ...
##  $ SL.Response.Category             : Factor w/ 3 levels "correct word",..: 1 3 1 1 2 2 3 1 2 1 ...
##  $ SL.Correct.Based.on.Only.SL.     : num  1 1 1 1 0 0 0 1 0 1 ...
##  $ SL.Correct.Enough.for.IT.        : num  1 0 1 1 0 0 0 1 0 1 ...
##  $ SL.Response.Type                 : Factor w/ 6 levels "correct response (no meaning)",..: 2 6 2 2 4 4 6 2 4 2 ...
##  $ IT.Block                         : Factor w/ 31 levels "ID_apple","ID_bed",..: 31 31 31 31 31 31 31 31 31 31 ...
##  $ IT.Trial.Type                    : Factor w/ 30 levels "recog1","recog10",..: 1 1 1 1 12 12 12 23 23 23 ...
##  $ Task.1                           : Factor w/ 1 level "IT": 1 1 1 1 1 1 1 1 1 1 ...
##  $ IT.Trial.Number                  : num  1 1 1 1 2 2 2 3 3 3 ...
##  $ IT.Trial.Order.by.Task           : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ IT.Meaning.Condition             : Factor w/ 2 levels "M-","M+": 2 2 2 2 2 2 2 2 2 2 ...
##  $ IT.Nonword                       : Factor w/ 30 levels "bov","chaws",..: 20 20 20 20 17 17 17 15 15 15 ...
##  $ IT.Correct.Response              : num  1 1 1 1 3 3 3 2 2 2 ...
##  $ IT.Response                      : num  3 3 1 5 1 5 4 1 5 3 ...
##  $ IT.Correct.                      : num  0 0 1 0 0 0 0 0 0 0 ...
##  $ IT.Response.Type                 : Factor w/ 11 levels "#N/A","correct response (M+ target word)",..: 4 4 2 9 4 9 10 11 9 10 ...
##  $ Semantic.vs.Other                : Factor w/ 3 levels "#N/A","other foil",..: 2 2 NA NA 2 NA 3 2 NA 3 ...
##  $ Familiar.vs.Unrelated            : Factor w/ 3 levels "#N/A","familiar foil",..: 2 2 NA NA 2 NA NA 3 NA NA ...
##  $ Language.Status                  : Factor w/ 8 levels "","bilingual (English, Chinese)",..: 7 7 7 7 7 6 2 7 7 5 ...
##  $ Exclude.                         : num  0 0 0 1 1 0 0 0 0 0 ...
##  $ Exclusion.Reason                 : Factor w/ 18 levels "","Completed portion of SL task before restarting and completing whole study",..: 1 1 1 12 4 1 1 1 1 1 ...
##  $ Age                              : num  26 24 26 29 25 27 25 25 28 24 ...
##  $ Gender                           : Factor w/ 6 levels "","3","5","female",..: 4 5 4 5 5 4 4 5 5 5 ...
##  $ Highest.Completed.Education.Level: Factor w/ 8 levels "","associate's degree",..: 7 2 2 2 4 3 3 5 5 7 ...
##  $ Highest.Degree.Earned            : Factor w/ 24 levels "","B.A","B.A.",..: 1 1 1 1 20 2 3 15 15 1 ...
##  $ Group                            : Factor w/ 2 levels "A","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.meaning.cond.c                : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
# Create some data subsets
incl_slid_data <- subset(slid_data, Exclude. != 1 & !grepl("bilingual", Language.Status, ignore.case = TRUE)) # only included, monolingual participants
incl_slid_data %<>%
  mutate(Age = as.numeric(Age),
         age.c = as.numeric(scale(Age, center = TRUE, scale = FALSE)),
         Gender = factor(Gender),
         gender.c = as.numeric(Gender) - 1.5)
str(incl_slid_data)
## 'data.frame':    3150 obs. of  38 variables:
##  $ Participant.ID                   : Factor w/ 156 levels "049b2dc2","070821_1f_10",..: 113 143 47 155 152 153 140 81 114 57 ...
##  $ Child.or.adult                   : Factor w/ 2 levels "A","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.block.or.condition            : Factor w/ 31 levels "apple_block",..: 25 25 25 25 25 25 25 25 25 25 ...
##  $ Task                             : Factor w/ 1 level "SL": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.Triplet.Number                : num  30 30 30 18 18 17 19 19 19 20 ...
##  $ SL.Trial.Order.by.Task           : num  4 22 24 4 8 11 3 13 24 21 ...
##  $ SL.Meaning.Condition             : Factor w/ 2 levels "M-","M+": 2 2 2 2 2 2 2 2 2 2 ...
##  $ SL.Nonword                       : Factor w/ 31 levels "bov","chaws",..: 21 21 21 15 15 6 16 16 16 14 ...
##  $ SL.Correct.Response              : Factor w/ 17 levels "apple","bed",..: 1 1 1 3 3 14 17 17 17 15 ...
##  $ SL.Response                      : Factor w/ 263 levels ""," ","  nice",..: 7 163 7 20 106 221 225 251 225 243 ...
##  $ SL.Response.Category             : Factor w/ 3 levels "correct word",..: 1 3 1 1 2 1 1 1 1 1 ...
##  $ SL.Correct.Based.on.Only.SL.     : num  1 1 1 1 0 1 1 1 1 1 ...
##  $ SL.Correct.Enough.for.IT.        : num  1 0 1 1 0 1 1 1 1 1 ...
##  $ SL.Response.Type                 : Factor w/ 6 levels "correct response (no meaning)",..: 2 6 2 2 4 2 2 2 2 2 ...
##  $ IT.Block                         : Factor w/ 31 levels "ID_apple","ID_bed",..: 31 31 31 31 31 31 31 31 31 31 ...
##  $ IT.Trial.Type                    : Factor w/ 30 levels "recog1","recog10",..: 1 1 1 23 23 25 26 26 26 27 ...
##  $ Task.1                           : Factor w/ 1 level "IT": 1 1 1 1 1 1 1 1 1 1 ...
##  $ IT.Trial.Number                  : num  1 1 1 3 3 4 5 5 5 6 ...
##  $ IT.Trial.Order.by.Task           : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ IT.Meaning.Condition             : Factor w/ 2 levels "M-","M+": 2 2 2 2 2 2 2 2 2 2 ...
##  $ IT.Nonword                       : Factor w/ 30 levels "bov","chaws",..: 20 20 20 15 15 6 16 16 16 14 ...
##  $ IT.Correct.Response              : num  1 1 1 2 2 4 1 1 1 2 ...
##  $ IT.Response                      : num  3 3 1 1 5 4 1 1 1 2 ...
##  $ IT.Correct.                      : num  0 0 1 0 0 1 1 1 1 1 ...
##  $ IT.Response.Type                 : Factor w/ 11 levels "#N/A","correct response (M+ target word)",..: 4 4 2 11 9 2 2 2 2 2 ...
##  $ Semantic.vs.Other                : Factor w/ 3 levels "#N/A","other foil",..: 2 2 NA 2 NA NA NA NA NA NA ...
##  $ Familiar.vs.Unrelated            : Factor w/ 3 levels "#N/A","familiar foil",..: 2 2 NA 3 NA NA NA NA NA NA ...
##  $ Language.Status                  : Factor w/ 8 levels "","bilingual (English, Chinese)",..: 7 7 7 7 7 7 7 7 7 7 ...
##  $ Exclude.                         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Exclusion.Reason                 : Factor w/ 18 levels "","Completed portion of SL task before restarting and completing whole study",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Age                              : num  26 24 26 25 28 23 25 24 25 27 ...
##  $ Gender                           : Factor w/ 2 levels "female","male": 1 2 1 2 2 2 1 2 1 1 ...
##  $ Highest.Completed.Education.Level: Factor w/ 8 levels "","associate's degree",..: 7 2 2 5 5 7 3 3 3 3 ...
##  $ Highest.Degree.Earned            : Factor w/ 24 levels "","B.A","B.A.",..: 1 1 1 15 15 1 3 9 7 13 ...
##  $ Group                            : Factor w/ 2 levels "A","C": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SL.meaning.cond.c                : num  0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 ...
##  $ age.c                            : num  6.71 4.71 6.71 5.71 8.71 ...
##  $ gender.c                         : num  -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 ...
mp_slid_data <- subset(incl_slid_data, SL.Meaning.Condition == "M+") # only M+ trials


# Calculate the proportions of responses in the semantic learning task for each participant
# Step 1: Define valid response types per condition
valid_responses <- tribble(
  ~SL.Meaning.Condition, ~SL.Response.Type,
  "M+", "correct response (target word)",
  "M+", "incorrect response (no meaning)",
  "M+", "incorrect response (no response)",
  "M+", "incorrect response (wrong word)",
  "M-", "correct response (no meaning)",
  "M-", "incorrect response (any meaning)",
  "M-", "incorrect response (no response)"
)

# Step 2: Summarise participant-level counts
participant_counts <- incl_slid_data %>%
  group_by(Participant.ID, Group, SL.Meaning.Condition, SL.Response.Type) %>%
  summarise(n = n(), .groups = "drop")

# Step 3: Get unique Participant × Condition combos from actual data
participant_conditions <- incl_slid_data %>%
  distinct(Participant.ID, Group, SL.Meaning.Condition)

# Step 4: Create complete grid of valid combinations per participant
full_grid <- participant_conditions %>%
  inner_join(valid_responses, by = "SL.Meaning.Condition")
## Warning in inner_join(., valid_responses, by = "SL.Meaning.Condition"): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 1 of `x` matches multiple rows in `y`.
## ℹ Row 1 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
# Step 5: Left join actual counts onto full grid (so missing = 0)
propsl_data <- full_grid %>%
  left_join(participant_counts,
            by = c("Participant.ID", "Group", "SL.Meaning.Condition", "SL.Response.Type")) %>%
  mutate(n = replace_na(n, 0)) %>%
  group_by(Participant.ID, Group, SL.Meaning.Condition) %>%
  mutate(
    total_responses = sum(n),
    proportion = n / total_responses
  ) %>%
  ungroup()

# Notes:
# SL Meaning Condition = context condition (M- = unsupportive, M+ = supportive); default reference level = unsupportive/M-
# For SL Meaning Condition, M+ = -0.5 (after centering), M- = 0.5 (after centering)
# For Gender, female = -0.5 (after centering), male = 0.5 (after center)

Sanity checks

# Is each participant in only one group?
# Expected: TRUE (between-subjects design)
slid_data %>% group_by(Participant.ID) %>%
  summarise(Group = n_distinct(Group)) %>%
  as.data.frame() %>% 
  {.$Group == 1} %>%
  all()
## [1] TRUE
# Number of included participants per experimental condition
# Expected: Children = 45, Adults = 69
incl_slid_data %>% group_by(Participant.ID) %>%
  summarise(Group = first(Group)) %>%
  ungroup() %>%
  group_by(Group) %>%
  summarise(n = n())
## # A tibble: 2 × 2
##   Group     n
##   <fct> <int>
## 1 A        60
## 2 C        45
# Number of different target words (collapsed across participants) by group
# Expected: 15
mp_slid_data %>%  
  group_by(Group) %>%
  summarise(items = n_distinct(SL.Correct.Response))
## # A tibble: 2 × 2
##   Group items
##   <fct> <int>
## 1 A        15
## 2 C        15
  #summarise(items = n_distinct(Distinct.Target))

# Number of different psuedowords (collapsed across participants) by group
# Expected: 15
mp_slid_data %>%  
  group_by(Group) %>%  
  summarise(items = n_distinct(SL.Nonword))
## # A tibble: 2 × 2
##   Group items
##   <fct> <int>
## 1 A        15
## 2 C        15

Participants

Inclusions/exclusions

slid_data %>%
  distinct(Participant.ID, Group, Language.Status, Exclude., Exclusion.Reason)%>%
  group_by(Exclude.,Group, Language.Status, Exclusion.Reason)%>%
  summarise(n = n())%>%
  mutate(total.Exclusion.Reason.n = sum(n))%>%
  knitr::kable()
## `summarise()` has grouped output by 'Exclude.', 'Group', 'Language.Status'. You
## can override using the `.groups` argument.
Exclude. Group Language.Status Exclusion.Reason n total.Exclusion.Reason.n
0 A bilingual (English, Chinese) 2 2
0 A bilingual (English, Korean) 1 1
0 A bilingual (English, Spanish) 5 5
0 A bilingual (English, Vietnamese) 1 1
0 A monolingual 60 60
0 C 45 45
1 A bilingual (English, French) This participant provided the same 2 answers for almost all of the R/IT trials 1 1
1 A monolingual Participant didn’t seem to understand WLT (provided nonwords as responses) 1 29
1 A monolingual Repeated attempts by Mturk workers that should be excluded 9 29
1 A monolingual This participant did not complete the study 1 29
1 A monolingual This participant did not respond to almost any of the R/IT trials (let almost all of them time out) 1 29
1 A monolingual This participant did not respond to any of the R/IT trials (let them all time out) 1 29
1 A monolingual This participant selected “no meaning” for most of the R/IT trials 3 29
1 A monolingual This participant spent ten or less minutes 10 29
1 A monolingual This participant spent ten or less minutes and provided the same 2 answers for almost all of the answers in the WLT and most of the R/IT 1 29
1 A monolingual This participant spent ten or less minutes, didn’t seem to understand WLT (provided repeated, nonsensical responses), and selected “no meaning” for all of the R/IT trials 1 29
1 A monolingual This participant spent ten or less minutes, provided the same 2 answers for almost all of the answers in the WLT, and provided repeated answers for much of R/IT 1 29
1 A N/A Repeated attempts by Mturk workers that should be excluded 1 11
1 A N/A This participant did not fill out the demographics 4 11
1 A N/A This participant did not fill out the demographics and selected “no meaning” for all of the R/IT trials 1 11
1 A N/A This participant spent ten or less minutes 2 11
1 A N/A This participant spent ten or less minutes and did not fill out the demographics 1 11
1 A N/A This participant spent ten or less minutes, provided repeated answers for much of WLT, and selected “no meaning” for all of the R/IT trials 1 11
1 A N/A This was a practice run 1 11
1 C Completed portion of SL task before restarting and completing whole study 1 1

Age and gender demographics

# Age
incl_slid_data %>%
  distinct(Participant.ID, Group, Age)%>%
  group_by(Group)%>%
  summarise_at('Age', 
               list(~mean(., na.rm=T), 
                    ~sd(., na.rm=T),
                    ~median(., na.rm=T),
                    ~min(., na.rm=T),
                    ~max(., na.rm=T),
                    ~sum(!is.na(.))))%>%
  dplyr::rename("n" = "sum")%>%
  dplyr::select(Group, n, mean, sd, median, min, max)%>%
  mutate(total.n = sum(n))%>%
  knitr::kable()
Group n mean sd median min max total.n
A 60 25.38333 1.7083213 25 22 29 105
C 45 11.15556 0.7964568 11 10 12 105
# Gender
incl_slid_data %>%
  distinct(Participant.ID, Group, Gender)%>%
  group_by(Group, Gender)%>%
  summarise(n = n())%>%
  mutate(total.Gender.n = sum(n))%>%
  knitr::kable()
## `summarise()` has grouped output by 'Group'. You can override using the
## `.groups` argument.
Group Gender n total.Gender.n
A female 33 60
A male 27 60
C female 26 45
C male 19 45

Descriptives

# Semantic learning task performance
incl_slid_data_partsum <- incl_slid_data %>%
  group_by(Participant.ID, Group,SL.Meaning.Condition) %>%
  summarise(SL_corr_partacc = mean(SL.Correct.Enough.for.IT., na.rm = TRUE), .groups = "drop")

sl_summary_df <- incl_slid_data_partsum %>%
  group_by(Group,SL.Meaning.Condition) %>%
  summarise(
    mean_accuracy = mean(SL_corr_partacc),
    sd_accuracy = sd(SL_corr_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_accuracy + sd_accuracy + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(sl_summary_df)
Group SL.Meaning.Condition mean_accuracy sd_accuracy n label_y total_n
A M- 0.9611111 0.0697498 60 1.0508609 210
A M+ 0.7755556 0.1472749 60 0.9428304 210
C M- 0.9570370 0.0767464 45 1.0537834 210
C M+ 0.6459259 0.1757076 45 0.8416336 210
# Proportions of semantic learning task
propsl_data_partsum <- propsl_data %>%
  group_by(Participant.ID, Group,SL.Meaning.Condition, SL.Response.Type) %>%
  summarise(proportion_partacc = mean(proportion, na.rm = TRUE), .groups = "drop")

propsl_summary_df <- propsl_data_partsum %>%
  group_by(Group, SL.Meaning.Condition, SL.Response.Type) %>%
  summarise(
    mean_proportion = mean(proportion_partacc),
    sd_proportion = sd(proportion_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_proportion + sd_proportion + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(propsl_summary_df)
Group SL.Meaning.Condition SL.Response.Type mean_proportion sd_proportion n label_y total_n
A M+ correct response (target word) 0.7755556 0.1472749 60 0.9428304 735
A M+ incorrect response (no meaning) 0.1388889 0.1395671 60 0.2984560 735
A M+ incorrect response (no response) 0.0000000 0.0000000 60 0.0200000 735
A M+ incorrect response (wrong word) 0.0855556 0.0650559 60 0.1706114 735
A M- correct response (no meaning) 0.9622222 0.0653735 60 1.0475957 735
A M- incorrect response (any meaning) 0.0377778 0.0653735 60 0.1231513 735
A M- incorrect response (no response) 0.0000000 0.0000000 60 0.0200000 735
C M+ correct response (target word) 0.7555556 0.1669694 45 0.9425250 735
C M+ incorrect response (no meaning) 0.1422222 0.1106455 45 0.2728677 735
C M+ incorrect response (no response) 0.0014815 0.0099381 45 0.0314196 735
C M+ incorrect response (wrong word) 0.1007407 0.1021212 45 0.2228619 735
C M- correct response (no meaning) 0.9570370 0.0767464 45 1.0537834 735
C M- incorrect response (any meaning) 0.0414815 0.0769217 45 0.1384032 735
C M- incorrect response (no response) 0.0014815 0.0099381 45 0.0314196 735

Visualizations

# Semantic learning task performance
incl_slid_data_partsum %>%
  mutate(#SL.Meaning.Condition = factor(SL.Meaning.Condition, levels = c("M-", "M+"), 
                       #labels = c("Unsupportive Context", "Supportive Context"))),
     SL.Meaning.Condition = factor(SL.Meaning.Condition, levels = c("M+","M-"))  # Set the desired order of variables
)%>%
  ggplot(aes(x = SL.Meaning.Condition, y = SL_corr_partacc, fill = SL.Meaning.Condition, color = SL.Meaning.Condition)) + 
  stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = sl_summary_df,
  aes(
    x = SL.Meaning.Condition,
    y = label_y,
    label = sprintf("%.2f", mean_accuracy),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  # scale_fill_brewer(palette = "Dark2") +
  #langcog::scale_fill_solarized()+
  labs(y = "Mean Accuracy of Target Meaning/Word Identification", 
       x = "Group", 
       fill = "Meaning Condition")  +
  theme(axis.text.x = element_text(hjust = 0.5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 10), 
        legend.title = element_text(size = 11), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        plot.title = element_text(size = 12)) +
  guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Proportions of semantic learning task
## M+
mp_resp_types <- c(
  "correct response (target word)",
  "incorrect response (no meaning)",
  "incorrect response (no response)",
  "incorrect response (wrong word)"
)
propsl_data_partsum %>%
  filter(
      SL.Meaning.Condition == "M+",
      SL.Response.Type %in% mp_resp_types
    ) %>%
    mutate(SL.Response.Type = factor(SL.Response.Type, levels = mp_resp_types)) %>%
    droplevels() %>%
  ggplot(aes(x = SL.Response.Type, y = proportion_partacc, fill = Group)) + 
  stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_wrap(~ Group, scales = "free_y", drop = TRUE) +  # Drop unused categories
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
               geom = "errorbar", 
               position = position_dodge(width = 0.9), 
               size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  scale_x_discrete(limits = mp_resp_types) +  # <-- THIS IS KEY
  geom_text(
    data = propsl_summary_df,
    aes(
      x = SL.Response.Type,
      y = label_y,
      label = sprintf("%.2f", mean_proportion),
      group = Group
    ),
    position = position_dodge(width = 0.9),
    size = 4,
    color = "black"
  ) +  # Add formatted text on top of bars
  labs(title = "Proportions of M+ Semantic Learning Task Responses",
    x = "Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group"
  ) +
  theme(
    axis.text.x = element_text(hjust = 1, angle = 45, size = 12, color = "black"),
    axis.text.y = element_text(size = 12, color = "black"), 
    axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),
    axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),
    strip.text = element_text(size = 12, color = "black", face = "bold"),
    legend.key.size = unit(.5, 'cm'), 
    legend.text = element_text(size = 11), 
    legend.title = element_text(size = 12, face = "bold"), 
    legend.margin = margin(t = 0, unit = 'cm'), 
    plot.title = element_text(size = 14,  face = "bold")
  ) +
  scale_y_continuous(breaks = seq(0, 1, .25))
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_text()`).

## M-
mm_resp_types <- c(
  "correct response (no meaning)",
  "incorrect response (any meaning)",
  "incorrect response (no response)"
)
propsl_data_partsum %>%
  filter(
      SL.Meaning.Condition == "M-",
      SL.Response.Type %in% mm_resp_types
    ) %>%
    mutate(SL.Response.Type = factor(SL.Response.Type, levels = mm_resp_types)) %>%
    droplevels() %>%
  ggplot(aes(x = SL.Response.Type, y = proportion_partacc, fill = Group)) + 
  stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_wrap(~ Group, scales = "free_y", drop = TRUE) +  # Drop unused categories
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
               geom = "errorbar", 
               position = position_dodge(width = 0.9), 
               size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  scale_x_discrete(limits = mm_resp_types) +  # <-- THIS IS KEY
  geom_text(
    data = propsl_summary_df,
    aes(
      x = SL.Response.Type,
      y = label_y,
      label = sprintf("%.2f", mean_proportion),
      group = Group
    ),
    position = position_dodge(width = 0.9),
    size = 4,
    color = "black"
  ) +  # Add formatted text on top of bars
  labs(title = "Proportions of M- Semantic Learning Task Responses",
    x = "Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group"
  ) +
  theme(
    axis.text.x = element_text(hjust = 1, angle = 45, size = 12, color = "black"),
    axis.text.y = element_text(size = 12, color = "black"), 
    axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),
    axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),
    strip.text = element_text(size = 12, color = "black", face = "bold"),
    legend.key.size = unit(.5, 'cm'), 
    legend.text = element_text(size = 11), 
    legend.title = element_text(size = 12, face = "bold"), 
    legend.margin = margin(t = 0, unit = 'cm'), 
    plot.title = element_text(size = 14,  face = "bold")
  ) +
  scale_y_continuous(breaks = seq(0, 1, .25))
## Warning: Removed 6 rows containing missing values or values outside the scale range
## (`geom_text()`).

Identification Task

Data Manipulations

# Create some data subsets (from previously loaded dataset)
mp_slid_data <- subset(incl_slid_data, SL.Meaning.Condition == "M+") # only M+ trials 

learned_slid_data <- subset(mp_slid_data, SL.Correct.Enough.for.IT. == 1) # only M+ trials where nonsense words' target meanings were IDed

mp_foil_data <- subset(mp_slid_data, !is.na(Semantic.vs.Other)) # only M+ trials where semantically-related, unrelated, or familiar foils were selected

learned_foil_data <- subset(learned_slid_data, !is.na(Semantic.vs.Other)) # only M+ trials where nonsense words' target meanings were IDed AND then only either a semantically-related, unrelated, or familiar foil was selected

# Calculate the proportions of responses in the identification task for each participant (disregarding learned/not learned status in SL task)
# Step 1: Define valid response types for IT
valid_IT_responses <- tribble(
  ~IT.Response.Type,
  "correct response (M+ target word)",
  "familiar foil",
  "unrelated foil",
  "no meaning",
  "NA",
  "semantically-related foil"
)

# Step 2: Count IT responses per participant (no SL.Meaning.Condition involved)
it_participant_counts <- mp_slid_data %>%
  group_by(Participant.ID, Group, IT.Response.Type) %>%
  summarise(n = n(), .groups = "drop")

# Step 3: Get participant × valid IT response type combinations
it_full_grid <- mp_slid_data %>%
  distinct(Participant.ID, Group) %>%
  crossing(IT.Response.Type = valid_IT_responses$IT.Response.Type)  # Using predefined valid response types

# Step 4: Left join actual counts onto the grid to fill missing values
propit_data <- it_full_grid %>%
  left_join(it_participant_counts,
            by = c("Participant.ID", "Group", "IT.Response.Type")) %>%
  mutate(n = replace_na(n, 0)) %>%
  group_by(Participant.ID, Group) %>%
  mutate(
    total_responses = sum(n),
    proportion = n / total_responses
  ) %>%
  ungroup()



# Calculate the proportions of responses in the identification task for each participant for only *learned* words
# Step 1: Define valid response types for IT
valid_IT_responses <- tribble(
  ~IT.Response.Type,
  "correct response (M+ target word)",
  "familiar foil",
  "unrelated foil",
  "no meaning",
  "NA",
  "semantically-related foil"
)

# Step 2: Count IT responses per participant (no SL.Meaning.Condition involved)
learned_it_participant_counts <- learned_slid_data %>%
  group_by(Participant.ID, Group, IT.Response.Type) %>%
  summarise(n = n(), .groups = "drop")

# Step 3: Get participant × valid IT response type combinations
learned_it_full_grid <- learned_slid_data %>%
  distinct(Participant.ID, Group) %>%
  crossing(IT.Response.Type = valid_IT_responses$IT.Response.Type)  # Using predefined valid response types

# Step 4: Left join actual counts onto the grid to fill missing values
learned_propit_data <- learned_it_full_grid %>%
  left_join(learned_it_participant_counts,
            by = c("Participant.ID", "Group", "IT.Response.Type")) %>%
  mutate(n = replace_na(n, 0)) %>%
  group_by(Participant.ID, Group) %>%
  mutate(
    total_responses = sum(n),
    proportion = n / total_responses
  ) %>%
  ungroup()

# Notes:
# SL Meaning Condition = context condition (M- = unsupportive, M+ = supportive); default reference level = unsupportive/M-
# For SL Meaning Condition, M+ = -0.5 (after centering), M- = 0.5 (after centering)
# For Gender, female = -0.5 (after centering), male = 0.5 (after center)

Descriptives

# Identification task performance (disregarding learned/not learned status in SL task)
mp_slid_data_partsum <- mp_slid_data %>%
  group_by(Participant.ID, Group) %>%
  summarise(IT_corr_partacc = mean(IT.Correct., na.rm = TRUE), .groups = "drop")

it_summary_df <- mp_slid_data_partsum %>%
  group_by(Group) %>%
  summarise(
    mean_accuracy = mean(IT_corr_partacc),
    sd_accuracy = sd(IT_corr_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_accuracy + sd_accuracy + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(it_summary_df)
Group mean_accuracy sd_accuracy n label_y total_n
A 0.3688889 0.1593143 60 0.5482032 105
C 0.3718519 0.1636014 45 0.5554533 105
# Identification task performance for *learned* words
learned_slid_data_partsum <- learned_slid_data %>%
  group_by(Participant.ID, Group) %>%
  summarise(IT_corr_partacc = mean(IT.Correct., na.rm = TRUE), .groups = "drop")

learned_it_summary_df <- learned_slid_data_partsum %>%
  group_by(Group) %>%
  summarise(
    mean_accuracy = mean(IT_corr_partacc),
    sd_accuracy = sd(IT_corr_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_accuracy + sd_accuracy + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(learned_it_summary_df)
Group mean_accuracy sd_accuracy n label_y total_n
A 0.4271696 0.1734506 60 0.6206202 105
C 0.4393798 0.1939308 45 0.6533106 105
# Proportions of identification task (disregarding learned/not learned status in SL task)
propit_data_partsum <- propit_data %>%
  group_by(Participant.ID, Group,IT.Response.Type) %>%
  summarise(proportion_partacc = mean(proportion, na.rm = TRUE), .groups = "drop")
  
propit_summary_df <- propit_data_partsum %>%
  group_by(Group, IT.Response.Type) %>%
  summarise(
    mean_proportion = mean(proportion_partacc),
    sd_proportion = sd(proportion_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_proportion + sd_proportion + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(propit_summary_df)
Group IT.Response.Type mean_proportion sd_proportion n label_y total_n
A NA 0.0000000 0.0000000 60 0.0200000 630
A correct response (M+ target word) 0.3703175 0.1581543 60 0.5484717 630
A familiar foil 0.2578571 0.1340458 60 0.4119029 630
A no meaning 0.2751587 0.1715924 60 0.4667511 630
A semantically-related foil 0.0633333 0.0992818 60 0.1826151 630
A unrelated foil 0.0333333 0.0527939 60 0.1061272 630
C NA 0.0000000 0.0000000 45 0.0200000 630
C correct response (M+ target word) 0.3718519 0.1636014 45 0.5554533 630
C familiar foil 0.2118519 0.1075803 45 0.3394321 630
C no meaning 0.3511111 0.1702049 45 0.5413160 630
C semantically-related foil 0.0296296 0.0523306 45 0.1019603 630
C unrelated foil 0.0355556 0.0612991 45 0.1168546 630
# Proportions of identification task for *learned* words
learned_propit_data_partsum <- learned_propit_data %>%
  group_by(Participant.ID, Group,IT.Response.Type) %>%
  summarise(proportion_partacc = mean(proportion, na.rm = TRUE), .groups = "drop")

learned_propit_summary_df <- learned_propit_data_partsum %>%
  group_by(Group, IT.Response.Type) %>%
  summarise(
    mean_proportion = mean(proportion_partacc),
    sd_proportion = sd(proportion_partacc),
    n = n(),
    .groups = "drop"
  ) %>%
  mutate(
    label_y = mean_proportion + sd_proportion + 0.02,  # Add small buffer
    total_n = sum(n)
  )
  knitr::kable(learned_propit_summary_df)
Group IT.Response.Type mean_proportion sd_proportion n label_y total_n
A NA 0.0000000 0.0000000 60 0.0200000 630
A correct response (M+ target word) 0.4287081 0.1719068 60 0.6206149 630
A familiar foil 0.2320241 0.1433781 60 0.3954022 630
A no meaning 0.2421080 0.1893168 60 0.4514248 630
A semantically-related foil 0.0608621 0.1009820 60 0.1818442 630
A unrelated foil 0.0362977 0.0628175 60 0.1191152 630
C NA 0.0000000 0.0000000 45 0.0200000 630
C correct response (M+ target word) 0.4393798 0.1939308 45 0.6533106 630
C familiar foil 0.1887736 0.1238211 45 0.3325947 630
C no meaning 0.3287325 0.1888939 45 0.5376264 630
C semantically-related foil 0.0262722 0.0600091 45 0.1062813 630
C unrelated foil 0.0168419 0.0515258 45 0.0883677 630
write.csv(mp_slid_data$IT.Correct., "check_sd.csv", row.names = FALSE)

Visualizations

# Identification task performance (disregarding learned/not learned status in SL task)
mp_slid_data_partsum %>%
  #mutate(SL.Meaning.Condition = factor(SL.Meaning.Condition, levels = c("M+","M-"))  # Set the desired order of variables
#)%>%
  ggplot(aes(x = Group, y = IT_corr_partacc, fill = Group, color = Group)) + 
  stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  #facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = it_summary_df,
  aes(
    x = Group,
    y = label_y,
    label = sprintf("%.2f", mean_accuracy),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  # scale_fill_brewer(palette = "Dark2") +
  #langcog::scale_fill_solarized()+
  labs(y = "Mean Accuracy of Target Meaning/Word Identification", 
       x = "Group")+ 
       #fill = "Meaning Condition")  +
  theme(axis.text.x = element_text(hjust = 0.5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 10), 
        legend.title = element_text(size = 11), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        plot.title = element_text(size = 12)) +
  guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

# Identification task performance for *learned* words
learned_slid_data_partsum %>%
  #mutate(SL.Meaning.Condition = factor(SL.Meaning.Condition, levels = c("M+","M-"))  # Set the desired order of variables
#)%>%
  ggplot(aes(x = Group, y = IT_corr_partacc, fill = Group, color = Group)) + 
  stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  #facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = learned_it_summary_df,
  aes(
    x = Group,
    y = label_y,
    label = sprintf("%.2f", mean_accuracy),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  # scale_fill_brewer(palette = "Dark2") +
  #langcog::scale_fill_solarized()+
  labs(y = "Mean Accuracy of Target Meaning/Word Identification", 
       x = "Group")+ 
       #fill = "Meaning Condition")  +
  theme(axis.text.x = element_text(hjust = 0.5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 10), 
        legend.title = element_text(size = 11), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        plot.title = element_text(size = 12)) +
  guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

# Proportions of identification task (disregarding learned/not learned status in SL task)
propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = propit_summary_df %>%
    filter(IT.Response.Type != "NA") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(M+ target word)",
  "semantically-related foil" = "semantically-related foil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "no meaning"
))+
 theme(axis.text.x = element_text(hjust = 1, angle = 45, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

# Proportions of identification task for *learned* words
learned_propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = learned_propit_summary_df %>%
    filter(IT.Response.Type != "NA") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(M+ target word)",
  "semantically-related foil" = "semantically-related foil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "no meaning"
))+
 theme(axis.text.x = element_text(hjust = 1, angle = 45, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

# Proportions of identification task for adult data only (disregarding learned/not learned status in SL task)
adultpropit_data_plot <- propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA" & Group == "A") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = propit_summary_df %>%
    filter(IT.Response.Type != "NA" & Group == "A") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Semantic Recognition Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(target word)",
  "semantically-related foil" = "semantically-related\nfoil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "red X\n(no meaning)"
))+
 theme(axis.text.x = element_text(hjust = .5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        legend.position = "none",
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

ggplot2::ggsave(filename = "ID Task Responses - Adults.jpeg", 
                plot = adultpropit_data_plot, 
                device = "jpeg", 
                dpi = 300, 
                width = 12,
                height = 8, 
                units = "in",
                limitsize = FALSE)


# Proportions of identification task for adult data only for *learned* words
learned_adultpropit_data_plot <- learned_propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA" & Group == "A") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = learned_propit_summary_df %>%
    filter(IT.Response.Type != "NA" & Group == "A") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Semantic Recognition Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(target word)",
  "semantically-related foil" = "semantically related\nfoil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "red X\n(no meaning)"
))+
 theme(axis.text.x = element_text(hjust = .5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        legend.position = "none",
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

ggplot2::ggsave(filename = "ID Task Responses - Adults.jpeg", 
                plot = learned_adultpropit_data_plot, 
                device = "jpeg", 
                dpi = 300, 
                width = 12,
                height = 8, 
                units = "in",
                limitsize = FALSE)


# Proportions of identification task for child data only (disregarding learned/not learned status in SL task)
kidpropit_data_plot <- propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA" & Group == "C") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black", fill = "#619CFF") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = propit_summary_df %>%
    filter(IT.Response.Type != "NA" & Group == "C") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Semantic Recognition Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(target word)",
  "semantically-related foil" = "semantically-related\nfoil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "red X\n(no meaning)"
))+
 theme(axis.text.x = element_text(hjust = .5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        legend.position = "none",
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

ggplot2::ggsave(filename = "ID Task Responses - Kids.jpeg", 
                plot = kidpropit_data_plot, 
                device = "jpeg", 
                dpi = 300, 
                width = 12,
                height = 8, 
                units = "in",
                limitsize = FALSE)


# Proportions of identification task for child data only for *learned* words
learned_kidpropit_data_plot <- learned_propit_data_partsum %>%
    mutate(IT.Response.Type = factor(IT.Response.Type, levels = c("correct response (M+ target word)","semantically-related foil", "familiar foil", "unrelated foil", "no meaning"))  # Set the desired order of variables
)%>%
  filter(IT.Response.Type != "NA" & Group == "C") %>%  # Removes both NA and character "NA"
  droplevels() %>%
  ggplot(aes(x = IT.Response.Type, y = proportion_partacc, fill = Group)) + 
 stat_summary(fun = mean, position = position_dodge(width = .9),
               geom="bar", colour = "black", fill = "#619CFF") + 
  geom_hline(yintercept = .5, color = "grey", linetype = "dashed") + 
  facet_grid(~Group) + 
  stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1),
             geom = "errorbar", 
             position = position_dodge(width = 0.9), 
             size = 1, width = 0.25, color = "black") +  # Standard deviation bars
  geom_text(
  data = learned_propit_summary_df %>%
    filter(IT.Response.Type != "NA" & Group == "C") %>%
    droplevels(),
  aes(
    x = IT.Response.Type,
    y = label_y,
    label = sprintf("%.2f", mean_proportion),
    group = Group
  ),
  position = position_dodge(width = 0.9),
  size = 4,
  color = "black") +  # Add formatted text on top of bars
  labs(#title = "Proportions of Identification Task Responses",
    x = "Semantic Recognition Response Type",
    y = "Mean Proportion of Responses",
    fill = "Group")  +
  scale_x_discrete(labels = c(
  "correct response (M+ target word)" = "correct response\n(target word)",
  "semantically-related foil" = "semantically related\nfoil",
  "familiar foil" = "familiar foil",
  "unrelated foil" = "unrelated foil",
  "no meaning" = "red X\n(no meaning)"
))+
 theme(axis.text.x = element_text(hjust = .5, angle = 0, size = 12, color = "black"),  # Customize x-axis text
        axis.text.y = element_text(size = 12, color = "black"), 
        axis.title.x = element_text(size = 14, color = "black", face = "bold", margin = margin(t = 10)),  # x-axis title
        axis.title.y = element_text(size = 14, color = "black", face = "bold", margin = margin(r = 10)),  # y-axis title
        strip.text = element_text(size = 12, color = "black", face = "bold"),  # Facet labels
        legend.key.size = unit(.5, 'cm'), 
        legend.text = element_text(size = 11), 
        legend.title = element_text(size = 12, face = "bold"), 
        legend.margin = margin(t = 0, unit = 'cm'), 
        legend.position = "none",
        plot.title = element_text(size = 12),
        plot.margin = margin(t = 10, r = 20, b = 20, l = 10, unit = "pt"))+
  #guides(fill = FALSE, color = FALSE) +  # Remove both fill and color legends
  scale_y_continuous(breaks = seq(0, 1, .25))

ggplot2::ggsave(filename = "ID Task Responses - Kids.jpeg", 
                plot = learned_kidpropit_data_plot, 
                device = "jpeg", 
                dpi = 300, 
                width = 12,
                height = 8, 
                units = "in",
                limitsize = FALSE)

Analyses

RQ1: when an individual correctly identifies a new word’s meaning in the semantic learning task, do they correctly identify the word’s meaning in the identification task?

Adults

Results:
- intercept is significant, so adult participants who failed to identify the meaning of the word in the semantic learning task were significantly more likely to not correctly identify the image in the identification task (i.e., pick a foil/say no meaning)
- 4.8 times more likely to correctly identify the image in the identification task if they had correctly identified the word’s meaning in the semantic learning task, compared to if they didn’t

Adult participants who formed a correct semantic representation during learning were significantly more likely to get the identification trial correct—about 4.8 times higher odds, even after accounting for age, gender, and subject/item variability.

Note: may want to throw in at least one of our measures of education for adults since we have them – currently not included in analysis

# # maximal model
#rq1.a.m1 <- glmer(IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID)+(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_slid_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to simplify model
#   
# summary(rePCA(rq1.a.m1)) # all PC 2s for semantic learning task accuracy (SL.Correct.Enough.for.IT.) account for negligible proportions of variance
# 
# # model with all random slopes removed
# rq1.a.m2 <- glmer(IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID)+(1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_slid_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
#   
# summary(rePCA(rq1.a.m2)) # random intercept for semantic learning task order (SL.Trial.Order.by.Task) and identification task trial order (IT.Trial.Order.by.Task) accounts for a negligible proportion of variance
# 
# # model with random intercept for semantic learning task order (SL.Trial.Order.by.Task) and identification task trial order (IT.Trial.Order.by.Task) removed
 rq1.a.m3 <- glmer(IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID)+(1 |SL.Correct.Response), data=subset(mp_slid_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# final model results 
tab_model(rq1.a.m3, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  IT.Correct.
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 0.15 0.06 -4.64 <0.001 Inf
SL Correct Enough for IT 4.80 1.08 6.96 <0.001 Inf
age c 1.00 0.05 0.05 0.957 Inf
gender c 1.24 0.22 1.20 0.231 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 0.14
τ00 SL.Correct.Response 0.14
ICC 0.08
N Participant.ID 60
N SL.Correct.Response 15
Observations 900
Marginal R2 / Conditional R2 0.106 / 0.176
summary(rq1.a.m3)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c +  
##     (1 | Participant.ID) + (1 | SL.Correct.Response)
##    Data: subset(mp_slid_data, Group == "A")
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 20000))
## 
##      AIC      BIC   logLik deviance df.resid 
##   1117.8   1146.6   -552.9   1105.8      894 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.4151 -0.7930 -0.4219  0.9933  3.6762 
## 
## Random effects:
##  Groups              Name        Variance Std.Dev.
##  Participant.ID      (Intercept) 0.1394   0.3734  
##  SL.Correct.Response (Intercept) 0.1396   0.3737  
## Number of obs: 900, groups:  Participant.ID, 60; SL.Correct.Response, 15
## 
## Fixed effects:
##                            Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               -1.866224   0.401821  -4.644 3.41e-06 ***
## SL.Correct.Enough.for.IT.  1.568281   0.225440   6.957 3.49e-12 ***
## age.c                      0.002893   0.053101   0.054    0.957    
## gender.c                   0.214073   0.178667   1.198    0.231    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) SL.C.E age.c 
## SL.C.E..IT. -0.501              
## age.c       -0.812  0.021       
## gender.c    -0.098  0.102  0.089

Children

Results:
- intercept not significant, so child participants who failed to identify the meaning of the word in the semantic learning task were not significantly more likely to correctly or incorrectly identify the image in the identification task
- 2.91 times more likely to correctly identify the image in the identification task if they had correctly identified the word’s meaning in the semantic learning task, compared to if they didn’t

Child participants who formed a correct semantic representation during learning were significantly more likely to get the identification trial correct—almost 3 times higher odds, even after accounting for age, gender, and subject/item variability.

Comparing patterns of results across the two participant groups, while semantic learning task performance still supports identification task performance in children, it has a weaker effect in children than in adults.

# # maximal model
# rq1.c.m1 <- glmer(IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c +(1 + SL.Correct.Enough.for.IT. |Participant.ID) +(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_slid_data,Group == "C"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to simplify model
#    
# summary(rePCA(rq1.c.m1)) # PC 2 for semantic learning task trial order (SL.Trial.Order.by.Task), identification task trial order (IT.Trial.Order.by.Task), and participant account for negligible proportions of variance
# 
# # model with above random slopes removed
rq1.c.m2 <- glmer(IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c +(1|Participant.ID)+ (1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_slid_data,Group == "C"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# final model results 
tab_model(rq1.c.m2, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  IT.Correct.
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 0.23 0.27 -1.27 0.205 Inf
SL Correct Enough for IT 2.91 0.80 3.89 <0.001 Inf
age c 0.98 0.13 -0.13 0.900 Inf
gender c 1.17 0.26 0.71 0.478 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 0.17
τ00 IT.Trial.Order.by.Task 0.03
τ00 SL.Trial.Order.by.Task 0.08
τ00 SL.Correct.Response 0.12
τ11 SL.Correct.Response.SL.Correct.Enough.for.IT. 0.42
ρ01 SL.Correct.Response -0.68
ICC 0.13
N Participant.ID 45
N SL.Correct.Response 15
N SL.Trial.Order.by.Task 30
N IT.Trial.Order.by.Task 31
Observations 675
Marginal R2 / Conditional R2 0.064 / 0.182
summary(rq1.c.m2)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: IT.Correct. ~ SL.Correct.Enough.for.IT. + age.c + gender.c +  
##     (1 | Participant.ID) + (1 + SL.Correct.Enough.for.IT. | SL.Correct.Response) +  
##     (1 | SL.Trial.Order.by.Task) + (1 | IT.Trial.Order.by.Task)
##    Data: subset(mp_slid_data, Group == "C")
## Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 20000))
## 
##      AIC      BIC   logLik deviance df.resid 
##    863.5    908.6   -421.7    843.5      665 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.4958 -0.7278 -0.5010  0.9408  2.2953 
## 
## Random effects:
##  Groups                 Name                      Variance Std.Dev. Corr 
##  Participant.ID         (Intercept)               0.17282  0.4157        
##  IT.Trial.Order.by.Task (Intercept)               0.02539  0.1594        
##  SL.Trial.Order.by.Task (Intercept)               0.07857  0.2803        
##  SL.Correct.Response    (Intercept)               0.11698  0.3420        
##                         SL.Correct.Enough.for.IT. 0.42399  0.6511   -0.68
## Number of obs: 675, groups:  
## Participant.ID, 45; IT.Trial.Order.by.Task, 31; SL.Trial.Order.by.Task, 30; SL.Correct.Response, 15
## 
## Fixed effects:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)               -1.45000    1.14441  -1.267    0.205    
## SL.Correct.Enough.for.IT.  1.06959    0.27469   3.894 9.87e-05 ***
## age.c                     -0.01725    0.13686  -0.126    0.900    
## gender.c                   0.15553    0.21934   0.709    0.478    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) SL.C.E age.c 
## SL.C.E..IT. -0.182              
## age.c        0.981 -0.043       
## gender.c     0.154  0.084  0.159

RQ2: when a word’s meaning is not correctly identified in the identification task, which foil is an individual most likely to select?

Adults

Semantic vs Other Foils

Results:
- intercept not significant, so adult participants who failed to identify the meaning of the word in the semantic learning task were not significantly more likely to choose the semantically-related foil or other foils
- correctly identifying the word’s meaning in the semantic learning task did not significantly influence the likelihood of choosing the semantically-related foil over the other foils

Regardless of whether adult participants correctly or incorrectly identified a word’s meaning in the semantic learning task, when they did not identify the correct image in the identification task, they were not significantly more likely to select the semantically-related foil than any other foil, even after accounting for age, gender, and subject/item variability.

Note: may want to throw in at least one of our measures of education for adults since we have them – currently not included in analysis

# # maximal model
# rq2.1.a.m1 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 + SL.Correct.Enough.for.IT.|SL.Nonword)+(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to simplify model
#  
# summary(rePCA(rq2.1.a.m1)) # random slopes for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for all variables account for negligible proportions of variance
# 
# # model with all random slopes removed
# rq2.1.a.m2 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.1.a.m2)) # all random intercepts account for non-zero proportions of variance, but the model is still too complex to converge, so will try removing each random intercept
# 
# # model with random intercept for nonword (SL.Nonword) removed
# rq2.1.a.m3.nonw <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID)+(1|SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning
# 
# # model with random intercept for target word (SL.Correct.Response) removed
# rq2.1.a.m3.nocr <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning
# 
# # model with random intercept for semantic learning task trial order (SL.Trial.Order.by.Task) removed
# rq2.1.a.m3.noslto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # model is nearly unidentifiable: large eigenvalue ratio
# 
# # model with random intercetp for identification task trial order (IT.Trial.Order.by.Task) removed
# rq2.1.a.m3.noitto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A"), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning
# 
# # models are still too complex, so will try removing multiple random intercepts at once
# 
# # model with random intercepts for semantic learning task trial order (SL.Trial.Order.by.Task) and identification task trial order (IT.Trial.Order.by.Task) removed
# rq2.1.a.m4.noto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1 |SL.Nonword)+(1|SL.Correct.Response), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # model is nearly unidentifiable: large eigenvalue ratio
# 
# # model with random intercept for nonword (SL.Nonword) and target word (SL.Correct.Response) removed
# rq2.1.a.m4.nonwocr <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# model with random intercept for nonword (SL.Nonword) and semantic learning task trial order (SL.Trial.Order.by.Task) removed 
rq2.1.a.m4.nonwoslto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Correct.Response) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# # model with random intercept for nonword (SL.Nonword) and identification task trial order (IT.Trial.Order.by.Task) removed
# rq2.1.a.m4.nonwoitto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) +(1|SL.Correct.Response)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning
# 
# # model with random intercept for target word (SL.Correct.Response) and semantic learning task trial order (SL.Trial.Order.by.Task) removed
# rq2.1.a.m4.nocroslto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1 |SL.Nonword)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!
# 
# # model with random intercept for target word (SL.Correct.Response) and identification task trial order (SL.Trial.Order.by.Task) removed
# rq2.1.a.m4.nocroritto <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1 |SL.Nonword)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning

# # comparing models that converged to see which is best
# anova(rq2.1.a.m4.nocroslto,rq2.1.a.m4.nonwocr) # rq2.1.a.m4.nocroslto has slightly smaller AIC & BIC
# anova(rq2.1.a.m4.nonwoslto,rq2.1.a.m4.nonwocr) # rq2.1.a.m4.nonwoslto has slightly smaller AIC & BIC
# anova(rq2.1.a.m4.nocroslto,rq2.1.a.m4.nonwoslto)  # no model comes out better than the other, but already know target word has levels with observations, so will keep that variable

mp_foil_data$Semantic.vs.Other <- relevel(mp_foil_data$Semantic.vs.Other, ref = "other foil")
tab_model(rq2.1.a.m4.nonwoslto, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  Semantic.vs.Other
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 0.56 0.53 -0.61 0.539 Inf
SL Correct Enough for IT 0.94 0.38 -0.14 0.887 Inf
age c 0.78 0.11 -1.84 0.065 Inf
gender c 1.01 0.45 0.03 0.980 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 0.81
τ00 IT.Trial.Order.by.Task 0.33
τ00 SL.Correct.Response 0.52
ICC 0.34
N Participant.ID 58
N SL.Correct.Response 15
N IT.Trial.Order.by.Task 30
Observations 319
Marginal R2 / Conditional R2 0.034 / 0.359

Familiar vs Unrelated Foils

Results:
- intercept is significant, so adult participants who failed to identify the meaning of the word in the semantic learning task were significantly more likely to choose the unrelated foil than the familiar foil
- correctly identifying the word’s meaning in the semantic learning task did not significantly influence the likelihood of choosing the familiar foil over the unrelated foil (probably due to high variability because there is a numerically higher likelihood)

When adult participants correctly identified a word’s meaning in the semantic learning task but did not identify the correct image in the identification task, they were numerically more likely but not significantly more likely to select the familiar foil than the unrelated foil, even after accounting for age, gender, and subject/item variability. However, when adult participants incorrectly identified a word’s meaning in the semantic learning task and did not identify the correct image in the identification task, they were significantly more likely to select the unrelated foil than the familiar foil, even after accounting for age, gender, and subject/item variability.

Note: may want to throw in at least one of our measures of education for adults since we have them – currently not included in analysis

# # maximal model
# rq2.2.a.m1 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 + SL.Correct.Enough.for.IT.|SL.Nonword)+(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to simplify model
# 
# summary(rePCA(rq2.2.a.m1)) # random slopes for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for all variables account for negligible proportions of variance
# 
# # model with all random slopes removed
# rq2.2.a.m2 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.2.a.m2)) # random intercept for identification task trial order (IT.Trial.Order.by.Task) accounts for a negligible proportion of variance
# 
# # model with random intercept for identification task trial order (IT.Trial.Order.by.Task) removed
# rq2.2.a.m3 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.2.a.m3)) # all random intercepts account for non-zero proportions of variance, but the model is still too complex to converge, so will try removing each random intercept
# 
# model with random intercept for nonword (SL.Nonword) removed
rq2.2.a.m4.nonw <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!
# 
# # model with random intercept for target word (SL.Correct.Response) removed
# rq2.2.a.m4.nocr <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Nonword)+(1|SL.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!
# 
# # model with random intercept for semantic learning task trial order (SL.Trial.Order.by.Task) removed
# rq2.2.a.m4.noto <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response), data=subset(mp_foil_data,Group == "A" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) #  model is nearly unidentifiable: large eigenvalue ratio
# 
# # comparing models that converged to see which is best
# anova(rq2.2.a.m4.nocr ,rq2.2.a.m4.nonw) # no model comes out better than the other, but already know target word has levels with observations, so will keep that variable

mp_foil_data$Familiar.vs.Unrelated <- relevel(mp_foil_data$Familiar.vs.Unrelated, ref = "unrelated foil")
tab_model(rq2.2.a.m4.nonw, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  Familiar.vs.Unrelated
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 0.05 0.08 -1.97 0.048 Inf
SL Correct Enough for IT 1.52 0.95 0.66 0.508 Inf
age c 0.91 0.17 -0.53 0.598 Inf
gender c 0.83 0.53 -0.29 0.771 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 1.57
τ00 SL.Trial.Order.by.Task 1.31
τ00 SL.Correct.Response 1.96
ICC 0.59
N Participant.ID 58
N SL.Correct.Response 15
N SL.Trial.Order.by.Task 30
Observations 262
Marginal R2 / Conditional R2 0.010 / 0.599

Children

Semantic vs Other Foils

Results:
- intercept not significant, so child participants who failed to identify the meaning of the word in the semantic learning task were not significantly more likely to choose the semantically-related foil or other foils
- correctly identifying the word’s meaning in the semantic learning task did not significantly influence the likelihood of choosing the semantically-related foil over the other foils
- male child participants were 4.08 times more likely than female child participants to choose the semantically-related foil over the other foils

Regardless of whether child participants correctly or incorrectly identified a word’s meaning in the semantic learning task, when they did not identify the correct image in the identification task, they were not significantly more likely to select the semantically-related foil than any other foil, even after accounting for age, gender, and subject/item variability. However, male child participants were significantly more likely than female child participants to choose a semantically-related foil over any other foil , even after accounting for semantic learning task performance, age, and subject/item variability.

Comparing patterns of results across the two participant groups, adult and child participants appear generally no different in their word learning strategies, although there is an bias present in female children that is absent in adults.

# # maximal model
# rq2.1.c.m1 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 + SL.Correct.Enough.for.IT.|SL.Nonword)+(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to simplify model
# 
# summary(rePCA(rq2.1.c.m1)) # random slopes for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for target word (SL.Correct.Response) and nonword (SL.Nonword) account for negligible proportions of variance
# 
# # model with above random slopes removed
# rq2.1.c.m2 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.1.c.m2)) # random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for semantic learning task trial order (SL.Trial.Order.by.Task) accounts for a negligible proportion of variance
# 
# # model with random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for semantic learning task trial order (SL.Trial.Order.by.Task) removed
# rq2.1.c.m3 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.1.c.m3)) # random slopes for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for participant and identification task trial order (IT.Trial.Order.by.Task) account for non-zero proportions of variance, but the model is still too complex to converge, so will try removing them
# 
# # model with all random slopes removed
# rq2.1.c.m4 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) + (1 |SL.Nonword)+(1 |SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.1.c.m4)) # random intercepts for semantic learning task trial order (SL.Trial.Order.by.Task), target word (SL.Correct.Response), and nonword (SL.Nonword) account for negligible proportions of variance

# model with above random intercepts removed
rq2.1.c.m5 <- glmer(Semantic.vs.Other ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 |Participant.ID) +(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Semantic.vs.Other)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

mp_foil_data$Semantic.vs.Other <- relevel(mp_foil_data$Semantic.vs.Other, ref = "other foil")
tab_model(rq2.1.c.m5, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  Semantic.vs.Other
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 0.01 0.02 -1.49 0.136 Inf
SL Correct Enough for IT 0.68 0.40 -0.65 0.515 Inf
age c 0.75 0.30 -0.72 0.469 Inf
gender c 4.08 2.82 2.03 0.042 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 0.68
τ00 IT.Trial.Order.by.Task 1.82
ICC 0.43
N Participant.ID 44
N IT.Trial.Order.by.Task 31
Observations 187
Marginal R2 / Conditional R2 0.102 / 0.489

Familiar vs Unrelated Foils

Results:
- intercept is not significant, so child participants who failed to identify the meaning of the word in the semantic learning task were not significantly more likely to choose the familiar foil or unrelated foil
- 4.94 times more likely to choose a familiar foil over the unrelated foil if they had correctly identified the word’s meaning in the semantic learning task

When child participants correctly identified a word’s meaning in the semantic learning task but did not identify the correct image in the identification task, they were significantly more likely to select the familiar foil than the unrelated foil, even after accounting for age, gender, and subject/item variability.

Comparing patterns of results across the two participant groups, these results suggest semantic learning task performance had a stronger impact in children than in adults when selecting familiar vs. unrelated foils.

# # maximal model
# rq2.2.c.m1 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 + SL.Correct.Enough.for.IT.|SL.Nonword)+(1 + SL.Correct.Enough.for.IT. |SL.Correct.Response)+(1+ SL.Correct.Enough.for.IT.|SL.Trial.Order.by.Task)+(1+ SL.Correct.Enough.for.IT.|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingualr warning, so checking importance of each component to decide how to simplify model
# 
# summary(rePCA(rq2.2.c.m1)) # random slopes for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for identification task trial order (IT.Trial.Order.by.Task), semantic learning task trial order (SL.Trial.Order.by.Task), and target word (SL.Correct.Response) account for negligible proportions of variance
# 
# # model with above random slopes removed
# rq2.2.c.m2 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1 + SL.Correct.Enough.for.IT.|SL.Nonword)+(1|SL.Correct.Response)+(1|SL.Trial.Order.by.Task)+(1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.2.c.m2)) # random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for nonword (SL.Nonword) accounts for negligible proportion of variance

# # model with random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for nonword (SL.Nonword) removed
# rq2.2.c.m3 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1 + SL.Correct.Enough.for.IT. |Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response) + (1|SL.Trial.Order.by.Task) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges! but double checking importance of each component because random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for participant accounted for a pretty small proportion of variance earlier
# 
# summary(rePCA(rq2.2.c.m3)) # random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for participant still accounts for a pretty small proportion of variance
# 
# # model with random slope for semantic learning task accuracy (SL.Correct.Enough.for.IT.) for participant removed
# rq2.2.c.m4 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response) + (1|SL.Trial.Order.by.Task) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # isSingular warning, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.2.c.m4)) # random intercept for semantic learning task trial order (SL.Trial.Order.by.Task) accounts for a negligible proportion of variance
#  
# # model with random intercept for semantic learning task trial order (SL.Trial.Order.by.Task) removed
# rq2.2.c.m5 <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge, so checking importance of each component to decide how to further simplify model
# 
# summary(rePCA(rq2.2.c.m5)) # all random intercepts account for non-zero proportions of variance, but the model is still too complex to converge, so will try removing each random intercept

# model with random intercept for nonword (SL.Nonword) removed
rq2.2.c.m5.nonw <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) +(1|SL.Correct.Response) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# # model with random intercept for target word (SL.Correct.Response) removed
# rq2.2.c.m5.nocr <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # converges!

# # model with random intercept for identification task order (IT.Trial.Order.by.Task) removed
# rq2.2.c.m5.noto <- glmer(Familiar.vs.Unrelated ~ SL.Correct.Enough.for.IT. + age.c + gender.c + (1|Participant.ID) + (1|SL.Nonword)+(1|SL.Correct.Response) + (1|IT.Trial.Order.by.Task), data=subset(mp_foil_data,Group == "C" & !is.na(Familiar.vs.Unrelated)), family = 'binomial', control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e4))) # failed to converge

# comparing models that converged to see which is best
# anova(rq2.2.c.m5.nocr ,rq2.2.c.m5.nonw) # no model comes out better than the other, but already know target word has levels with observations, so will keep that variable

mp_foil_data$Familiar.vs.Unrelated <- relevel(mp_foil_data$Familiar.vs.Unrelated, ref = "unrelated foil")
tab_model(rq2.2.c.m5.nonw, show.se = TRUE,show.ci = FALSE,show.stat = TRUE, show.df = TRUE)
  Familiar.vs.Unrelated
Predictors Odds Ratios std. Error Statistic p df
(Intercept) 1.08 3.64 0.02 0.982 Inf
SL Correct Enough for IT 4.94 3.36 2.35 0.019 Inf
age c 0.79 0.32 -0.59 0.553 Inf
gender c 3.04 2.40 1.41 0.160 Inf
Random Effects
σ2 3.29
τ00 Participant.ID 0.73
τ00 IT.Trial.Order.by.Task 0.70
τ00 SL.Correct.Response 0.44
ICC 0.36
N Participant.ID 44
N SL.Correct.Response 15
N IT.Trial.Order.by.Task 31
Observations 167
Marginal R2 / Conditional R2 0.147 / 0.456