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.
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.
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.
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.
## 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
)# 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"
)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.
This analysis draws on 10 variables across three domains. What follows explains each variable in plain terms, with the exact survey question wording.
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.
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.
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.
Income Satisfaction (income_sat,
original: plh0175) : “How satisfied are you with your
household income?” Scale 0–10. Used descriptively.
Family Satisfaction (family_sat,
original: plh0180): “How satisfied are you with your
family life?” Scale 0–10. Available 2010–2013 only.
Job Satisfaction (job_sat,
original: plj0454): “How satisfied are you with your
job?” Scale 0–10. Available from 2015 onwards.
Age (age, original:
d11101): Age in years, grouped into five ordered
categories: 18–29, 30–44, 45–59, 60–74, 75+.
Marital Status (marital, original:
d11104): Five categories: married, single, widowed,
divorced, separated.
Region (region, original:
l11102): West Germany (1) vs East Germany (2). Captures
structural differences in political culture following reunification
(Meier and Stutzer
2008).
Survey Year (syear): Year of
interview, ranging from 1985 to 2022. Used for temporal trend
analysis.
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.
# 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_modernFigure 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_modernFigure 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).
# 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.
# life satisfaction over time
lifesat_time_age <- soep_clean %>%
filter(!is.na(age_group)) %>%
group_by(syear, age_group) %>%
summarise(mean_lifesat = mean(lifesat, na.rm = TRUE), .groups = "drop")
ggplot(lifesat_time_age,
aes(x = syear, y = mean_lifesat, color = age_group)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
scale_color_manual(values = cb_palette) +
labs(
title = "Figure 5: Life Satisfaction Over Time by Age Group",
caption = "Source: SOEP Teaching Data. Mean of plh0182 by wave.",
x = "Survey Year",
y = "Mean Life Satisfaction (0-10)",
color = "Age Group"
) +
theme_modernfamily_time_age <- soep_family %>%
filter(!is.na(age_group)) %>%
group_by(syear, age_group) %>%
summarise(mean_family_sat = mean(family_sat, na.rm = TRUE),
.groups = "drop")
ggplot(family_time_age,
aes(x = syear, y = mean_family_sat, color = age_group)) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
scale_color_manual(values = cb_palette) +
scale_x_continuous(
breaks = c(2010, 2011, 2012, 2013),
limits = c(2009.5, 2013.5)
) +
scale_y_continuous(limits = c(6.5, 9)) +
labs(
title = "Figure 6: Family Satisfaction Over Time by Age (2010-2013)",
caption = "Source: SOEP Teaching Data. Variable plh0180. Available 2010-2013 only.",
x = "Survey Year",
y = "Mean Family Satisfaction (0-10)",
color = "Age Group"
) +
theme_modernFigure 5 shows clear external shocks in life satisfaction: dip around 2020 likely reflecting the COVID-19 pandemic. Middle aged adults (45–59) consistently report slightly lower satisfaction consistent with the U-shape of happiness.
Figure 6 shows family satisfaction between 2010 and 2013. The pattern is stable across this short window, with younger cohorts reporting notably lower family satisfaction, likely reflecting relationship instability typical of early adulthood.
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.
### 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)
)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.
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
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
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."
)| 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.
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]\]
##
## 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
##
## 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.
## 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.
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.
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.
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 |