This document presents the analysis of the ODMACS database including: - Data loading and preprocessing - Thematic subsetting of variables - WHODAS 2.0 items analysis with IRT using mirt and EGAnet - Distribution of WHODAS items (frequency tables and stacked bar charts) - Likert analysis of comparison items
All code is folded by default. Click the arrow at the top right of each code chunk to view the code.
We create several subsets: basic information, persisting symptoms, resolved symptoms, quality of life, functional status, and dyspnoea.
We focus on the 12 core WHODAS items. First, we convert them to numeric, compute a simple sum score, then fit a unidimensional graded‐response IRT model, extract item parameters, plot item characteristic curves and the test information function, and derive factor scores (theta).
## Iteration: 1, Log-Lik: -13131.556, Max-Change: 4.34382Iteration: 2, Log-Lik: -11983.536, Max-Change: 3.14197Iteration: 3, Log-Lik: -11737.767, Max-Change: 1.42252Iteration: 4, Log-Lik: -11644.629, Max-Change: 1.29672Iteration: 5, Log-Lik: -11600.219, Max-Change: 0.45293Iteration: 6, Log-Lik: -11575.945, Max-Change: 0.55321Iteration: 7, Log-Lik: -11558.949, Max-Change: 0.43284Iteration: 8, Log-Lik: -11546.928, Max-Change: 0.45045Iteration: 9, Log-Lik: -11538.094, Max-Change: 0.31023Iteration: 10, Log-Lik: -11531.523, Max-Change: 0.36852Iteration: 11, Log-Lik: -11526.210, Max-Change: 0.24028Iteration: 12, Log-Lik: -11521.878, Max-Change: 0.27897Iteration: 13, Log-Lik: -11518.290, Max-Change: 0.17247Iteration: 14, Log-Lik: -11515.284, Max-Change: 0.21801Iteration: 15, Log-Lik: -11512.641, Max-Change: 0.14107Iteration: 16, Log-Lik: -11510.503, Max-Change: 0.16987Iteration: 17, Log-Lik: -11508.509, Max-Change: 0.10486Iteration: 18, Log-Lik: -11506.820, Max-Change: 0.13000Iteration: 19, Log-Lik: -11505.465, Max-Change: 0.08994Iteration: 20, Log-Lik: -11504.073, Max-Change: 0.10273Iteration: 21, Log-Lik: -11502.894, Max-Change: 0.07921Iteration: 22, Log-Lik: -11501.779, Max-Change: 0.09256Iteration: 23, Log-Lik: -11500.777, Max-Change: 0.06180Iteration: 24, Log-Lik: -11499.871, Max-Change: 0.06909Iteration: 25, Log-Lik: -11497.909, Max-Change: 0.04381Iteration: 26, Log-Lik: -11497.378, Max-Change: 0.05151Iteration: 27, Log-Lik: -11496.850, Max-Change: 0.04088Iteration: 28, Log-Lik: -11494.504, Max-Change: 0.02416Iteration: 29, Log-Lik: -11494.334, Max-Change: 0.01217Iteration: 30, Log-Lik: -11494.147, Max-Change: 0.01048Iteration: 31, Log-Lik: -11493.885, Max-Change: 0.00940Iteration: 32, Log-Lik: -11493.746, Max-Change: 0.00880Iteration: 33, Log-Lik: -11493.622, Max-Change: 0.00842Iteration: 34, Log-Lik: -11493.048, Max-Change: 0.00690Iteration: 35, Log-Lik: -11492.991, Max-Change: 0.00626Iteration: 36, Log-Lik: -11492.943, Max-Change: 0.00553Iteration: 37, Log-Lik: -11492.898, Max-Change: 0.00494Iteration: 38, Log-Lik: -11492.862, Max-Change: 0.00584Iteration: 39, Log-Lik: -11492.828, Max-Change: 0.00445Iteration: 40, Log-Lik: -11492.808, Max-Change: 0.00444Iteration: 41, Log-Lik: -11492.780, Max-Change: 0.00432Iteration: 42, Log-Lik: -11492.754, Max-Change: 0.00574Iteration: 43, Log-Lik: -11492.725, Max-Change: 0.00402Iteration: 44, Log-Lik: -11492.704, Max-Change: 0.00383Iteration: 45, Log-Lik: -11492.685, Max-Change: 0.00367Iteration: 46, Log-Lik: -11492.597, Max-Change: 0.00571Iteration: 47, Log-Lik: -11492.588, Max-Change: 0.00215Iteration: 48, Log-Lik: -11492.581, Max-Change: 0.00250Iteration: 49, Log-Lik: -11492.553, Max-Change: 0.00391Iteration: 50, Log-Lik: -11492.548, Max-Change: 0.00151Iteration: 51, Log-Lik: -11492.545, Max-Change: 0.00167Iteration: 52, Log-Lik: -11492.541, Max-Change: 0.00149Iteration: 53, Log-Lik: -11492.538, Max-Change: 0.00179Iteration: 54, Log-Lik: -11492.535, Max-Change: 0.00136Iteration: 55, Log-Lik: -11492.529, Max-Change: 0.00117Iteration: 56, Log-Lik: -11492.528, Max-Change: 0.00086Iteration: 57, Log-Lik: -11492.526, Max-Change: 0.00085Iteration: 58, Log-Lik: -11492.521, Max-Change: 0.00062Iteration: 59, Log-Lik: -11492.520, Max-Change: 0.00059Iteration: 60, Log-Lik: -11492.520, Max-Change: 0.00055Iteration: 61, Log-Lik: -11492.517, Max-Change: 0.00014Iteration: 62, Log-Lik: -11492.517, Max-Change: 0.00013Iteration: 63, Log-Lik: -11492.517, Max-Change: 0.00014Iteration: 64, Log-Lik: -11492.516, Max-Change: 0.00089Iteration: 65, Log-Lik: -11492.516, Max-Change: 0.00011Iteration: 66, Log-Lik: -11492.516, Max-Change: 0.00054Iteration: 67, Log-Lik: -11492.516, Max-Change: 0.00070Iteration: 68, Log-Lik: -11492.515, Max-Change: 0.00020Iteration: 69, Log-Lik: -11492.515, Max-Change: 0.00009
## F1 h2
## func_stand 0.895 0.801
## func_hous 0.924 0.854
## func_learn 0.826 0.682
## func_sociality 0.830 0.689
## func_emot 0.693 0.480
## func_con 0.708 0.501
## func_walk 0.883 0.780
## func_wash 0.961 0.924
## func_dress 0.963 0.928
## func_deal_strangers 0.774 0.598
## func_friend 0.786 0.618
## func_work 0.871 0.759
##
## SS loadings: 8.614
## Proportion Var: 0.718
##
## Factor correlations:
##
## F1
## F1 1
## $items
## a b1 b2 b3 b4
## func_stand 3.412 0.151 0.832 1.386 2.072
## func_hous 4.117 0.804 1.446 1.930 2.520
## func_learn 2.495 1.216 1.929 2.482 3.229
## func_sociality 2.531 1.404 2.050 2.436 2.773
## func_emot 1.634 1.510 2.453 3.326 4.777
## func_con 1.705 1.229 2.343 3.285 5.289
## func_walk 3.205 0.022 0.702 1.296 1.902
## func_wash 5.951 1.374 1.813 2.202 2.662
## func_dress 6.090 1.388 1.823 2.315 2.879
## func_deal_strangers 2.077 2.203 2.941 3.548 4.133
## func_friend 2.166 2.256 2.887 3.488 3.905
## func_work 3.023 1.034 1.581 2.254 3.128
##
## $means
## F1
## 0
##
## $cov
## F1
## F1 1
## [1] "Correlation between WHODAS sum score and theta: 0.876"
We now generate frequency tables, a distribution table (percentages), and a horizontal stacked bar chart for the WHODAS items.
## [1] "Frequency Tables for each WHODAS item:"
## $func_stand
## .x
## 0 1 2 3 4 <NA>
## 1118 450 257 156 62 48
##
## $func_hous
## .x
## 0 1 2 3 4 <NA>
## 1570 290 108 53 20 50
##
## $func_learn
## .x
## 0 1 2 3 4 <NA>
## 1720 213 67 30 10 51
##
## $func_sociality
## .x
## 0 1 2 3 4 <NA>
## 1789 158 43 21 24 56
##
## $func_emot
## .x
## 0 1 2 3 4 <NA>
## 1734 206 69 26 3 53
##
## $func_con
## .x
## 0 1 2 3 4 <NA>
## 1653 286 73 25 1 53
##
## $func_walk
## .x
## 0 1 2 3 4 <NA>
## 1028 466 292 161 94 50
##
## $func_wash
## .x
## 0 1 2 3 4 <NA>
## 1859 107 42 22 11 50
##
## $func_dress
## .x
## 0 1 2 3 4 <NA>
## 1864 105 49 18 6 49
##
## $func_deal_strangers
## .x
## 0 1 2 3 4 <NA>
## 1948 66 18 6 3 50
##
## $func_friend
## .x
## 0 1 2 3 4 <NA>
## 1959 53 18 5 4 52
##
## $func_work
## .x
## 0 1 2 3 4 <NA>
## 1666 211 116 41 8 49
## [1] "Distribution Table (Percentages) for WHODAS Items:"
## # A tibble: 12 × 7
## item `No difficulty` `Mild difficulty` `Moderate difficulty`
## <chr> <dbl> <dbl> <dbl>
## 1 func_con 79.1 13.7 3.49
## 2 func_deal_strangers 93.2 3.16 0.861
## 3 func_dress 89.1 5.02 2.34
## 4 func_emot 82.9 9.85 3.30
## 5 func_friend 93.7 2.53 0.861
## 6 func_hous 75.1 13.9 5.16
## 7 func_learn 82.3 10.2 3.20
## 8 func_sociality 85.6 7.56 2.06
## 9 func_stand 53.5 21.5 12.3
## 10 func_walk 49.2 22.3 14.0
## 11 func_wash 88.9 5.12 2.01
## 12 func_work 79.7 10.1 5.55
## # ℹ 3 more variables: `Severe difficulty` <dbl>,
## # `Extreme difficulty or cannot do` <dbl>, `NA` <dbl>
We now analyze the comparison items that capture respondents’ perceived change compared to before COVID. We recode the numeric responses (1 = Better, 2 = Same, 3 = Worse) into descriptive labels and create a Likert plot.
## The default 'loading.method' has changed to "revised" in {EGAnet} version >= 2.0.7.
##
## For the previous default (version <= 2.0.6), use `loading.method = "original"`
## Loading Method: Revised
##
## 1
## func_dress 0.556
## func_friend 0.556
## func_wash 0.543
## func_learn 0.522
## func_hous 0.504
## func_sociality 0.452
## func_deal_strangers 0.449
## func_stand 0.448
## func_work 0.439
## func_walk 0.426
## func_con 0.352
## func_emot 0.286
## Standardized loadings >= |0.10| are displayed. To change this 'minimum', use `print(net.loads_object, minimum = 0.10)`
## [1] "func_stand" "func_hous" "func_learn"
## [4] "func_sociality" "func_emot" "func_con"
## [7] "func_walk" "func_wash" "func_dress"
## [10] "func_deal_strangers" "func_friend" "func_work"
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->ldw_parse_model_string():
## having identifiers with spaces ('Fat 1') is deprecated at line 1, pos 1
## Fat 1 =~ func_stand + func_hous + func_learn + func_sociality + func_emot + func_con + func_walk + func_wash + func_dress + func_deal_strangers + func_friend + func_work
## ^
## Warning: lavaan->lav_data_full():
## some cases are empty and will be ignored: 14 19 39 43 58 60 84 112 114 144
## 171 174 179 186 202 217 356 439 464 468 485 548 603 914 1161 1341 1343
## 1345 1356 1396 1397 1404 1422 1471 1639 1658 1659 1720 1774 1814 2056 2065
## 2086 2091.
## Registered S3 method overwritten by 'kutils':
## method from
## print.likert likert
## npar fmin
## 60.000 0.314
## chisq df
## 1283.540 54.000
## pvalue chisq.scaled
## 0.000 1383.566
## df.scaled pvalue.scaled
## 54.000 0.000
## chisq.scaling.factor baseline.chisq
## 0.943 184799.408
## baseline.df baseline.pvalue
## 66.000 0.000
## baseline.chisq.scaled baseline.df.scaled
## 69552.801 66.000
## baseline.pvalue.scaled baseline.chisq.scaling.factor
## 0.000 2.659
## cfi tli
## 0.993 0.992
## cfi.scaled tli.scaled
## 0.981 0.977
## cfi.robust tli.robust
## 0.648 0.570
## nnfi rfi
## 0.992 0.992
## nfi pnfi
## 0.993 0.812
## ifi rni
## 0.993 0.993
## nnfi.scaled rfi.scaled
## 0.977 0.976
## nfi.scaled pnfi.scaled
## 0.980 0.802
## ifi.scaled rni.scaled
## 0.981 0.981
## nnfi.robust rni.robust
## 0.570 0.648
## rmsea rmsea.ci.lower
## 0.105 0.101
## rmsea.ci.upper rmsea.ci.level
## 0.111 0.900
## rmsea.pvalue rmsea.close.h0
## 0.000 0.050
## rmsea.notclose.pvalue rmsea.notclose.h0
## 1.000 0.080
## rmsea.scaled rmsea.ci.lower.scaled
## 0.110 0.105
## rmsea.ci.upper.scaled rmsea.pvalue.scaled
## 0.115 0.000
## rmsea.notclose.pvalue.scaled rmsea.robust
## 1.000 0.320
## rmsea.ci.lower.robust rmsea.ci.upper.robust
## 0.295 0.344
## rmsea.pvalue.robust rmsea.notclose.pvalue.robust
## 0.000 1.000
## rmr rmr_nomean
## 0.081 0.103
## srmr srmr_bentler
## 0.103 0.081
## srmr_bentler_nomean crmr
## 0.103 0.085
## crmr_nomean srmr_mplus
## 0.112 NA
## srmr_mplus_nomean cn_05
## NA 116.014
## cn_01 gfi
## 130.226 0.994
## agfi pgfi
## 0.988 0.471
## mfi wrmr
## 0.740 3.355
IRT Analysis:
The graded-response IRT model yielded item discrimination (a) and
threshold (b) parameters for each WHODAS item. Items with high
discrimination—such as func_wash (a = 5.95) and
func_dress (a = 6.09)—are particularly sensitive to differences
in the latent disability trait. Threshold parameters indicate the latent
trait levels at which respondents transition between categories (e.g.,
for func_stand, thresholds at 0.151, 0.832, 1.386, and 2.072
suggest progressively higher difficulty endorsements).
WHODAS Sum Score vs. Theta:
The latent trait (theta) derived from the IRT model shows a strong
positive correlation (r = 0.876) with the simple sum score of the WHODAS
items. This indicates that the sum score is a reasonable approximation
of the underlying disability construct, although theta offers a refined
measure that accounts for differential item characteristics.
Item Response Distributions:
Frequency and distribution tables, along with the stacked bar chart,
reveal variability across WHODAS items. For instance,
func_friend and func_deal_strangers display very high
percentages of “No difficulty” responses, whereas items like
func_stand and func_walk have a broader spread across
categories. This suggests that certain functional domains (e.g.,
mobility) are more affected in this sample.
Comparison Items (Likert Plot):
The Likert plot for the comparison items—where responses are recoded as
1 = Better, 2 = Same, 3 = Worse—indicates that most respondents perceive
little improvement, with many reporting that their current functioning
is “Same” or “Worse” compared to before COVID. This underscores the
generally negative impact of COVID-19 on patient functioning.