Motivation & Approach

Specific questions: Do E-V bilingual children show a noun/verb bias? If so, are they consistent across languages? - Does noun/verb dominance also change with age / other demographic characteristics? Possible big question: How should we characterize noun-verb dominance? Is noun-verb dominance driven by conceptual underpinnings (e.g., Mcnamara 1972) vs. language input features (Tardif 1996; also Gentner 1982)?

Alternatives

H1: Cross-linguistic consistency. Noun/verb bias is consistent across the two languages of E–V bilingual children. This pattern would be consistent with noun/verb dominance being underpinned primarily by language-independent conceptual differences.

H2: Cross-linguistic inconsistency. Noun/verb bias differs across the two languages of E–V bilingual children. This pattern would be consistent with noun/verb dominance being shaped primarily by language-specific input features. Importantly, cross-linguistic inconsistency could take at least two forms:

H2.1: Monolingual-like biases: Bilingual children show a noun/verb bias in each language that is comparable to the bias observed in monolingual children acquiring that language. This would suggest that each language’s bias is largely shaped by its own input.

H2.2: Language-specific biases with a lexical “accent”: Bilingual children show different noun/verb biases across their two languages, but each language’s bias is shifted relative to the corresponding monolingual pattern. This would suggest that language-specific input interacts with the bilingual child’s cross-linguistic lexical experience.

Note: We would need additional data from monolingual speakers to differentiate between H2.1 and H2.2.

Methodological Approach

  1. Fit bifactor IRT models that estimate kids’ noun ability & verb ability, in both English and Vietnamese. Check whether these models fit the data better than the corresponding unidimensional IRT model.
  2. Use estimated noun ability to bootstrap 95% CI noun ability for each kid, in each language.
  3. Check whether 95% CI EN-VI overlap, how much, does this change with age / language exposure for each language?

Methods Overview

The existing 2PL models (02_IRT_analysis_en.Rmd, 02_IRT_analysis_vi_0716.Rmd) estimate a single, unidimensional production-vocabulary ability per child. These were the best fitting models for English and Vietnamese vocabulary respectively (compared with unidimensional Rasch/3PL/4PL). Here we additionally estimate noun-specific and verb-specific ability using a confirmatory bifactor model: every item loads on a general factor (G), and items belonging to noun or verb categories additionally load on a noun-specific (S1) or verb-specific (S2) factor. Each child therefore gets three ability estimates per language:

  • ability_general (G): overall production vocabulary, net of noun/verb group membership
  • ability_noun (S1): noun ability beyond what is explained by general vocabulary ability
  • ability_verb (S2): verb ability beyond what is explained by general vocabulary ability

Item-to-domain mapping is based on item_kind (the CDI category embedded in each column name, e.g. action_words, animals, …):

  • verb = action_words
  • noun = animals, body_parts, clothing, food_drink, furniture_rooms, household, outdoor, people, places, toys, vehicles
  • all other item_kinds (descriptive_words, pronouns, quantifiers, helping_verbs, question_words, connecting_words, locations, games_routines, sounds, time_words) load on the general factor only.

Modeling notes

  • A plain 3-dimensional mirt() fit using rectangular quadrature does not scale to ~680 items and is extremely slow to converge. method = "QMCEM" (quasi-Monte Carlo integration) is mirt’s documented fix for 3+ dimensional models.
  • Without priors, item discriminations on the specific (noun/verb) factors blow up into Heywood cases (|a| > 50, NaN log-likelihood) given the current sample size (~100 usable children per language). Log-normal priors on a1/a2/a3 keep discriminations positive and bounded, which resolves this.
  • We use mirt() directly (not the bfactor() convenience wrapper) because bfactor()’s fast dimension-reduction EM algorithm does not respect the PRIOR statements needed to stabilize the fit at this sample size.
noun_kinds <- c("animals", "body_parts", "clothing", "food_drink", "furniture_rooms",
                "household", "outdoor", "people", "places", "toys", "vehicles")
