Wave 2 interim analysis: changes in political solidarity

What we check

This report follows the preregistration on change. It checks which changes go with changes in solidarity.

We match Wave 2 records to Wave 1 by country and serial number. We use only Wave 1 main-field records (phase = 2). Germany has no matches. The survey provider still needs to confirm that the serial numbers identify the same people in both waves.

This export contains 2188 Wave 2 records and 1823 possible matches. All 365 German records lack serial numbers. The change models below use the matched records from the other six countries. They show associations, not experimental effects.

Code
link_check %>% kable()
matched gender_mismatch age_mismatch
1823 2 3
Code
changes <- panel %>% mutate(delta_solidarity = solidarity_w2 - solidarity_w1)
changes %>% group_by(country) %>%
  summarise(matched = n(), complete_outcome = sum(!is.na(delta_solidarity)),
            wave1 = mean(solidarity_w1[!is.na(delta_solidarity)]),
            wave2 = mean(solidarity_w2[!is.na(delta_solidarity)]),
            mean_change = mean(delta_solidarity, na.rm = TRUE),
            sd_change = sd(delta_solidarity, na.rm = TRUE)) %>%
  kable(digits = 2, col.names = c("Country", "Matched", "Complete scores", "Wave 1 mean", "Wave 2 mean", "Mean change", "SD of change"))
Country Matched Complete scores Wave 1 mean Wave 2 mean Mean change SD of change
Croatia 200 200 2.92 2.89 -0.04 0.88
France 356 356 3.05 3.08 0.03 0.77
Italy 301 301 3.46 3.41 -0.05 0.79
Poland 215 215 3.29 3.32 0.03 0.75
Spain 405 405 3.55 3.57 0.02 0.87
Sweden 346 346 3.70 3.65 -0.05 0.64

The match check finds 2 gender differences and 3 age gaps larger than one year. We keep these pairs in this overview. Their identities need review before the final panel analysis.

A positive change means more willingness to pay for public services that help others. The score averages three answers: support for people in the local area, the country and other EU countries. It ranges from 1 to 5.

We use a pair only when all three answers are available in both waves. Both wave averages in the table use the same people. “SD of change” shows how much the change scores vary.

Matching age and gender gives a useful check. It does not prove that a serial number identifies the same person in both waves.

How much does solidarity change?

Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/dynamics_change_distribution.png")

Do changes point in the expected direction?

We expect solidarity to increase with more left-wing views, greater financial security, more risk, more trust and better views of public services. We also expect an increase after an adverse event in the last six months.

Each model uses one predictor and accounts for country. We subtract the Wave 1 answer from the Wave 2 answer. For adverse events, we use the Wave 2 timing questions.

A positive estimate means that an increase in the predictor goes with a more positive change in solidarity. A negative estimate means the reverse. We expect positive signs for these predictors, except satisfaction with democracy, which has no separate sign prediction.

Each row shows how many matched pairs the model uses. We do not fill in missing answers. The updated figures and tables show uncertainty separately from sign agreement.

Code
change_vars <- c("economic_left", "cultural_left", "financial_security", "personal_risk",
                 "unemployment", "benefit_receipt", "social_trust", "institutional_trust",
                 "satdem", "pssatgen", "pssatloc", "service_quality", "service_delivery")
for (v in change_vars) {
  changes[[paste0("delta_", v)]] <- changes[[paste0(v, "_w2")]] - changes[[paste0(v, "_w1")]]
}
results <- direction_models(changes, "delta_solidarity", c(paste0("delta_", change_vars), "recent_adverse")) %>%
  mutate(direction = case_when(predictor == "delta_satdem" ~ "No stated expectation",
    estimate > 0 ~ "Expected", TRUE ~ "Opposite or zero"))
