1 Introduction

1.1 Why Happiness Might Drive Political Engagement ?

Think about two people living in the same city. One is struggling financially, unhappy at work, and feels disconnected from the people around them. The other has a stable job, a fulfilling family life, and feels broadly content with where things stand. Which one is more likely to show up to a local council meeting, follow political news, or vote in regional elections? Common sense and a growing body of research suggests the second person. But why this might be true, how strong the relationship really is, and whether it looks different depending on how old you are are questions that remain surprisingly open, particularly for Germany.

This paper takes those questions seriously. Using data from the German Socio-Economic Panel Study (SOEP), it investigates whether individuals who report higher life satisfaction are more likely to be politically interested and to participate in local politics and whether this relationship changes meaningfully across age groups. Germany is a particularly interesting setting for this inquiry. It is a stable, mature democracy, but one with a historically divided political culture between East and West that persists decades after reunification. It also has an ageing population, which makes the question of how older citizens engage with politics not just academically interesting, but directly relevant to democratic representation.

1.2 Key Concepts

Before going further, it is worth being precise about what is meant by the central terms in this seminar paper.

Subjective well-being refers to how people evaluate and experience their own lives. It has two components: an emotional one (how often people feel positive versus negative emotions day to day) and a cognitive one (how satisfied people feel when they step back and assess their life as a whole). In this paper, we focus on the cognitive component, measured as life satisfaction A single survey question asking respondents to rate their overall life on a scale from 0 (completely dissatisfied) to 10 (completely satisfied). This is the most commonly used measure of subjective well-being in large-scale longitudinal surveys, and it is available in the SOEP from 1984 onwards under variable plh0182.

Political interest captures the attitudinal side of civic engagement whether a person pays attention to politics and considers it relevant to their life. In the SOEP, this is asked directly: “Generally speaking, how interested are you in politics?” Responses run from 1 (very interested) to 4 (not at all interested). Note the reversed scale: a lower number means more interest, which matters for interpreting regression results later.

Political participation refers to the behavioral side actually doing something in the political arena. This paper uses pli0097_v2, which asks how often respondents engage in local political activities, ranging from weekly to never. The distinction between interest and participation turns out to be one of the most important findings later as will be shown, interest and participation respond differently to age, which tells us something meaningful about how life circumstances shape civic behavior.

1.3 Background and Literature Review

The idea that happier people are also more civically engaged is not new, but the mechanisms behind it are still debated. One explanation, rooted in resource theory, holds that life satisfaction is a signal of broader well being resources financial security, social embeddedness, emotional stability that reduce the personal costs of political engagement (Flavin and Keane 2012). Someone who is not worried about paying rent has more bandwidth to care about what the local government is doing. A second explanation emphasises social trust: satisfied individuals tend to trust other people and institutions more, and trust is a well established predictor of conventional political participation (Esaiasson, Dahlberg, and Kokkonen 2020).

For Germany specifically (Meier and Stutzer 2008) offer a clever natural experiment. Using the collapse of civic organisations in East Germany after reunification as an exogenous shock to volunteering opportunities, they show that losing access to civic engagement reduced life satisfaction among those affected suggesting the relationship runs in both directions, not just from happiness to participation. This bidirectionality is a key reason why simply regressing participation on life satisfaction does not settle questions of causality, a point that (Pirralha 2018) reinforces directly. Using the very same SOEP dataset used in this paper, Pirralha applies a three wave cross lagged panel model and finds that after accounting for measurement error and prior states, the cross sectional association between participation and life satisfaction is considerably weaker than raw correlations suggest. This is a humbling finding for any paper on this topic including this one and it shapes how the results are interpreted in the conclusion.

The broader dataset underlying this analysis is described in (Wagner, Frick, and Schupp 2007), who document the SOEP’s design, sampling strategy, and development over time. Their account makes clear that the SOEP is unusually well suited for studying well being and civic engagement together, precisely because it tracks the same individuals over decades and covers both attitudinal and behavioral dimensions of political life.

1.4 Research Goal

This seminar paper has two connected goals. The first is to estimate whether life satisfaction is a statistically meaningful predictor of political interest in Germany, and whether the strength of this relationship differs across age groups. The second is to ask whether life satisfaction also predicts actual political participation and whether it does so partly through political interest as a mediating step, or through a more direct pathway.

The conceptual model guiding the analysis can be stated simply:

\[\text{Resources} \;\rightarrow\; \text{Well-Being} \;\rightarrow\; \text{Political Interest} \;\rightarrow\; \text{Political Participation}\]

where satisfaction with income, family, and work feeds into overall life satisfaction, which in turn shapes how interested people are in politics, which ultimately shapes whether they act on that interest. Age enters this chain as a moderator not changing the direction of the relationships, but potentially amplifying or dampening them at different life stages.

2 Data Analysis

## Setup
 
library(haven)
library(tidyverse)
library(sjlabelled)
library(stargazer)
library(ggplot2)
library(dplyr)
library(marginaleffects)
library(gtsummary)
library(corrplot)
## Load and Merge Data
 