verb_kinds <- c("action_words")

lang_config <- list(
  en = list(
    data_file   = "data/EnglishAmericanWS_Bui_data_redact.csv",
    fields_file = "data/EnglishAmericanWS_Bui_fields.csv",
    prefix      = "cat_eng_",
    out_dir     = "models/en"
  ),
  vi = list(
    data_file   = "data/VietnameseWS_Bui_data.csv",
    fields_file = "data/VietnameseWS_Bui_fields.csv",
    prefix      = "cat_vie_",
    out_dir     = "models/vi"
  )
)

We are currently not filtering any data, but this function is written here in case we want to filter kids who do not produce any English words etc.

English

# coef(mod_bifactor, simplify = TRUE)

en_bifactor_1pl <- fit_bifactor_variant(d_mat_en, d_items_en, out_dir = "models/en", itemtype = "Rasch")
en_bifactor_2pl <- fit_bifactor_variant(d_mat_en, d_items_en, out_dir = "models/en", itemtype = "2PL")
en_bifactor_3pl <- fit_bifactor_variant(d_mat_en, d_items_en, out_dir = "models/en", itemtype = "3PL")
en_bifactor_4pl <- fit_bifactor_variant(d_mat_en, d_items_en, out_dir = "models/en", itemtype = "4PL")

Model comparison: Bifactor 1PL/2PL/3PL/4PL

Compares the bifactor structure (G + noun + verb factors) fit at each itemtype, plus the plain unidimensional 2PL (mod_2pl) as a baseline.

English: pairwise nested-model comparisons.
Model AIC BIC logLik df
Bifactor 1PL 39314.19 41335.98 -18973.10 NA
Bifactor 2PL 40909.21 46315.41 -18625.60 1145
Bifactor 2PL 40909.21 46315.41 -18625.60 NA
Bifactor 3PL 42201.92 49621.05 -18590.96 681
Bifactor 2PL 40909.21 46315.41 -18625.60 NA
Bifactor 4PL 43372.01 52804.06 -18495.01 1362
Unidim 2PL 40365.38 44391.22 -18820.69 NA
Bifactor 2PL 40909.21 46315.41 -18625.60 467
Unidim 2PL 40365.38 44391.22 -18820.69 NA
Bifactor 1PL 39314.19 41335.98 -18973.10 -678
English: fit statistics across the four bifactor itemtypes.
Model AIC SABIC HQ BIC logLik logPost
1PL 39314.19 39171.76 40135.76 41335.98 -18973.10 NA
2PL 40909.21 40528.34 43106.07 46315.41 -18625.60 -19303.36
3PL 42201.92 41679.24 45216.75 49621.05 -18590.96 -19291.79
4PL 43372.01 42707.52 47204.81 52804.06 -18495.01 -19183.33
Unidim2PL 40365.38 40081.76 42001.32 44391.22 -18820.69 NA

Model selection

Selects the best-fitting bifactor variant by BIC (penalizes the extra noun/verb discrimination – and, for 3PL/4PL, guessing/upper-asymptote – parameters more heavily than AIC; with only 142 children in this sample, BIC’s stronger complexity penalty is the more conservative choice). Swap BIC for AIC below to select on AIC instead. All of the inferential analysis below (noun/verb dominance, age effects, etc.) is run on this selected model, referred to from here on as mod_bifactor.

The best model is the Bifactor 1PL.

## Best-fitting English bifactor variant (by BIC): 1PL
## Converged: TRUE | Iterations: 115 | logLik: -18973.1

Investigate ability_noun and ability_verb for spread.

summary(en_fscores$ability_noun)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -1.7579 -0.4934 -0.1396 -0.1017  0.1870  4.4349
summary(en_fscores$ability_verb)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -1.573131 -0.279244 -0.007532 -0.018926  0.068660  2.350589
sd(en_fscores$ability_noun)
## [1] 0.7762871
sd(en_fscores$ability_verb)
## [1] 0.5171733

Step 2: 95% CI on noun ability (item-resampling bootstrap)

