Understanding the multifaceted impact of socioeconomic factors on well-being remains a pivotal challenge in developmental and social sciences. Recent research has illuminated the significant role that economic disparities play in influencing health outcomes and developmental trajectories, particularly among children and their families. Notably, studies such as Weissman et al. (2023) have highlighted how state-level economic policies and cost of living can mediate the association between family income and child brain development and mental health. Building upon this foundation, our study seeks to expand the scope of inquiry by examining how varying levels of income influence child and parent well-being through different spectrums of material hardship and economic assistance, incorporating a nuanced analysis of both environmental and policy-driven moderators.
The detrimental effects of poverty extend beyond simple measures of income, often manifesting through material hardships that include food insecurity, inadequate housing, and unstable living conditions. These hardships can exert profound psychological and physical effects on families, potentially exacerbating the stressors associated with low income. Moreover, the assistance sought by families, whether in the form of direct financial aid or supportive services, may provide a buffering effect against these hardships. Our analysis employs a dual-model approach to dissect these dynamics further: the first model explores how the cost of living interacts with income and material hardships to affect well-being, while the second model assesses the impact of the type and extent of aid requested by families on their overall well-being.
By integrating these dimensions, this study aims to provide a more comprehensive understanding of the complex interplay between economic factors and family well-being. This approach not only contributes to the theoretical discourse on socioeconomic impacts but also holds practical implications for policy-making and the design of interventions aimed at alleviating poverty’s effects on vulnerable populations. Through this research, we aspire to refine the metrics and models used to assess poverty, advocating for policies that recognize and respond to the nuanced realities faced by low-income families.
This study addresses the following critical questions:
Based on the literature and the conceptual framework guiding this study, we propose the following hypotheses: (1) Higher cost of living will exacerbate the negative effects of low income on family well-being, particularly for families experiencing greater material hardships. However, these effects will be mitigated in contexts where material hardships are less severe. (2) Families receiving more comprehensive aid, in terms of both scope and magnitude, will exhibit better well-being outcomes, with this effect being more pronounced among those facing higher levels of material hardship and living in areas with a higher cost of living.
Data for this study were obtained from the Rapid Assessment of Pandemic Impact on Development–Early Childhood (RAPID-EC) project. This national project conducts weekly or biweekly surveys to explore how the pandemic affects households with children aged 0 to 5 years. The University of Oregon’s and Stanford University’s institutional review boards approved all study procedures. Participants were recruited via community organization email lists, Facebook advertisements, and panel services. Initially, families completed an online survey to verify eligibility. Those who qualified provided consent online and filled out a baseline survey covering demographics, employment and financial challenges, health and well-being, and access to childcare. After completing this initial survey, families joined a participant pool and received email invitations for follow-up surveys. These follow-up surveys revisited core baseline topics and introduced new special topics on a weekly or biweekly schedule. Each sampling point for the follow-up surveys was demographically representative of the U.S. population concerning race, income, and geographic location. Families were compensated $5 for each survey they completed.
library(rmarkdown)
library(knitr) # tables for RMD
library(corrr) # for correlation tables
library(kableExtra)
source("data_prep.R")
##
## iter imp variable
## 1 1 COLI AidIndex
## 1 2 COLI AidIndex
## 1 3 COLI AidIndex
## 1 4 COLI AidIndex
## 1 5 COLI AidIndex
## 2 1 COLI AidIndex
## 2 2 COLI AidIndex
## 2 3 COLI AidIndex
## 2 4 COLI AidIndex
## 2 5 COLI AidIndex
## 3 1 COLI AidIndex
## 3 2 COLI AidIndex
## 3 3 COLI AidIndex
## 3 4 COLI AidIndex
## 3 5 COLI AidIndex
## 4 1 COLI AidIndex
## 4 2 COLI AidIndex
## 4 3 COLI AidIndex
## 4 4 COLI AidIndex
## 4 5 COLI AidIndex
## 5 1 COLI AidIndex
## 5 2 COLI AidIndex
## 5 3 COLI AidIndex
## 5 4 COLI AidIndex
## 5 5 COLI AidIndex
First, I will display descriptive table of our sample with the variables and covariates used in the analysis:
# Summarizing race
race_sum <- final_data_cleaned %>%
group_by(race_ethnic) %>%
summarise(Count = n(),
Percentage = n() / nrow(final_data_cleaned) * 100) %>%
mutate(Category = "Race/Ethnicity")
# Summarizing gender
gender_sum <- final_data_cleaned %>%
group_by(Pgender) %>%
summarise(Count = n(),
Percentage = n() / nrow(final_data_cleaned) * 100) %>%
mutate(Category = "Gender")
# Summarizing education
edu_sum <- final_data_cleaned %>%
group_by(Pedu) %>%
summarise(Count = n(),
Percentage = n() / nrow(final_data_cleaned) * 100) %>%
mutate(Category = "Education")
# Summarizing age groups
age_sum <- final_data_cleaned %>%
group_by(Page) %>%
summarise(Count = n(),
Percentage = n() / nrow(final_data_cleaned) * 100) %>%
mutate(Category = "Age Group")
table1 <- bind_rows(race_sum, gender_sum, edu_sum, age_sum)
# Optionally reorder columns for display
table1 <- table1 %>%
select(Category, race_ethnic, Pgender, Pedu, Page, Count, Percentage)
# Use tidyr to unite the race, gender, and education columns into a single column for cleaner presentation
table1 <- table1 %>%
unite("Demographic", c(race_ethnic, Pgender, Pedu, Page),
na.rm = TRUE, remove = TRUE) %>%
filter(Demographic != "") %>%
mutate(Percentage = paste0(round(Percentage, 1), "%"))
# Display Table 1 using kable
kable(table1,
caption = "Table 1: Demographic Summary Statistics") %>%
kable_styling(full_width = FALSE)
| Category | Demographic | Count | Percentage |
|---|---|---|---|
| Race/Ethnicity | Black | 1298 | 8.6% |
| Race/Ethnicity | Latinx | 1985 | 13.1% |
| Race/Ethnicity | Other minorities | 1259 | 8.3% |
| Race/Ethnicity | White | 10538 | 69.8% |
| Gender | Do not wish to disclose | 37 | 0.2% |
| Gender | Female/Transgender Female | 13554 | 89.8% |
| Gender | Male/Transgender Male | 1434 | 9.5% |
| Gender | Non-binary | 27 | 0.2% |
| Gender | Not listed | 44 | 0.3% |
| Education | Associate degree | 1183 | 7.8% |
| Education | Bachelor’s degree | 3958 | 26.2% |
| Education | Doctorate/Professional | 708 | 4.7% |
| Education | High school diploma/GED | 1068 | 7.1% |
| Education | Less than high school | 71 | 0.5% |
| Education | Master’s degree | 2524 | 16.7% |
| Education | Some college | 2265 | 15% |
| Education | Some high school | 155 | 1% |
| Education | other | 130 | 0.9% |
| Age Group | 18-24 | 552 | 3.7% |
| Age Group | 25-30 | 2766 | 18.3% |
| Age Group | 31-35 | 4042 | 26.8% |
| Age Group | 36-40 | 3067 | 20.3% |
| Age Group | 41-45 | 1140 | 7.6% |
| Age Group | 46-50 | 240 | 1.6% |
| Age Group | 51-55 | 88 | 0.6% |
| Age Group | 56-60 | 55 | 0.4% |
| Age Group | 61+ | 41 | 0.3% |
# Calculate means and standard deviations for continuous variables
library(psych)
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
table2 <- psych::describe(final_data_cleaned[c("fs_num",
"log_INR",
"AidIndex",
"COLI")])
# Select and round necessary columns
table2 <- table2[c("n", "mean", "sd", "min", "max")] %>%
mutate(across(c(mean, sd, min, max), ~round(., 3)))
# Display Table 2 using kable
kable(table2[c("n", "mean", "sd", "min", "max")],
caption = "Table 2: Descriptive Stats") %>%
kable_styling(full_width = FALSE)
| n | mean | sd | min | max | |
|---|---|---|---|---|---|
| fs_num | 15097 | 1.027 | 1.486 | 0.000 | 6.000 |
| log_INR | 15097 | 1.020 | 0.793 | -1.171 | 3.200 |
| AidIndex | 15097 | 0.250 | 0.411 | 0.000 | 1.000 |
| COLI | 15097 | 0.991 | 0.231 | 0.517 | 2.271 |
# Assuming 'AidIndex' and 'COLI' (if continuous) are your continuous variables
# You might need to adjust the variables based on your dataset's specifics
table3 <- final_data_cleaned %>%
select(fs_num, log_INR, AidIndex, COLI) %>%
correlate() %>%
rearrange() %>%
fashion()
## Correlation computed with
## • Method: 'pearson'
## • Missing treated using: 'pairwise.complete.obs'
# Display Table 2 using kable
kable(table3,
caption = "Table 3: Correlation Table") %>%
kable_styling(full_width = FALSE)
| term | AidIndex | fs_num | COLI | log_INR |
|---|---|---|---|---|
| AidIndex | .22 | -.09 | -.43 | |
| fs_num | .22 | -.04 | -.40 | |
| COLI | -.09 | -.04 | .06 | |
| log_INR | -.43 | -.40 | .06 |
Aim 1: How does the cost of living moderate the relationship between income and well-being among families experiencing varying levels of material hardship?
Graph 1: Child Problems by Income, CoL, and Hardship
final_data_cleaned <- final_data_cleaned %>%
mutate(Aid_Group = case_when(AidIndex > 0 ~ "Aid",
AidIndex == 0 ~ "No Aid"),
MH_Group = case_when(fs_num > 0 ~ "Some Hardship",
fs_num == 0 ~ "No Hardship"),
COLI_Merge = factor(COLI_Merge))
final_data_cleaned %>%
group_by(COLI_Merge, income_group, MH_Group) %>%
summarise(AvgProblem = mean(child_problems, na.rm = TRUE),
SE = sd(child_problems, na.rm = TRUE) / sqrt(n()),
.groups = 'drop') %>%
ggplot(aes(x = income_group, y = AvgProblem)) +
geom_point(aes(color = MH_Group, alpha = COLI_Merge), size = 3) +
geom_errorbar(aes(ymin = AvgProblem - SE,
ymax = AvgProblem + SE,
alpha = COLI_Merge),
width = 0.2, position = position_dodge(width = 0.001)) +
scale_color_manual(values = c("Some Hardship" = "red",
"No Hardship" = "blue")) +
scale_alpha_manual(values = c("High CoL" = 1,
"Low CoL" = 0.4)) +
labs(title = "Child Problems by Income, Cost of Living and Hardship",
x = "Income Group",
y = "Mean Child Problems") +
theme_classic() +
theme(legend.position = "top")
Graph 2: Parent Problems by Income, CoL, and Hardship
final_data_cleaned %>%
group_by(COLI_Merge, income_group, MH_Group) %>%
summarise(AvgProblem = mean(parent_problems, na.rm = TRUE),
SE = sd(parent_problems, na.rm = TRUE) / sqrt(n()),
.groups = 'drop') %>%
ggplot(aes(x = income_group, y = AvgProblem)) +
geom_point(aes(color = MH_Group, alpha = COLI_Merge), size = 3) +
geom_errorbar(aes(ymin = AvgProblem - SE,
ymax = AvgProblem + SE,
alpha = COLI_Merge),
width = 0.2, position = position_dodge(width = 0.001)) +
scale_color_manual(values = c("Some Hardship" = "red",
"No Hardship" = "blue")) +
scale_alpha_manual(values = c("High CoL" = 1,
"Low CoL" = 0.4)) +
labs(title = " Parent Problems by Income, Cost of Living, and Hardship",
x = "Income Group",
y = "Mean Parent Problems") +
theme_classic() +
theme(legend.position = "top")
Graph 3: Child Problems by Income, Aid, and Hardship
final_data_cleaned %>%
group_by(Aid_Group, income_group, MH_Group) %>%
summarise(AvgProblem = mean(child_problems, na.rm = TRUE),
SE = sd(child_problems, na.rm = TRUE) / sqrt(n()),
.groups = 'drop') %>%
ggplot(aes(x = income_group, y = AvgProblem)) +
geom_point(aes(color = MH_Group, alpha = Aid_Group), size = 3) +
geom_errorbar(aes(ymin = AvgProblem - SE,
ymax = AvgProblem + SE,
alpha = Aid_Group),
width = 0.2, position = position_dodge(width = 0.001)) +
scale_color_manual(values = c("Some Hardship" = "red",
"No Hardship" = "blue")) +
scale_alpha_manual(values = c("Some Aid" = 1,
"No Aid" = 0.4)) +
labs(title = "Child Problems by Income, Aid, and Hardship",
x = "Income Group",
y = "Mean Child Problems") +
theme_classic() +
theme(legend.position = "top")
Graph 4: Parent Problems by Income, Aid, and Hardship
final_data_cleaned %>%
group_by(Aid_Group, income_group, MH_Group) %>%
summarise(AvgProblem = mean(parent_problems, na.rm = TRUE),
SE = sd(parent_problems, na.rm = TRUE) / sqrt(n()),
.groups = 'drop') %>%
ggplot(aes(x = income_group, y = AvgProblem)) +
geom_point(aes(color = MH_Group, alpha = Aid_Group), size = 3) +
geom_errorbar(aes(ymin = AvgProblem - SE,
ymax = AvgProblem + SE,
alpha = Aid_Group),
width = 0.2, position = position_dodge(width = 0.001)) +
scale_color_manual(values = c("Some Hardship" = "red",
"No Hardship" = "blue")) +
scale_alpha_manual(values = c("Some Aid" = 1,
"No Aid" = 0.4)) +
labs(title = "Parent Problems by Income, Aid and Hardship",
x = "Income Group",
y = "Mean Parent Problems") +
theme_classic() +
theme(legend.position = "top")