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)?
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.
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 membershipability_noun (S1): noun ability beyond what is
explained by general vocabulary abilityability_verb (S2): verb ability beyond what is
explained by general vocabulary abilityItem-to-domain mapping is based on item_kind (the CDI
category embedded in each column name, e.g. action_words,
animals, …):
action_wordsanimals,
body_parts, clothing, food_drink,
furniture_rooms, household,
outdoor, people, places,
toys, vehiclesitem_kinds (descriptive_words,
pronouns, quantifiers,
helping_verbs, question_words,
connecting_words, locations,
games_routines, sounds,
time_words) load on the general factor only.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.|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.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.
# 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")
Compares the bifactor structure (G + noun + verb factors) fit at each
itemtype, plus the plain unidimensional 2PL (mod_2pl) as a
baseline.
| 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 |
| 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 |
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
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.
| domain | n_items | mean_a1 | mean_a2 | mean_a3 |
|---|---|---|---|---|
| noun | 364 | 1 | 1 | 0 |
| other | 214 | 1 | 0 | 0 |
| verb | 103 | 1 | 0 | 1 |
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")
Compares the bifactor structure (G + noun + verb factors) fit at each
itemtype, plus the plain unidimensional 2PL (mod_2pl) as a
baseline.
| 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 |
| 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 |
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
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`
| domain | n_items | mean_a1 | mean_a2 | mean_a3 |
|---|---|---|---|---|
| noun | 384 | 1 | 1 | 0 |
| other | 200 | 1 | 0 | 0 |
| verb | 103 | 1 | 0 | 1 |
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.
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.
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'
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:
How do we test whether language exposure determine overlap or not?
For kids who are more “balanced” in language exposure, what determines whether they have better ability in English vs. Vietnamese?