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.
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:
wss20
: Western States Survey, 2020wss24
: Western States Survey, 2024avp23
: Arizona Voter Project, 2023avp24
: Arizona Voter Project, 2024cesASU
: 2022 Congressional Election Study, ASU
modulecesBYU
: 2022 Congressional Election Study, BYU
modulecesBYU24
: 2024 Congressional Election Study, BYU
modulecrosswalk_df
: The full crosswalk file joined with the
constituent surveys.electoralConstestationLong
: A cleaned version of the
data, in long format, where each rows is a respondent \(\times\) wave \(\times\) contestation item.electoralConstestationWide
: A cleaned version of the
data, in wide format, where each row is a respondent, and all over time
information is in columns.long_panel
: A cleaned up version of the crosswalk data,
with constituent surveys, in long format, such that each row is a
respondent \(\times\) survey
combination, corresponding to a survey wave structure in a panel data
set.wide_panel
: A cleaned up version of the crosswalk data,
with constituent surveys, in wide format, such that each row is a
respondent, and all over time information resides in the columns.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.
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.
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.
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
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.
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 (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.
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.