table_labels <- c(
  delta_economic_left = "Support for income equality and government intervention",
  delta_cultural_left = "Support for LGBT freedom and less traditional gender roles",
  delta_financial_security = "How long the household could cover living costs after losing most income",
  delta_personal_risk = "Expected risk of money shortage, unemployment, inability to work or care duties",
  delta_unemployment = "Being unemployed and actively looking for work",
  delta_benefit_receipt = "Number of unemployment, disability, housing or minimum-income benefits received",
  delta_social_trust = "Trust in other people",
  delta_institutional_trust = "Trust in political and public institutions",
  delta_satdem = "Satisfaction with how democracy works",
  delta_pssatgen = "Overall satisfaction with public services",
  delta_pssatloc = "Rating of local public services compared with the rest of the country",
  delta_service_quality = "Quality ratings for healthcare, schools, tax, transport and benefits services",
  delta_service_delivery = "Fairness, efficiency, prompt help and integrity of public services",
  recent_adverse = "An adverse life event in the last six months (yes versus no)"
)
read_csv("../../outputs/preliminary_wave2/tables/solidarity_change_models.csv", show_col_types = FALSE) %>%
  filter(specification == "baseline") %>%
  transmute(`What changes between waves` = unname(table_labels[predictor]), `Pairs used` = n,
            Estimate = estimate, SE = std_error, `95% lower` = conf_low, `95% upper` = conf_high,
            `CI excludes zero` = excludes_zero) %>% kable(digits = 3)
What changes between waves Pairs used Estimate SE 95% lower 95% upper CI excludes zero
Support for income equality and government intervention 1599 0.048 0.029 -0.010 0.106 FALSE
Support for LGBT freedom and less traditional gender roles 1716 -0.030 0.032 -0.092 0.032 FALSE
How long the household could cover living costs after losing most income 1613 -0.001 0.022 -0.043 0.042 FALSE
Expected risk of money shortage, unemployment, inability to work or care duties 1002 0.018 0.045 -0.070 0.107 FALSE
Being unemployed and actively looking for work 1811 0.002 0.096 -0.187 0.191 FALSE
Number of unemployment, disability, housing or minimum-income benefits received 1745 0.017 0.037 -0.055 0.089 FALSE
Trust in other people 1823 0.009 0.007 -0.005 0.023 FALSE
Trust in political and public institutions 1631 0.056 0.022 0.013 0.099 TRUE
Satisfaction with how democracy works 1760 0.040 0.013 0.015 0.065 TRUE
Overall satisfaction with public services 1777 0.044 0.021 0.004 0.085 TRUE
Rating of local public services compared with the rest of the country 1708 0.055 0.025 0.006 0.105 TRUE
Quality ratings for healthcare, schools, tax, transport and benefits services 1122 0.053 0.028 -0.001 0.107 FALSE
Fairness, efficiency, prompt help and integrity of public services 1823 0.068 0.032 0.005 0.130 TRUE
An adverse life event in the last six months (yes versus no) 1772 0.089 0.042 0.006 0.171 TRUE

The rows describe changes from Wave 1 to Wave 2. The last row is different: it compares people with and without an adverse event in the last six months.

For example, the estimate for economic views is 0.048. A one-point increase in the economic-left score goes with this many points of difference in solidarity change, after accounting for country. This is a score difference, not a percentage. The estimates describe associations, not cause and effect.

“Expected” means only that the estimate has the predicted sign. It does not mean that the hypothesis has been confirmed.

What the numbers show

The next table counts how many estimates point in each direction. These are checks of signs, not tests of the predictions.

Code
bind_rows(
  results %>% count(direction) %>% mutate(check = "Individual predictors"),
  interactions %>% count(direction) %>% mutate(check = "Service-use interactions")
) %>% select(check, direction, n) %>%
  kable(col.names = c("Check", "Sign", "Number of estimates"))
Check Sign Number of estimates
Individual predictors Expected 11
Individual predictors No stated expectation 1
Individual predictors Opposite or zero 2
Service-use interactions Expected 2
Service-use interactions Opposite or zero 4

Limits

The country table shows how much change scores vary. It does not show that welfare-state differences explain that variation.

These models show links between changes. They do not show cause and effect. We leave the full models, income conversion, missing-data replacement and panel weights for the main analysis.

Data source and limits

