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
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")| 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.
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()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")| 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()We can analyze whether the effect of a spoken prime differs between training and test, and whether this differs over age. Critically, we find:
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")| 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")| 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")| 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 |
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.
| 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 |