setwd("C:/1. IBA/4. Applied Economics/Data")
 
pequiv <- read_dta("pequiv.dta", col_select = c(
  "pid",     # person ID
  "syear",   # survey year
  "d11101",  # age
  "d11104",  # marital status
  "l11102"   # region (1 = west, 2 = east)
))
 
pl <- read_dta("pl.dta", col_select = c(
  "pid",
  "syear",
  "plh0007",    # political interest
  "pli0097_v2", # political participation
  "plh0182",    # life satisfaction
  "plh0175",    # income satisfaction
  "plh0180",    # family satisfaction
  "plj0454"     # job satisfaction
))
 
pequiv <- remove_all_labels(pequiv)
pl     <- remove_all_labels(pl)
soep   <- left_join(pl, pequiv, by = c("pid", "syear"))
## Rename Variables

soep <- soep %>%
  rename(
    pol_interest      = plh0007,
    pol_participation = pli0097_v2,
    lifesat           = plh0182,
    income_sat        = plh0175,
    family_sat        = plh0180,
    job_sat           = plj0454,
    age               = d11101,
    marital           = d11104,
    region            = l11102
  )

2.1 Data Management

# Step 1: SOEP missing value codes 
soep_missing <- c(-1, -2, -3, -4, -5, -6, -7, -8, -9)
 
# Step 2: Recode missings and filter 
soep_clean <- soep %>%
  mutate(across(
    c(pol_interest, pol_participation, lifesat,
      income_sat, family_sat, job_sat, age, marital),
    ~ ifelse(.x %in% soep_missing, NA, .x)
  )) %>%
  filter(
    !is.na(pol_interest),
    !is.na(lifesat),
    !is.na(age),
    !is.na(region)
  )
 
# Step 3: Factor variables
soep_clean$region <- factor(soep_clean$region,
  levels = c(1, 2),
  labels = c("West Germany", "East Germany"))
 
soep_clean$marital <- factor(soep_clean$marital,
  levels = c(1, 2, 3, 4, 5),
  labels = c("married", "single", "widowed", "divorced", "separated"))
 
# Step 4: Political interest
# Binary: 1 = very/interested, 0 = not very/not at all
soep_clean <- soep_clean %>%
  mutate(pol_interest_bin = ifelse(pol_interest <= 2, 1, 0))
 
# Ordered factor for descriptive plots
soep_clean$pol_interest_ord <- factor(soep_clean$pol_interest,
  levels  = c(1, 2, 3, 5),
  labels  = c("very interested", "interested", "not very", "not at all"),
  ordered = TRUE)
 
#  Step 5: Political participation 
soep_clean$pol_participation <- factor(soep_clean$pol_participation,
  levels  = c(1, 2, 3, 4),
  labels  = c("weekly", "monthly", "rarely", "never"),
  ordered = TRUE)
 
# Step 6: Age groups 
soep_clean <- soep_clean %>%
  mutate(age_group = case_when(
    age >= 18 & age <= 29 ~ "Youth (18-29)",
    age >= 30 & age <= 44 ~ "Young Adults (30-44)",
    age >= 45 & age <= 59 ~ "Middle-Aged (45-59)",
    age >= 60 & age <= 74 ~ "Senior Citizens (60-74)",
    age >= 75             ~ "Older Seniors (75+)"
  ))
 
soep_clean$age_group <- factor(soep_clean$age_group,
  levels  = c("Youth (18-29)", "Young Adults (30-44)",
              "Middle-Aged (45-59)", "Senior Citizens (60-74)",
              "Older Seniors (75+)"),
  labels  = c("18-29", "30-44", "45-59", "60-74", "75+"),
  ordered = TRUE)
 
# Step 7: Mean-centre continuous predictors 
soep_clean <- soep_clean %>%
  mutate(
    lifesat_c      = as.numeric(scale(lifesat,
                                      center = TRUE, scale = FALSE)),
    pol_interest_c = as.numeric(scale(pol_interest,
                                      center = TRUE, scale = FALSE))
  )
 
# Step 8: Satisfaction categories for plots 
soep_clean <- soep_clean %>%
  mutate(
    lifesat_cat    = case_when(lifesat    <= 4 ~ "Low",
                               lifesat    <= 7 ~ "Medium", TRUE ~ "High"),
    income_sat_cat = case_when(income_sat <= 4 ~ "Low",
                               income_sat <= 7 ~ "Medium", TRUE ~ "High"),
    job_sat_cat    = case_when(job_sat    <= 4 ~ "Low",
                               job_sat    <= 7 ~ "Medium", TRUE ~ "High"),
    family_sat_cat = case_when(family_sat <= 4 ~ "Low",
                               family_sat <= 7 ~ "Medium", TRUE ~ "High")
  )
 
# Step 9: Sub datasets for time restricted variables 
participation_years <- c(2010, 2011, 2012, 2013, 2014, 2015, 2017)
 
