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

Descriptive statistics

Reading Performance

df %>% 
  lm(formula = wr_time_z ~ group) -> m1.reading
df %>% 
  lm(formula = wr_error_z ~ group) -> m2.reading
df %>% 
  lm(formula = nwr_time_z ~ group) -> m3.reading
df %>% 
  lm(formula = nwr_error_z ~ group) -> m4.reading
Estimate SE t p
Word reading fluency
(Intercept) -4.15 0.30 -13.63 < .001
groupTD 3.74 0.38 9.79 < .001
Word reading accuracy
(Intercept)1 -2.75 0.31 -8.89 < .001
groupTD1 2.84 0.39 7.34 < .001
Pseudoword reading fluency
(Intercept)2 -3.03 0.25 -12.28 < .001
groupTD2 2.96 0.31 9.58 < .001
Pseudoword reading accuracy
(Intercept)3 -3.04 0.38 -7.90 < .001
groupTD3 2.90 0.48 6.02 < .001
group M sd range
Pseudoword reading accuracy
DYS -3.04 3.05 -11.78 - 0.75
TD -0.14 1.21 -4.15 - 1.29
Pseudoword reading fluency
DYS -3.03 1.93 -8.35 - -0.44
TD -0.07 0.81 -1.81 - 1.8
Word reading accuracy
DYS -2.75 2.58 -9.07 - 1.04
TD 0.09 0.78 -2.36 - 1.18
Word reading fluency
DYS -4.15 2.49 -14.12 - -0.58
TD -0.42 0.85 -2.58 - 1.65

Summary.

group measure M SD range
Spoonerism accuracy
DYS Accuracy 30.41 7.28 10-40
TD Accuracy 36.98 3.09 26-40
DYS BIS -1.44 2.12 -6.47-1.68
TD BIS 0.99 0.91 -2.12-2.13
DYS RT 12.17 5.60 3.92-24.27
TD RT 5.63 2.46 1.72-11.61
Italian orthographic knowledge
DYS Total score 29.55 10.18 12-50
TD Total score 46.35 9.36 25-59
DYS False alarms 3.66 3.31 0-11
TD False alarms 1.71 2.18 0-12
DYS Correct responses 33.21 9.73 14-51
TD Correct responses 48.06 9.47 25-60
Verbal short-term memory
DYS 5.97 0.91 4-8
TD 6.63 1.11 4-9
Visual attention span
DYS 0.66 0.11 0.38-0.9
TD 0.78 0.11 0.62-1
Vocabulary
DYS 52.69 8.05 17-60
TD 57.06 2.01 48-60
Verbal working memory
DYS 4.24 1.90 0-8
TD 5.39 1.40 3-8

Correlations

WRT WRE NWRT NWRE PA STM WM VOC IOK VAS
PA 0.67 0.74 0.59 0.69 1.00 0.40 0.44 0.33 0.48 0.55
STM 0.30 0.37 0.31 0.34 0.40 1.00 0.29 0.02 0.24 0.33
WM 0.26 0.26 0.29 0.31 0.44 0.29 1.00 0.14 0.26 0.41
VOC 0.32 0.50 0.37 0.40 0.33 0.02 0.14 1.00 0.32 0.26
IOK 0.70 0.52 0.68 0.40 0.48 0.24 0.26 0.32 1.00 0.49
VAS 0.45 0.53 0.48 0.41 0.55 0.33 0.41 0.26 0.49 1.00

Inferential analysis - tasks

Spoonerism

RT

Sum Sq Df F value Pr(>F)
(Intercept) 2351.246 1 10782.690 0.000
age 0.172 1 0.790 0.377
group 10.288 1 47.179 0.000
Residuals 16.790 77 NA NA
term estimate std.error statistic p.value
(Intercept) 9.315 0.090 103.840 0.000
age -0.049 0.055 -0.889 0.377
groupTD -0.786 0.114 -6.869 0.000

Accuracy

LR Chisq Df Pr(>Chisq)
age 8.483 1 0.004
group 30.674 1 0.000
age:group 6.987 1 0.008
term estimate std.error statistic p.value
(Intercept) 3.360 0.039 85.162 0.000
age 0.121 0.042 2.907 0.004
groupTD 0.249 0.046 5.421 0.000
age:groupTD -0.125 0.047 -2.639 0.008
group age.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS 0.121 0.042 Inf 0.039 0.202 2.907 0.004
TD -0.004 0.023 Inf -0.049 0.040 -0.190 0.849

