Introduction

We begin with a descriptive question: What types of actions do Americans deem acceptable when someone disagrees with the results of an election? Here we focus on levels of support for various actions such as protesting, criticizing election integrity, burning the American flag, ballot recounts, or challenging the outcome in the courts. Moreover, we are interested in understanding the underlying structure of contestation preferences. Is a construct like contestation multidimensional? Is it stable over time? What factors contribute to variation or instability?

On one hand, we might expect that contestation behaviors reside on a single underlying dimension, anchored by a preference for contestation behaviors on one pole, and an opposition to these behaviors at the other pole. However, there are several reasons to expect more nuance, due primarily to different norms surrounding such behaviors. For instance, while recounting ballots and supporting legal means to contest an election are common and generally perceived-to-be acceptable behaviors, attending a march or burning the flag are seen as more active and potentially transgressive behaviors. Contestation behaviors may be effectively disaggregated into forms that pose a relatively high cost for individual citizens (i.e, require action) versus forms of contestation that are passive and impose a low cost for citizens. They can also be viewed as a continuum of behaviors that range from less to more normatively acceptable.

In this document, I describe the panel data sets, with some relatively simple anlaysis.

Summary of Findings

TL;DR

  1. Using two panel data sets, one constructed from the Western States and a second from The Arizona Voter Project, we examine the stability of contestation attitudes. Over a four year period (WSS), contestation beliefs are volatile. The construct is not a stable disposition characteristics. Stability is higher over a one-year period absent an election (AVP)
  1. The correlations between the same contestation behavior over four years are low, with some negative correlations.
  2. The correlations over one year period are higher, but still modest.
  3. Several factor models were estimated to ascertain how stable these constructs are over time: The Simplex Model which is more or less a two factor model, one with contestation at wave 1 and another contestation at wave 2 and an autoregressive (stability) parameter, and The Trait-State-Occasion model which allows us to decompose the panel variance into state (varying) and trait (stable) components. Unfortunately, because there is so much volatility in responding to these items, the interpretation of these models is challenging, but suffice it to say, there is very little evidence that these beliefs are bound up in a disposition, or stable trait factor.

Data

We measure support for behaviors aimed at contesting election results with a question battery that captures some of the most prominent ways election results are contested. Respondents were asked,

Many people are unhappy with the outcomes of elections. How much do you support or oppose each of the following behaviors when people are unhappy with the outcome of an election?

\(\bullet\) Attend a march or demonstration (WSS20[1/2], WSS24, AVPW1, AVPW2, ASU, BYU)

\(\bullet\) Burning the American flag (WSS20, WSS24, AVPW1, AVPW2, ASU, BYU)

\(\bullet\) Contest the outcome in the courts (WSS20, WSS24, AVPW1, AVPW2, ASU, BYU)

\(\bullet\) Support ballot recounts (WSS20, WSS24, AVPW1, AVPW2, ASU, BYU)

\(\bullet\) Publicly criticize the integrity or fairness of the election (WSS20[1/2], WSS24, AVPW1, AVPW2, ASU, BYU)

We rely on seven data sets in this project. The Western States Survey conducted in both 2020 and 2024. The Arizona Voter Project election surveys, conducted in 2023 and 2024, the 2022 Congressional Election Study BYU and ASU modules, and the 2024 Congressional Election Study BYU module. In the package that includes functions and ways to construct these data, there are several preloaded files.

The electoralContestation package (currently in a private repository, which I can share with you all) includes the following data sets:

Panel Data Analysis

I constructed the panel data sets from the crosswalk data.

# Print data sets
# utils::data(package = "electoralContestation")
cat("The wide version of the panel data has", nrow(wide_panel_data), "rows and", ncol(wide_panel_data), "columns.")
## The wide version of the panel data has 834 rows and 174 columns.

The dimensions match those found in the crosswalk data, crosswalk_df.

cat("The crosswalk data has", nrow(crosswalk_df), "rows")
## The crosswalk data has 834 rows

The full crosswalk data, with seven surveys, can be used to examine overlap across surveys. The UpSetR package provides a way to visualize overlap across multiple sets.

## Summary:
## # A tibble: 7 × 2
##   Dataset      N_Respondents
##   <chr>                <int>
## 1 AVP 2024               496
## 2 AVP 2023               444
## 3 WSS 2024               430
## 4 WSS 2020               419
## 5 CES BYU 2024            37
## 6 CES ASU 2022            28
## 7 CES BYU 2022            21
## 
## Total respondents: 834
## AVP Panel (both 2023 & 2024): 387 respondents
## CES BYU Panel (both 2022 & 2024): 1 respondents
## WSS Panel (both 2020 & 2024): 267 respondents
## AVP & CES 2022 overlap: 8 respondents
## WSS & CES overlap: 68 respondents