We use only w2_data/POLITSOLID_W2_Interim_261007.dta, with 2188 records. Collection is still ongoing. We do not read or add either soft-launch file. We match this export to the Wave 1 main field by country and serial number.

The matched sample excludes Germany because its serial numbers are missing. The survey provider still needs to confirm that serial numbers identify the same people across waves. The models use available complete pairs, without imputation or weights. The results below include 95% confidence intervals and unadjusted two-sided tests.

How to read the confidence intervals

The bars show 95% confidence intervals. If an interval crosses zero, the estimate is not statistically distinguishable from zero at the unadjusted two-sided 5% level. A green estimate can still have an interval crossing zero. The colour records the predicted sign, not statistical significance.

The current export has no Wave 2 weights. Regression intervals use HC2 standard errors. Each panel model uses one change score per person. The graphs of proportions use Wilson intervals. The paired country-change graph uses the variation in each person’s change. The histogram shows counts, so it does not need a confidence interval.

All results remain preliminary. Many comparisons are shown, and their p-values are not corrected for multiple testing. These simple baseline models do not implement every part of the final preregistered analysis.

Age and gender robustness

Age and gender use Wave 1 values. These characteristics can predict different changes between people, even though the outcome is a within-person difference. The original model and a baseline using the adjusted model’s complete cases are both retained. This separates adjustment from a change in sample composition. Education is included in a further specification in the exported CSV.

Code
read_csv("../../outputs/preliminary_wave2/tables/solidarity_baseline_adjusted_comparison.csv", show_col_types = FALSE) %>%
  transmute(Predictor = unname(table_labels[predictor]), `Baseline N` = n_baseline, `Adjusted N` = n_age_gender,
    Baseline = estimate_baseline, Adjusted = estimate_age_gender, `Adjusted SE` = std_error_age_gender,
    `95% lower` = conf_low_age_gender, `95% upper` = conf_high_age_gender,
    `Sign changed on same sample` = sign_changed) %>% kable(digits = 3)
Predictor Baseline N Adjusted N Baseline Adjusted Adjusted SE 95% lower 95% upper Sign changed on same sample
Support for income equality and government intervention 1599 1599 0.048 0.047 0.029 -0.010 0.105 FALSE
Support for LGBT freedom and less traditional gender roles 1716 1715 -0.030 -0.030 0.032 -0.092 0.032 FALSE
How long the household could cover living costs after losing most income 1613 1613 -0.001 0.001 0.022 -0.042 0.043 TRUE
Expected risk of money shortage, unemployment, inability to work or care duties 1002 1001 0.018 0.017 0.044 -0.070 0.103 FALSE
Being unemployed and actively looking for work 1811 1810 0.002 -0.001 0.097 -0.190 0.189 TRUE
Number of unemployment, disability, housing or minimum-income benefits received 1745 1744 0.017 0.019 0.037 -0.053 0.091 FALSE
Trust in other people 1823 1822 0.009 0.009 0.007 -0.005 0.023 FALSE
Trust in political and public institutions 1631 1630 0.056 0.057 0.022 0.015 0.100 FALSE
Satisfaction with how democracy works 1760 1759 0.040 0.041 0.013 0.015 0.066 FALSE
Overall satisfaction with public services 1777 1776 0.044 0.045 0.021 0.005 0.085 FALSE
Rating of local public services compared with the rest of the country 1708 1707 0.055 0.054 0.025 0.004 0.103 FALSE
Quality ratings for healthcare, schools, tax, transport and benefits services 1122 1122 0.053 0.052 0.028 -0.002 0.106 FALSE
Fairness, efficiency, prompt help and integrity of public services 1823 1822 0.068 0.070 0.032 0.008 0.133 FALSE
An adverse life event in the last six months (yes versus no) 1772 1771 0.089 0.085 0.042 0.003 0.167 FALSE
Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/dynamics_predictors_age_gender.png")

Country average changes with paired intervals

Both waves refer to the same people. We calculate each person’s change first, then average those changes within country.

