Overview

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.

1. Data Loading and Preprocessing

2. Thematic Subsets

We create several subsets: basic information, persisting symptoms, resolved symptoms, quality of life, functional status, and dyspnoea.

3. WHODAS Items & IRT Analysis

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"

4. Distribution of WHODAS Items Responses

We now generate frequency tables, a distribution table (percentages), and a horizontal stacked bar chart for the WHODAS items.

4.1 Frequency and Distribution Table

## [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>

4.2 Stacked Bar Chart

5. WHODAS Comparison Items: Likert Plot

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

Interpretation

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.