soep_participation <- soep_clean %>%
  filter(syear %in% participation_years,
         !is.na(pol_participation))
 
soep_family <- soep_clean %>%
  filter(syear >= 2010, syear <= 2013,
         !is.na(family_sat))
 
soep_job <- soep_clean %>%
  filter(syear >= 2015,
         !is.na(job_sat))

All SOEP negative codes (−1 through −9) representing “not applicable”, “don’t know”, or “refused” are recoded as NA and excluded. Three sub data sets are created to handle unequal variable availability across waves. Continuous predictors are mean centered prior to regression to ensure the intercept is interpret able at average satisfaction levels.

## Graphics Theme
 
cb_palette <- c(
  "#0072B2", "#009E73", "#D55E00", "#CC79A7", "#F0E442"
)
 
theme_modern <- theme_minimal(base_size = 14) +
  theme(
    panel.grid       = element_blank(),
    panel.background = element_rect(fill = "white", color = NA),
    axis.line        = element_line(color = "black", linewidth = 0.4),
    axis.ticks       = element_line(color = "black", linewidth = 0.4),
    plot.title       = element_text(face = "bold", size = 16),
    legend.position  = "right"
  )

2.2 Sample

n_total   <- nrow(soep_clean)
n_persons <- n_distinct(soep_clean$pid)
year_range <- range(soep_clean$syear)
n_waves   <- length(unique(soep_clean$syear))

This study uses the SOEP Teaching Data, a reduced but representative version of the German Socio-Economic Panel Study one of the longest-running household panel surveys in the world (Wagner, Frick, and Schupp 2007). The SOEP has tracked the same German households annually since 1984, collecting detailed information on income, employment, health, subjective well being, and political attitudes and behavior.

After merging and cleaning, the working sample contains 365,981 person-year observations from 55,194 unique individuals, spanning 38 waves between 1985 and 2022. The estimation sample for the regression models is restricted to observations where political participation is also non-missing, yielding 125,745 person-year observations. Three exclusion criteria were applied: removal of system-missing values (codes −1 to −9), exclusion of observations missing on key analysis variables, and restriction of regression models to waves where participation data are available.

2.3 Variables

This analysis draws on 10 variables across three domains. What follows explains each variable in plain terms, with the exact survey question wording.

2.3.1 Political Engagement

  1. Political Interest (pol_interest, original: plh0007): “Generally speaking, how interested are you in politics?” Coded 1 = very interested to 4 = not at all interested. Scale is reversed: lower = more interest. Binarised for regression: 1 if interested or very interested, 0 otherwise.

  2. Political Participation (pol_participation, original: pli0097_v2): Frequency of participation in local political activities: 1 = weekly, 2 = monthly, 3 = rarely, 4 = never. Available 2010–2017 only. Binarised for regression: 1 = participates at least rarely, 0 = never.

2.3.2 Subjective Well-Being

  1. Life Satisfaction (lifesat, original: plh0182): “How satisfied are you with your life, all things considered?” Scale 0–10. Central independent variable. Mean centred in regression models.

  2. Income Satisfaction (income_sat, original: plh0175) : “How satisfied are you with your household income?” Scale 0–10. Used descriptively.

  3. Family Satisfaction (family_sat, original: plh0180): “How satisfied are you with your family life?” Scale 0–10. Available 2010–2013 only.

  4. Job Satisfaction (job_sat, original: plj0454): “How satisfied are you with your job?” Scale 0–10. Available from 2015 onwards.

2.3.3 Socio - demographic Variables

  1. Age (age, original: d11101): Age in years, grouped into five ordered categories: 18–29, 30–44, 45–59, 60–74, 75+.

  2. Marital Status (marital, original: d11104): Five categories: married, single, widowed, divorced, separated.

  3. Region (region, original: l11102): West Germany (1) vs East Germany (2). Captures structural differences in political culture following reunification (Meier and Stutzer 2008).

  4. Survey Year (syear): Year of interview, ranging from 1985 to 2022. Used for temporal trend analysis.

2.4 Summary Statistics

