1 Experiment 4

Children in this experiment interpreted sine wave sentences under one of two conditions, either with or without a preceding clear prime. We then tested whether learning generalized to a new set of sentences in which a prime was never provided.

The task was a 2AFC judgment: Children saw a picture, and decided which of two sine wave sentences provided a better description of it (one sentence was an accurate description, the other sentence was not, e.g., the chicken has an egg versus the soup is in the bowl). The task was divided into three blocks of 8 sentences. The first two blocks were training trials, in which participants in the top-down condition heard a clear version of the picture description before they heard the two sine wave versions. In the final test block, no children received a clear speech cue.

Rather than present stimuli in a random order, they were grouped into three blocks of 8 sentences each, A, B, and C. Half the children heard the sentences in ABC order, and half in CBA; order of presentation within each block was randomized. This design allowed us to contrast performance on the final Test block with performance on the initial Training block, if necessary.

Image from a trial

Image from a trial

The sentences used in the study were all simple transitives; we used the MCDI to ensure that the words used were known (75% of 2-year-olds should be able to understand each of the nouns used). We have tested 46 children so far. All included children completed the experiment. Numbers per condition are shown below.

kable(sws %>% 
 dplyr::group_by(subject_id,age,prime_condition) %>%
 dplyr::summarise(acc = mean(accuracy)) %>%
 dplyr::select(subject_id,age,prime_condition,acc) %>%
 dplyr::group_by(age,prime_condition) %>%
 dplyr::summarise(n = length(acc)),
 caption = "Number of participants per condition")
Number of participants per condition
age prime_condition n
3 picture_only 11
3 spoken_prime 13
4 picture_only 12
4 spoken_prime 10

NB. Two-year-olds couldn’t complete this task; we tested 4 or 5 and the all fussed out, no matter the condition. We have excluded 4 three-year-olds so far, 1 in the Spoken prime condition, and 3 in the no prime condition. We excluded one 4-year-old, in the no prime condition.

2 Experimental Comparisons.

The simplest visualization is to examine average accuracy across the three blocks (two training blocks plus one test block), by condition and age.

sws$age_scale <- scale(as.numeric((as.character(sws$age_weeks))))[,1]
sws$trial_number_scale <- scale(sws$trial_number)[,1]

sws.item_block.graph <- sws %>%
  dplyr::select(rt,accuracy,subject_id,age,block,prime_condition,item_block) %>%
  dplyr::group_by(subject_id,age,block,prime_condition,item_block) %>%
  dplyr::summarise(acc.m = mean(accuracy,na.rm = T),rt.m = mean(rt,na.rm = T)) %>% 
  dplyr::group_by(age,block,prime_condition,item_block) %>%
  dplyr::select(acc.m,rt.m,age,block,prime_condition,item_block) %>%
  dplyr::summarise(acc.mean = mean(acc.m,na.rm = T),acc.sd = sd(acc.m,na.rm=T),rt.mean = mean(rt.m, na.rm = T), rt.sd = sd(rt.m,na.rm = T),acc.low = ci.low(acc.m),acc.high = ci.high(acc.m),rt.low = ci.low(rt.m),rt.high = ci.high(rt.m)) 

sws.item_block.graph$item_block_name <- ifelse(sws.item_block.graph$item_block == 0,"Block 1",
                                               ifelse(sws.item_block.graph$item_block == 1, "Block 2", "Block 3 (Test)"))
dodge <- position_dodge(width=0.9)
ggplot(subset(sws.item_block.graph, age != "2"), aes(prime_condition,acc.mean, fill = prime_condition)) + 
  geom_bar(stat = "identity",  position = dodge) +
  geom_errorbar(data = subset(sws.item_block.graph, age != "2"), aes(ymax = acc.high, ymin = acc.low), width=0.25, position = dodge) +
  facet_grid(age~item_block_name)+
  theme(axis.text.x = element_text(colour = "black", size = 12)) +
  ylab("Accuracy") +
  xlab("Condition") + 
  ylim(c(0,1))+guides(fill=FALSE)+
  geom_hline(yintercept = 0.5, lty = 2)+
  theme_cowplot()

2.1  Training Phase

The obvious feature of this dataset, which really does jump out, is that 4-year-olds show a large “pop out” effect on the training trials, which is more muted for three-year-olds. However, with additional data, the interaction is not significant.

kable(summary(glmer(accuracy ~ age_scale*prime_condition + (1|subject_id)+(1|target_sentence), 
              data = subset(sws,  age %in% c(3,4) & block != "Test Block" ), 
              family = "binomial" ))$coef, caption = "Omnibus analysis")
Omnibus analysis
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.3269686 0.1770807 7.493581 0.0000000
age_scale 0.4700835 0.1649613 2.849658 0.0043766
prime_conditionspoken_prime 1.3434892 0.3225708 4.164944 0.0000311
age_scale:prime_conditionspoken_prime 0.4138552 0.3273875 1.264114 0.2061890
# kable(summary(glmer(accuracy ~ age_scale + (1|subject_id)+(1|target_sentence), 
#               data = subset(sws,  age %in% c(3,4) & block != "Test Block" & prime_condition == "spoken_prime"), 
#               family = "binomial" ))$coef, caption = "Effect of age in top-down condition")
# 
# kable(summary(glmer(accuracy ~ age + (1|subject_id)+(1|target_sentence), 
#               data = subset(sws,  age %in% c(3,4) & block != "Test Block" & prime_condition != "spoken_prime"), 
#               family = "binomial" ))$coef, caption = "Effect of age without top-down prime")

