(Appendix C) How English orthographic proficiency modulates visual attention span in Italian learners with and without dyslexia

Venagli, I., Kupisch, T., Lallier, M.

Participants

Age

Age
mean sd range
17.03 1.41 14.11
17.03 1.41 20.50
Output of lm model: Age by group
contrast estimate SE df t.ratio p.value
DYS - TD 0.2180656 0.2187545 92 0.9968508 0.3214516
## 
##  Kruskal-Wallis rank sum test
## 
## data:  age by group
## Kruskal-Wallis chi-squared = 0.75681, df = 1, p-value = 0.3843

Age of EN acquisition

AoO
mean sd
5.66 0.86

Current exposure to English

Students per school

school n
NA 2
LAE 39
LC 17
MEN 32

Hours of EN classes

school mean sd range
NA 0.50 0.71 0-1
LAE 3.67 0.62 3-5
LC 3.12 0.33 3-4
MEN 2.84 0.45 2-4

Proficiency (self-assessed)

#### Use (self-assessed)

Reading exposure (self-assessed)

Number of other FLs

school mean sd range
NA 2.50 0.71 2-3
LAE 3.41 0.55 3-5
LC 1.94 0.56 1-3
MEN 2.06 0.56 1-3

Control tasks

Reading performance & exclusion

Initial sample
group n
DYS 29
TD 61
### Model reading performance 

reading %>% summarize(mean = round(mean(wr_time_z),2),
                      sd = round(sd(wr_time_z),2),
                      min = round(min(wr_time_z),2),
                      max = round(max(wr_time_z),2),
                      .by = group) %>% 
  mutate(range = paste(min, max, sep = "-")) %>% dplyr::select(-min, -max) %>% 
  kable(caption = "Word reading fluency") %>% kable_minimal()
Word reading fluency
group mean sd range
DYS -4.46 2.83 -14.12–0.58
TD -0.73 1.18 -4.97-1.65
reading %>% summarize(mean = round(mean(wr_error_z),2),
                      sd = round(sd(wr_error_z),2),
                      min = round(min(wr_error_z),2),
                      max = round(max(wr_error_z),2),
                      .by = group) %>% 
  mutate(range = paste(min, max, sep = "-")) %>% dplyr::select(-min, -max) %>% 
  kable(caption = "Word reading accuracy") %>% kable_minimal()
Word reading accuracy
group mean sd range
DYS -2.80 2.53 -9.07-1.04
TD -0.06 0.82 -2.36-1.18
reading %>% summarize(mean = round(mean(nwr_time_z),2),
                      sd = round(sd(nwr_time_z),2),
                      min = round(min(nwr_time_z),2),
                      max = round(max(nwr_time_z),2),
                      .by = group) %>% 
  mutate(range = paste(min, max, sep = "-")) %>% dplyr::select(-min, -max) %>% 
  kable(caption = "Nonword reading fluency") %>% kable_minimal()
Nonword reading fluency
group mean sd range
DYS -3.62 3.45 -19.39–0.44
TD -0.36 1.15 -4.58-1.8
reading %>% summarize(mean = round(mean(nwr_error_z),2),
                      sd = round(sd(nwr_error_z),2),
                      min = round(min(nwr_error_z),2),
                      max = round(max(nwr_error_z),2),
                      .by = group) %>% 
  mutate(range = paste(min, max, sep = "-")) %>% dplyr::select(-min, -max) %>% 
  kable(caption = "Nonword reading accuracy") %>% kable_minimal()
Nonword reading accuracy
group mean sd range
DYS -2.97 2.97 -11.78-0.75
TD -0.28 1.29 -4.55-1.29
### word reading fluency 
reading %>% 
  filter(!startsWith(ID, "VER")) %>% 
  filter(ID != "MEN12" & ID != "MEN18" & ID != "MEN26" & ID != "LAE33") %>% 
  mutate(group = as.factor(group)) %>% 
  
  lm(formula = wr_time_z ~ group) -> model.wr.fluency


### word reading accuracy 
reading %>% 
  filter(!startsWith(ID, "VER")) %>% 
  filter(ID != "MEN12" & ID != "MEN18" & ID != "MEN26" & ID != "LAE33") %>% 
  mutate(group = as.factor(group)) %>% 
  
  lm(formula = wr_error_z ~ group) -> model.wr.acc

### nonword reading fluency 
reading %>% 
  filter(!startsWith(ID, "VER")) %>% 
  filter(ID != "MEN12" & ID != "MEN18" & ID != "MEN26" & ID != "LAE33") %>% 
  mutate(group = as.factor(group)) %>% 
  
  lm(formula = nwr_time_z ~ group) -> model.nwr.fluency


### nonword reading accuracy 
reading %>% 
  filter(!startsWith(ID, "VER")) %>% 
  filter(ID != "MEN12" & ID != "MEN18" & ID != "MEN26" & ID != "LAE33") %>% 
  mutate(group = as.factor(group)) %>% 
  
  lm(formula = nwr_error_z ~ group) -> model.nwr.acc
  wr time z wr error z
Predictors Estimates CI p Estimates CI p
(Intercept) -4.15 -4.80 – -3.51 <0.001 -2.75 -3.35 – -2.15 <0.001
group [TD] 3.44 2.65 – 4.24 <0.001 2.74 2.00 – 3.49 <0.001
Observations 86 86
R2 / R2 adjusted 0.471 / 0.465 0.392 / 0.385
  nwr time z nwr error z
Predictors Estimates CI p Estimates CI p
(Intercept) -3.03 -3.58 – -2.49 <0.001 -3.04 -3.80 – -2.27 <0.001
group [TD] 2.69 2.02 – 3.36 <0.001 2.75 1.81 – 3.69 <0.001
Observations 86 86
R2 / R2 adjusted 0.432 / 0.425 0.287 / 0.278

### Exclusion: 
reading %>% dplyr::select(ID, reading.score, group.exclusion) -> reading
left_join(df, reading, by = "ID") -> df

df %>%
  mutate(
    exclude = case_when(
      ID == "VER02" ~ 1, # ADHD - university - DYS
      ID == "VER04" ~ 1, # ADHD - university - DYS
      ID == "MEN12" ~ 1, # discalculia - 3rd - TD
      ID == "MEN18" ~ 1, # disgrafia, discalculia - 3rd - TD
      ID == "MEN26" ~ 1, # disgrafia - 5th - TD, 
      ID == "LAE33" ~ 1, # disgrafia, disortografia, 3rd - TD, 
      
      ### new exclusion criteria: 
      ID == "LAE38" ~ 1,
      ID == "LC19" ~ 1, 
      ID == "MEN29" ~ 1, 
      ID == "MEN02" ~ 1, 
      
      
      ID == "MEN10" ~ 1, 
      ID == "LAE23" ~ 1, 
      TRUE ~ 0
    )
  ) %>%
  filter(exclude == 0) %>%
  
  
  filter(ID != "VER01" & ID != "VER03") %>% 
  dplyr::select(-exclude) -> df
Analyzed sample
group n
DYS 29
TD 51

Italian orthographic knowledge

Italian orthographic knowledge
group mean sd min max
DYS 29.55 10.18 12 50
TD 46.35 9.36 25 59
df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group), 
         age = as.double(age), age = scale(age), age = as.double(age)) %>% 
  glm(formula = it.ok ~ group + age, family = poisson(link = "log")) -> model.it.ok
  it ok
Predictors Incidence Rate Ratios CI p
(Intercept) 28.57 26.64 – 30.59 <0.001
group [TD] 1.65 1.52 – 1.79 <0.001
age 1.08 1.04 – 1.12 <0.001
Observations 80
R2 Nagelkerke 0.866
LR Chisq Df Pr(>Chisq)
group 153.473 1 0
age 17.834 1 0

Digit span memory

forward
group mean.for sd min max
DYS 5.97 0.91 4 8
TD 6.63 1.11 4 9
backward
group mean.for sd min max
DYS 4.24 1.9 0 8
TD 5.39 1.4 3 8
df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group)) %>% 
  
  glm(formula = forward ~ group + age, family = poisson(link = "log")) -> model.forward


df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group)) %>% 
  
  glm(formula = backward ~ group + age, family = poisson(link = "log")) -> model.backward
  forward backward