The `UpSet’ plot is an easier-to-read form of a Venn diagram, with many intersections – here corresponding to overlap across seven surveys. There is considerable overlap for for Western States respondents, which consists of two waves (2020 and 2024), and the Arizona Voter Project, which has two waves (2023 and 2024). There are \(n=387\) repeat interviews in the AVP, and \(n=267\) in the Wester States. This creates two two-wave panel structures, one separated by four years, and one just over one. For the time being, I’ll just focus on these, due in large part to the fact that the other surveys already follow a panel structure, a “pre” and “post” version, coupled with experimental treatments. Both the AVP and Western States are relatively straightforward designs, with no treatments, that follow a simple two-wave panel structure.

Using the wide_panel_data its informative to examine over time correlations.

Correlations: Western States (2020-2024) and Arizona Voter Project (2023-2024)

Let’s start by examining the over time correlations, displayed as a heatmap.

What I take away from this is that electoral contestation is not a dispositional tendency – the over time correlations are pretty modest, sometimes negative. These preferences seem to be somewhat volatile over time. Flag burning in 2020 is correlated with Flag burning at 2024 at just \(r=0.17\). Attending a march is correlated at \(r=0.38\), whereas contesting the outcome in the courts and ballot recounts have over time correlations of \(r= 0.16\) and \(r=0.12\) respectively. Criticizing the election is negatively correlated over time, \(r= -0.25\)

On the other hand, over-time stability over a one-year period is higher.

These correlations are much higher – though still somewhat mixed – likely due in part to the fact that these data are not separated by an election and are in close proximity.

Next, we can simply look at the individual trajectories for each item, by item.

Individual Trajectories: Western States (2020-2024)

Individual Trajectories: Arizona Voter Project (2023-2024)

Notice the increased stability for the one-year-separated AVP panel (though again, there seems to be a lot of switching). The next thing I looked at was the general factor structure, over time. Unfortunately, there’s not a lot we can do with just two waves, but we can estimate a few simple models to get a sense of stability over time. One is called the simplex model and the other is the trait-state-occasion model. Both include factors to account for measurement error, and both include a parameters or sets of parameters that captures stability over time.

SEM: The Simplex Model

The Simplex Model (Joreskog, 1970) is a measurement model where \(t-1\) measurements predict measurements at \(t\) and \(t\) predict measurements at \(t+1\). With factors that account for measurement error, this is better described as the **quasi simplex* model, the the general structure is the same. The logic is actually relatively straightforward: (1) Estimate two factors, one factor is contestation(2024), and a second is contestation(2024). (2) In the model, constrain factor loadings and variances – these restrictions can be relaxed later – and (3) specify an autoregressive parameter such that the 2020 contestation factor predicts the 2024 contestation factor. (4) Interpret the standardized autoregressive parameter as a measure of stability over time.

I estimate the model in two ways, one with weighted least squares (WLS) and one with maximum likelihood (ML). Unfortunately, lavaan does not allow for full-information-maximum-likelihood estimation with ordinal variables, so the WLS model treats the variables as ordinal but drops missing cases using listwise deleition, and the ML model treats the data as continuous, but uses full information maximum likelihood to handle missing data, where we assume the data are missing at random (MAR) in the maximum likelihood model.

Here I print the model code and full results – apologies, it’s a bit long.

library(lavaan)

ordinal_vars <- c("attend_march_wss20", "burn_flag_wss20",
                  "court_wss20", "recount_wss20", 
                  "criticize_election_wss20",
                  "attend_march_wss24", "burn_flag_wss24", 
                  "court_wss24", "recount_wss24", 
                  "criticize_election_wss24")

# Simplex model 
# Invariance: Fix all loadings as equal over time.
simplex_wss <- '
  # Latent factors with equal loadings across time
  contestation_20 =~ L1*attend_march_wss20 + L2*burn_flag_wss20 + L3*court_wss20 + 
                     L4*recount_wss20 + L5*criticize_election_wss20
  contestation_24 =~ L1*attend_march_wss24 + L2*burn_flag_wss24 + L3*court_wss24 + 
                     L4*recount_wss24 + L5*criticize_election_wss24
  
  contestation_24 ~ contestation_20

  # Equal residual variances across time for same items
  attend_march_wss20 ~~ E1*attend_march_wss20
  attend_march_wss24 ~~ E1*attend_march_wss24
  burn_flag_wss20    ~~ E2*burn_flag_wss20  
  burn_flag_wss24    ~~ E2*burn_flag_wss24
  court_wss20        ~~ E3*court_wss20
  court_wss24        ~~ E3*court_wss24
  recount_wss20      ~~ E4*recount_wss20
  recount_wss24      ~~ E4*recount_wss24
  criticize_election_wss20 ~~ E5*criticize_election_wss20
  criticize_election_wss24 ~~ E5*criticize_election_wss24
  
  contestation_20 ~~ 1*contestation_20
'

# WLS
fit_simplex_ordinal <- sem(simplex_wss, 
                   data = wide_panel_data, 
                   ordered = ordinal_vars,
                   estimator = "wlsmv")
# ML
fit_simplex <- sem(simplex_wss, 
                   data = wide_panel_data, 
                   estimator = "ml",
                   missing = "fiml")
cat("The Ordinal Simplex Model, using Listwise Deletion\n")
## The Ordinal Simplex Model, using Listwise Deletion
summary(fit_simplex_ordinal, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 15 iterations
## 
##   Estimator                                       DWLS
##   Optimization method                           NLMINB
##   Number of model parameters                        60
##   Number of equality constraints                     9
## 
##                                                   Used       Total
##   Number of observations                           267         834
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               805.596     618.252
##   Degrees of freedom                                34          34
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.322
##   Shift parameter                                            8.786
##     simple second-order correction                                
## 
## Model Test Baseline Model:
## 
##   Test statistic                              1780.001    1179.023
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.530
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.555       0.485
##   Tucker-Lewis Index (TLI)                       0.411       0.318
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.130
##   Robust Tucker-Lewis Index (TLI)                           -0.152
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.292       0.254
##   90 Percent confidence interval - lower         0.275       0.237
##   90 Percent confidence interval - upper         0.310       0.272
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    1.000       1.000
##                                                                   
##   Robust RMSEA                                               0.316
##   90 Percent confidence interval - lower                     0.293
##   90 Percent confidence interval - upper                     0.340
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.212       0.212
## 
## Parameter Estimates:
## 
##   Parameterization                               Delta
##   Standard errors                           Robust.sem
##   Information                                 Expected
##   Information saturated (h1) model        Unstructured
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_20 =~                                                      
##     attnd__20 (L1)      1.000                               1.000    1.000
##     brn_fl_20 (L2)      0.732    0.039   18.936    0.000    0.732    0.732
##     crt_wss20 (L3)      0.568    0.037   15.308    0.000    0.568    0.568
##     rcnt_ws20 (L4)      0.488    0.043   11.461    0.000    0.488    0.488
##     crtcz__20 (L5)      0.610    0.033   18.328    0.000    0.610    0.610
##   contestation_24 =~                                                      
##     attnd__24 (L1)      1.000                               0.744    0.744
##     brn_fl_24 (L2)      0.732    0.039   18.936    0.000    0.544    0.544
##     crt_wss24 (L3)      0.568    0.037   15.308    0.000    0.423    0.423
##     rcnt_ws24 (L4)      0.488    0.043   11.461    0.000    0.363    0.363
##     crtcz__24 (L5)      0.610    0.033   18.328    0.000    0.454    0.454
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_20     0.402    0.045    9.012    0.000    0.540    0.540
## 
## Thresholds:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     attnd_mrc_20|1   -0.493    0.080   -6.141    0.000   -0.493   -0.493
##     attnd_mrc_20|2   -0.070    0.077   -0.916    0.360   -0.070   -0.070
##     attnd_mrc_20|3    0.472    0.080    5.901    0.000    0.472    0.472
##     attnd_mrc_20|4    1.319    0.107   12.346    0.000    1.319    1.319
##     brn_flg_ws20|1   -0.847    0.088   -9.652    0.000   -0.847   -0.847
##     brn_flg_ws20|2   -0.290    0.078   -3.721    0.000   -0.290   -0.290
##     brn_flg_ws20|3    0.672    0.083    8.044    0.000    0.672    0.672
##     brn_flg_ws20|4    1.341    0.108   12.410    0.000    1.341    1.341
##     court_wss20|t1   -0.744    0.085   -8.742    0.000   -0.744   -0.744
##     court_wss20|t2   -0.242    0.078   -3.112    0.002   -0.242   -0.242
##     court_wss20|t3    0.719    0.085    8.511    0.000    0.719    0.719
##     court_wss20|t4    1.414    0.112   12.575    0.000    1.414    1.414
##     recnt_wss20|t1   -1.781    0.143  -12.496    0.000   -1.781   -1.781
##     recnt_wss20|t2   -1.467    0.116  -12.656    0.000   -1.467   -1.467
##     recnt_wss20|t3   -0.340    0.078   -4.329    0.000   -0.340   -0.340
##     recnt_wss20|t4    0.902    0.089   10.094    0.000    0.902    0.902
##     crtcz_lct_20|1    0.410    0.079    5.177    0.000    0.410    0.410
##     crtcz_lct_20|2    0.820    0.087    9.427    0.000    0.820    0.820
##     crtcz_lct_20|3    1.440    0.114   12.619    0.000    1.440    1.440
##     crtcz_lct_20|4    1.829    0.148   12.382    0.000    1.829    1.829
##     attnd_mrc_24|1   -1.087    0.096  -11.339    0.000   -1.087   -1.087
##     attnd_mrc_24|2   -0.660    0.083   -7.926    0.000   -0.660   -0.660
##     attnd_mrc_24|3    0.271    0.078    3.478    0.001    0.271    0.271
##     attnd_mrc_24|4    0.902    0.089   10.094    0.000    0.902    0.902
##     brn_flg_ws24|1    0.660    0.083    7.926    0.000    0.660    0.660
##     brn_flg_ws24|2    0.902    0.089   10.094    0.000    0.902    0.902
##     brn_flg_ws24|3    1.555    0.122   12.719    0.000    1.555    1.555
##     brn_flg_ws24|4    1.829    0.148   12.382    0.000    1.829    1.829
##     court_wss24|t1   -0.960    0.091  -10.525    0.000   -0.960   -0.960
##     court_wss24|t2   -0.493    0.080   -6.141    0.000   -0.493   -0.493
##     court_wss24|t3    0.370    0.079    4.692    0.000    0.370    0.370
##     court_wss24|t4    1.214    0.101   11.970    0.000    1.214    1.214
##     recnt_wss24|t1   -1.940    0.161  -12.041    0.000   -1.940   -1.940
##     recnt_wss24|t2   -1.275    0.104  -12.205    0.000   -1.275   -1.275
##     recnt_wss24|t3   -0.451    0.080   -5.660    0.000   -0.451   -0.451
##     recnt_wss24|t4    0.637    0.083    7.691    0.000    0.637    0.637
##     crtcz_lct_24|1   -0.648    0.083   -7.809    0.000   -0.648   -0.648
##     crtcz_lct_24|2   -0.242    0.078   -3.112    0.002   -0.242   -0.242
##     crtcz_lct_24|3    0.683    0.084    8.161    0.000    0.683    0.683
##     crtcz_lct_24|4    1.234    0.102   12.051    0.000    1.234    1.234
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd__20 (E1)    0.000                               0.000    0.000
##    .attnd__24 (E1)    0.447    0.934    0.478    0.632    0.447    0.447
##    .brn_fl_20 (E2)    0.464    0.999    0.465    0.642    0.464    0.464
##    .brn_fl_24 (E2)    0.704    1.000    0.704    0.482    0.704    0.704
##    .crt_wss20 (E3)    0.677    0.999    0.678    0.498    0.677    0.677
##    .crt_wss24 (E3)    0.821    1.000    0.822    0.411    0.821    0.821
##    .rcnt_ws20 (E4)    0.762    0.998    0.763    0.445    0.762    0.762
##    .rcnt_ws24 (E4)    0.868    1.000    0.869    0.385    0.868    0.868
##    .crtcz__20 (E5)    0.628    0.999    0.629    0.530    0.628    0.628
##    .crtcz__24 (E5)    0.794    1.000    0.794    0.427    0.794    0.794
##     cntstt_20         1.000                               1.000    1.000
##    .cntstt_24         0.392    0.064    6.143    0.000    0.708    0.708
cat("The Linear Simplex Model, using FIML\n")
## The Linear Simplex Model, using FIML
summary(fit_simplex, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 34 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        30
##   Number of equality constraints                     9
## 
##                                                   Used       Total
##   Number of observations                           582         834
##   Number of missing patterns                         3            
## 
## Model Test User Model:
##                                                       
##   Test statistic                               579.472
##   Degrees of freedom                                44
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                               972.432
##   Degrees of freedom                                45
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.423
##   Tucker-Lewis Index (TLI)                       0.410
##                                                       
##   Robust Comparative Fit Index (CFI)             0.373
##   Robust Tucker-Lewis Index (TLI)                0.359
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6534.368
##   Loglikelihood unrestricted model (H1)      -6244.632
##                                                       
##   Akaike (AIC)                               13110.736
##   Bayesian (BIC)                             13202.432
##   Sample-size adjusted Bayesian (SABIC)      13135.764
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.145
##   90 Percent confidence interval - lower         0.134
##   90 Percent confidence interval - upper         0.155
##   P-value H_0: RMSEA <= 0.050                    0.000
##   P-value H_0: RMSEA >= 0.080                    1.000
##                                                       
##   Robust RMSEA                                   0.194
##   90 Percent confidence interval - lower         0.180
##   90 Percent confidence interval - upper         0.208
##   P-value H_0: Robust RMSEA <= 0.050             0.000
##   P-value H_0: Robust RMSEA >= 0.080             1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.167
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_20 =~                                                      
##     attnd__20 (L1)      1.000                               1.000    0.676
##     brn_fl_20 (L2)      0.723    0.065   11.145    0.000    0.723    0.582
##     crt_wss20 (L3)      0.752    0.067   11.233    0.000    0.752    0.577
##     rcnt_ws20 (L4)      0.568    0.054   10.540    0.000    0.568    0.547
##     crtcz__20 (L5)      0.639    0.061   10.480    0.000    0.639    0.505
##   contestation_24 =~                                                      
##     attnd__24 (L1)      1.000                               0.732    0.558
##     brn_fl_24 (L2)      0.723    0.065   11.145    0.000    0.530    0.464
##     crt_wss24 (L3)      0.752    0.067   11.233    0.000    0.551    0.460
##     rcnt_ws24 (L4)      0.568    0.054   10.540    0.000    0.416    0.431
##     crtcz__24 (L5)      0.639    0.061   10.480    0.000    0.468    0.393
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_20     0.401    0.072    5.555    0.000    0.547    0.547
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    2.664    0.072   37.218    0.000    2.664    1.801
##    .burn_flg_wss20    2.855    0.060   47.328    0.000    2.855    2.296
##    .court_wss20       2.738    0.063   43.292    0.000    2.738    2.100
##    .recount_wss20     3.746    0.050   74.295    0.000    3.746    3.607
##    .crtcz_lctn_w20    1.684    0.062   27.363    0.000    1.684    1.330
##    .attnd_mrch_w24    3.212    0.063   51.088    0.000    3.212    2.445
##    .burn_flg_wss24    1.602    0.055   29.252    0.000    1.602    1.404
##    .court_wss24       3.005    0.058   52.239    0.000    3.005    2.507
##    .recount_wss24     3.847    0.046   83.144    0.000    3.847    3.992
##    .crtcz_lctn_w24    2.734    0.057   47.836    0.000    2.734    2.298
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd__20 (E1)    1.189    0.079   15.054    0.000    1.189    0.543
##    .attnd__24 (E1)    1.189    0.079   15.054    0.000    1.189    0.689
##    .brn_fl_20 (E2)    1.023    0.064   16.078    0.000    1.023    0.662
##    .brn_fl_24 (E2)    1.023    0.064   16.078    0.000    1.023    0.785
##    .crt_wss20 (E3)    1.134    0.071   15.991    0.000    1.134    0.667
##    .crt_wss24 (E3)    1.134    0.071   15.991    0.000    1.134    0.789
##    .rcnt_ws20 (E4)    0.756    0.045   16.682    0.000    0.756    0.701
##    .rcnt_ws24 (E4)    0.756    0.045   16.682    0.000    0.756    0.814
##    .crtcz__20 (E5)    1.196    0.067   17.797    0.000    1.196    0.745
##    .crtcz__24 (E5)    1.196    0.067   17.797    0.000    1.196    0.845
##     cntstt_20         1.000                               1.000    1.000
##    .cntstt_24         0.376    0.076    4.959    0.000    0.701    0.701

Results from the Simplex Model

The over time stability coefficient is about \(0.4\) in both models, indicating moderate stability over this four year period. The fit, however, is quite poor. Typically the CFI and TLI should be above \(0.90\) and the RMSEA below \(0.05\). Here, the CFI and TLI are below \(0.80\), and the RMSEA is above \(0.10\). These models fit the data quite poorly and should not be relied upon. There is either misspecification in the model, or the data do not really follow this structure.

One approach would be to modify the simplex, relaxing the equality of factor loading constraints and allowing the residuals to correlate over time.

Modified Simplex (varying loadings, correlated resisuals)

Let’s remove the equal loadings constraint, and allow the residuals for the same items to correlate over time

library(lavaan)


ordinal_vars <- c("attend_march_wss20", "burn_flag_wss20",
                  "court_wss20", "recount_wss20", 
                  "criticize_election_wss20",
                  "attend_march_wss24", "burn_flag_wss24", 
                  "court_wss24", "recount_wss24", 
                  "criticize_election_wss24")
# Free the loadings
simplex_wss <- '
  # Latent factors with equal loadings across time
  contestation_20 =~ attend_march_wss20 +  court_wss20 + burn_flag_wss20+ 
                     recount_wss20 + criticize_election_wss20
  contestation_24 =~ attend_march_wss24 + court_wss24 +  burn_flag_wss24 +
                     recount_wss24 + criticize_election_wss24
  
  contestation_24 ~ contestation_20

  attend_march_wss20 ~~ attend_march_wss24
  burn_flag_wss20 ~~ burn_flag_wss24  
  court_wss20 ~~ court_wss24
  recount_wss20 ~~ recount_wss24
  criticize_election_wss20 ~~ criticize_election_wss24
'


fit_simplex_ordinal <- sem(simplex_wss, 
                   data = wide_panel_data, 
                   ordered = ordinal_vars,
                   estimator = "wlsmv")
fit_simplex <- sem(simplex_wss, 
                   data = wide_panel_data, 
                   estimator = "ml",
                   missing = "fiml")
cat("The Ordinal Simplex Model, using Listwise Deletion\n")
## The Ordinal Simplex Model, using Listwise Deletion
summary(fit_simplex_ordinal, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 32 iterations
## 
##   Estimator                                       DWLS
##   Optimization method                           NLMINB
##   Number of model parameters                        56
## 
##                                                   Used       Total
##   Number of observations                           267         834
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               518.738     523.556
##   Degrees of freedom                                29          29
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.006
##   Shift parameter                                            7.705
##     simple second-order correction                                
## 
## Model Test Baseline Model:
## 
##   Test statistic                              1780.001    1179.023
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.530
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.718       0.564
##   Tucker-Lewis Index (TLI)                       0.562       0.323
##                                                                   
##   Robust Comparative Fit Index (CFI)                           NaN
##   Robust Tucker-Lewis Index (TLI)                             -Inf
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.252       0.253
##   90 Percent confidence interval - lower         0.233       0.234
##   90 Percent confidence interval - upper         0.271       0.272
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    1.000       1.000
##                                                                   
##   Robust RMSEA                                                 Inf
##   90 Percent confidence interval - lower                        NA
##   90 Percent confidence interval - upper                        NA
##   P-value H_0: Robust RMSEA <= 0.050                            NA
##   P-value H_0: Robust RMSEA >= 0.080                            NA
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.191       0.191
## 
## Parameter Estimates:
## 
##   Parameterization                               Delta
##   Standard errors                           Robust.sem
##   Information                                 Expected
##   Information saturated (h1) model        Unstructured
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_20 =~                                                      
##     attnd_mrch_w20      1.000                               0.568    0.568
##     court_wss20         0.910    0.093    9.735    0.000    0.517    0.517
##     burn_flg_wss20      1.345    0.124   10.865    0.000    0.764    0.764
##     recount_wss20       0.908    0.099    9.206    0.000    0.515    0.515
##     crtcz_lctn_w20      1.538    0.154   10.016    0.000    0.873    0.873
##   contestation_24 =~                                                      
##     attnd_mrch_w24      1.000                               0.466    0.466
##     court_wss24         0.987    0.167    5.908    0.000    0.460    0.460
##     burn_flg_wss24      1.990    0.298    6.676    0.000    0.928    0.928
##     recount_wss24       0.558    0.154    3.625    0.000    0.260    0.260
##     crtcz_lctn_w24      0.689    0.162    4.255    0.000    0.321    0.321
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_20     0.590    0.098    6.009    0.000    0.718    0.718
## 
## Covariances:
##                               Estimate  Std.Err  z-value  P(>|z|)   Std.lv
##  .attend_march_wss20 ~~                                                   
##    .attnd_mrch_w24               0.244    0.049    4.965    0.000    0.244
##  .burn_flag_wss20 ~~                                                      
##    .burn_flg_wss24              -0.278    0.068   -4.111    0.000   -0.278
##  .court_wss20 ~~                                                          
##    .court_wss24                  0.006    0.050    0.125    0.901    0.006
##  .recount_wss20 ~~                                                        
##    .recount_wss24                0.052    0.063    0.822    0.411    0.052
##  .criticize_election_wss20 ~~                                             
##    .crtcz_lctn_w24              -0.539    0.066   -8.215    0.000   -0.539
##   Std.all
##          
##     0.335
##          
##    -1.157
##          
##     0.008
##          
##     0.063
##          
##    -1.168
## 
## Thresholds:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     attnd_mrc_20|1   -0.493    0.080   -6.141    0.000   -0.493   -0.493
##     attnd_mrc_20|2   -0.070    0.077   -0.916    0.360   -0.070   -0.070
##     attnd_mrc_20|3    0.472    0.080    5.901    0.000    0.472    0.472
##     attnd_mrc_20|4    1.319    0.107   12.346    0.000    1.319    1.319
##     court_wss20|t1   -0.744    0.085   -8.742    0.000   -0.744   -0.744
##     court_wss20|t2   -0.242    0.078   -3.112    0.002   -0.242   -0.242
##     court_wss20|t3    0.719    0.085    8.511    0.000    0.719    0.719
##     court_wss20|t4    1.414    0.112   12.575    0.000    1.414    1.414
##     brn_flg_ws20|1   -0.847    0.088   -9.652    0.000   -0.847   -0.847
##     brn_flg_ws20|2   -0.290    0.078   -3.721    0.000   -0.290   -0.290
##     brn_flg_ws20|3    0.672    0.083    8.044    0.000    0.672    0.672
##     brn_flg_ws20|4    1.341    0.108   12.410    0.000    1.341    1.341
##     recnt_wss20|t1   -1.781    0.143  -12.496    0.000   -1.781   -1.781
##     recnt_wss20|t2   -1.467    0.116  -12.656    0.000   -1.467   -1.467
##     recnt_wss20|t3   -0.340    0.078   -4.329    0.000   -0.340   -0.340
##     recnt_wss20|t4    0.902    0.089   10.094    0.000    0.902    0.902
##     crtcz_lct_20|1    0.410    0.079    5.177    0.000    0.410    0.410
##     crtcz_lct_20|2    0.820    0.087    9.427    0.000    0.820    0.820
##     crtcz_lct_20|3    1.440    0.114   12.619    0.000    1.440    1.440
##     crtcz_lct_20|4    1.829    0.148   12.382    0.000    1.829    1.829
##     attnd_mrc_24|1   -1.087    0.096  -11.339    0.000   -1.087   -1.087
##     attnd_mrc_24|2   -0.660    0.083   -7.926    0.000   -0.660   -0.660
##     attnd_mrc_24|3    0.271    0.078    3.478    0.001    0.271    0.271
##     attnd_mrc_24|4    0.902    0.089   10.094    0.000    0.902    0.902
##     court_wss24|t1   -0.960    0.091  -10.525    0.000   -0.960   -0.960
##     court_wss24|t2   -0.493    0.080   -6.141    0.000   -0.493   -0.493
##     court_wss24|t3    0.370    0.079    4.692    0.000    0.370    0.370
##     court_wss24|t4    1.214    0.101   11.970    0.000    1.214    1.214
##     brn_flg_ws24|1    0.660    0.083    7.926    0.000    0.660    0.660
##     brn_flg_ws24|2    0.902    0.089   10.094    0.000    0.902    0.902
##     brn_flg_ws24|3    1.555    0.122   12.719    0.000    1.555    1.555
##     brn_flg_ws24|4    1.829    0.148   12.382    0.000    1.829    1.829
##     recnt_wss24|t1   -1.940    0.161  -12.041    0.000   -1.940   -1.940
##     recnt_wss24|t2   -1.275    0.104  -12.205    0.000   -1.275   -1.275
##     recnt_wss24|t3   -0.451    0.080   -5.660    0.000   -0.451   -0.451
##     recnt_wss24|t4    0.637    0.083    7.691    0.000    0.637    0.637
##     crtcz_lct_24|1   -0.648    0.083   -7.809    0.000   -0.648   -0.648
##     crtcz_lct_24|2   -0.242    0.078   -3.112    0.002   -0.242   -0.242
##     crtcz_lct_24|3    0.683    0.084    8.161    0.000    0.683    0.683
##     crtcz_lct_24|4    1.234    0.102   12.051    0.000    1.234    1.234
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    0.677                               0.677    0.677
##    .court_wss20       0.733                               0.733    0.733
##    .burn_flg_wss20    0.417                               0.417    0.417
##    .recount_wss20     0.734                               0.734    0.734
##    .crtcz_lctn_w20    0.238                               0.238    0.238
##    .attnd_mrch_w24    0.782                               0.782    0.782
##    .court_wss24       0.788                               0.788    0.788
##    .burn_flg_wss24    0.139                               0.139    0.139
##    .recount_wss24     0.932                               0.932    0.932
##    .crtcz_lctn_w24    0.897                               0.897    0.897
##     contestatin_20    0.323    0.051    6.347    0.000    1.000    1.000
##    .contestatin_24    0.105    0.034    3.061    0.002    0.484    0.484
cat("The Linear Simplex Model, using FIML\n")
## The Linear Simplex Model, using FIML
summary(fit_simplex, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 58 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        36
## 
##                                                   Used       Total
##   Number of observations                           582         834
##   Number of missing patterns                         3            
## 
## Model Test User Model:
##                                                       
##   Test statistic                               337.187
##   Degrees of freedom                                29
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                               972.432
##   Degrees of freedom                                45
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.668
##   Tucker-Lewis Index (TLI)                       0.484
##                                                       
##   Robust Comparative Fit Index (CFI)             0.598
##   Robust Tucker-Lewis Index (TLI)                0.377
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6413.225
##   Loglikelihood unrestricted model (H1)      -6244.632
##                                                       
##   Akaike (AIC)                               12898.451
##   Bayesian (BIC)                             13055.644
##   Sample-size adjusted Bayesian (SABIC)      12941.357
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.135
##   90 Percent confidence interval - lower         0.122
##   90 Percent confidence interval - upper         0.148
##   P-value H_0: RMSEA <= 0.050                    0.000
##   P-value H_0: RMSEA >= 0.080                    1.000
##                                                       
##   Robust RMSEA                                   0.191
##   90 Percent confidence interval - lower         0.173
##   90 Percent confidence interval - upper         0.209
##   P-value H_0: Robust RMSEA <= 0.050             0.000
##   P-value H_0: Robust RMSEA >= 0.080             1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.145
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_20 =~                                                      
##     attnd_mrch_w20      1.000                               0.614    0.451
##     court_wss20         1.041    0.158    6.587    0.000    0.639    0.528
##     burn_flg_wss20      1.650    0.219    7.529    0.000    1.013    0.809
##     recount_wss20       0.934    0.127    7.334    0.000    0.573    0.599
##     crtcz_lctn_w20      0.688    0.112    6.148    0.000    0.422    0.389
##   contestation_24 =~                                                      
##     attnd_mrch_w24      1.000                               0.454    0.350
##     court_wss24         2.219    0.372    5.960    0.000    1.006    0.789
##     burn_flg_wss24      0.197    0.141    1.390    0.165    0.089    0.080
##     recount_wss24       1.181    0.217    5.449    0.000    0.536    0.520
##     crtcz_lctn_w24      1.701    0.301    5.657    0.000    0.772    0.585
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_20     0.216    0.076    2.846    0.004    0.293    0.293
## 
## Covariances:
##                               Estimate  Std.Err  z-value  P(>|z|)   Std.lv
##  .attend_march_wss20 ~~                                                   
##    .attnd_mrch_w24               0.593    0.095    6.239    0.000    0.593
##  .burn_flag_wss20 ~~                                                      
##    .burn_flg_wss24              -0.080    0.084   -0.944    0.345   -0.080
##  .court_wss20 ~~                                                          
##    .court_wss24                 -0.130    0.074   -1.743    0.081   -0.130
##  .recount_wss20 ~~                                                        
##    .recount_wss24                0.102    0.048    2.122    0.034    0.102
##  .criticize_election_wss20 ~~                                             
##    .crtcz_lctn_w24              -0.352    0.075   -4.716    0.000   -0.352
##   Std.all
##          
##     0.402
##          
##    -0.098
##          
##    -0.161
##          
##     0.151
##          
##    -0.330
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    2.659    0.065   40.757    0.000    2.659    1.955
##    .court_wss20       2.734    0.059   46.279    0.000    2.734    2.258
##    .burn_flg_wss20    2.848    0.061   46.785    0.000    2.848    2.276
##    .recount_wss20     3.743    0.047   80.487    0.000    3.743    3.912
##    .crtcz_lctn_w20    1.675    0.052   31.943    0.000    1.675    1.546
##    .attnd_mrch_w24    3.204    0.062   52.089    0.000    3.204    2.469
##    .court_wss24       3.007    0.061   49.079    0.000    3.007    2.358
##    .burn_flg_wss24    1.593    0.054   29.611    0.000    1.593    1.430
##    .recount_wss24     3.847    0.049   77.759    0.000    3.847    3.735
##    .crtcz_lctn_w24    2.736    0.063   43.385    0.000    2.736    2.074
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    1.473    0.115   12.771    0.000    1.473    0.796
##    .court_wss20       1.058    0.084   12.593    0.000    1.058    0.721
##    .burn_flg_wss20    0.540    0.092    5.871    0.000    0.540    0.345
##    .recount_wss20     0.587    0.051   11.585    0.000    0.587    0.641
##    .crtcz_lctn_w20    0.996    0.076   13.157    0.000    0.996    0.848
##    .attnd_mrch_w24    1.478    0.105   14.022    0.000    1.478    0.878
##    .court_wss24       0.613    0.119    5.147    0.000    0.613    0.377
##    .burn_flg_wss24    1.234    0.084   14.621    0.000    1.234    0.994
##    .recount_wss24     0.774    0.063   12.198    0.000    0.774    0.729
##    .crtcz_lctn_w24    1.145    0.107   10.713    0.000    1.145    0.658
##     contestatin_20    0.377    0.089    4.248    0.000    1.000    1.000
##    .contestatin_24    0.188    0.057    3.278    0.001    0.914    0.914
# mod indices

Clearly the loadings vary. Notice the criticize election loading increases from wave 1 to wave 2, for instance.

Latent Variables:
                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  contestation_20 =~                                                      
    attnd_mrch_w20      1.000                               0.568    0.568
    court_wss20         0.910    0.093    9.735    0.000    0.517    0.517
    burn_flg_wss20      1.345    0.124   10.865    0.000    0.764    0.764
    recount_wss20       0.908    0.099    9.206    0.000    0.515    0.515
    crtcz_lctn_w20      1.538    0.154   10.016    0.000    0.873    0.873
  contestation_24 =~                                                      
    attnd_mrch_w24      1.000                               0.466    0.466
    court_wss24         0.987    0.167    5.908    0.000    0.460    0.460
    burn_flg_wss24      1.990    0.298    6.676    0.000    0.928    0.928
    recount_wss24       0.558    0.154    3.625    0.000    0.260    0.260
    crtcz_lctn_w24      0.689    0.162    4.255    0.000    0.321    0.321

The loadings vary considerably, with flag burning having the highest loading in both years, and attend march also having a relatively high loading. Recount has the lowest loading in 2024. But also, notice that flag burning and criticize_election is negatively correlated over time.

Covariances:
                              Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .attend_march_wss20 ~~                                                            
   .attnd_mrch_w24               0.244    0.049    4.965    0.000    0.244    0.335
 .burn_flag_wss20 ~~                                                               
   .burn_flg_wss24              -0.278    0.068   -4.111    0.000   -0.278   -1.157
 .court_wss20 ~~                                                                   
   .court_wss24                  0.006    0.050    0.125    0.901    0.006    0.008
 .recount_wss20 ~~                                                                 
   .recount_wss24                0.052    0.063    0.822    0.411    0.052    0.063
 .criticize_election_wss20 ~~                                                      
   .crtcz_lctn_w24              -0.539    0.066   -8.215    0.000   -0.539   -1.168

The over time stability coefficient is about \(0.2\), indicating little stability over this four year period. I also estimated a model – not shown here – simply removing flag burning from the model. The fit is again pretty terrible, and the stability coefficients is \(-0.02\).

Replication: AVP

Here is the same model for the AVP data, with the same modifications (varying loadings, correlated residuals).

library(lavaan)
ordinal_vars <- c("attend_march_avp23", "burn_flag_avp23",
                  "court_avp23", "recount_avp23", 
                  "criticize_election_avp23",
                  "attend_march_avp24", "burn_flag_avp24", 
                  "court_avp24", "recount_avp24", 
                  "criticize_election_avp24")
# Free the loadings
simplex_avp <- '
  # Latent factors with equal loadings across time
  contestation_23 =~ attend_march_avp23 +  court_avp23 + burn_flag_avp23+ 
                     recount_avp23 + criticize_election_avp23
  contestation_24 =~ attend_march_avp24 + court_avp24 +  burn_flag_avp24 +
                     recount_avp24 + criticize_election_avp24
  
  contestation_24 ~ contestation_23
  attend_march_avp23 ~~ attend_march_avp24
  burn_flag_avp23 ~~ burn_flag_avp24  
  court_avp23 ~~ court_avp24
  recount_avp23 ~~ recount_avp24
  criticize_election_avp23 ~~ criticize_election_avp24
'
fit_simplex_ordinal <- sem(simplex_avp, 
                   data = wide_panel_data, 
                   ordered = ordinal_vars,
                   estimator = "wlsmv")
fit_simplex <- sem(simplex_avp, 
                   data = wide_panel_data, 
                   estimator = "ml",
                   missing = "fiml")
cat("The Ordinal Simplex Model, using Listwise Deletion\n")
## The Ordinal Simplex Model, using Listwise Deletion
summary(fit_simplex_ordinal, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 49 iterations
## 
##   Estimator                                       DWLS
##   Optimization method                           NLMINB
##   Number of model parameters                        56
## 
##                                                   Used       Total
##   Number of observations                           386         834
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               301.302     427.101
##   Degrees of freedom                                29          29
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  0.719
##   Shift parameter                                            7.873
##     simple second-order correction                                
## 
## Model Test Baseline Model:
## 
##   Test statistic                              7725.773    4214.967
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.842
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.965       0.905
##   Tucker-Lewis Index (TLI)                       0.945       0.852
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.891
##   Robust Tucker-Lewis Index (TLI)                            0.830
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.156       0.189
##   90 Percent confidence interval - lower         0.140       0.173
##   90 Percent confidence interval - upper         0.172       0.205
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    1.000       1.000
##                                                                   
##   Robust RMSEA                                               0.157
##   90 Percent confidence interval - lower                     0.131
##   90 Percent confidence interval - upper                     0.184
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.137       0.137
## 
## Parameter Estimates:
## 
##   Parameterization                               Delta
##   Standard errors                           Robust.sem
##   Information                                 Expected
##   Information saturated (h1) model        Unstructured
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_23 =~                                                      
##     attnd_mrch_v23      1.000                               0.386    0.386
##     court_avp23         2.242    0.276    8.129    0.000    0.867    0.867
##     burn_flag_vp23     -0.266    0.168   -1.579    0.114   -0.103   -0.103
##     recount_avp23       2.120    0.267    7.934    0.000    0.820    0.820
##     crtcz_lctn_v23      2.174    0.269    8.087    0.000    0.840    0.840
##   contestation_24 =~                                                      
##     attnd_mrch_v24      1.000                               0.315    0.315
##     court_avp24         2.474    0.411    6.025    0.000    0.779    0.779
##     burn_flag_vp24     -0.131    0.219   -0.597    0.551   -0.041   -0.041
##     recount_avp24       2.687    0.454    5.921    0.000    0.846    0.846
##     crtcz_lctn_v24      2.559    0.419    6.106    0.000    0.806    0.806
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_23     0.687    0.106    6.496    0.000    0.843    0.843
## 
## Covariances:
##                               Estimate  Std.Err  z-value  P(>|z|)   Std.lv
##  .attend_march_avp23 ~~                                                   
##    .attnd_mrch_v24               0.515    0.038   13.447    0.000    0.515
##  .burn_flag_avp23 ~~                                                      
##    .burn_flag_vp24               0.781    0.028   27.526    0.000    0.781
##  .court_avp23 ~~                                                          
##    .court_avp24                  0.011    0.033    0.334    0.738    0.011
##  .recount_avp23 ~~                                                        
##    .recount_avp24                0.161    0.027    6.068    0.000    0.161
##  .criticize_election_avp23 ~~                                             
##    .crtcz_lctn_v24               0.156    0.030    5.217    0.000    0.156
##   Std.all
##          
##     0.588
##          
##     0.786
##          
##     0.035
##          
##     0.527
##          
##     0.487
## 
## Thresholds:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     attnd_mrc_23|1   -1.233    0.085  -14.494    0.000   -1.233   -1.233
##     attnd_mrc_23|2   -0.553    0.068   -8.185    0.000   -0.553   -0.553
##     attnd_mrc_23|3   -0.249    0.065   -3.859    0.000   -0.249   -0.249
##     attnd_mrc_23|4    0.807    0.072   11.202    0.000    0.807    0.807
##     court_avp23|t1   -0.971    0.076  -12.755    0.000   -0.971   -0.971
##     court_avp23|t2   -0.414    0.066   -6.284    0.000   -0.414   -0.414
##     court_avp23|t3   -0.137    0.064   -2.134    0.033   -0.137   -0.137
##     court_avp23|t4    0.789    0.072   11.013    0.000    0.789    0.789
##     brn_flg_vp23|1    0.358    0.065    5.478    0.000    0.358    0.358
##     brn_flg_vp23|2    0.862    0.073   11.762    0.000    0.862    0.862
##     brn_flg_vp23|3    1.219    0.085   14.426    0.000    1.219    1.219
##     brn_flg_vp23|4    1.990    0.140   14.260    0.000    1.990    1.990
##     recont_vp23|t1   -1.421    0.094  -15.142    0.000   -1.421   -1.421
##     recont_vp23|t2   -0.843    0.073  -11.577    0.000   -0.843   -0.843
##     recont_vp23|t3   -0.615    0.068   -8.977    0.000   -0.615   -0.615
##     recont_vp23|t4    0.457    0.066    6.887    0.000    0.457    0.457
##     crtcz_lct_23|1   -0.435    0.066   -6.586    0.000   -0.435   -0.435
##     crtcz_lct_23|2    0.039    0.064    0.610    0.542    0.039    0.039
##     crtcz_lct_23|3    0.263    0.065    4.062    0.000    0.263    0.263
##     crtcz_lct_23|4    0.910    0.074   12.220    0.000    0.910    0.910
##     attnd_mrc_24|1   -1.179    0.083  -14.215    0.000   -1.179   -1.179
##     attnd_mrc_24|2   -0.508    0.067   -7.587    0.000   -0.508   -0.508
##     attnd_mrc_24|3   -0.203    0.064   -3.150    0.002   -0.203   -0.203
##     attnd_mrc_24|4    0.881    0.074   11.947    0.000    0.881    0.881
##     court_avp24|t1   -0.992    0.077  -12.930    0.000   -0.992   -0.992
##     court_avp24|t2   -0.386    0.066   -5.881    0.000   -0.386   -0.386
##     court_avp24|t3   -0.117    0.064   -1.830    0.067   -0.117   -0.117
##     court_avp24|t4    0.940    0.075   12.490    0.000    0.940    0.940
##     brn_flg_vp24|1    0.553    0.068    8.185    0.000    0.553    0.553
##     brn_flg_vp24|2    1.141    0.082   13.993    0.000    1.141    1.141
##     brn_flg_vp24|3    1.421    0.094   15.142    0.000    1.421    1.421
##     brn_flg_vp24|4    2.228    0.173   12.900    0.000    2.228    2.228
##     recont_vp24|t1   -1.796    0.120  -14.994    0.000   -1.796   -1.796
##     recont_vp24|t2   -1.093    0.080  -13.681    0.000   -1.093   -1.093
##     recont_vp24|t3   -0.825    0.072  -11.390    0.000   -0.825   -0.825
##     recont_vp24|t4    0.351    0.065    5.377    0.000    0.351    0.351
##     crtcz_lct_24|1   -0.457    0.066   -6.887    0.000   -0.457   -0.457
##     crtcz_lct_24|2    0.065    0.064    1.017    0.309    0.065    0.065
##     crtcz_lct_24|3    0.256    0.065    3.961    0.000    0.256    0.256
##     crtcz_lct_24|4    1.046    0.078   13.354    0.000    1.046    1.046
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_v23    0.851                               0.851    0.851
##    .court_avp23       0.249                               0.249    0.249
##    .burn_flag_vp23    0.989                               0.989    0.989
##    .recount_avp23     0.328                               0.328    0.328
##    .crtcz_lctn_v23    0.294                               0.294    0.294
##    .attnd_mrch_v24    0.901                               0.901    0.901
##    .court_avp24       0.393                               0.393    0.393
##    .burn_flag_vp24    0.998                               0.998    0.998
##    .recount_avp24     0.284                               0.284    0.284
##    .crtcz_lctn_v24    0.351                               0.351    0.351
##     contestatin_23    0.149    0.037    4.011    0.000    1.000    1.000
##    .contestatin_24    0.029    0.010    2.869    0.004    0.289    0.289
cat("The Linear Simplex Model, using FIML\n")
## The Linear Simplex Model, using FIML
summary(fit_simplex, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 63 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        36
## 
##                                                   Used       Total
##   Number of observations                           553         834
##   Number of missing patterns                         4            
## 
## Model Test User Model:
##                                                       
##   Test statistic                               177.124
##   Degrees of freedom                                29
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                              1869.699
##   Degrees of freedom                                45
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.919
##   Tucker-Lewis Index (TLI)                       0.874
##                                                       
##   Robust Comparative Fit Index (CFI)             0.927
##   Robust Tucker-Lewis Index (TLI)                0.887
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6917.966
##   Loglikelihood unrestricted model (H1)      -6829.404
##                                                       
##   Akaike (AIC)                               13907.933
##   Bayesian (BIC)                             14063.286
##   Sample-size adjusted Bayesian (SABIC)      13949.006
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.096
##   90 Percent confidence interval - lower         0.083
##   90 Percent confidence interval - upper         0.110
##   P-value H_0: RMSEA <= 0.050                    0.000
##   P-value H_0: RMSEA >= 0.080                    0.976
##                                                       
##   Robust RMSEA                                   0.103
##   90 Percent confidence interval - lower         0.088
##   90 Percent confidence interval - upper         0.119
##   P-value H_0: Robust RMSEA <= 0.050             0.000
##   P-value H_0: Robust RMSEA >= 0.080             0.992
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.090
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                      Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_23 =~                                                      
##     attnd_mrch_v23      1.000                               0.485    0.378
##     court_avp23         2.449    0.311    7.883    0.000    1.188    0.846
##     burn_flag_vp23     -0.116    0.110   -1.049    0.294   -0.056   -0.051
##     recount_avp23       1.872    0.251    7.461    0.000    0.908    0.726
##     crtcz_lctn_v23      2.308    0.310    7.435    0.000    1.120    0.733
##   contestation_24 =~                                                      
##     attnd_mrch_v24      1.000                               0.441    0.338
##     court_avp24         2.289    0.328    6.983    0.000    1.010    0.739
##     burn_flag_vp24      0.014    0.103    0.141    0.888    0.006    0.007
##     recount_avp24       1.758    0.268    6.565    0.000    0.776    0.698
##     crtcz_lctn_v24      2.404    0.364    6.612    0.000    1.061    0.717
## 
## Regressions:
##                     Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   contestation_24 ~                                                      
##     contestatin_23     0.775    0.112    6.904    0.000    0.852    0.852
## 
## Covariances:
##                               Estimate  Std.Err  z-value  P(>|z|)   Std.lv
##  .attend_march_avp23 ~~                                                   
##    .attnd_mrch_v24               0.764    0.079    9.616    0.000    0.764
##  .burn_flag_avp23 ~~                                                      
##    .burn_flag_vp24               0.716    0.058   12.437    0.000    0.716
##  .court_avp23 ~~                                                          
##    .court_avp24                  0.012    0.062    0.188    0.851    0.012
##  .recount_avp23 ~~                                                        
##    .recount_avp24                0.296    0.049    6.053    0.000    0.296
##  .criticize_election_avp23 ~~                                             
##    .crtcz_lctn_v24               0.452    0.076    5.952    0.000    0.452
##   Std.all
##          
##     0.522
##          
##     0.687
##          
##     0.017
##          
##     0.433
##          
##     0.422
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_v23    3.413    0.059   57.840    0.000    3.413    2.656
##    .court_avp23       3.233    0.064   50.520    0.000    3.233    2.302
##    .burn_flag_vp23    1.685    0.049   34.059    0.000    1.685    1.542
##    .recount_avp23     3.730    0.057   65.727    0.000    3.730    2.982
##    .crtcz_lctn_v23    2.733    0.069   39.428    0.000    2.733    1.789
##    .attnd_mrch_v24    3.324    0.058   57.644    0.000    3.324    2.546
##    .court_avp24       3.180    0.060   52.714    0.000    3.180    2.327
##    .burn_flag_vp24    1.502    0.042   35.906    0.000    1.502    1.573
##    .recount_avp24     3.935    0.049   80.687    0.000    3.935    3.542
##    .crtcz_lctn_v24    2.722    0.065   41.960    0.000    2.722    1.841
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_v23    1.416    0.097   14.547    0.000    1.416    0.857
##    .court_avp23       0.561    0.082    6.876    0.000    0.561    0.284
##    .burn_flag_vp23    1.192    0.079   15.099    0.000    1.192    0.997
##    .recount_avp23     0.739    0.067   11.100    0.000    0.739    0.472
##    .crtcz_lctn_v23    1.079    0.098   10.980    0.000    1.079    0.463
##    .attnd_mrch_v24    1.510    0.099   15.309    0.000    1.510    0.886
##    .court_avp24       0.849    0.087    9.739    0.000    0.849    0.454
##    .burn_flag_vp24    0.911    0.057   15.931    0.000    0.911    1.000
##    .recount_avp24     0.633    0.055   11.532    0.000    0.633    0.513
##    .crtcz_lctn_v24    1.061    0.094   11.289    0.000    1.061    0.485
##     contestatin_23    0.235    0.059    3.960    0.000    1.000    1.000
##    .contestatin_24    0.053    0.017    3.093    0.002    0.274    0.274

There is much greater stability over the one-year period, without an election.

The Trait-State-Occasion (TSO) Model

The Trait-State-Occasion (TSO) model (Cole, Martin, and Steiger, 2005; Kenny and Zautra, 1995) decomposes the variation into a stable trait component, and a state-component that captures variation over time. It’s useful to ascertain the degree by which over-time correlations are governed by a stable, trait, dispositional characteristic, versus time-specific fluctuations. The TSO is particularly advantageous here to examine the degree by which contestation is a stable, unchanging dispositional factor.

tso_model <- '
  trait =~ attend_march_wss20 + court_wss20 + recount_wss20 + criticize_election_wss20 +
           attend_march_wss24 +  court_wss24 + recount_wss24 + criticize_election_wss24 +  
           burn_flag_wss20 +  burn_flag_wss24
  
  state_20 =~ attend_march_wss20 +court_wss20 + recount_wss20 + criticize_election_wss20 + burn_flag_wss20
  state_24 =~ attend_march_wss24 + court_wss24 + recount_wss24 + criticize_election_wss24 + burn_flag_wss24
  
  trait ~~ 0*state_20
  trait ~~ 0*state_24
  state_20 ~~ state_20
  
'

ordinal_vars <- c("attend_march_wss20",  "court_wss20", "recount_wss20", "criticize_election_wss20",
                  "attend_march_wss24",  "court_wss24", "recount_wss24", "criticize_election_wss24")

fit_tso <- sem(tso_model, data = wide_panel_data, estimator = "mlr", missing = "fiml")
cat("The TSO model, with the Western States data")
## The TSO model, with the Western States data
summary(fit_tso, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 77 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        41
## 
##                                                   Used       Total
##   Number of observations                           582         834
##   Number of missing patterns                         3            
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                                64.908      59.795
##   Degrees of freedom                                24          24
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.086
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                               972.432     861.081
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.129
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.956       0.956
##   Tucker-Lewis Index (TLI)                       0.917       0.918
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.941
##   Robust Tucker-Lewis Index (TLI)                            0.890
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6277.086   -6277.086
##   Scaling correction factor                                  1.073
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)      -6244.632   -6244.632
##   Scaling correction factor                                  1.077
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               12636.172   12636.172
##   Bayesian (BIC)                             12815.197   12815.197
##   Sample-size adjusted Bayesian (SABIC)      12685.038   12685.038
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.054       0.051
##   90 Percent confidence interval - lower         0.039       0.035
##   90 Percent confidence interval - upper         0.070       0.066
##   P-value H_0: RMSEA <= 0.050                    0.312       0.448
##   P-value H_0: RMSEA >= 0.080                    0.003       0.001
##                                                                   
##   Robust RMSEA                                               0.080
##   90 Percent confidence interval - lower                     0.056
##   90 Percent confidence interval - upper                     0.105
##   P-value H_0: Robust RMSEA <= 0.050                         0.021
##   P-value H_0: Robust RMSEA >= 0.080                         0.533
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.041       0.041
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait =~                                                              
##     attnd_mrch_w20    1.000                               0.784    0.566
##     court_wss20      -0.003    0.117   -0.026    0.980   -0.002   -0.002
##     recount_wss20     0.155    0.071    2.177    0.030    0.121    0.127
##     crtcz_lctn_w20    1.228    0.147    8.340    0.000    0.963    0.870
##     attnd_mrch_w24    0.620    0.082    7.599    0.000    0.487    0.379
##     court_wss24      -0.189    0.113   -1.675    0.094   -0.148   -0.117
##     recount_wss24    -0.308    0.090   -3.414    0.001   -0.242   -0.235
##     crtcz_lctn_w24   -0.565    0.120   -4.726    0.000   -0.443   -0.333
##     burn_flg_wss20    0.294    0.114    2.582    0.010    0.230    0.185
##     burn_flg_wss24    1.007    0.136    7.381    0.000    0.790    0.707
##   state_20 =~                                                           
##     attnd_mrch_w20    1.000                               0.445    0.322
##     court_wss20       1.562    0.310    5.039    0.000    0.696    0.575
##     recount_wss20     1.274    0.224    5.682    0.000    0.567    0.594
##     crtcz_lctn_w20    0.435    0.155    2.806    0.005    0.194    0.175
##     burn_flg_wss20    2.171    0.391    5.559    0.000    0.967    0.777
##   state_24 =~                                                           
##     attnd_mrch_w24    1.000                               0.491    0.383
##     court_wss24       1.922    0.340    5.659    0.000    0.943    0.746
##     recount_wss24     1.054    0.218    4.842    0.000    0.517    0.504
##     crtcz_lctn_w24    1.566    0.302    5.187    0.000    0.768    0.577
##     burn_flg_wss24    0.437    0.149    2.930    0.003    0.215    0.192
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait ~~                                                              
##     state_20          0.000                               0.000    0.000
##     state_24          0.000                               0.000    0.000
##   state_20 ~~                                                           
##     state_24          0.086    0.029    2.979    0.003    0.395    0.395
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    2.670    0.065   41.036    0.000    2.670    1.928
##    .court_wss20       2.734    0.059   46.545    0.000    2.734    2.259
##    .recount_wss20     3.745    0.046   80.986    0.000    3.745    3.925
##    .crtcz_lctn_w20    1.696    0.051   33.134    0.000    1.696    1.533
##    .attnd_mrch_w24    3.210    0.061   53.049    0.000    3.210    2.503
##    .court_wss24       3.010    0.061   49.651    0.000    3.010    2.380
##    .recount_wss24     3.848    0.049   78.671    0.000    3.848    3.746
##    .crtcz_lctn_w24    2.737    0.064   43.077    0.000    2.737    2.055
##    .burn_flg_wss20    2.857    0.060   47.580    0.000    2.857    2.295
##    .burn_flg_wss24    1.599    0.051   31.204    0.000    1.599    1.431
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     state_20          0.198    0.070    2.835    0.005    1.000    1.000
##    .attnd_mrch_w20    1.104    0.093   11.815    0.000    1.104    0.576
##    .court_wss20       0.981    0.088   11.095    0.000    0.981    0.670
##    .recount_wss20     0.574    0.059    9.703    0.000    0.574    0.630
##    .crtcz_lctn_w20    0.260    0.082    3.177    0.001    0.260    0.212
##    .attnd_mrch_w24    1.166    0.101   11.576    0.000    1.166    0.709
##    .court_wss24       0.689    0.109    6.297    0.000    0.689    0.430
##    .recount_wss24     0.729    0.064   11.364    0.000    0.729    0.691
##    .crtcz_lctn_w24    0.987    0.115    8.556    0.000    0.987    0.556
##    .burn_flg_wss20    0.562    0.108    5.197    0.000    0.562    0.363
##    .burn_flg_wss24    0.579    0.100    5.803    0.000    0.579    0.464
##     trait             0.615    0.104    5.909    0.000    1.000    1.000
##     state_24          0.241    0.079    3.054    0.002    1.000    1.000

The trait factor captures the extent to which contestation is stable over time. The fit of the model is good, but the trait factor is uninterpretable. Some of the factor loadings are negative, others are quite small. The correlation of the state factors, denoted by ~~ (\(r=0.02\)) is the correlation between the residuals, or correlation of the occasions (the remaining variance not accounted for by the state and trait). The interpretation of the TSO is:

\[Y = Y_{Trait} +Y_{State} + Y_{Occasion}\]

And, \[var(Y) = var(Y_{Trait}) +var(Y_{State}) + var(Y_{Occasion})\] The “sign-flipping” of the loadings makes it difficult to interpret the trait factor. It seems there is very little support for a trait-level disposition in support contestation behaviors. We could impose invariance constraints on the same loadings – e.g., the flag burning item on the trait factor is the same in 2020 and 2024. This may improve things.

tso_model <- '
  # Trait factor with EQUAL LOADINGS across time (measurement invariance)
  trait =~ T1*attend_march_wss20 + T2*court_wss20 + T3*recount_wss20 + T4*criticize_election_wss20 + T5*burn_flag_wss20 +
           T1*attend_march_wss24 + T2*court_wss24 + T3*recount_wss24 + T4*criticize_election_wss24 + T5*burn_flag_wss24
  
  state_20 =~ attend_march_wss20 + court_wss20 + recount_wss20 + criticize_election_wss20 + burn_flag_wss20
  state_24 =~ attend_march_wss24 + court_wss24 + recount_wss24 + criticize_election_wss24 + burn_flag_wss24
  
  trait ~~ 0*state_20
  trait ~~ 0*state_24
  state_24 ~~ state_20

  # Fix trait variance for identification
  trait ~~ 1*trait
'

ordinal_vars <- c("attend_march_wss20", "court_wss20", "recount_wss20", "criticize_election_wss20", "burn_flag_wss20",
                  "attend_march_wss24", "court_wss24", "recount_wss24", "criticize_election_wss24", "burn_flag_wss24")

fit_tso_invariant <- sem(tso_model, data = wide_panel_data, estimator = "mlr", missing = "fiml")
summary(fit_tso_invariant, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 213 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        39
##   Number of equality constraints                     4
## 
##                                                   Used       Total
##   Number of observations                           582         834
##   Number of missing patterns                         3            
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               266.043     248.303
##   Degrees of freedom                                30          30
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.071
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                               972.432     861.081
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.129
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.745       0.732
##   Tucker-Lewis Index (TLI)                       0.618       0.599
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.681
##   Robust Tucker-Lewis Index (TLI)                            0.522
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6377.653   -6377.653
##   Scaling correction factor                                  0.971
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)      -6244.632   -6244.632
##   Scaling correction factor                                  1.077
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               12825.306   12825.306
##   Bayesian (BIC)                             12978.133   12978.133
##   Sample-size adjusted Bayesian (SABIC)      12867.021   12867.021
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.116       0.112
##   90 Percent confidence interval - lower         0.104       0.100
##   90 Percent confidence interval - upper         0.129       0.124
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    1.000       1.000
##                                                                   
##   Robust RMSEA                                               0.167
##   90 Percent confidence interval - lower                     0.148
##   90 Percent confidence interval - upper                     0.186
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.182       0.182
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait =~                                                              
##     attnd__20 (T1)    1.000                               1.000    0.716
##     crt_wss20 (T2)    0.438    0.074    5.885    0.000    0.438    0.348
##     rcnt_ws20 (T3)    0.302    0.065    4.679    0.000    0.302    0.318
##     crtcz__20 (T4)    0.579    0.077    7.541    0.000    0.579    0.573
##     brn_fl_20 (T5)    0.656    0.084    7.802    0.000    0.656    0.511
##     attnd__24 (T1)    1.000                               1.000    0.694
##     crt_wss24 (T2)    0.438    0.074    5.885    0.000    0.438    0.331
##     rcnt_ws24 (T3)    0.302    0.065    4.679    0.000    0.302    0.276
##     crtcz__24 (T4)    0.579    0.077    7.541    0.000    0.579    0.377
##     brn_fl_24 (T5)    0.656    0.084    7.802    0.000    0.656    0.588
##   state_20 =~                                                           
##     attnd__20         1.000                               0.035    0.025
##     crt_wss20        18.650    2.415    7.723    0.000    0.661    0.524
##     rcnt_ws20        13.484    1.777    7.589    0.000    0.478    0.503
##     crtcz__20        -2.400    3.453   -0.695    0.487   -0.085   -0.084
##     brn_fl_20        21.843    2.268    9.631    0.000    0.774    0.603
##   state_24 =~                                                           
##     attnd__24         1.000                               0.224    0.155
##     crt_wss24         3.792    1.208    3.139    0.002    0.849    0.643
##     rcnt_ws24         2.846    0.961    2.962    0.003    0.637    0.581
##     crtcz__24         4.441    1.532    2.899    0.004    0.994    0.648
##     brn_fl_24        -0.746    0.432   -1.727    0.084   -0.167   -0.150
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait ~~                                                              
##     state_20          0.000                               0.000    0.000
##     state_24          0.000                               0.000    0.000
##   state_20 ~~                                                           
##     state_24          0.003    0.001    2.089    0.037    0.358    0.358
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_w20    2.669    0.066   40.599    0.000    2.669    1.912
##    .court_wss20       2.737    0.059   46.526    0.000    2.737    2.173
##    .recount_wss20     3.745    0.046   80.765    0.000    3.745    3.942
##    .crtcz_lctn_w20    1.687    0.052   32.556    0.000    1.687    1.669
##    .burn_flg_wss20    2.858    0.060   47.342    0.000    2.858    2.225
##    .attnd_mrch_w24    3.222    0.061   52.571    0.000    3.222    2.237
##    .court_wss24       3.013    0.061   49.200    0.000    3.013    2.280
##    .recount_wss24     3.853    0.050   77.231    0.000    3.853    3.517
##    .crtcz_lctn_w24    2.747    0.066   41.388    0.000    2.747    1.791
##    .burn_flg_wss24    1.605    0.053   30.480    0.000    1.605    1.437
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     trait             1.000                               1.000    1.000
##    .attnd_mrch_w20    0.948    0.089   10.677    0.000    0.948    0.486
##    .court_wss20       0.958    0.109    8.798    0.000    0.958    0.604
##    .recount_wss20     0.583    0.063    9.311    0.000    0.583    0.646
##    .crtcz_lctn_w20    0.679    0.113    6.009    0.000    0.679    0.665
##    .burn_flg_wss20    0.619    0.132    4.680    0.000    0.619    0.376
##    .attnd_mrch_w24    1.024    0.113    9.080    0.000    1.024    0.494
##    .court_wss24       0.834    0.105    7.941    0.000    0.834    0.477
##    .recount_wss24     0.703    0.069   10.219    0.000    0.703    0.586
##    .crtcz_lctn_w24    1.029    0.142    7.245    0.000    1.029    0.437
##    .burn_flg_wss24    0.789    0.129    6.099    0.000    0.789    0.632
##     state_20          0.001    0.000    7.111    0.000    1.000    1.000
##     state_24          0.050    0.034    1.469    0.142    1.000    1.000
cat("compare TSO with TSO-invariant \n")
## compare TSO with TSO-invariant
anova(fit_tso, fit_tso_invariant)

The model fit is quite poor, and the trait factor is still difficult to interpret. The loadings are all positive, but some are quite small. There just doesn’t seem to be any evidence for a stable, dispositional characteristic driving responses to these items.

Replication with AVP Panel

tso_model <- '
  trait =~ attend_march_avp23 + court_avp23 + recount_avp23 + criticize_election_avp23 +
           attend_march_avp24 + court_avp24 + recount_avp24 + criticize_election_avp24 +  
           burn_flag_avp23 + burn_flag_avp24
  
  state_23 =~ attend_march_avp23 + court_avp23 + recount_avp23 + criticize_election_avp23 + burn_flag_avp23
  state_24 =~ attend_march_avp24 + court_avp24 + recount_avp24 + criticize_election_avp24 + burn_flag_avp24
  
  trait ~~ 0*state_23
  trait ~~ 0*state_24
  state_24 ~~ state_23
  #trait ~~ 1*trait
  
'

fit_tso <- sem(tso_model, data = wide_panel_data, estimator = "ml", missing = "fiml")
summary(fit_tso, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-19 ended normally after 103 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        41
## 
##                                                   Used       Total
##   Number of observations                           553         834
##   Number of missing patterns                         4            
## 
## Model Test User Model:
##                                                       
##   Test statistic                               198.153
##   Degrees of freedom                                24
##   P-value (Chi-square)                           0.000
## 
## Model Test Baseline Model:
## 
##   Test statistic                              1869.699
##   Degrees of freedom                                45
##   P-value                                        0.000
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.905
##   Tucker-Lewis Index (TLI)                       0.821
##                                                       
##   Robust Comparative Fit Index (CFI)             0.894
##   Robust Tucker-Lewis Index (TLI)                0.801
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -6928.481
##   Loglikelihood unrestricted model (H1)      -6829.404
##                                                       
##   Akaike (AIC)                               13938.961
##   Bayesian (BIC)                             14115.891
##   Sample-size adjusted Bayesian (SABIC)      13985.739
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.115
##   90 Percent confidence interval - lower         0.100
##   90 Percent confidence interval - upper         0.130
##   P-value H_0: RMSEA <= 0.050                    0.000
##   P-value H_0: RMSEA >= 0.080                    1.000
##                                                       
##   Robust RMSEA                                   0.137
##   90 Percent confidence interval - lower         0.120
##   90 Percent confidence interval - upper         0.155
##   P-value H_0: Robust RMSEA <= 0.050             0.000
##   P-value H_0: Robust RMSEA >= 0.080             1.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.047
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait =~                                                              
##     attnd_mrch_v23    1.000                               0.261    0.205
##     court_avp23      -1.973    1.911   -1.033    0.302   -0.515   -0.367
##     recount_avp23    -1.882    1.711   -1.100    0.271   -0.491   -0.392
##     crtcz_lctn_v23   -2.979    2.442   -1.220    0.223   -0.778   -0.508
##     attnd_mrch_v24    1.294    0.388    3.331    0.001    0.338    0.258
##     court_avp24      -1.068    1.325   -0.806    0.420   -0.279   -0.204
##     recount_avp24    -1.571    1.441   -1.090    0.276   -0.410   -0.370
##     crtcz_lctn_v24   -2.238    1.996   -1.121    0.262   -0.584   -0.393
##     burn_flag_vp23    3.249    1.699    1.912    0.056    0.848    0.775
##     burn_flag_vp24    2.642    1.341    1.970    0.049    0.690    0.724
##   state_23 =~                                                           
##     attnd_mrch_v23    1.000                               0.689    0.540
##     court_avp23       1.452    0.291    4.987    0.000    1.000    0.713
##     recount_avp23     1.156    0.257    4.491    0.000    0.796    0.636
##     crtcz_lctn_v23    1.342    0.351    3.820    0.000    0.925    0.604
##     burn_flag_vp23    0.493    0.226    2.185    0.029    0.340    0.311
##   state_24 =~                                                           
##     attnd_mrch_v24    1.000                               0.664    0.507
##     court_avp24       1.407    0.266    5.295    0.000    0.934    0.684
##     recount_avp24     1.036    0.250    4.138    0.000    0.688    0.622
##     crtcz_lctn_v24    1.406    0.350    4.012    0.000    0.933    0.628
##     burn_flag_vp24    0.487    0.173    2.813    0.005    0.324    0.340
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   trait ~~                                                              
##     state_23          0.000                               0.000    0.000
##     state_24          0.000                               0.000    0.000
##   state_23 ~~                                                           
##     state_24          0.415    0.091    4.585    0.000    0.908    0.908
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_v23    3.420    0.059   57.613    0.000    3.420    2.679
##    .court_avp23       3.234    0.064   50.688    0.000    3.234    2.304
##    .recount_avp23     3.742    0.057   65.366    0.000    3.742    2.987
##    .crtcz_lctn_v23    2.718    0.070   39.018    0.000    2.718    1.774
##    .attnd_mrch_v24    3.314    0.058   56.981    0.000    3.314    2.532
##    .court_avp24       3.181    0.060   52.810    0.000    3.181    2.329
##    .recount_avp24     3.940    0.049   80.847    0.000    3.940    3.560
##    .crtcz_lctn_v24    2.719    0.065   41.599    0.000    2.719    1.830
##    .burn_flag_vp23    1.681    0.050   33.889    0.000    1.681    1.536
##    .burn_flag_vp24    1.504    0.042   36.001    0.000    1.504    1.579
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .attnd_mrch_v23    1.086    0.084   12.907    0.000    1.086    0.667
##    .court_avp23       0.705    0.068   10.420    0.000    0.705    0.358
##    .recount_avp23     0.693    0.059   11.776    0.000    0.693    0.442
##    .crtcz_lctn_v23    0.887    0.081   10.903    0.000    0.887    0.378
##    .attnd_mrch_v24    1.158    0.086   13.440    0.000    1.158    0.676
##    .court_avp24       0.916    0.076   12.057    0.000    0.916    0.491
##    .recount_avp24     0.583    0.048   12.056    0.000    0.583    0.476
##    .crtcz_lctn_v24    0.996    0.085   11.723    0.000    0.996    0.451
##    .burn_flag_vp23    0.363    0.058    6.288    0.000    0.363    0.303
##    .burn_flag_vp24    0.327    0.040    8.160    0.000    0.327    0.360
##     trait             0.068    0.080    0.849    0.396    1.000    1.000
##     state_23          0.475    0.109    4.358    0.000    1.000    1.000
##     state_24          0.441    0.118    3.725    0.000    1.000    1.000

Again, these are not very interpretable. The fit is poor, and the loadings run from positive to negative.