bootstrap_noun_ci() (defined above) gives each child a nonparametric 95% bootstrap CI on ability_noun, built by resampling items with replacement (B = 1000 replicates) and re-estimating that child’s (ability-general, ability-noun, ability-verb) MAP under the fixed, already-fitted item parameters – see the function definition for why a full model-refit bootstrap isn’t used. Results (the point estimates and CI bounds, not the raw B draws) are cached to models/en/noun_boot_ci_<variant>.Rds, so re-knitting doesn’t re-run the ~3-4 minute bootstrap unless the cache file is deleted or a different bifactor variant gets selected. We also attach demographics (age, % active English/Vietnamese exposure) here for use in the cross-language comparison below.

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1000  0.1069  0.2209  0.2165  0.2861  0.3959
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3845  0.4208  0.8482  0.8447  1.1120  1.5634

ability_noun and ability_verb share a nominal prior scale (the bifactor model fixes all three factor variances to 1), but their empirical spread differs substantially – each specific factor is measured by a much smaller, differently-reliable domain-specific item set than ability_general, so MAP shrinkage compresses them to different degrees (e.g. sd(ability_verb) is meaningfully smaller than sd(ability_noun) in this sample).

ggplot(aes(x = ability_noun, y = ability_verb),
       data = en_fscores) +
  geom_point() +
  geom_abline(yintercept = 0, slope = 1, linetype = "dashed")
## Warning in geom_abline(yintercept = 0, slope = 1, linetype = "dashed"):
## Ignoring unknown parameters: `yintercept`

Double-checking that nouns only load onto nouns + general, verbs only load onto verbs + general, others only load onto general. All clear.

English: mean discrimination on G/S1(noun)/S2(verb) by domain.
domain n_items mean_a1 mean_a2 mean_a3
noun 364 1 1 0
other 214 1 0 0
verb 103 1 0 1

Vietnamese

vi_bifactor_1pl <- fit_bifactor_variant(d_mat_vi, d_items_vi, out_dir = "models/vi", itemtype = "Rasch")
vi_bifactor_2pl <- fit_bifactor_variant(d_mat_vi, d_items_vi, out_dir = "models/vi", itemtype = "2PL")
vi_bifactor_3pl <- fit_bifactor_variant(d_mat_vi, d_items_vi, out_dir = "models/vi", itemtype = "3PL")
vi_bifactor_4pl <- fit_bifactor_variant(d_mat_vi, d_items_vi, out_dir = "models/vi", itemtype = "4PL")

Model comparison: Bifactor 1PL/2PL/3PL/4PL

Compares the bifactor structure (G + noun + verb factors) fit at each itemtype, plus the plain unidimensional 2PL (mod_2pl) as a baseline.

Vietnamese: pairwise nested-model comparisons.
Model AIC BIC logLik df
Bifactor 1PL 62866.50 64906.02 -30743.25 NA
Bifactor 2PL 62597.43 68098.22 -29437.71 1171
Bifactor 2PL 62597.43 68098.22 -29437.71 NA
Bifactor 3PL 63875.66 71407.11 -29389.83 687
Bifactor 2PL 62597.43 68098.22 -29437.71 NA
Bifactor 4PL 65000.88 74562.98 -29265.44 1374
Unidim 2PL 64254.78 68316.09 -30753.39 NA
Bifactor 2PL 62597.43 68098.22 -29437.71 487
Unidim 2PL 64254.78 68316.09 -30753.39 NA
Bifactor 1PL 62866.50 64906.02 -30743.25 -684
Vietnamese: fit statistics across the four bifactor itemtypes.
Model AIC SABIC HQ BIC logLik logPost
1PL 62866.50 62722.81 63695.28 64906.02 -30743.25 NA
2PL 62597.43 62209.89 64832.73 68098.22 -29437.71 -30081.22
3PL 63875.66 63345.07 66936.14 71407.11 -29389.83 -30021.71
4PL 65000.88 64327.22 68886.53 74562.98 -29265.44 -29905.58
Unidim2PL 64254.78 63968.66 65905.13 68316.09 -30753.39 NA