Predictors Incidence Rate Ratios CI p Incidence Rate Ratios CI p
(Intercept) 6.02 1.96 – 18.57 0.002 1.93 0.55 – 6.80 0.308
group [TD] 1.11 0.92 – 1.35 0.287 1.33 1.06 – 1.66 0.013
age 1.00 0.94 – 1.06 0.987 1.05 0.97 – 1.12 0.214
Observations 80 80
R2 Nagelkerke 0.094 0.151
LR Chisq Df Pr(>Chisq)
group 1.144 1 0.285
age 0.000 1 0.987
LR Chisq Df Pr(>Chisq)
group 6.333 1 0.012
age 1.537 1 0.215

Phonological awareness

### Accuracy 
df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group)) %>% 
  
  glm(formula = pa.acc ~ group * age, family = poisson(link = "log")) -> model.pa.acc

tab_model(model.pa.acc)
  pa acc
Predictors Incidence Rate Ratios CI p
(Intercept) 6.96 2.55 – 18.85 <0.001
group [TD] 5.59 1.82 – 17.26 0.003
age 1.09 1.03 – 1.15 0.004
group [TD] × age 0.92 0.86 – 0.98 0.008
Observations 80
R2 Nagelkerke 0.483
emtrends(model.pa.acc, pairwise ~ group, var = "age", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(age.trend:z.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) %>% 
  kable() %>% kable_styling()
group age.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS 0.08 0.03 Inf 0.03 0.14 2.91 0.004
TD 0.00 0.02 Inf -0.03 0.03 -0.19 0.849
### RT 

df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group),
         pa.rt = log(pa.rt)) %>% 
  
  lm(formula = pa.rt ~ group * age) -> model.pa.rt

tab_model(model.pa.rt)
  pa rt
Predictors Estimates CI p
(Intercept) 11.52 8.95 – 14.08 <0.001
group [TD] -2.98 -5.94 – -0.02 0.049
age -0.13 -0.27 – 0.02 0.088
group [TD] × age 0.13 -0.04 – 0.30 0.143
Observations 80
R2 / R2 adjusted 0.406 / 0.382
### BIS 
df %>% 
  distinct(ID, .keep_all = T) %>% 
  mutate(group = as.factor(group)) %>% 
  
  lm(formula = tot.bis.pa ~ group * age) -> model.pa.bis

tab_model(model.pa.bis)
  tot bis pa
Predictors Estimates CI p
(Intercept) -13.80 -21.51 – -6.08 0.001
group [TD] 15.07 6.16 – 23.97 0.001
age 0.70 0.26 – 1.14 0.002
group [TD] × age -0.72 -1.23 – -0.21 0.007
Observations 80
R2 / R2 adjusted 0.467 / 0.446
Anova(model.pa.bis, type = "III") %>% as.data.frame() %>% mutate_all(~round(.x,3)) %>% kable() %>% kable_minimal()
Sum Sq Df F value Pr(>F)
(Intercept) 24.613 1 12.692 0.001
group 22.028 1 11.359 0.001
age 19.832 1 10.226 0.002
group:age 15.181 1 7.828 0.007
Residuals 147.388 76 NA NA
emtrends(model.pa.bis, pairwise ~ group, var = "age", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(age.trend:t.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) %>% 
  kable() %>% kable_styling()
group age.trend SE df lower.CL upper.CL t.ratio p.value
DYS 0.70 0.22 76 0.26 1.14 3.20 0.002
TD -0.02 0.13 76 -0.28 0.25 -0.13 0.899

English orthographic knowledge

  en ok bis
Predictors Estimates CI p
(Intercept) -4.12 -7.89 – -0.35 0.033
group [TD] 2.36 1.72 – 2.99 <0.001
age 0.16 -0.05 – 0.37 0.139
Observations 80
R2 / R2 adjusted 0.418 / 0.403
Sum Sq Df F value Pr(>F)
group 92.365 1 54.577 0.000
age 3.785 1 2.236 0.139
Residuals 130.315 77 NA NA

LexTALE

To measure L2 vocabulary size the LexTALE test was used (Lemhöfer & Broersma, 2012). The test includes a total of 60 items, 40 real words and 20 nonwords, and was implemented on Gorilla (Anwyl-Irvine et al., 2018). Participants were instructed to accept or reject the items depending on whether or not they were familiar with them. Items were not randomized as per instructions on the LexTALE website . Accuracy in the LexTALE (Lemhöfer & Broersma, 2012) was computed with the formula: LexTALE score = Tot Correct - 2* False Alarms

group mean sd min max
DYS 8.79 6.18 -2 29
TD 13.33 6.32 0 34
  tot lextale
Predictors Estimates CI p
(Intercept) -16.37 -33.73 – 0.99 0.064
group [TD] 5.89 2.96 – 8.81 <0.001
age 1.43 0.45 – 2.40 0.005
Observations 80
R2 / R2 adjusted 0.199 / 0.178
Sum Sq Df F value Pr(>F)
group 577.093 1 16.066 0.000
age 304.165 1 8.468 0.005
Residuals 2765.927 77 NA NA

Descriptive stats

DYS
Consonant Position Accuracy (M) SD
1 0.71 0.45
2 0.73 0.45
3 0.69 0.46
4 0.60 0.49
5 0.57 0.50
TD
Consonant Position Accuracy (M) SD
1 0.86 0.35
2 0.79 0.41
3 0.82 0.39
4 0.74 0.44
5 0.71 0.46

Correlations

Table TD

VA Span (mean accuracy) Orthographic Knowledge (EN) Orthographic Knowledge (IT) Phonological Awareness Digit-span memory (forward) Digit-span memory (backward) LexTALE Number other FLs
VA Span (mean accuracy) 1 0.34 0.27 0.43 0.34 0.34 0.3 0.19
Orthographic Knowledge (EN) 0.34 1 0.29 0.38 0.28 0.24 0.66 0.36
Orthographic Knowledge (IT) 0.27 0.29 1 -0.15 0.08 0.16 0.36 -0.03
Phonological Awareness 0.43 0.38 -0.15 1 0.35 0.18 0.14 0.29
Digit-span memory (forward) 0.34 0.28 0.08 0.35 1 0.36 0.27 0.03
Digit-span memory (backward) 0.34 0.24 0.16 0.18 0.36 1 0.22 -0.09
LexTALE 0.3 0.66 0.36 0.14 0.27 0.22 1 0.08
Number other FLs 0.19 0.36 -0.03 0.29 0.03 -0.09 0.08 1

Table DYS

VA Span (mean accuracy) Orthographic Knowledge (EN) Orthographic Knowledge (IT) Phonological Awareness Digit-span memory (forward) Digit-span memory (backward) LexTALE Number other FLs
VA Span (mean accuracy) 1 0.46 0.25 0.36 -0.01 0.27 0.17 0.13
Orthographic Knowledge (EN) 0.46 1 0.58 0.59 0.22 0.04 0.55 0.45
Orthographic Knowledge (IT) 0.25 0.58 1 0.35 0.04 -0.04 0.11 0.04
Phonological Awareness 0.36 0.59 0.35 1 0.32 0.41 0.42 0.37
Digit-span memory (forward) -0.01 0.22 0.04 0.32 1 -0.02 0.13 0.07
Digit-span memory (backward) 0.27 0.04 -0.04 0.41 -0.02 1 0.07 -0.05
LexTALE 0.17 0.55 0.11 0.42 0.13 0.07 1 0.55
Number other FLs 0.13 0.45 0.04 0.37 0.07 -0.05 0.55 1

Inferential stats accuracy

VA span ~ EN Orthographic Knowledge

### model 
dprime.df %>% 

### remove fillers 
  filter(pos != "none") %>% 
  
### prepare data 
  mutate(accuracy = as.factor(accuracy), 
         pos = as.factor(pos),
         ID = as.factor(ID)) %>% 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  
  ### scale measures
  mutate(en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok),
         memory.score = scale(memory.score)) %>% 
  
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  
  ### model
  glmer(formula = 
          
          accuracy ~  
          pos * OrthKnowledgeEN * group + 
          # memory.score * group + 
          memory.score + 
          
          
          (1 |ID) + (1|string), 
        family = "binomial",
        control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000))) -> m1