soep_clean %>%
  select(lifesat, pol_interest, age,
         income_sat, family_sat, region, marital) %>%
  tbl_summary(
    statistic = list(
      all_continuous()  ~ "{mean} ({sd})",
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = all_continuous() ~ 2,
    label  = list(
      lifesat      ~ "Life Satisfaction (0-10)",
      pol_interest ~ "Political Interest (1=high, 4=low)",
      age          ~ "Age (years)",
      income_sat   ~ "Income Satisfaction (0-10)",
      family_sat   ~ "Family Satisfaction (0-10)",
      region       ~ "Region",
      marital      ~ "Marital Status"
    ),
    missing = "no"
  ) %>%
  bold_labels() %>%
  add_n()
Characteristic N N = 365,9811
Life Satisfaction (0-10) 365,981 7.16 (1.79)
Political Interest (1=high, 4=low) 365,981
    1
29,807 (8.1%)
    2
105,080 (29%)
    3
169,898 (46%)
    4
61,196 (17%)
Age (years) 365,981 46.69 (17.46)
Income Satisfaction (0-10) 349,491 6.55 (2.28)
Family Satisfaction (0-10) 193,129 7.92 (1.91)
Region 365,981
    West Germany
285,067 (78%)
    East Germany
80,914 (22%)
Marital Status 365,786
    married
219,111 (60%)
    single
89,400 (24%)
    widowed
21,582 (5.9%)
    divorced
26,406 (7.2%)
    separated
9,287 (2.5%)
1 Mean (SD); n (%)

Mean life satisfaction stands at approximately 7.2 out of 10 and political interest averages 2.7 on the reversed 1–4 scale, placing most respondents between “interested” and “not very interested”. Family satisfaction (≈ 7.9) runs consistently higher than income satisfaction (≈ 6.6). The sample skews toward West Germany and married respondents typical of stable, long running household panels.

2.5 Data Analysis and Visualizations

2.5.1 Exploring Individual Variables

# Histogram of life satisfaction — check for skew and ceiling effects
ggplot(soep_clean, aes(x = lifesat)) +
  geom_histogram(binwidth = 1, fill = "#0072B2",
                 color = "white", alpha = 0.85) +
  scale_x_continuous(breaks = 0:10) +
  labs(
    title   = "Figure 1: Distribution of Life Satisfaction",
    caption = "Source: SOEP Teaching Data. Variable: plh0182.",
    x       = "Life Satisfaction (0-10)",
    y       = "Number of Observations"
  ) +
  theme_modern

Figure 1 shows that life satisfaction is left skewed, clustering between 6 and 8 with a spike at 8. Very low values are rare and there is a mild ceiling at 10. This skew means the regression models are driven mainly by variation in the middle of the scale. Extreme dissatisfaction (0–3) affects a small minority of respondents and should not influence estimates.

ggplot(
  soep_clean %>% filter(!is.na(pol_interest), !is.na(region)),
  aes(x = pol_interest, fill = region)
) +
  geom_density(alpha = 0.55) +
  scale_fill_manual(values = c("#0072B2", "#D55E00")) +
  scale_x_continuous(
    breaks = c(1, 2, 3, 4),                     
    labels = c("Very\ninterested", "Interested",
               "Not very", "Not at all"),
    limits = c(0.5, 4.5)                          
  ) +
  labs(
    title   = "Figure 2: Density of Political Interest by Region",
    caption = "Source: SOEP Teaching Data. Variable: plh0007.",
    x       = "Political Interest",
    y       = "Density",
    fill    = "Region"
  ) +
  theme_modern

Figure 2 shows East Germans are slightly more concentrated at the “not very” and “not at all” ends of the interest scale compared to West Germans. The difference is modest but consistent with post reunification literature documenting lower civic engagement in the East a legacy of decades under the GDR where political participation was imposed rather than chosen (Meier and Stutzer 2008).

2.5.2 Group Comparisons

# Your original Graph 3 — political interest across age groups
ggplot(
  soep_clean %>% filter(!is.na(pol_interest), !is.na(age_group)),
  aes(x = age_group, y = pol_interest, fill = age_group)
) +
  geom_boxplot(alpha = 0.85, outlier.shape = 21,
               outlier.size = 1.5, outlier.alpha = 0.3) +
  scale_fill_manual(values = cb_palette) +
  labs(
    title   = "Figure 3: Political Interest Across Age Groups",
    caption = "Source: SOEP Teaching Data. Lower values = more interest.",
    x       = "Age Group",
    y       = "Political Interest (1=very interested, 4=not at all)"
  ) +
  theme_modern +
  guides(fill = "none")

Figure 3 shows medians shifting downward (more interest) from left to right across age groups. Political interest becomes more homogeneous in older cohorts the interquartile range narrows, suggesting that older adults are not just more interested on average but also more consistently so. The youngest group (18–29) has the widest spread, pointing to a cohort where political attitudes are still forming.

participation_summary <- soep_participation %>%
  filter(!is.na(pol_participation), !is.na(age_group)) %>%
  group_by(age_group, pol_participation) %>%
  summarise(count = n(), .groups = "drop_last") %>%
  mutate(total = sum(count), share = count / total) %>%
  ungroup()
 
ggplot(participation_summary,
       aes(x = age_group, y = share, fill = pol_participation)) +
  geom_col() +
  geom_text(
    data        = participation_summary %>% distinct(age_group, total),
    aes(x       = age_group, y = 1.06,
        label   = paste0("N=", total)),             
    inherit.aes = FALSE,
    size        = 3.2                               
  ) +
  scale_y_continuous(
    labels = scales::percent,
    limits = c(0, 1.20),                          
    breaks = seq(0, 1, 0.25)
  ) +
  scale_fill_manual(values = cb_palette) +
  labs(
    title   = "Figure 4: Political Participation Across Age Groups",
    subtitle = "SOEP waves: 2010, 2011, 2012, 2013, 2014, 2015, 2017",  
    caption = "Source: SOEP Teaching Data. Variable: pli0097_v2.",
    x       = "Age Group",
    y       = "Share of Participation Levels",
    fill    = "Participation Frequency"
  ) +
  theme_modern +
  theme(legend.position = "bottom")                 

Figure 4 reveals the key divergence from Figure 3. While interest rises with age, actual participation does not follow the same pattern. The share of “never” participants is highest among the youngest cohort, drops for middle aged groups, but climbs again for those aged 75 and above. Middle aged Germans (45–59) are the most behaviorally engaged group not the oldest. This gap between interest and behavior, growing in the oldest cohort, is one of the central point which explored by this seminar paper.

2.5.4 Correlation Analysis

cor_vars <- soep_clean %>%
  select(lifesat, pol_interest, income_sat, family_sat, age) %>%
  filter(complete.cases(.))
 
cor_matrix <- cor(cor_vars, use = "complete.obs")
 
corrplot(cor_matrix,
         method      = "color",
         type        = "upper",
         addCoef.col = "black",
         tl.col      = "black",
         tl.srt      = 45,
         col         = colorRampPalette(
                         c("#D55E00", "white", "#0072B2"))(200),
         title       = "Figure 7: Correlation Matrix of Key Variables",
         mar         = c(0, 0, 2, 0))

Figure 7 shows pairwise Pearson correlations. Life satisfaction and income satisfaction share the strongest positive correlation (r ≈ 0.47), confirming financial well being is a major component of overall satisfaction. The correlation between life satisfaction and political interest is negative (r ≈ −0.09) negative because higher interest is coded as a lower number, so this actually means more satisfied people tend to be more interested. The magnitude is modest but significant marginal effects will be found in the regression.

2.6 Advanced Analysis: Regression Models

### Model Dataset
model_data <- soep_clean %>%
  filter(
    !is.na(pol_interest),
    !is.na(lifesat),
    !is.na(age_group),
    !is.na(pol_participation)
  ) %>%
  mutate(
    part_bin       = ifelse(pol_participation == "never", 0, 1),
    pol_interest_c = as.numeric(scale(pol_interest,
                                      center = TRUE, scale = FALSE)),
    lifesat_c      = as.numeric(scale(lifesat,
                                      center = TRUE, scale = FALSE)),
    age_group      = factor(age_group)
  )

2.6.1 Model Specification

Two binary logistic regression models are estimated. All continuous predictors are mean-centered so the intercept is interpretable at average predictor values, and to reduce multicollinearity in interaction terms.

Model A — Political Interest

\[\ln\!\left(\frac{P(Y_{1i}=1)}{1-P(Y_{1i}=1)}\right) = \alpha + \beta_1\widetilde{L}_i + \sum_{k=2}^{5}\gamma_k\,\mathbf{1}[\text{Age}_i=k] + \sum_{k=2}^{5}\delta_k\,\widetilde{L}_i\cdot\mathbf{1}[\text{Age}_i=k] + \varepsilon_i\]

where \(\widetilde{L}_i\) is mean-centred life satisfaction, age group dummies use 18–29 as the reference category, and \(\delta_k\) captures whether the life satisfaction slope differs across age groups.

Model B — Political Participation

\[\ln\!\left(\frac{P(Y_{2i}=1)}{1-P(Y_{2i}=1)}\right) = \alpha + \beta_1\widetilde{L}_i + \beta_2\widetilde{I}_i + \beta_3\,\widetilde{L}_i\cdot\widetilde{I}_i + \sum_{k=2}^{5}\gamma_k\,\mathbf{1}[\text{Age}_i=k] + \varepsilon_i\]

where \(\widetilde{I}_i\) is mean-centred political interest and \(\beta_3\) tests whether life satisfaction and interest act as complements or substitutes in driving participation. Both models maximise the log-likelihood:

\[\ell(\boldsymbol{\theta}) = \sum_{i=1}^{n}\left[Y_i\ln\Lambda(\mathbf{x}_i^\top\boldsymbol{\theta}) + (1-Y_i)\ln\!\left(1-\Lambda(\mathbf{x}_i^\top\boldsymbol{\theta})\right)\right]\]

where \(\Lambda(z)=e^z/(1+e^z)\) is the logistic function.

2.6.2 Model A: Political Interest

model_interest <- glm(
  pol_interest_bin ~ lifesat_c * age_group,
  data   = model_data,
  family = binomial(link = "logit")
)
 
summary(model_interest)
## 
## Call:
## glm(formula = pol_interest_bin ~ lifesat_c * age_group, family = binomial(link = "logit"), 
##     data = model_data)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           -0.575429   0.006815 -84.434  < 2e-16 ***
## lifesat_c              0.094926   0.003745  25.351  < 2e-16 ***
## age_group.L            0.882782   0.017901  49.315  < 2e-16 ***
## age_group.Q           -0.194195   0.016276 -11.931  < 2e-16 ***
## age_group.C           -0.096255   0.014039  -6.856 7.08e-12 ***
## age_group^4           -0.036887   0.012102  -3.048   0.0023 ** 
## lifesat_c:age_group.L  0.095611   0.009676   9.881  < 2e-16 ***
## lifesat_c:age_group.Q  0.007539   0.008833   0.854   0.3933    
## lifesat_c:age_group.C  0.009950   0.007883   1.262   0.2069    
## lifesat_c:age_group^4  0.003082   0.006829   0.451   0.6518    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 162363  on 125744  degrees of freedom
## Residual deviance: 157878  on 125735  degrees of freedom
## AIC: 157898
## 
## Number of Fisher Scoring iterations: 4

2.6.3 Model B: Political Participation

model_participation <- glm(
  part_bin ~ lifesat_c * pol_interest_c + age_group,
  data   = model_data,
  family = binomial(link = "logit")
)
 
summary(model_participation)
## 
## Call:
## glm(formula = part_bin ~ lifesat_c * pol_interest_c + age_group, 
##     family = binomial(link = "logit"), data = model_data)
## 
## Coefficients:
##                           Estimate Std. Error  z value Pr(>|z|)    
## (Intercept)              -2.655424   0.014321 -185.425  < 2e-16 ***
## lifesat_c                 0.035169   0.006777    5.189 2.11e-07 ***
## pol_interest_c           -0.935622   0.012542  -74.601  < 2e-16 ***
## age_group.L              -0.342860   0.035278   -9.719  < 2e-16 ***
## age_group.Q              -0.511732   0.030992  -16.512  < 2e-16 ***
## age_group.C              -0.112595   0.025003   -4.503 6.69e-06 ***
## age_group^4               0.022298   0.020030    1.113   0.2656    
## lifesat_c:pol_interest_c  0.014936   0.006703    2.228   0.0259 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 76896  on 125744  degrees of freedom
## Residual deviance: 70373  on 125737  degrees of freedom
## AIC: 70389
## 
## Number of Fisher Scoring iterations: 5

2.6.4 Regression Table

stargazer(
  model_interest,
  model_participation,
  type           = "html",
  title          = "Table 1: Logistic Regression Models",
  column.labels  = c("Political Interest", "Political Participation"),
  dep.var.labels = c("Interest (binary)", "Participation (binary)"),
  digits         = 3,
  star.cutoffs   = c(0.05, 0.01, 0.001),
  no.space       = TRUE,
  align          = TRUE,
  notes          = "Standard errors in parentheses."
)
Table 1: Logistic Regression Models
Dependent variable:
Interest (binary) Participation (binary)
Political Interest Political Participation
(1) (2)
lifesat_c 0.095*** 0.035***
(0.004) (0.007)
pol_interest_c -0.936***
(0.013)
age_group.L 0.883*** -0.343***
(0.018) (0.035)
age_group.Q -0.194*** -0.512***
(0.016) (0.031)
age_group.C -0.096*** -0.113***
(0.014) (0.025)
age_group4 -0.037** 0.022
(0.012) (0.020)
lifesat_c:age_group.L 0.096***
(0.010)
lifesat_c:age_group.Q 0.008
(0.009)
lifesat_c:age_group.C 0.010
(0.008)
lifesat_c:age_group4 0.003
(0.007)
lifesat_c:pol_interest_c 0.015*
(0.007)
Constant -0.575*** -2.655***
(0.007) (0.014)
Observations 125,745 125,745
Log Likelihood -78,938.770 -35,186.350
Akaike Inf. Crit. 157,897.500 70,388.700
Note: p<0.05; p<0.01; p<0.001
Standard errors in parentheses.

Table 1 confirms life satisfaction is a statistically significant positive predictor in both models. In Model A the lifesat_c coefficient (0.095, p < 0.001) shows higher satisfaction raises the log odds of being interested. The significant positive interaction (lifesat_c:age_group.L = 0.096) confirms the effect is stronger for older groups.

In Model B, political interest dominates: its large negative coefficient (−0.936) reflects the reversed scale substantively it means more interested individuals participate far more. The small but significant interaction (\(\beta_3\) = 0.015) suggests life satisfaction and interest act as mild complements.

2.6.5 Average Marginal Effects

Log-odds have no direct probabilistic interpretation. Average Marginal Effects (AMEs) translate results into probability changes:

\[\widehat{\text{AME}}_j = \frac{1}{n}\sum_{i=1}^{n}\hat{\beta}_j\cdot \Lambda(\mathbf{x}_i^\top\hat{\boldsymbol{\theta}})\cdot \!\left[1-\Lambda(\mathbf{x}_i^\top\hat{\boldsymbol{\theta}})\right]\]

avg_slopes(model_interest)
## 
##       Term      Contrast Estimate Std. Error    z Pr(>|z|)     S  2.5 % 97.5 %
##  age_group 30-44 - 18-29   0.0713   0.003624 19.7   <0.001 283.7 0.0642 0.0784
##  age_group 45-59 - 18-29   0.1492   0.003771 39.6   <0.001   Inf 0.1418 0.1566
##  age_group 60-74 - 18-29   0.2296   0.004248 54.1   <0.001   Inf 0.2213 0.2379
##  age_group 75+ - 18-29     0.2327   0.006027 38.6   <0.001   Inf 0.2209 0.2445
##  lifesat_c dY/dX           0.0190   0.000743 25.5   <0.001 475.1 0.0175 0.0204
## 
## Type: response
avg_slopes(model_participation)
## 
##            Term      Contrast Estimate Std. Error      z Pr(>|z|)    S    2.5 %
##  age_group      30-44 - 18-29  0.01379   0.002426   5.69  < 0.001 26.2  0.00904
##  age_group      45-59 - 18-29  0.02450   0.002464   9.94  < 0.001 75.0  0.01967
##  age_group      60-74 - 18-29  0.00792   0.002555   3.10  0.00193  9.0  0.00291
##  age_group      75+ - 18-29   -0.02956   0.002897 -10.20  < 0.001 78.8 -0.03524
##  lifesat_c      dY/dX          0.00216   0.000455   4.76  < 0.001 19.0  0.00127
##  pol_interest_c dY/dX         -0.07288   0.001015 -71.83  < 0.001  Inf -0.07486
##    97.5 %
##   0.01855
##   0.02933
##   0.01293
##  -0.02389
##   0.00306
##  -0.07089
## 
## Type: response

For Model A, a one unit increase in life satisfaction raises the probability of political interest by 1.9 percentage points (p < 0.001). Age group differences are much larger: compared to 18–29 year olds, the predicted probability of interest is 7.1 percentage points higher among 30–44 year olds, 14.9 percentage points higher among 45–59 year old, and approximately 23 percentage points higher for both senior cohorts. For Model B, the direct life satisfaction effect is tiny (0.22 pp) while political interest dominates (7.3 pp per unit). Crucially, the 75+ cohort is 2.96 pp less likely to participate than the youngest group confirming the participation decline visible in Figure 4.

2.6.6 Predicted Probability Plots

## Shared theme addition for all three predicted probability plots
theme_pred <- theme_modern +
  theme(
    axis.text.x  = element_text(angle = 30, hjust = 1, size = 11), 
    axis.title.x = element_text(margin = margin(t = 14)),          
    plot.margin  = margin(t = 10, r = 20, b = 20, l = 10)          
  )
 
# Figure 8: Predicted probability of interest by age group 
pred_interest <- predictions(model_interest,
  newdata = datagrid(age_group = levels(model_data$age_group)))
 
ggplot(pred_interest,
       aes(x = age_group, y = estimate,
           ymin = conf.low, ymax = conf.high)) +
  geom_point(size = 3, color = "#0072B2") +
  geom_errorbar(width = 0.2, color = "#0072B2") +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    limits = c(0, 0.8)
  ) +
  labs(
    title    = "Figure 8: Predicted Probability of Political Interest by Age",
    subtitle = "At mean life satisfaction | 95% confidence intervals shown",
    caption  = "Source: SOEP Teaching Data. Predictions from Model A.",
    x        = "Age Group",
    y        = "Predicted Probability"
  ) +
  theme_pred                                         