These violin plots might be helpful in understanding the disribution of responses across the conditions.

sws.item_block.violin = sws %>%
  dplyr::select(rt,accuracy,subject_id,age,block,prime_condition,item_block,age_scale) %>%
  dplyr::group_by(subject_id,age,block,prime_condition,item_block,age_scale) %>%
  dplyr::summarise(acc.m = mean(accuracy,na.rm = T),rt.m = mean(rt,na.rm = T))
sws.item_block.violin$item_block_name <- ifelse(sws.item_block.violin$item_block == 0,"Block 1",
                                               ifelse(sws.item_block.violin$item_block == 1, "Block 2", "Block 3 (Test)"))

ggplot(subset(sws.item_block.violin, age != "2"), aes(prime_condition,acc.m, fill = prime_condition)) + 
  geom_violin() +
  facet_grid(age~item_block_name)+
  theme(axis.text.x = element_text(colour = "black", size = 12)) +
  ylab("Accuracy") +
  xlab("Condition") + 
  ylim(c(0,1))+guides(fill=FALSE)+
  geom_hline(yintercept = 0.5, lty = 2)+
  theme_cowplot()

2.2 Comparison between training and test

We can analyze whether the effect of a spoken prime differs between training and test, and whether this differs over age. Critically, we find:

  1. A two way interaction, such that the effect of a spoken prime is greater during the training period than the testing period.
  2. A three way interaction, such that this difference between training and test is greater for older children.
kable(summary(glmer(accuracy ~ age_scale*prime_condition*block + (1|subject_id)+(1|target_sentence), 
                data = subset(sws,  age %in% c(3,4)  ), 
                family = "binomial" ))$coef,
      caption = "Comparison of training to test")
Comparison of training to test
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.3919833 0.1592607 8.7402836 0.0000000
age_scale 0.5044574 0.1496178 3.3716408 0.0007472
prime_conditionspoken_prime 0.7989034 0.2902830 2.7521533 0.0059205
blockTest Block 0.1705106 0.1780726 0.9575341 0.3382977
age_scale:prime_conditionspoken_prime -0.0045619 0.2980673 -0.0153050 0.9877888
age_scale:blockTest Block 0.1127828 0.1750279 0.6443706 0.5193351
prime_conditionspoken_prime:blockTest Block -1.0374486 0.3388541 -3.0616377 0.0022013
age_scale:prime_conditionspoken_prime:blockTest Block -0.7657228 0.3492020 -2.1927792 0.0283233

We can then see how these effects vary by age. 3-year-olds show no significant effects (a marginal main effect of spoken prime), while 4-year-olds show a main effect of spoken prime, and an interaction with block (training vs test).

kable(summary(glmer(accuracy ~ prime_condition*block + (1|subject_id)+(1|target_sentence), 
                data = subset(sws,  age %in% c(3)  ), 
                family = "binomial" ))$coef,
caption = "3 year olds omnibus analysis")
3 year olds omnibus analysis
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.8968395 0.1826360 4.9105307 0.0000009
prime_conditionspoken_prime 0.6531395 0.3564463 1.8323642 0.0668972
blockTest Block 0.1119958 0.2055917 0.5447487 0.5859263
prime_conditionspoken_prime:blockTest Block -0.4360534 0.4050436 -1.0765592 0.2816772
kable(summary(glmer(accuracy ~ prime_condition*block + (1|subject_id)+(1|target_sentence), 
                data = subset(sws,  age %in% c(4)  ), 
                family = "binomial" ))$coef,
caption = "4 year olds omnibus analysis")
4 year olds omnibus analysis
Estimate Std. Error z value Pr(>|z|)
(Intercept) 2.0166264 0.2858125 7.0557672 0.0000000
prime_conditionspoken_prime 1.1056393 0.4906918 2.2532256 0.0242449
blockTest Block 0.1905076 0.3047871 0.6250515 0.5319373
prime_conditionspoken_prime:blockTest Block -1.7184356 0.5808548 -2.9584599 0.0030918

2.2.1 Criterion analysis

Previously Matt, you had suggested that we analyze whether children reach some criterion. I’ve done that now, and the results confirm the above analysis

I set the criterion to be 7/8 correct trials. What you can see, is that this analysis recapitulates the main analysis.

  1. During training, children in the spoken prime condition are more likely to reach criterion.
  2. During test, training condition has little effect.

Criterion analysis
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.4510051 0.2717510 -1.6596263 0.0969896
age_scale 1.0724418 0.3295722 3.2540418 0.0011378
blockTest Block -0.0204144 0.5435020 -0.0375608 0.9700379
prime_conditionspoken_prime 1.3660670 0.5435020 2.5134534 0.0119556
age_scale:blockTest Block 0.5928098 0.6591444 0.8993625 0.3684596
age_scale:prime_conditionspoken_prime -0.3554989 0.6591444 -0.5393338 0.5896565
blockTest Block:prime_conditionspoken_prime -1.9009120 1.0870040 -1.7487627 0.0803321
age_scale:blockTest Block:prime_conditionspoken_prime -2.5751473 1.3182889 -1.9534014 0.0507721