# drop1(m1, test = "Chisq")
# Anova(m1, type = "III")
Model 1: Anova
Chisq Df p.value
(Intercept) 39.37 1 0.000
pos 22.10 4 0.000
OrthKnowledgeEN 7.90 1 0.005
group 1.55 1 0.213
memory.score 8.33 1 0.004
pos:OrthKnowledgeEN 6.49 4 0.165
pos:group 3.37 4 0.498
OrthKnowledgeEN:group 0.88 1 0.349
pos:OrthKnowledgeEN:group 9.70 4 0.046

Post-hoc analysis

  1. Is there a difference between participants with high (+2SD) and low (-2SD) levels of EN Orthographic Knowledge in each consonant position (1 to 5)?
# POST HOC ANALYSIS 
emmeans(m1, pairwise ~ OrthKnowledgeEN | group | pos, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrast %>% summary() %>% emmeans_glmer_table() -> m1.int1
DYS
contrast group pos estimate SE df z.ratio p.value
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 DYS 1 -0.80 0.28 Inf -2.81 0.005
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 DYS 2 -0.62 0.28 Inf -2.20 0.028
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 DYS 3 -0.18 0.28 Inf -0.66 0.507
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 DYS 4 -0.15 0.27 Inf -0.55 0.579
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 DYS 5 -0.22 0.27 Inf -0.83 0.406
TD
contrast group pos estimate SE df z.ratio p.value
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 TD 1 -0.12 0.67 Inf -0.17 0.862
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 TD 2 -0.31 0.59 Inf -0.53 0.597
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 TD 3 -1.16 0.63 Inf -1.85 0.065
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 TD 4 -0.97 0.57 Inf -1.71 0.087
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 TD 5 -1.66 0.56 Inf -2.95 0.003
  1. Does EN Orthographic Knowledge significantly influence VA Span accuracy in each position?
emtrends(m1, pairwise ~ group | pos, var = "OrthKnowledgeEN", infer = T, pbkrtest.limit = 3811, adjust = "bonferroni")$emtrends %>% summary() %>% emtrends_glmer_table() -> m1.int2
DYS
group pos OrthKnowledgeEN.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS 1 0.40 0.14 Inf 0.12 0.68 2.81 0.005
DYS 2 0.31 0.14 Inf 0.03 0.59 2.20 0.028
DYS 3 0.09 0.14 Inf -0.18 0.36 0.66 0.507
DYS 4 0.07 0.13 Inf -0.19 0.34 0.55 0.579
DYS 5 0.11 0.13 Inf -0.15 0.37 0.83 0.406
TD
group pos OrthKnowledgeEN.trend SE df asymp.LCL asymp.UCL z.ratio p.value
TD 1 0.06 0.34 Inf -0.60 0.72 0.17 0.862
TD 2 0.16 0.30 Inf -0.43 0.74 0.53 0.597
TD 3 0.58 0.31 Inf -0.04 1.19 1.85 0.065
TD 4 0.49 0.28 Inf -0.07 1.04 1.71 0.087
TD 5 0.83 0.28 Inf 0.28 1.38 2.95 0.003
  1. Difference between consonant position by EN Orth. Knowledge for TD and DYS
emmeans(m1, pairwise ~ pos | OrthKnowledgeEN | group, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% summary() %>% as.data.frame() %>% mutate(across(estimate:z.ratio, ~round(.x,2))) %>% 
    mutate(p.value = round(p.value, 3)) -> m1.int3
contrast OrthKnowledgeEN group estimate SE df z.ratio p.value
pos1 - pos2 -1 DYS -0.08 0.23 Inf -0.33 1.000
pos1 - pos3 -1 DYS 0.12 0.22 Inf 0.55 1.000
pos1 - pos4 -1 DYS 0.53 0.22 Inf 2.41 0.158
pos1 - pos5 -1 DYS 0.64 0.22 Inf 2.91 0.036
pos2 - pos3 -1 DYS 0.20 0.23 Inf 0.88 1.000
pos2 - pos4 -1 DYS 0.61 0.22 Inf 2.74 0.061
pos2 - pos5 -1 DYS 0.72 0.22 Inf 3.24 0.012
pos3 - pos4 -1 DYS 0.41 0.22 Inf 1.88 0.603
pos3 - pos5 -1 DYS 0.52 0.22 Inf 2.38 0.173
pos4 - pos5 -1 DYS 0.11 0.21 Inf 0.51 1.000
pos1 - pos2 1 DYS 0.10 0.40 Inf 0.25 1.000
pos1 - pos3 1 DYS 0.74 0.39 Inf 1.88 0.600
pos1 - pos4 1 DYS 1.18 0.38 Inf 3.08 0.020
pos1 - pos5 1 DYS 1.22 0.38 Inf 3.18 0.015
pos2 - pos3 1 DYS 0.64 0.39 Inf 1.63 1.000
pos2 - pos4 1 DYS 1.08 0.38 Inf 2.83 0.047
pos2 - pos5 1 DYS 1.12 0.38 Inf 2.92 0.034
pos3 - pos4 1 DYS 0.45 0.37 Inf 1.20 1.000
pos3 - pos5 1 DYS 0.48 0.37 Inf 1.30 1.000
pos4 - pos5 1 DYS 0.04 0.36 Inf 0.10 1.000
pos1 - pos2 -1 TD 0.64 0.61 Inf 1.06 1.000
pos1 - pos3 -1 TD 1.04 0.62 Inf 1.69 0.905
pos1 - pos4 -1 TD 1.39 0.59 Inf 2.36 0.184
pos1 - pos5 -1 TD 2.05 0.58 Inf 3.51 0.004
pos2 - pos3 -1 TD 0.40 0.57 Inf 0.71 1.000
pos2 - pos4 -1 TD 0.75 0.54 Inf 1.39 1.000
pos2 - pos5 -1 TD 1.41 0.53 Inf 2.65 0.082
pos3 - pos4 -1 TD 0.35 0.55 Inf 0.63 1.000
pos3 - pos5 -1 TD 1.01 0.54 Inf 1.86 0.631
pos4 - pos5 -1 TD 0.66 0.51 Inf 1.29 1.000
pos1 - pos2 1 TD 0.44 0.30 Inf 1.47 1.000
pos1 - pos3 1 TD 0.00 0.31 Inf 0.00 1.000
pos1 - pos4 1 TD 0.53 0.30 Inf 1.79 0.742
pos1 - pos5 1 TD 0.50 0.30 Inf 1.69 0.918
pos2 - pos3 1 TD -0.44 0.30 Inf -1.49 1.000
pos2 - pos4 1 TD 0.09 0.28 Inf 0.32 1.000
pos2 - pos5 1 TD 0.06 0.28 Inf 0.21 1.000
pos3 - pos4 1 TD 0.53 0.29 Inf 1.80 0.713
pos3 - pos5 1 TD 0.50 0.29 Inf 1.70 0.884
pos4 - pos5 1 TD -0.03 0.28 Inf -0.10 1.000
  1. Difference between DYS and TD at each proficiency level and CP
emmeans(m1, pairwise ~ group | OrthKnowledgeEN | pos, at = list(OrthKnowledgeEN = c(-1,0,1)), adjust = "bonferroni")$contrasts %>% as.data.frame() %>% emmeans_glmer_table() -> m1.int4
contrast OrthKnowledgeEN pos estimate SE df z.ratio p.value
DYS - TD -1 1 -0.71 0.53 Inf -1.34 0.180
DYS - TD 0 1 -0.37 0.30 Inf -1.25 0.213
DYS - TD 1 1 -0.03 0.40 Inf -0.08 0.936
DYS - TD -1 2 0.00 0.48 Inf 0.00 0.996
DYS - TD 0 2 0.16 0.28 Inf 0.55 0.583
DYS - TD 1 2 0.31 0.39 Inf 0.80 0.424
DYS - TD -1 3 0.20 0.49 Inf 0.42 0.674
DYS - TD 0 3 -0.28 0.27 Inf -1.03 0.303
DYS - TD 1 3 -0.77 0.38 Inf -2.00 0.046
DYS - TD -1 4 0.14 0.45 Inf 0.31 0.755
DYS - TD 0 4 -0.27 0.26 Inf -1.05 0.295
DYS - TD 1 4 -0.68 0.36 Inf -1.90 0.058
DYS - TD -1 5 0.69 0.44 Inf 1.57 0.116
DYS - TD 0 5 -0.03 0.26 Inf -0.11 0.914
DYS - TD 1 5 -0.75 0.36 Inf -2.08 0.038

VA span ~ IT Orthographic Knowledge

### model 
df %>% 
  ### Exclude VER participants
  filter(!startsWith(ID, "VER")) %>% 
  
  
  
### remove fillers 
  filter(pos != "none") %>% 
  
  
  
### prepare data 
  mutate(accuracy = as.factor(accuracy), 
         pos = as.factor(pos),
         ID = as.factor(ID)) %>% 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  
  ### scale IT and EN orthographic knowledge 
  mutate(
         en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok),
         memory.score = scale(memory.score)) %>% 
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  
  ### model
  glmer(formula = 
          accuracy ~  
          pos * OrthKnowledgeIT * group + 
          # age + 
          
          memory.score + 
          
          (1 |ID) + (1|string), 
        family = "binomial",
        control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000))) -> m2