BIS

Sum Sq Df F value Pr(>F)
(Intercept) 79.761 1 41.129 0.000
age 19.832 1 10.226 0.002
group 126.177 1 65.062 0.000
age:group 15.181 1 7.828 0.007
Residuals 147.388 76 NA NA
term estimate std.error statistic p.value
(Intercept) -1.861 0.290 -6.413 0.000
age 1.015 0.317 3.198 0.002
groupTD 2.844 0.353 8.066 0.000
age:groupTD -1.040 0.372 -2.798 0.007
group age.trend SE df lower.CL upper.CL t.ratio p.value
DYS 1.015 0.317 76 0.383 1.647 3.198 0.002
TD -0.025 0.193 76 -0.410 0.360 -0.128 0.899

Plot

Partial correlations

STM and WM

STM

LR Chisq Df Pr(>Chisq)
age 0.000 1 0.987
group 1.144 1 0.285
term estimate std.error statistic p.value
(Intercept) 1.786 0.078 22.768 0.000
age -0.001 0.047 -0.017 0.987
groupTD 0.105 0.098 1.065 0.287

WM

LR Chisq Df Pr(>Chisq)
age 1.537 1 0.215
group 6.333 1 0.012
term estimate std.error statistic p.value
(Intercept) 1.417 0.093 15.188 0.000
age 0.065 0.052 1.244 0.214
groupTD 0.281 0.113 2.485 0.013

Plot

Partial correlations

STM

WM

IOK

Total Score

LR Chisq Df Pr(>Chisq)
age 17.834 1 0
group 153.473 1 0
term estimate std.error statistic p.value
(Intercept) 3.352 0.035 95.270 0
age 0.077 0.018 4.239 0
groupTD 0.499 0.041 12.044 0

Correct Answers

LR Chisq Df Pr(>Chisq)
age 0.249 1 0.618
group 89.263 1 0.000
age:group 5.212 1 0.022
term estimate std.error statistic p.value
(Intercept) 3.511 0.036 97.704 0.000
age -0.020 0.040 -0.499 0.618
groupTD 0.377 0.041 9.131 0.000
age:groupTD 0.101 0.044 2.285 0.022
group age.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS -0.020 0.04 Inf -0.097 0.058 -0.499 0.618
TD 0.081 0.02 Inf 0.043 0.120 4.121 0.000

False Alarms

LR Chisq Df Pr(>Chisq)
age 19.861 1 0.000
group 36.845 1 0.000
age:group 10.615 1 0.001
term estimate std.error statistic p.value
(Intercept) 1.423 0.097 14.608 0.000
age -0.533 0.121 -4.414 0.000
groupTD -0.891 0.147 -6.052 0.000
age:groupTD 0.527 0.161 3.272 0.001
group age.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS -0.533 0.121 Inf -0.770 -0.296 -4.414 0.000
TD -0.006 0.106 Inf -0.215 0.202 -0.061 0.952

Plot

Partial correlations

Voc.

Accuracy

LR Chisq Df Pr(>Chisq)
age 5.653 1 0.017
group 10.489 1 0.001
age:group 4.180 1 0.041
term estimate std.error statistic p.value
(Intercept) 3.932 0.029 133.394 0.000
age 0.075 0.031 2.375 0.018
groupTD 0.113 0.035 3.211 0.001
age:groupTD -0.074 0.036 -2.043 0.041
group age.trend SE df asymp.LCL asymp.UCL z.ratio p.value
DYS 0.075 0.031 Inf 0.013 0.137 2.375 0.018
TD 0.000 0.018 Inf -0.036 0.036 0.018 0.986

RT

Sum Sq Df F value Pr(>F)
(Intercept) 1584.187 1 21534.856 0.000
age 0.020 1 0.271 0.604
group 3.054 1 41.509 0.000
Residuals 5.664 77 NA NA
term estimate std.error statistic p.value
(Intercept) 7.646 0.052 146.748 0.000
age -0.017 0.032 -0.520 0.604
groupTD -0.428 0.066 -6.443 0.000

Plot

VAS

Sum Sq Df F value Pr(>F)
(Intercept) 11.589 1 971.198 0.000
age 0.012 1 0.982 0.325
group 0.288 1 24.095 0.000
Residuals 0.919 77 NA NA
term estimate std.error statistic p.value
(Intercept) 0.654 0.021 31.164 0.000
age 0.013 0.013 0.991 0.325
groupTD 0.131 0.027 4.909 0.000

