Lexical and sublexical reading predictors

Poor readers

Poor readers’ performance
ID wr_time_z wr_error_z nwr_time_z nwr_error_z pa.bis forward backward lexita.acc it.ok.acc
LAE23 -2.88 -0.13 -3.36 -0.53 0.68 -0.10 -1.06 0.95 0.09
LAE38 -2.75 -0.26 -2.73 -1.70 0.52 0.52 -0.49 0.59 -1.17
LC19 -4.97 -0.65 -4.58 0.06 -1.48 -0.49 -1.10 -3.12 -2.29
MEN02 -2.96 -1.04 -2.10 -2.41 0.16 -0.49 -0.49 -0.76 -0.35
MEN10 -3.40 -0.69 -2.68 -0.53 0.12 -1.02 0.08 -0.20 -0.32
MEN29 -2.24 -2.36 -0.52 -4.55 -0.26 -0.10 -0.49 0.37 -0.72
MEN35 -0.12 -2.36 0.94 -2.54 -0.04 -0.10 0.08 -0.20 1.24

Compensated DYS

Compensated DYSs’ performance
ID wr_time_z wr_error_z nwr_time_z nwr_error_z pa.bis forward backward lexita.acc it.ok.acc
LAUVEN -0.58 -1.23 -1.05 -1.45 -0.71 0.71 0.71 -0.71 -0.71
LAE04 -4.58 1.04 -0.99 -0.43 0.79 -0.39 -0.07 -0.61 -0.79
LAE17 -1.15 -1.04 -1.33 -0.65 0.44 -1.50 0.74 0.26 -0.50
LC03 -2.75 -1.82 -0.44 -1.70 -1.29 -0.49 0.13 -0.08 -0.20
LC15 -3.00 -0.72 -1.47 -1.23 -0.99 0.45 -0.07 0.41 0.20
MEN22 -4.16 -0.69 -1.16 -1.34 -0.65 -1.02 -0.49 1.24 -0.45
MEN33 -3.33 0.43 -1.21 0.67 0.31 0.82 0.66 0.09 -0.32

Exclude participants

df %>% 
  filter(group == "DYS" | (group == "TD" & is.na(other_diagnoses))) %>% 
  mutate(ID = as.character(ID)) %>% 
  filter(!startsWith(ID, "VER")) -> 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, 
      # ID == "MEN35" ~ 1, 
      TRUE ~ 0
    )
  ) %>%
  filter(exclude == 0) %>%
  
  # stricter crtiteria 
  # filter(group.exclusion != "PR") %>% 
  
  # less strict criteria 
  # filter(group == "DYS" | (group == "TD" & reading.score > -2)) %>%
  
  
  filter(ID != "VER01" & ID != "VER03") %>% 
  dplyr::select(-exclude) -> df

Dyslexics’ profiles

Inferential analyses

Correlations

Lexical: All measures

df %>% 
  dplyr::select(ID, group, wr_time_z:nwr_error_z, age, pa.bis, backward, forward, lexita.acc, it.ok.acc) %>% 
  pivot_longer(names_to = "dimension", values_to = "reading", 3:6) %>% 
  mutate(
    measure = 
      case_when(
        dimension == "wr_time_z" ~ "fluency", 
        dimension == "wr_error_z" ~ "accuracy", 
        dimension == "nwr_time_z" ~ "fluency", 
        dimension == "nwr_error_z" ~ "accuracy", 
        ), 
    dimension = 
      case_when(
        dimension == "wr_time_z" ~ "lexical", 
        dimension == "wr_error_z" ~ "lexical", 
        dimension == "nwr_time_z" ~ "sublexical", 
        dimension == "nwr_error_z" ~ "sublexical", 
      )
  ) %>% 
  mutate(across(backward:it.ok.acc, ~scale(.x))) %>% 
  mutate_if(is.character, as.factor) -> df.model
  
df.model %>% filter(dimension == "lexical") %>% 
  
  lmer(formula = reading ~ 
         
         # pa.bis * group * measure + 
         # pa.bis * group + 
         pa.bis * measure + 
         
         # lexita.acc * group * measure + 
         lexita.acc * measure + 
         # lexita.acc * group + 
         
         it.ok.acc * group * measure + 
         
         backward * group * measure + 
         # backward * group + 
         # backward * measure + 
         # backward + 
         
         (1 |ID)
         
         ) -> m1