Model selection

Selects the best-fitting bifactor variant by BIC (see the English section above for the rationale). All of the inferential analysis below is run on this selected model, referred to from here on as mod_bifactor.

The best model is Bifactor 1PL (same as English).

## Best-fitting Vietnamese bifactor variant (by BIC): 1PL
## Converged: TRUE | Iterations: 62 | logLik: -30743.2

Investigate ability_noun and ability_verb for spread.

summary(vi_fscores$ability_noun)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -2.59437 -0.51041 -0.07837 -0.04878  0.35845  2.06732
summary(vi_fscores$ability_verb)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -2.56118 -0.74693 -0.22793 -0.02973  0.55725  4.02561
sd(vi_fscores$ability_noun)
## [1] 0.7596996
sd(vi_fscores$ability_verb)
## [1] 1.053916

Step 2: 95% CI on noun ability (item-resampling bootstrap)

Same procedure as the English section above (bootstrap_noun_ci(), defined earlier): a nonparametric 95% bootstrap CI on ability_noun per child, from B = 1000 item-resampling replicates under the fixed, already-fitted item parameters.

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1663  0.2027  0.2390  0.2536  0.2950  0.3764
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.6588  0.7982  0.9243  0.9906  1.1518  1.4694

ability_noun and ability_verb share a nominal prior scale but differ in empirical spread due to differential shrinkage (see the English section above for why).

ggplot(aes(x = ability_noun, y = ability_verb),
       data = vi_fscores) +
  geom_point() +
  geom_abline(yintercept = 0, slope = 1)
## Warning in geom_abline(yintercept = 0, slope = 1): Ignoring unknown parameters:
## `yintercept`

Vietnamese: mean discrimination on G/S1(noun)/S2(verb) by domain.
domain n_items mean_a1 mean_a2 mean_a3
noun 384 1 1 0
other 200 1 0 0
verb 103 1 0 1

Cross-language comparison

row_id is a child-level identifier shared by the English and Vietnamese surveys (unlike response_id, which is per-survey-response), confirmed to fully overlap across the two raw data files, and age is identical across the two surveys for the same child. It’s used here to join each child’s independently-derived English and Vietnamese noun-ability bootstrap CIs (Step 2 above), to ask (Step 3) whether a child’s noun ability is consistent across their two languages.

Step 3: Do the English and Vietnamese noun-ability 95% CIs overlap?

The English and Vietnamese bifactor models are fit independently, so their ability_noun scales aren’t directly comparable: different item counts, difficulties, and discriminations per language, and (per the bootstrap diagnostics above) different amounts of MAP shrinkage. Comparing raw CI overlap would conflate true cross-linguistic consistency with the two instruments simply having different empirical spreads – the same reason the (now-removed) noun/verb D score was z-scored within language rather than computed on raw units. So before computing overlap, ability_noun and its CI bounds are z-scored within each language, using that language’s own full-sample mean/SD (the same affine transform applied to the point estimate and both CI bounds, which preserves CI validity).

For each child with both an English and a Vietnamese noun-ability estimate, overlap_amount is the signed length of the intersection of their two (standardized) 95% CIs: min(upper_en, upper_vi) - max(lower_en, lower_vi). A positive value is the width (in within-language SD units) of CI overlap; a negative value is the size of the gap between two non-overlapping intervals. overlap is just overlap_amount > 0.

142 children have a noun-ability estimate in both languages (out of 142 English and 142 Vietnamese children retained after filtering).

## 63.4 % of children have overlapping EN/VI 95% CIs on ability_noun
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -4.30295 -0.74964  0.42418  0.03496  0.86430  1.84775

Gap cases (overlap_amount < 0, non-overlapping CIs) are colored by which language is higher, using the same point-estimate comparison used to derive overlap_amount’s sign; overlapping cases are left uncolored (grey) since “which is higher” isn’t a clean distinction once the two CIs intersect.