#### Partial correlations

Summary Inf 1

Sum Sq F value Pr(>F)
Spoonerism (RT)
(Intercept) 2351.246 10782.690 0.000
age 0.172 0.790 0.377
group 10.288 47.179 0.000
Spoonerism (BIS)
(Intercept) 79.761 41.129 0.000
age 19.832 10.226 0.002
group 126.177 65.062 0.000
age:group 15.181 7.828 0.007
VAS
(Intercept) 11.589 971.198 0.000
age 0.012 0.982 0.325
group 0.288 24.095 0.000
rowname Chisq Pr(>Chisq)
Spoonerism ACC
age 8.483 0.004
group 30.674 0.000
age:group 6.987 0.008
Verbal short-term memory
age 0.000 0.987
group 1.144 0.285
Verbal working memory
age 1.537 0.215
group 6.333 0.012
Italian orthographic knolwedge (total score)
age 17.834 0.000
group 153.473 0.000
Italian orthographic knolwedge (correct responses)
age 0.249 0.618
group 89.263 0.000
age:group 5.212 0.022
Italian orthographic knolwedge (false alarms)
age 19.861 0.000
group 36.845 0.000
age:group 10.615 0.001
Vocabulary
age 5.653 0.017
group 10.489 0.001
age:group 4.180 0.041

Analysis 1 (original approach)

Lexical reading

df %>% 
  dplyr::select(ID,group, 
                wr_time_z:nwr_error_z, 
                pa.bis, 
                forward, 
                backward, 
                it.ok.acc, 
                va.span.acc) %>% 
  
  pivot_longer(names_to = "measure", 
               values_to = "score",
               3:6) %>% 
  mutate(dimension = if_else(startsWith(measure, "wr"), "lexical", "sublex.")) %>% 
  mutate(measure = case_when(
    measure == "wr_time_z" | measure == "nwr_time_z" ~ "time",
    measure == "wr_error_z" | measure == "nwr_error_z" ~ "error"
  )) %>% 
  
  rowwise() %>%
  mutate(
    verbal.wm = mean(c_across(forward:backward))
  ) %>%
  ungroup() %>% 
  
  
  mutate(across(pa.bis:va.span.acc, ~scale(.x))) %>% 
  mutate(across(pa.bis:va.span.acc, ~as.numeric(.x))) %>% 
  mutate(measure = as.factor(measure),
         group = as.factor(group),
         verbal.wm = scale(verbal.wm), verbal.wm = as.numeric(verbal.wm)) %>% 
  
  filter(dimension == "lexical")  %>% 
  
  lmer(formula = score ~ 
       
       # group * it.ok.acc * measure + 
       measure * it.ok.acc +
       group * it.ok.acc +
       # it.ok.acc + 
       # group * va.span.acc * measure + 
       # group * va.span.acc +
       # measure * va.span.acc +
       # va.span.acc +  
       # group * pa.bis * measure +
       # group * pa.bis +
       # pa.bis * measure +
        pa.bis +
       # group * verbal.wm * measure +
       # group * verbal.wm +
       # verbal.wm * measure +
       # verbal.wm + 
         
       # group * measure + 
     
     (1|ID)
     
     ) -> lex.mod
Chisq Df Pr(>Chisq)
(Intercept) 18.347 1 0.000
measure 22.901 1 0.000
it.ok.acc 10.253 1 0.001
group 9.438 1 0.002
pa.bis 22.699 1 0.000
measure:it.ok.acc 11.500 1 0.001
it.ok.acc:group 9.491 1 0.002

measure it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
error 0.371 0.188 113.491 -0.001 0.744 1.973 0.051
time 0.963 0.188 113.491 0.590 1.336 5.117 0.000
group it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
DYS 1.193 0.266 75 0.663 1.723 4.481 0.000
TD 0.142 0.207 75 -0.271 0.555 0.685 0.496
contrast it.ok.acc estimate SE df t.ratio p.value
DYS - TD -1 -2.224 0.472 75 -4.708 0.000
DYS - TD 0 -1.173 0.382 75 -3.072 0.003
DYS - TD 1 -0.122 0.549 75 -0.223 0.824

Sublexical reading