# drop1(m1, test = "Chisq")
# Anova(m1, type = "III")
Model 2: Anova
Chisq Df p.value
(Intercept) 27.82 1 0.000
pos 22.49 4 0.000
OrthKnowledgeIT 2.59 1 0.108
group 1.53 1 0.217
memory.score 11.57 1 0.001
pos:OrthKnowledgeIT 7.76 4 0.101
pos:group 7.47 4 0.113
OrthKnowledgeIT:group 0.24 1 0.622
pos:OrthKnowledgeIT:group 6.94 4 0.139

Post-hoc analysis

  1. Is there a difference between participants with high (+2SD) and low (-2SD) levels of IT Orthographic Knowledge in each consonant position (1 to 5)?
# POST HOC ANALYSIS 
emmeans(m2, pairwise ~ OrthKnowledgeIT | group | pos, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrast %>% summary() %>% emmeans_glmer_table() -> m2.int1
DYS
contrast group pos estimate SE df z.ratio p.value
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 DYS 1 -0.65 0.40 Inf -1.61 0.108
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 DYS 2 -1.04 0.41 Inf -2.50 0.012
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 DYS 3 -0.04 0.39 Inf -0.10 0.922
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 DYS 4 -0.10 0.38 Inf -0.26 0.796
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 DYS 5 0.02 0.38 Inf 0.05 0.959
TD
contrast group pos estimate SE df z.ratio p.value
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 TD 1 -0.37 0.39 Inf -0.95 0.340
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 TD 2 -0.34 0.35 Inf -0.96 0.336
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 TD 3 -0.78 0.36 Inf -2.17 0.030
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 TD 4 -0.57 0.33 Inf -1.69 0.091
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 TD 5 -0.36 0.33 Inf -1.10 0.273
  1. Does IT Orthographic Knowledge significantly influence VA Span accuracy in each position?
emtrends(m2, pairwise ~ group | pos, var = "OrthKnowledgeIT", infer = T, pbkrtest.limit = 3811, adjust = "bonferroni")$emtrends %>% summary() %>% emtrends_glmer_table() -> m2.int2
DYS
group pos OrthKnowledgeIT.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS 1 0.33 0.20 Inf -0.07 0.72 1.61 0.108
DYS 2 0.52 0.21 Inf 0.11 0.93 2.50 0.012
DYS 3 0.02 0.20 Inf -0.37 0.41 0.10 0.922
DYS 4 0.05 0.19 Inf -0.32 0.42 0.26 0.796
DYS 5 -0.01 0.19 Inf -0.38 0.36 -0.05 0.959
TD
group pos OrthKnowledgeIT.trend SE df asymp.LCL asymp.UCL z.ratio p.value
TD 1 0.19 0.20 Inf -0.20 0.57 0.95 0.340
TD 2 0.17 0.18 Inf -0.18 0.51 0.96 0.336
TD 3 0.39 0.18 Inf 0.04 0.75 2.17 0.030
TD 4 0.28 0.17 Inf -0.05 0.61 1.69 0.091
TD 5 0.18 0.16 Inf -0.14 0.50 1.10 0.273
  1. Difference at each consonant position ~ IT Orth. Knowledge
emmeans(m2, pairwise ~ pos | OrthKnowledgeIT | group, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% summary() %>% as.data.frame() %>% mutate(across(estimate:z.ratio, ~round(.x,2))) %>% 
    mutate(p.value = round(p.value, 3)) -> m2.int3
contrast OrthKnowledgeIT group estimate SE df z.ratio p.value
pos1 - pos2 -1 DYS -0.07 0.23 Inf -0.30 1.000
pos1 - pos3 -1 DYS 0.11 0.22 Inf 0.47 1.000
pos1 - pos4 -1 DYS 0.52 0.22 Inf 2.37 0.177
pos1 - pos5 -1 DYS 0.62 0.22 Inf 2.81 0.050
pos2 - pos3 -1 DYS 0.17 0.23 Inf 0.77 1.000
pos2 - pos4 -1 DYS 0.59 0.22 Inf 2.66 0.079
pos2 - pos5 -1 DYS 0.69 0.22 Inf 3.09 0.020
pos3 - pos4 -1 DYS 0.42 0.22 Inf 1.90 0.572
pos3 - pos5 -1 DYS 0.51 0.22 Inf 2.34 0.192
pos4 - pos5 -1 DYS 0.10 0.22 Inf 0.45 1.000
pos1 - pos2 1 DYS -0.46 0.52 Inf -0.87 1.000
pos1 - pos3 1 DYS 0.72 0.49 Inf 1.45 1.000
pos1 - pos4 1 DYS 1.08 0.48 Inf 2.22 0.265
pos1 - pos5 1 DYS 1.29 0.48 Inf 2.67 0.076
pos2 - pos3 1 DYS 1.17 0.51 Inf 2.30 0.214
pos2 - pos4 1 DYS 1.53 0.50 Inf 3.06 0.022
pos2 - pos5 1 DYS 1.75 0.50 Inf 3.50 0.005
pos3 - pos4 1 DYS 0.36 0.47 Inf 0.76 1.000
pos3 - pos5 1 DYS 0.57 0.47 Inf 1.23 1.000
pos4 - pos5 1 DYS 0.21 0.46 Inf 0.47 1.000
pos1 - pos2 -1 TD 0.47 0.38 Inf 1.24 1.000
pos1 - pos3 -1 TD 0.58 0.38 Inf 1.52 1.000
pos1 - pos4 -1 TD 0.91 0.37 Inf 2.44 0.145
pos1 - pos5 -1 TD 0.94 0.37 Inf 2.53 0.114
pos2 - pos3 -1 TD 0.11 0.36 Inf 0.31 1.000
pos2 - pos4 -1 TD 0.44 0.35 Inf 1.26 1.000
pos2 - pos5 -1 TD 0.47 0.35 Inf 1.34 1.000
pos3 - pos4 -1 TD 0.33 0.35 Inf 0.94 1.000
pos3 - pos5 -1 TD 0.35 0.35 Inf 1.02 1.000
pos4 - pos5 -1 TD 0.03 0.33 Inf 0.08 1.000
pos1 - pos2 1 TD 0.51 0.25 Inf 2.05 0.400
pos1 - pos3 1 TD 0.17 0.26 Inf 0.68 1.000
pos1 - pos4 1 TD 0.72 0.24 Inf 2.95 0.032
pos1 - pos5 1 TD 0.95 0.24 Inf 3.95 0.001
pos2 - pos3 1 TD -0.33 0.24 Inf -1.38 1.000
pos2 - pos4 1 TD 0.21 0.23 Inf 0.92 1.000
pos2 - pos5 1 TD 0.44 0.23 Inf 1.97 0.494
pos3 - pos4 1 TD 0.54 0.24 Inf 2.29 0.222
pos3 - pos5 1 TD 0.78 0.23 Inf 3.31 0.009
pos4 - pos5 1 TD 0.23 0.22 Inf 1.06 1.000
  1. Difference between DYS and TD at each proficiency level and CP
emmeans(m2, pairwise ~ group | OrthKnowledgeIT | pos, at = list(OrthKnowledgeIT = c(-1,0,1)), adjust = "bonferroni")$contrasts %>% as.data.frame() %>% emmeans_glmer_table() -> m2.int4
contrast OrthKnowledgeIT pos estimate SE df z.ratio p.value
DYS - TD -1 1 -0.51 0.36 Inf -1.44 0.151
DYS - TD 0 1 -0.37 0.30 Inf -1.24 0.217
DYS - TD 1 1 -0.23 0.46 Inf -0.51 0.612
DYS - TD -1 2 0.03 0.33 Inf 0.09 0.929
DYS - TD 0 2 0.38 0.30 Inf 1.25 0.211
DYS - TD 1 2 0.73 0.47 Inf 1.55 0.121
DYS - TD -1 3 -0.03 0.33 Inf -0.10 0.918
DYS - TD 0 3 -0.41 0.28 Inf -1.43 0.151
DYS - TD 1 3 -0.78 0.44 Inf -1.76 0.078
DYS - TD -1 4 -0.12 0.31 Inf -0.40 0.690
DYS - TD 0 4 -0.36 0.27 Inf -1.32 0.188
DYS - TD 1 4 -0.59 0.42 Inf -1.40 0.161
DYS - TD -1 5 -0.19 0.31 Inf -0.62 0.536
DYS - TD 0 5 -0.38 0.27 Inf -1.42 0.157
DYS - TD 1 5 -0.57 0.42 Inf -1.37 0.171

Inferential stats SDF: d’ measure

Calculate:

  1. Hits - Target YES - Answer YES
  2. Misses - Target YES - Answer NO
  3. False Alarms - Target NO - Answer YES
  4. Correct rejection - Target NO - Answer NO
### POSITION 1 
df %>% filter(pos == 1 | pos == "none") -> df.pos1

df.pos1 %>% 
  group_by(ID) %>% 
  mutate(
    hits = if_else(target == "YES" & response == "YES", 1, 0),
    miss = if_else(target == "YES" & response == "NO", 1, 0),
    fa = if_else(target == "NO" & response == "YES", 1,0),
    cr = if_else(target == "NO" & response == "NO", 1,0)
  ) %>% 
  summarize(
    n_hits = sum(hits),
    n_miss = sum(miss),
    n_fa = sum(fa),
    n_cr = sum(cr)
  ) %>% 
  mutate(
    n_target = 10, 
    n_distractors = 30
  ) %>% 
  ungroup() -> dprime.df.pos1

psycho::dprime(
      n_hit = dprime.df.pos1$n_hits, 
      n_miss = dprime.df.pos1$n_miss, 
      n_fa = dprime.df.pos1$n_fa, 
      n_cr = dprime.df.pos1$n_cr, 
      n_targets = dprime.df.pos1$n_target, 
      n_distractors = dprime.df.pos1$n_distractors,
      adjusted = T) %>% 
  as.data.frame() %>% 
  mutate(pos = "1") -> dprime.df.pos1


### join with ID and group 
df %>% distinct(ID, .keep_all = T) %>% dplyr::select(ID, group) -> ID
cbind(ID, dprime.df.pos1) -> dprime.df.pos1 


### POSITION 2 

df %>% filter(pos == 2 | pos == "none") -> df.pos2

df.pos2 %>% 
  group_by(ID) %>% 
  mutate(
    hits = if_else(target == "YES" & response == "YES", 1, 0),
    miss = if_else(target == "YES" & response == "NO", 1, 0),
    fa = if_else(target == "NO" & response == "YES", 1,0),
    cr = if_else(target == "NO" & response == "NO", 1,0)
  ) %>% 
  summarize(
    n_hits = sum(hits),
    n_miss = sum(miss),
    n_fa = sum(fa),
    n_cr = sum(cr)
  ) %>% 
  mutate(
    n_target = 10, 
    n_distractors = 30
  ) %>% 
  ungroup() -> dprime.df.pos2

psycho::dprime(
      n_hit = dprime.df.pos2$n_hits, 
      n_miss = dprime.df.pos2$n_miss, 
      n_fa = dprime.df.pos2$n_fa, 
      n_cr = dprime.df.pos2$n_cr, 
      n_targets = dprime.df.pos2$n_target, 
      n_distractors = dprime.df.pos2$n_distractors,
      adjusted = T) %>% 
  as.data.frame() %>% 
  mutate(pos = "2") -> dprime.df.pos2


### join with ID 
cbind(ID, dprime.df.pos2) -> dprime.df.pos2
bind_rows(dprime.df.pos1, dprime.df.pos2) -> dprime.df


### POSITION 3

df %>% filter(pos == 3 | pos == "none") -> df.pos3

df.pos3 %>% 
  group_by(ID) %>% 
  mutate(
    hits = if_else(target == "YES" & response == "YES", 1, 0),
    miss = if_else(target == "YES" & response == "NO", 1, 0),
    fa = if_else(target == "NO" & response == "YES", 1,0),
    cr = if_else(target == "NO" & response == "NO", 1,0)
  ) %>% 
  summarize(
    n_hits = sum(hits),
    n_miss = sum(miss),
    n_fa = sum(fa),
    n_cr = sum(cr)
  ) %>% 
  mutate(
    n_target = 10, 
    n_distractors = 30
  ) %>% 
  ungroup() -> dprime.df.pos3

psycho::dprime(
      n_hit = dprime.df.pos3$n_hits, 
      n_miss = dprime.df.pos3$n_miss, 
      n_fa = dprime.df.pos3$n_fa, 
      n_cr = dprime.df.pos3$n_cr, 
      n_targets = dprime.df.pos3$n_target, 
      n_distractors = dprime.df.pos3$n_distractors,
      adjusted = T) %>% 
  as.data.frame() %>% 
  mutate(pos = "3") -> dprime.df.pos3


### join with ID 
cbind(ID, dprime.df.pos3) -> dprime.df.pos3
bind_rows(dprime.df, dprime.df.pos3) -> dprime.df


### POSITION 4

df %>% filter(pos == 4 | pos == "none") -> df.pos4

df.pos4 %>% 
  group_by(ID) %>% 
  mutate(
    hits = if_else(target == "YES" & response == "YES", 1, 0),
    miss = if_else(target == "YES" & response == "NO", 1, 0),
    fa = if_else(target == "NO" & response == "YES", 1,0),
    cr = if_else(target == "NO" & response == "NO", 1,0)
  ) %>% 
  summarize(
    n_hits = sum(hits),
    n_miss = sum(miss),
    n_fa = sum(fa),
    n_cr = sum(cr)
  ) %>% 
  mutate(
    n_target = 10, 
    n_distractors = 30
  ) %>% 
  ungroup() -> dprime.df.pos4

psycho::dprime(
      n_hit = dprime.df.pos4$n_hits, 
      n_miss = dprime.df.pos4$n_miss, 
      n_fa = dprime.df.pos4$n_fa, 
      n_cr = dprime.df.pos4$n_cr, 
      n_targets = dprime.df.pos4$n_target, 
      n_distractors = dprime.df.pos4$n_distractors,
      adjusted = T) %>% 
  as.data.frame() %>% 
  mutate(pos = "4") -> dprime.df.pos4


### join with ID 
cbind(ID, dprime.df.pos4) -> dprime.df.pos4
bind_rows(dprime.df, dprime.df.pos4) -> dprime.df


### POSITION 5

df %>% filter(pos == 5 | pos == "none") -> df.pos5

df.pos5 %>% 
  group_by(ID) %>% 
  mutate(
    hits = if_else(target == "YES" & response == "YES", 1, 0),
    miss = if_else(target == "YES" & response == "NO", 1, 0),
    fa = if_else(target == "NO" & response == "YES", 1,0),
    cr = if_else(target == "NO" & response == "NO", 1,0)
  ) %>% 
  summarize(
    n_hits = sum(hits),
    n_miss = sum(miss),
    n_fa = sum(fa),
    n_cr = sum(cr)
  ) %>% 
  mutate(
    n_target = 10, 
    n_distractors = 30
  ) %>% 
  ungroup() -> dprime.df.pos5

psycho::dprime(
      n_hit = dprime.df.pos5$n_hits, 
      n_miss = dprime.df.pos5$n_miss, 
      n_fa = dprime.df.pos5$n_fa, 
      n_cr = dprime.df.pos5$n_cr, 
      n_targets = dprime.df.pos5$n_target, 
      n_distractors = dprime.df.pos5$n_distractors,
      adjusted = T) %>% 
  as.data.frame() %>% 
  mutate(pos = "5") -> dprime.df.pos5


### join with ID 
cbind(ID, dprime.df.pos5) -> dprime.df.pos5
bind_rows(dprime.df, dprime.df.pos5) -> dprime.df

rm("df.pos1", "df.pos2", "df.pos3", "df.pos4", "df.pos5",
   "dprime.df.pos1", "dprime.df.pos2", "dprime.df.pos3", "dprime.df.pos4", "dprime.df.pos5", "dprime.measures")

VA span ~ EN Orthographic Knowledge

dprime.df %>% 
  mutate(
    ID = as.factor(ID), 
    pos = as.factor(pos)
  ) %>% 
  
  ### proficiency measures 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  mutate(memory.score = scale(memory.score)) %>% 
  
  ### IT and EN orthographic knowledge 
  mutate(en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok)) %>% 
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  filter(pos != "none") %>% 
  
  lmer(formula = dprime ~ 
         
         OrthKnowledgeEN * pos * group + 
         memory.score + 
         (1 |ID)) -> m1.dprime

anova_table(m1.dprime) -> anova.m1.dprime
color.me <- which(anova.m1.dprime$p.value <= 0.05)
anova.m1.dprime %>% 
  kable() %>% kable_styling() %>% row_spec(color.me, background = "#F7F9FF", bold = T)
Chisq Df p.value
(Intercept) 65.61 1 0.000
OrthKnowledgeEN 2.75 1 0.097
pos 3.02 4 0.554
group 9.83 1 0.002
memory.score 0.03 1 0.855
OrthKnowledgeEN:pos 3.25 4 0.517
OrthKnowledgeEN:group 6.96 1 0.008
pos:group 12.67 4 0.013
OrthKnowledgeEN:pos:group 9.90 4 0.042

emmeans(m1.dprime, pairwise ~ OrthKnowledgeEN | pos | group, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() -> emmeans.m1.dprime
emtrends(m1.dprime, pairwise ~ pos | group, var = "OrthKnowledgeEN", infer = T, adjust = "bonferroni")$emtrends %>% 
  emtrends_lmer_table() -> emtrends.m1.dprime
contrast pos group estimate SE df t.ratio p.value
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 1 DYS -0.44 0.26 148.52 -1.66 0.099
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 2 DYS -0.22 0.26 148.52 -0.85 0.395
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 3 DYS -0.05 0.26 148.52 -0.18 0.857
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 4 DYS -0.29 0.26 148.52 -1.10 0.274
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 5 DYS -0.35 0.26 148.52 -1.33 0.186
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 1 TD 1.05 0.50 144.24 2.09 0.038
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 2 TD 0.60 0.50 144.24 1.19 0.234
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 3 TD 0.18 0.50 144.24 0.36 0.720
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 4 TD -0.12 0.50 144.24 -0.24 0.810
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 5 TD 0.10 0.50 144.24 0.21 0.836
pos group OrthKnowledgeEN.trend SE df lower.CL upper.CL t.ratio p.value
1 DYS 0.22 0.13 148.52 -0.04 0.48 1.66 0.099
2 DYS 0.11 0.13 148.52 -0.15 0.37 0.85 0.395
3 DYS 0.02 0.13 148.52 -0.24 0.28 0.18 0.857
4 DYS 0.14 0.13 148.52 -0.12 0.40 1.10 0.274
5 DYS 0.17 0.13 148.52 -0.08 0.43 1.33 0.186
1 TD -0.53 0.25 144.24 -1.03 -0.03 -2.09 0.038
2 TD -0.30 0.25 144.24 -0.80 0.20 -1.19 0.234
3 TD -0.09 0.25 144.24 -0.59 0.41 -0.36 0.720
4 TD 0.06 0.25 144.24 -0.44 0.56 0.24 0.810
5 TD -0.05 0.25 144.24 -0.55 0.45 -0.21 0.836
emmeans(m1.dprime, pairwise ~ pos | OrthKnowledgeEN | group, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() %>% filter(contrast == "pos1 - pos5") -> emmeans2.m1.dprime
contrast OrthKnowledgeEN group estimate SE df t.ratio p.value
pos1 - pos5 -1 DYS 0.16 0.13 304 1.25 1.000
pos1 - pos5 1 DYS 0.25 0.25 304 1.01 1.000
pos1 - pos5 -1 TD 1.39 0.33 304 4.15 0.000
pos1 - pos5 1 TD 0.44 0.15 304 2.92 0.038
### Contrast TD and DYS 
emmeans(m1.dprime, pairwise ~ group | pos | OrthKnowledgeEN, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% emmeans_lmer_table() -> emmeans3.m1.dprime
contrast pos OrthKnowledgeEN estimate SE df t.ratio p.value
DYS - TD 1 -1 -1.52 0.41 149.01 -3.72 0.000
DYS - TD 2 -1 -0.92 0.41 149.01 -2.26 0.026
DYS - TD 3 -1 -0.62 0.41 149.01 -1.52 0.130
DYS - TD 4 -1 -0.33 0.41 149.01 -0.80 0.423
DYS - TD 5 -1 -0.30 0.41 149.01 -0.74 0.462
DYS - TD 1 1 -0.03 0.34 143.19 -0.10 0.922
DYS - TD 2 1 -0.10 0.34 143.19 -0.29 0.774
DYS - TD 3 1 -0.39 0.34 143.19 -1.16 0.247
DYS - TD 4 1 -0.16 0.34 143.19 -0.48 0.634
DYS - TD 5 1 0.15 0.34 143.19 0.45 0.655

VA span ~ IT Orthographic Knowledge

dprime.df %>% 
  mutate(
    ID = as.factor(ID), 
    pos = as.factor(pos)
  ) %>% 
  
  ### proficiency measures 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  mutate(memory.score = scale(memory.score)) %>% 
  
  ### scale IT and EN orthographic knowledge
  mutate(en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok)) %>% 
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  filter(pos != "none") %>% 
  
  lmer(formula = dprime ~ 
         
         OrthKnowledgeIT * pos * group + 
         memory.score + 
         (1|ID)) -> m2.dprime

anova_table(m2.dprime) -> m2.dprime.anova
color.me <- which(m2.dprime.anova$p.value <= 0.05)  
m2.dprime.anova %>% kable() %>% kable_styling() %>% row_spec(color.me, background = "#F7F9FF", bold = T)
Chisq Df p.value
(Intercept) 29.80 1 0.000
OrthKnowledgeIT 0.51 1 0.477
pos 0.42 4 0.981
group 10.96 1 0.001
memory.score 0.05 1 0.827
OrthKnowledgeIT:pos 0.98 4 0.913
OrthKnowledgeIT:group 0.01 1 0.914
pos:group 8.21 4 0.084
OrthKnowledgeIT:pos:group 1.38 4 0.848

emmeans(m2.dprime, pairwise ~ OrthKnowledgeIT | pos | group, at = list(OrthKnowledgeIT = c(-1,1)))$contrasts %>% 
  emmeans_lmer_table() -> emmeans.m2.dprime

emtrends(m2.dprime, pairwise ~ pos | group, var = "OrthKnowledgeIT", infer = T, adjust = "bonferroni")$emtrends %>% emtrends_lmer_table() -> emtrends.m2.dprime
contrast pos group estimate SE df t.ratio p.value
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 1 DYS 0.27 0.38 149.88 0.71 0.478
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 2 DYS 0.21 0.38 149.88 0.56 0.576
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 3 DYS 0.17 0.38 149.88 0.44 0.660
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 4 DYS 0.04 0.38 149.88 0.12 0.908
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 5 DYS -0.01 0.38 149.88 -0.03 0.979
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 1 TD 0.21 0.31 148.76 0.70 0.485
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 2 TD 0.12 0.31 148.76 0.40 0.689
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 3 TD 0.32 0.31 148.76 1.04 0.300
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 4 TD 0.00 0.31 148.76 0.00 0.996
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 5 TD 0.32 0.31 148.76 1.03 0.305
pos group OrthKnowledgeIT.trend SE df lower.CL upper.CL t.ratio p.value
1 DYS -0.13 0.19 149.88 -0.50 0.24 -0.71 0.478
2 DYS -0.11 0.19 149.88 -0.48 0.27 -0.56 0.576
3 DYS -0.08 0.19 149.88 -0.45 0.29 -0.44 0.660
4 DYS -0.02 0.19 149.88 -0.39 0.35 -0.12 0.908
5 DYS 0.00 0.19 149.88 -0.37 0.38 0.03 0.979
1 TD -0.11 0.15 148.76 -0.41 0.20 -0.70 0.485
2 TD -0.06 0.15 148.76 -0.36 0.24 -0.40 0.689
3 TD -0.16 0.15 148.76 -0.46 0.14 -1.04 0.300
4 TD 0.00 0.15 148.76 -0.30 0.30 0.00 0.996
5 TD -0.16 0.15 148.76 -0.46 0.15 -1.03 0.305
emmeans(m2.dprime, pairwise ~ pos | OrthKnowledgeIT | group, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() %>% filter(contrast == "pos1 - pos5") -> emmeans2.m2.dprime
contrast OrthKnowledgeIT group estimate SE df t.ratio p.value
pos1 - pos5 -1 DYS 0.19 0.13 304 1.43 1.000
pos1 - pos5 1 DYS -0.09 0.33 304 -0.26 1.000
pos1 - pos5 -1 TD 0.61 0.22 304 2.73 0.068
pos1 - pos5 1 TD 0.71 0.12 304 5.86 0.000
### Contrast TD and DYS 
emmeans(m2.dprime, pairwise ~ group | pos | OrthKnowledgeIT, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% emmeans_lmer_table() -> emmeans3.m2.dprime
contrast pos OrthKnowledgeIT estimate SE df t.ratio p.value
DYS - TD 1 -1 -0.85 0.30 147.52 -2.85 0.005
DYS - TD 2 -1 -0.54 0.30 147.52 -1.80 0.074
DYS - TD 3 -1 -0.71 0.30 147.52 -2.38 0.018
DYS - TD 4 -1 -0.39 0.30 147.52 -1.31 0.191
DYS - TD 5 -1 -0.43 0.30 147.52 -1.45 0.149
DYS - TD 1 1 -0.90 0.41 145.88 -2.20 0.029
DYS - TD 2 1 -0.63 0.41 145.88 -1.52 0.130
DYS - TD 3 1 -0.56 0.41 145.88 -1.36 0.175
DYS - TD 4 1 -0.44 0.41 145.88 -1.07 0.288
DYS - TD 5 1 -0.11 0.41 145.88 -0.26 0.793

Inferential stats SDT: C criterion

VA span ~ EN Orthographic Knowledge

dprime.df %>% 
  mutate(
    ID = as.factor(ID), 
    pos = as.factor(pos)
  ) %>% 
  
  ### proficiency measures 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  mutate(memory.score = scale(memory.score)) %>% 
  
  ### scale IT and EN orthographic knowledge 
  mutate(en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok)) %>% 
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  filter(pos != "none") %>% 
  
  lmer(formula = c ~ 
         
         OrthKnowledgeEN * group * pos + 
         # memory.score * group + 
         memory.score + 
         
         (1|ID)) -> m1.c

#drop1(m1.c)
anova_table(m1.c) -> anova.m1.c
color.me <- which(anova.m1.c$p.value <= 0.05)  
anova.m1.c %>% kable() %>% kable_styling() %>% row_spec(color.me, background = "#F7F9FF", bold = T)
Chisq Df p.value
(Intercept) 0.01 1 0.941
OrthKnowledgeEN 3.66 1 0.056
group 2.28 1 0.131
pos 3.02 4 0.554
memory.score 0.68 1 0.411
OrthKnowledgeEN:group 4.51 1 0.034
OrthKnowledgeEN:pos 3.25 4 0.517
group:pos 12.67 4 0.013
OrthKnowledgeEN:group:pos 9.90 4 0.042

emmeans(m1.c, pairwise ~ OrthKnowledgeEN | pos | group, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() -> emmeans.m1.c

emtrends(m1.c, pairwise ~ pos | group, var = "OrthKnowledgeEN", infer = T, adjust = "bonferroni")$emtrends %>% emtrends_lmer_table() -> emtrends.m1.c
contrast pos group estimate SE df t.ratio p.value
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 1 DYS 0.22 0.11 190.23 1.91 0.057
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 2 DYS 0.11 0.11 190.23 0.98 0.326
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 3 DYS 0.02 0.11 190.23 0.21 0.833
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 4 DYS 0.14 0.11 190.23 1.27 0.207
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 5 DYS 0.17 0.11 190.23 1.53 0.127
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 1 TD -0.30 0.22 183.81 -1.39 0.168
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 2 TD -0.08 0.22 183.81 -0.35 0.727
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 3 TD 0.13 0.22 183.81 0.62 0.539
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 4 TD 0.29 0.22 183.81 1.31 0.193
(OrthKnowledgeEN-1) - OrthKnowledgeEN1 5 TD 0.17 0.22 183.81 0.79 0.431
pos group OrthKnowledgeEN.trend SE df lower.CL upper.CL t.ratio p.value
1 DYS -0.11 0.06 190.23 -0.22 0.00 -1.91 0.057
2 DYS -0.06 0.06 190.23 -0.17 0.06 -0.98 0.326
3 DYS -0.01 0.06 190.23 -0.12 0.10 -0.21 0.833
4 DYS -0.07 0.06 190.23 -0.18 0.04 -1.27 0.207
5 DYS -0.09 0.06 190.23 -0.20 0.03 -1.53 0.127
1 TD 0.15 0.11 183.81 -0.06 0.37 1.39 0.168
2 TD 0.04 0.11 183.81 -0.18 0.25 0.35 0.727
3 TD -0.07 0.11 183.81 -0.28 0.15 -0.62 0.539
4 TD -0.14 0.11 183.81 -0.36 0.07 -1.31 0.193
5 TD -0.09 0.11 183.81 -0.30 0.13 -0.79 0.431
emmeans(m1.c, pairwise ~ pos | OrthKnowledgeEN| group, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() -> emmeans2.m1.c
contrast OrthKnowledgeEN group estimate SE df t.ratio p.value
pos1 - pos2 -1 DYS 0.00 0.07 304 -0.02 1.000
pos1 - pos3 -1 DYS 0.00 0.07 304 -0.02 1.000
pos1 - pos4 -1 DYS -0.09 0.07 304 -1.34 1.000
pos1 - pos5 -1 DYS -0.08 0.07 304 -1.25 1.000
pos2 - pos3 -1 DYS 0.00 0.07 304 0.00 1.000
pos2 - pos4 -1 DYS -0.09 0.07 304 -1.32 1.000
pos2 - pos5 -1 DYS -0.08 0.07 304 -1.23 1.000
pos3 - pos4 -1 DYS -0.09 0.07 304 -1.31 1.000
pos3 - pos5 -1 DYS -0.08 0.07 304 -1.23 1.000
pos4 - pos5 -1 DYS 0.01 0.07 304 0.09 1.000
pos1 - pos2 1 DYS -0.11 0.12 304 -0.87 1.000
pos1 - pos3 1 DYS -0.20 0.12 304 -1.58 1.000
pos1 - pos4 1 DYS -0.16 0.12 304 -1.30 1.000
pos1 - pos5 1 DYS -0.13 0.12 304 -1.01 1.000
pos2 - pos3 1 DYS -0.09 0.12 304 -0.71 1.000
pos2 - pos4 1 DYS -0.05 0.12 304 -0.44 1.000
pos2 - pos5 1 DYS -0.02 0.12 304 -0.15 1.000
pos3 - pos4 1 DYS 0.03 0.12 304 0.28 1.000
pos3 - pos5 1 DYS 0.07 0.12 304 0.57 1.000
pos4 - pos5 1 DYS 0.04 0.12 304 0.29 1.000
pos1 - pos2 -1 TD -0.30 0.17 304 -1.81 0.720
pos1 - pos3 -1 TD -0.45 0.17 304 -2.71 0.072
pos1 - pos4 -1 TD -0.68 0.17 304 -4.10 0.001
pos1 - pos5 -1 TD -0.69 0.17 304 -4.15 0.000
pos2 - pos3 -1 TD -0.15 0.17 304 -0.90 1.000
pos2 - pos4 -1 TD -0.38 0.17 304 -2.30 0.222
pos2 - pos5 -1 TD -0.39 0.17 304 -2.35 0.196
pos3 - pos4 -1 TD -0.23 0.17 304 -1.40 1.000
pos3 - pos5 -1 TD -0.24 0.17 304 -1.45 1.000
pos4 - pos5 -1 TD -0.01 0.17 304 -0.05 1.000
pos1 - pos2 1 TD -0.08 0.07 304 -1.01 1.000
pos1 - pos3 1 TD -0.01 0.07 304 -0.20 1.000
pos1 - pos4 1 TD -0.10 0.07 304 -1.30 1.000
pos1 - pos5 1 TD -0.22 0.07 304 -2.92 0.038
pos2 - pos3 1 TD 0.06 0.07 304 0.81 1.000
pos2 - pos4 1 TD -0.02 0.07 304 -0.29 1.000
pos2 - pos5 1 TD -0.14 0.07 304 -1.91 0.570
pos3 - pos4 1 TD -0.08 0.07 304 -1.10 1.000
pos3 - pos5 1 TD -0.20 0.07 304 -2.72 0.069
pos4 - pos5 1 TD -0.12 0.07 304 -1.62 1.000
### Contrast TD and DYS 
emmeans(m1.c, pairwise ~ group | pos | OrthKnowledgeEN, at = list(OrthKnowledgeEN = c(-1,1)), adjust = "bonferroni")$contrasts %>% emmeans_lmer_table() -> emmeans3.m1.c
contrast pos OrthKnowledgeEN estimate SE df t.ratio p.value
DYS - TD 1 -1 0.42 0.18 190.96 2.38 0.018
DYS - TD 2 -1 0.12 0.18 190.96 0.69 0.490
DYS - TD 3 -1 -0.03 0.18 190.96 -0.15 0.879
DYS - TD 4 -1 -0.17 0.18 190.96 -0.98 0.329
DYS - TD 5 -1 -0.19 0.18 190.96 -1.06 0.292
DYS - TD 1 1 -0.10 0.15 182.23 -0.66 0.508
DYS - TD 2 1 -0.07 0.15 182.23 -0.44 0.657
DYS - TD 3 1 0.08 0.15 182.23 0.57 0.572
DYS - TD 4 1 -0.03 0.15 182.23 -0.23 0.821
DYS - TD 5 1 -0.19 0.15 182.23 -1.29 0.197

VA span ~ IT Orthographic Knowledge

dprime.df %>% 
  mutate(
    ID = as.factor(ID), 
    pos = as.factor(pos)
  ) %>% 
  
  ### proficiency measures 
  rowwise() %>% 
  mutate(memory.score = mean(c_across(forward:backward))) %>% 
  ungroup() %>% 
  mutate(memory.score = scale(memory.score)) %>% 
  
  ### scale IT and EN orthographic knowledge
  mutate(en.ok.bis = scale(en.ok.bis),
         it.ok = scale(it.ok)) %>% 
  rename(OrthKnowledgeEN = en.ok.bis, 
         OrthKnowledgeIT = it.ok) %>% 
  
  filter(pos != "none") %>% 
  
  lmer(formula = c ~ 
         
         OrthKnowledgeIT * group * pos + 
         # memory.score * group + 
         memory.score + 
         
         (1|ID)) -> m2.c

# drop1(m2.c)
anova_table(m2.c) -> anova.m2.c
color.me <- which(anova.m2.c$p.value <= 0.05)  
anova.m2.c %>% kable() %>% kable_styling() %>% row_spec(color.me, background = "#F7F9FF", bold = T)
Chisq Df p.value
(Intercept) 0.92 1 0.337
OrthKnowledgeIT 0.03 1 0.858
group 3.17 1 0.075
pos 0.42 4 0.981
memory.score 1.20 1 0.274
OrthKnowledgeIT:group 0.04 1 0.845
OrthKnowledgeIT:pos 0.98 4 0.913
group:pos 8.21 4 0.084
OrthKnowledgeIT:group:pos 1.38 4 0.848

emmeans(m2.c, pairwise ~ OrthKnowledgeIT | pos | group, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() -> emmeans.m2.c

emtrends(m2.c, pairwise ~ pos | group, var = "OrthKnowledgeIT", infer = T, adjust = "bonferroni")$emtrends %>% emtrends_lmer_table() -> emtrends.m2.c
contrast pos group estimate SE df t.ratio p.value
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 1 DYS -0.03 0.16 191.58 -0.18 0.858
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 2 DYS 0.00 0.16 191.58 -0.01 0.996
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 3 DYS 0.02 0.16 191.58 0.13 0.895
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 4 DYS 0.08 0.16 191.58 0.50 0.614
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 5 DYS 0.11 0.16 191.58 0.67 0.505
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 1 TD -0.07 0.13 189.91 -0.53 0.598
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 2 TD -0.02 0.13 189.91 -0.18 0.854
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 3 TD -0.12 0.13 189.91 -0.92 0.359
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 4 TD 0.04 0.13 189.91 0.28 0.779
(OrthKnowledgeIT-1) - OrthKnowledgeIT1 5 TD -0.12 0.13 189.91 -0.91 0.365
pos group OrthKnowledgeIT.trend SE df lower.CL upper.CL t.ratio p.value
1 DYS 0.01 0.08 191.58 -0.15 0.18 0.18 0.858
2 DYS 0.00 0.08 191.58 -0.16 0.16 0.01 0.996
3 DYS -0.01 0.08 191.58 -0.17 0.15 -0.13 0.895
4 DYS -0.04 0.08 191.58 -0.20 0.12 -0.50 0.614
5 DYS -0.05 0.08 191.58 -0.22 0.11 -0.67 0.505
1 TD 0.04 0.07 189.91 -0.10 0.17 0.53 0.598
2 TD 0.01 0.07 189.91 -0.12 0.14 0.18 0.854
3 TD 0.06 0.07 189.91 -0.07 0.19 0.92 0.359
4 TD -0.02 0.07 189.91 -0.15 0.11 -0.28 0.779
5 TD 0.06 0.07 189.91 -0.07 0.19 0.91 0.365
emmeans(m2.c, pairwise ~ pos | OrthKnowledgeIT| group, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% 
  emmeans_lmer_table() %>% filter(contrast == "pos1 - pos5") -> emmeans2.m2.c
contrast OrthKnowledgeIT group estimate SE df t.ratio p.value
pos1 - pos5 -1 DYS -0.10 0.07 304 -1.43 1.000
pos1 - pos5 1 DYS 0.04 0.17 304 0.26 1.000
pos1 - pos5 -1 TD -0.30 0.11 304 -2.73 0.068
pos1 - pos5 1 TD -0.36 0.06 304 -5.86 0.000
### Contrast TD and DYS 
emmeans(m2.c, pairwise ~ group | pos | OrthKnowledgeIT, at = list(OrthKnowledgeIT = c(-1,1)), adjust = "bonferroni")$contrasts %>% emmeans_lmer_table() -> emmeans3.m2.c
contrast pos OrthKnowledgeIT estimate SE df t.ratio p.value
DYS - TD 1 -1 0.23 0.13 188.08 1.73 0.085
DYS - TD 2 -1 0.07 0.13 188.08 0.53 0.596
DYS - TD 3 -1 0.16 0.13 188.08 1.20 0.232
DYS - TD 4 -1 0.00 0.13 188.08 -0.03 0.976
DYS - TD 5 -1 0.02 0.13 188.08 0.13 0.899
DYS - TD 1 1 0.18 0.18 185.64 1.03 0.304
DYS - TD 2 1 0.05 0.18 185.64 0.25 0.800
DYS - TD 3 1 0.01 0.18 185.64 0.07 0.948
DYS - TD 4 1 -0.05 0.18 185.64 -0.27 0.784
DYS - TD 5 1 -0.21 0.18 185.64 -1.20 0.232