production_en/production_vi (total word count across all items, not just nouns – computed in the filter-data step above but not currently used to drop anyone) let us check whether the histogram above is being driven by children who are zero-producers in one language altogether, rather than by genuine noun-specific gaps. 42 of 142 children produced zero total words in at least one language and are excluded below.

## 77 % of children have overlapping EN/VI 95% CIs on ability_noun (excluding zero-producers)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -4.30295  0.08697  0.60212  0.44293  0.98035  1.84775

One row per child, showing both language-specific 95% CIs on ability_noun side by side (small vertical offset only so the two intervals don’t visually overlap). Children are sorted by overlap_amount (ascending), so the least overlapping/most-gapped pairs are at the top and the most-overlapping pairs are at the bottom – the visual pattern should track the histogram above. Floor-score children (0 of that language’s noun items produced) are marked with a star instead of a dot – these are exactly the cases where the bootstrap CI is least trustworthy (see the discussion of why the point estimate can fall outside its own CI, above), so it’s worth being able to spot them.

Does CI overlap change with age or language exposure?

pct_active_english and pct_active_vietnamese are substantially negatively correlated for these bilingual children (most report only these two active languages, so more of one tends to mean less of the other) – see the correlation below. To avoid collinearity in one regression, we lead with pct_active_vietnamese (the heritage-language exposure) as the primary predictor; swap in pct_active_english to check the mirror-image model.

## cor(pct_active_english, pct_active_vietnamese): -0.639

Older kids are more likely to show divergence between noun dominance in the two languages. I added pct_active_vietnamese as a way to “control” for language exposure, but not sure if that’s the correct approach.

## 
## Call:
## lm(formula = overlap_amount ~ age + pct_active_vietnamese, data = cross_lang)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1703 -0.4816  0.2303  0.7916  1.6698 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1.679632   0.438893   3.827 0.000195 ***
## age                   -0.052714   0.015448  -3.412 0.000844 ***
## pct_active_vietnamese -0.005937   0.002775  -2.140 0.034142 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.081 on 139 degrees of freedom
## Multiple R-squared:  0.09639,    Adjusted R-squared:  0.08339 
## F-statistic: 7.414 on 2 and 139 DF,  p-value: 0.0008722
## 
## Call:
## lm(formula = overlap_amount ~ age + pct_active_vietnamese, data = filter(cross_lang, 
##     production_en > 0, production_vi > 0))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.4479 -0.3819  0.1753  0.5426  1.1744 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1.823644   0.412564   4.420 2.57e-05 ***
## age                   -0.052550   0.013870  -3.789 0.000263 ***
## pct_active_vietnamese -0.001655   0.003139  -0.527 0.599185    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8265 on 97 degrees of freedom
## Multiple R-squared:  0.129,  Adjusted R-squared:  0.1111 
## F-statistic: 7.186 on 2 and 97 DF,  p-value: 0.00123
## `geom_smooth()` using formula = 'y ~ x'

## `geom_smooth()` using formula = 'y ~ x'

Noun ability in Vietnamese tracks with % active in Vietnamese (makes sense!) But, kids who have an even split seem to have both overlap 95% CI and gaps. Some kids whose parents reported high Viet use also show EN > VI gap.

## `geom_smooth()` using formula = 'y ~ x'

## `geom_smooth()` using formula = 'y ~ x'

## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Conclusions / Questions

The majority of kids (63% - 77%, depending on whether we count the kids who do not produce words in one language) show “noun-dominance” that are consistent between English and Vietnamese. This would be consistent with the hypothesis that noun/verb dominance are underpinned by conceptual differences.

Another possibility is that kids tend to get exposed to translation equivalents. We would need to establish that their language input in the languages are actually different, but I think this is unlikely…

Questions:

  1. How do we test whether language exposure determine overlap or not?

  2. For kids who are more “balanced” in language exposure, what determines whether they have better ability in English vs. Vietnamese?