# Figure 9: Predicted probability of participation by age group
pred_participation <- predictions(model_participation,
  newdata = datagrid(age_group = levels(model_data$age_group)))
 
ggplot(pred_participation,
       aes(x = age_group, y = estimate,
           ymin = conf.low, ymax = conf.high)) +
  geom_point(size = 3, color = "#D55E00") +
  geom_errorbar(width = 0.2, color = "#D55E00") +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    limits = c(0, 0.25)
  ) +
  labs(
    title    = "Figure 9: Predicted Probability of Participation by Age",
    subtitle = "At mean life satisfaction and political interest | 95% CIs shown",
    caption  = "Source: SOEP Teaching Data. Predictions from Model B.",
    x        = "Age Group",
    y        = "Predicted Probability"
  ) +
  theme_pred                                        

# Figure 10: Life satisfaction gradient across age groups
pred_lifesat <- predictions(model_interest,
  newdata = datagrid(
    lifesat_c = seq(-5, 5, by = 1),
    age_group = levels(model_data$age_group)
  ))
 
ggplot(pred_lifesat,
       aes(x = lifesat_c, y = estimate, color = age_group,
           ymin = conf.low, ymax = conf.high)) +
  geom_line(linewidth = 1) +
  geom_ribbon(aes(fill = age_group), alpha = 0.1, color = NA) +
  scale_color_manual(values = cb_palette) +
  scale_fill_manual(values  = cb_palette) +
  scale_x_continuous(breaks = -5:5) +              
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(
    title    = "Figure 10: Life Satisfaction and Political Interest by Age",
    subtitle = "Shaded bands are 95% confidence intervals",
    caption  = "Source: SOEP Teaching Data. Predictions from Model A.",
    x        = "Life Satisfaction (centred, deviation from mean)",
    y        = "Predicted Probability of Being Interested",
    color    = "Age Group",
    fill     = "Age Group"
  ) +
  theme_modern +
  theme(plot.margin = margin(t = 10, r = 20, b = 10, l = 10)) 