Code
read_csv("../../outputs/preliminary_wave2/tables/paired_country_change.csv", show_col_types = FALSE) %>% kable(digits = 3)
country n estimate std_error conf_low conf_high
Croatia 200 -0.038 0.062 -0.161 0.084
France 356 0.030 0.041 -0.050 0.110
Italy 301 -0.048 0.045 -0.137 0.042
Poland 215 0.029 0.051 -0.071 0.130
Spain 405 0.021 0.043 -0.065 0.106
Sweden 346 -0.051 0.034 -0.119 0.017
Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/dynamics_country_change.png")

Service experience with age and gender controls

The graph shows the interaction between recent use and the change in service evaluation. This is not an unconditional effect of using a service. The main use coefficient refers to respondents with no change in their service evaluation. All terms are in the CSV.

Code
read_csv("../../outputs/preliminary_wave2/tables/service_experience_models.csv", show_col_types = FALSE) %>%
  filter(term == "evaluation_change:recent_use") %>%
  select(domain, specification, n, estimate, std_error, conf_low, conf_high, p_value) %>% kable(digits = 3)
domain specification n estimate std_error conf_low conf_high p_value
Any service (H6) baseline 1690 -0.048 0.112 -0.267 0.171 0.668
Any service (H6) age_gender 1689 -0.056 0.112 -0.275 0.163 0.616
Healthcare (H7) baseline 1780 -0.008 0.028 -0.062 0.046 0.774
Healthcare (H7) age_gender 1779 -0.009 0.028 -0.063 0.045 0.743
Schools (H7) baseline 1639 -0.012 0.026 -0.064 0.040 0.652
Schools (H7) age_gender 1638 -0.012 0.026 -0.063 0.040 0.654
Tax authority (H7) baseline 1530 0.027 0.033 -0.037 0.091 0.411
Tax authority (H7) age_gender 1530 0.028 0.032 -0.035 0.092 0.382
Transport (H7) baseline 1705 0.011 0.042 -0.071 0.092 0.794
Transport (H7) age_gender 1704 0.012 0.042 -0.070 0.094 0.779
Benefits/employment (H7) baseline 1246 -0.003 0.028 -0.058 0.052 0.908
Benefits/employment (H7) age_gender 1245 -0.002 0.028 -0.056 0.053 0.952
Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/service_interactions_age_gender.png")

Additional comparison on a common scale

This extra graph rescales continuous predictor changes to one standard deviation. It does not replace the original estimates. Binary events and unemployment are excluded from this additional comparison.

Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/dynamics_standardized.png")

Dependence sensitivity

The primary regression intervals use HC2. An additional CSV repeats uncertainty calculations using observed administrative regions as clusters. These regions are not documented survey sampling units. This sensitivity checks possible within-region dependence without replacing the primary models.

Baseline and adjusted models side by side

The comparison tables distinguish sample loss from adding controls. The figures below display the original baseline and the age/gender model together.

Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/dynamics_baseline_vs_adjusted.png")

Code
knitr::include_graphics("../../outputs/preliminary_wave2/figures/service_baseline_vs_adjusted.png")

Does the dependence assumption matter?

The table compares whether the primary HC2 interval and the observed-region clustered interval exclude zero. Changes here concern uncertainty, not a change in the estimated association.

Code
read_csv("../../outputs/preliminary_wave2/tables/dependence_comparison.csv", show_col_types = FALSE) %>%
  filter(status_changed) %>% mutate(predictor = unname(table_labels[predictor])) %>% kable(digits = 3)
predictor primary_excludes_zero primary_low primary_high cluster_low cluster_high cluster_excludes_zero status_changed
Quality ratings for healthcare, schools, tax, transport and benefits services FALSE -0.001 0.107 0.002 0.104 TRUE TRUE
An adverse life event in the last six months (yes versus no) TRUE 0.006 0.171 -0.003 0.180 FALSE TRUE

The dynamics registration specifies one-sided tests and 90% intervals for the final models. This update follows the requested 95% intervals and reports two-sided, unadjusted zero tests; it is not presented as the final registered decision rule.

The additional strict age check flags any age change outside 0 or 1 years. It finds four pairs, whereas the earlier absolute-gap-over-one-year check finds three. All flagged pairs remain in this overview.