df %>% 
  dplyr::select(ID,group, 
                wr_time_z:nwr_error_z, 
                pa.bis, 
                forward, 
                backward, 
                it.ok.acc, 
                va.span.acc) %>% 
  
  pivot_longer(names_to = "measure", 
               values_to = "score",
               3:6) %>% 
  mutate(dimension = if_else(startsWith(measure, "wr"), "lexical", "sublex.")) %>% 
  mutate(measure = case_when(
    measure == "wr_time_z" | measure == "nwr_time_z" ~ "time",
    measure == "wr_error_z" | measure == "nwr_error_z" ~ "error"
  )) %>% 
  
  rowwise() %>%
  mutate(
    verbal.wm = mean(c_across(forward:backward))
  ) %>%
  ungroup() %>%
  
  
  mutate(across(pa.bis:va.span.acc, ~scale(.x))) %>% 
  mutate(across(pa.bis:va.span.acc, ~as.numeric(.x))) %>% 
  mutate(measure = as.factor(measure),
         group = as.factor(group),
         verbal.wm = scale(verbal.wm), verbal.wm = as.numeric(verbal.wm)) %>% 
  
  filter(dimension == "sublex.")  %>% 
  
  lmer(formula = score ~ 
       
       # group * it.ok.acc * measure + 
       measure * it.ok.acc +
       # group * it.ok.acc +
       # it.ok.acc + 
       # group * va.span.acc * measure + 
       # group * va.span.acc +
       # measure * va.span.acc +
       # va.span.acc +  
       group * pa.bis * measure +
       # group * pa.bis +
       # pa.bis * measure +
       # pa.bis +
       # group * verbal.wm * measure +
       # group * verbal.wm +
       # verbal.wm * measure +
       # verbal.wm +
         
       # group * measure + 
     
     (1|ID)
     
     ) -> sublex.mod
# drop1(sublex.mod, test = "Chisq")
Chisq Df Pr(>Chisq)
(Intercept) 21.851 1 0.000
measure 1.575 1 0.209
it.ok.acc 0.260 1 0.610
group 6.507 1 0.011
pa.bis 39.591 1 0.000
measure:it.ok.acc 12.064 1 0.001
group:pa.bis 3.341 1 0.068
measure:group 0.193 1 0.660
measure:pa.bis 29.643 1 0.000
measure:group:pa.bis 5.826 1 0.016

measure it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
error -0.117 0.23 116.967 -0.573 0.338 -0.510 0.611
time 0.656 0.23 116.967 0.201 1.111 2.853 0.005
measure group pa.bis.trend SE df lower.CL upper.CL t.ratio p.value
error DYS 1.627 0.259 116.967 1.115 2.139 6.292 0.000
time DYS 0.264 0.259 116.967 -0.248 0.776 1.021 0.309
error TD 0.682 0.441 116.967 -0.192 1.556 1.546 0.125
time TD 0.527 0.441 116.967 -0.346 1.401 1.195 0.234
contrast measure pa.bis estimate SE df t.ratio p.value
DYS - TD error -1 -2.327 0.836 116.967 -2.785 0.006
DYS - TD time -1 -1.349 0.836 116.967 -1.614 0.109
DYS - TD error 0 -1.382 0.542 116.967 -2.551 0.012
DYS - TD time 0 -1.612 0.542 116.967 -2.976 0.004
DYS - TD error 1 -0.436 0.651 116.967 -0.671 0.504
DYS - TD time 1 -1.875 0.651 116.967 -2.882 0.005
measure it.ok.acc.trend SE df lower.CL upper.CL t.ratio p.value
error -0.117 0.23 116.967 -0.573 0.338 -0.510 0.611
time 0.656 0.23 116.967 0.201 1.111 2.853 0.005

Summary Inf 2

Chisq Df Pr(>Chisq)
Lexical reading predictors
(Intercept) 18.35 1 0.000
measure 22.90 1 0.000
it.ok.acc 10.25 1 0.001
group 9.44 1 0.002
pa.bis 22.70 1 0.000
measure:it.ok.acc 11.50 1 0.001
it.ok.acc:group 9.49 1 0.002
Sublexical reading predictors
(Intercept)1 21.85 1 0.000
measure1 1.58 1 0.209
it.ok.acc1 0.26 1 0.610
group1 6.51 1 0.011
pa.bis1 39.59 1 0.000
measure:it.ok.acc1 12.06 1 0.001
group:pa.bis 3.34 1 0.068
measure:group 0.19 1 0.660
measure:pa.bis 29.64 1 0.000
measure:group:pa.bis 5.83 1 0.016