Figures 8 and 9 place the interest-participation divergence side by side. Political interest rises steadily from roughly 30% among the youngest cohort to over 55% among seniors (Figure 8). Participation peaks at 45–59 and then falls sharply, dropping below the youth baseline for the 75+ group (Figure 9). Figure 10 confirms that the life satisfaction gradient is steepest for older groups well-being amplifies political interest more strongly in later life.

3 Conclusion

This paper set out to examine whether people who feel more satisfied with their lives are also more politically interested and politically active in Germany, and whether these relationships differ across age groups. Using almost 366,000 person‑year observations from the SOEP teaching data set, covering nearly forty years, the analysis offers three clear takeaways.

First, life satisfaction does have a positive effect on political interest, but the size of this effect is modest. A one‑point increase on the 0–10 life satisfaction scale raises the probability of being politically interested by about 1.9 percentage points. The effect is statistically strong, yet small compared to the influence of age.

Second, the direct impact of life satisfaction on political participation is even smaller only about 0.22 percentage points. Participation appears to be driven mainly through political interest rather than through well being itself. Political interest is by far the strongest predictor of participation, increasing the likelihood of taking part by roughly 7.3 percentage points for each unit increase.

Third, age plays a major role in shaping political engagement, but in different ways for interest and participation. Political interest increases steadily with age, while participation follows an inverted U‑shape: it rises through midlife and then drops sharply among the oldest adults. People aged 75 and above are actually less likely to participate than young adults, even though they report higher levels of interest.