AIC AICc BIC R2_conditional R2_marginal ICC RMSE Sigma
564.8965 569.7476 620.2496 0.8240664 0.6994607 0.4146072 0.7902413 0.9907325
Chisq Df Pr(>Chisq)
(Intercept) 13.99 1 0.000
pa.bis 28.27 1 0.000
measure 4.45 1 0.035
lexita.acc 9.30 1 0.002
it.ok.acc 1.97 1 0.161
group 2.58 1 0.108
backward 2.42 1 0.119
pa.bis:measure 7.32 1 0.007
measure:lexita.acc 10.57 1 0.001
it.ok.acc:group 1.22 1 0.270
measure:it.ok.acc 14.91 1 0.000
measure:group 2.22 1 0.136
group:backward 1.36 1 0.244
measure:backward 2.61 1 0.106
measure:it.ok.acc:group 5.21 1 0.022
measure:group:backward 3.71 1 0.054

Post-hoc 1: PA vs. Measure

emtrends(m1, pairwise ~ measure, var = "pa.bis", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(pa.bis.trend:t.ratio, ~round(.x,2)), 
         p.value = round(p.value,3)) -> post.1
color.me <- which(post.1$p.value <= .05)
post.1 %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
measure pa.bis.trend SE df lower.CL upper.CL t.ratio p.value
accuracy 0.61 0.12 122.88 0.39 0.84 5.32 0.000
fluency 0.28 0.12 122.88 0.05 0.50 2.39 0.018
emtrends(m1, pairwise ~ measure, var = "pa.bis", infer = T, adjust = "bonferroni")$contrasts %>% 
  as.data.frame() %>% 
  mutate(across(estimate:t.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) -> post.1a
color.me <- which(post.1a$p.value <= .05)
post.1a %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
contrast estimate SE df lower.CL upper.CL t.ratio p.value
accuracy - fluency 0.34 0.12 72 0.09 0.59 2.71 0.009

Post-hoc 2: Vocabulary vs. Measure

emtrends(m1, pairwise ~ measure, var = "lexita.acc", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(lexita.acc.trend:t.ratio, ~round(.x,2)), 
         p.value = round(p.value,3)) -> post.2
color.me <- which(post.2$p.value <= .05)
post.2 %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
measure lexita.acc.trend SE df lower.CL upper.CL t.ratio p.value
accuracy 0.49 0.16 122.88 0.17 0.80 3.05 0.003
fluency -0.07 0.16 122.88 -0.39 0.24 -0.47 0.640
emtrends(m1, pairwise ~ measure, var = "lexita.acc", infer = T, adjust = "bonferroni")$contrasts %>% 
  as.data.frame() %>% 
  mutate(across(estimate:t.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) -> post.2a
color.me <- which(post.2a$p.value <= .05)
post.2a %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
contrast estimate SE df lower.CL upper.CL t.ratio p.value
accuracy - fluency 0.56 0.17 72 0.22 0.9 3.25 0.002

Post-hoc 3: OK vs. Measure vs. Group

emtrends(m1, pairwise ~ group | measure, var = "it.ok.acc", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(it.ok.acc.trend:t.ratio, ~round(.x,2)), 
         p.value = round(p.value,3)) -> post.3
color.me <- which(post.3$p.value <= .05)
post.3 %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
group measure it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
DYS accuracy 0.45 0.32 122.88 -0.19 1.09 1.40 0.163
TD accuracy -0.01 0.25 122.88 -0.50 0.49 -0.02 0.982
DYS fluency 1.79 0.32 122.88 1.16 2.43 5.58 0.000
TD fluency 0.32 0.25 122.88 -0.18 0.81 1.26 0.209

### comparison of group performance 
emmeans(m1, pairwise ~ group | measure | it.ok.acc, at = list(it.ok.acc = c(-1,1)), adjust = "bonferroni")$contrasts %>% summary() %>% as.data.frame() %>% 
  mutate(across(estimate:t.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) -> post.3b
color.me <- which(post.3b$p.value <= .05)
post.3b %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
contrast measure it.ok.acc estimate SE df t.ratio p.value
DYS - TD accuracy -1 -1.20 0.57 122.88 -2.10 0.037
DYS - TD fluency -1 -2.96 0.57 122.88 -5.21 0.000
DYS - TD accuracy 1 -0.28 0.67 122.88 -0.43 0.670
DYS - TD fluency 1 -0.01 0.67 122.88 -0.01 0.991

Sublexical: All measures

df.model %>% 
  
  filter(dimension == "sublexical") %>% 
  
  lmer(formula = reading ~ 
         
         pa.bis * group * measure + 
         # pa.bis * measure + 
         # pa.bis * group + 
         
         # lexita.acc * group * measure + 
         # lexita.acc * measure +
         # lexita.acc * group +
         # lexita.acc + 
         
         # it.ok.acc * group * measure + 
         # it.ok.acc * group +
         it.ok.acc * measure +
         
         backward * group * measure + 
         # backward * group + 
         # backward * measure + 
         # backward + 
         
         (1 |ID)
         
         ) -> m2
AIC AICc BIC R2_conditional R2_marginal ICC RMSE Sigma
597.8943 601.6985 647.0971 0.7939116 0.5458077 0.546253 0.7922884 1.031352
Chisq Df Pr(>Chisq)
(Intercept) 25.00 1 0.000
pa.bis 34.55 1 0.000
group 7.01 1 0.008
measure 0.62 1 0.431
it.ok.acc 0.37 1 0.543
backward 0.26 1 0.609
pa.bis:group 3.64 1 0.056
pa.bis:measure 30.96 1 0.000
group:measure 0.01 1 0.936
measure:it.ok.acc 14.36 1 0.000
group:backward 0.34 1 0.560
measure:backward 1.73 1 0.189
pa.bis:group:measure 8.15 1 0.004
group:measure:backward 3.24 1 0.072

Post-hoc 1: OK vs. Measure

emtrends(m2, pairwise ~ measure, var = "it.ok.acc", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(it.ok.acc.trend:t.ratio, ~round(.x,2)), 
         p.value = round(p.value,3)) -> post2.1
color.me <- which(post2.1$p.value <= .05)
post2.1 %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
measure it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
accuracy -0.14 0.24 112.45 -0.61 0.32 -0.61 0.544
fluency 0.71 0.24 112.45 0.24 1.18 3.00 0.003

Post-hoc 2: PA vs. Measure vs. Group

emtrends(m2, pairwise ~ group | measure, var = "pa.bis", infer = T, adjust = "bonferroni")$emtrends %>% 
  as.data.frame() %>% 
  mutate(across(pa.bis.trend:t.ratio, ~round(.x,2)), 
         p.value = round(p.value,3)) -> post2.3
color.me <- which(post2.3$p.value <= .05)
post2.3 %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
group measure pa.bis.trend SE df lower.CL upper.CL t.ratio p.value
DYS accuracy 0.91 0.15 112.45 0.60 1.22 5.88 0.000
TD accuracy 0.35 0.24 112.45 -0.13 0.83 1.44 0.154
DYS fluency 0.09 0.15 112.45 -0.22 0.40 0.58 0.565
TD fluency 0.33 0.24 112.45 -0.16 0.81 1.34 0.181

### comparison of group performance 
emmeans(m2, pairwise ~ group | measure | pa.bis, at = list(pa.bis = c(-1,1)), adjust = "bonferroni")$contrasts %>% summary() %>% as.data.frame() %>% 
  mutate(across(estimate:t.ratio, ~round(.x,2)),
         p.value = round(p.value,3)) -> post2.3b
color.me <- which(post2.3b$p.value <= .05)
post2.3b %>% kable() %>% kable_styling() %>% row_spec(color.me, bold = T)
contrast measure pa.bis estimate SE df t.ratio p.value
DYS - TD accuracy -1 -2.04 0.71 112.45 -2.88 0.005
DYS - TD fluency -1 -1.29 0.71 112.45 -1.81 0.073
DYS - TD accuracy 1 -0.92 0.54 112.45 -1.70 0.092
DYS - TD fluency 1 -1.76 0.54 112.45 -3.25 0.002