These findings fit well with existing research. The positive link between well being and civic engagement echoes earlier work by (Meier and Stutzer 2008) as well as (Flavin and Keane 2012). The decline in participation among the oldest group is consistent with explanations that emphasize limited physical or social resources in later life. The small direct effect of life satisfaction also aligns with(Pirralha 2018) argument that cross sectional associations in SOEP data should be interpreted cautiously.

Limitations must be acknowledged. Although panel data were used, the analysis is essentially cross‑sectional and does not track within‑person changes over time, which would be necessary for stronger causal claims. The relationship between well‑being and participation is likely bidirectional. Finally, converting ordinal outcomes into binary variables simplifies interpretation but reduces the amount of information available. involves information loss.

3.1 Acknowledgment

I hereby declare that I, Yash Thakkar (matriculation number: 144342), have prepared the seminar paper entitled “Happiness and Political Participation” independently. I have used only the sources and aids listed in the paper, and all ideas, text passages, or fragments taken directly or indirectly from external sources have been properly acknowledged and cited.

The use of text‑based dialog systems (e.g., ChatGPT) and other AI‑based tools was explicitly agreed upon with the supervisor. These tools were used solely within the permitted scope and in accordance with academic integrity guidelines.

I further declare that this paper has not been submitted previously, in whole or in part, to any examination authority for assessment purposes.

4 References

Esaiasson, Peter, Stefan Dahlberg, and Andrej Kokkonen. 2020. “In Pursuit of Happiness: Life Satisfaction Drives Political Support.” European Journal of Political Research 59 (1): 25–44. https://doi.org/10.1111/1475-6765.12335.
Flavin, Patrick, and Michael J. Keane. 2012. “Life Satisfaction and Political Participation: Evidence from the United States.” Journal of Happiness Studies 13 (1): 63–78. https://doi.org/10.1007/s10902-011-9250-1.
Meier, Stephan, and Alois Stutzer. 2008. “Is Volunteering Rewarding in Itself?” Economica 75 (297): 39–59. https://doi.org/10.1111/j.1468-0335.2007.00597.x.
Pirralha, André. 2018. “The Link Between Political Participation and Life Satisfaction: A Three Wave Causal Analysis of the German SOEP Household Panel.” Social Indicators Research 138 (2): 793–807. https://doi.org/10.1007/s11205-017-1661-x.
Wagner, Gert G., Joachim R. Frick, and Jürgen Schupp. 2007. “The German Socio-Economic Panel Study (SOEP): Scope, Evolution and Enhancements.” Schmollers Jahrbuch 127 (1): 139–69.

5 Appendix: Original SOEP Variable Names

The table below lists all original SOEP variable names used in this analysis. Readers can look them up at paneldata.org or in the corresponding SOEP codebooks.

Renamed Variable Original SOEP Name Description File
pol_interest plh0007 Political interest (1–4) pl
pol_participation pli0097_v2 Local political participation (1–4) pl
lifesat plh0182 Life satisfaction (0–10) pl
income_sat plh0175 Income satisfaction (0–10) pl
family_sat plh0180 Family satisfaction (0–10) pl
job_sat plj0454 Job satisfaction (0–10) pl
age d11101 Age in years pequiv
marital d11104 Marital status (1–5) pequiv
region l11102 Region: West=1, East=2 pequiv
pid pid Person identifier both
syear syear Survey year both