How disabilities affect Black employment

How does prime-age employment (the employment rate of civilians aged 25 to 54) vary with race and disability status? How does disability status vary by race? How do race and disability status compare in predicting employment? In this post, I use the monthly Current Population Survey from January 2018 to May 2020 to find out.

I find that the disability employment gap is 45 percentage points, with and without controlling for factors like age. The racial employment gap (non-Black minus Black) is about 4 points, but since Black people are more likely to have a disability—specifically physical and mobility limitations that most severely reduce employment—this gap shrinks to 2.9 points when controlling for disabilities. While most individual disabilities do not have a differential impact on Blacks, having any disability reduces Black employment 3 points more than non-Black employment.

Background

The prime-age employment rate (often abbreviated as PAEPOP, for Prime Age Employment POPulation ratio) is used as a consistent measure of employment trends by economists who want to avoid relying on whether survey respondents say they’re still looking for work. The calculation is simply the share of civilians aged 25 to 54 that reported working in the survey week.

Federal Reserve Economic Data publishes some related trends, e.g. PAEPOP by disability and gender and black employment rate among the aged 16+ population, but we need to limit by ages to avoid effects of college education and early retirement, both of which may reflect lower employment without worse labor market outcomes. For the right statistics, we need to go to the CPS microdata instead (I used IPUMS to extract it).

For simplicity, I focus on two binary features identified in the CPS: being Black only (compared to all other races), and reporting any physical or cognitive difficulty (which I describe here as having a disability).

Statistical analysis

Regression analysis reveals the following:

  • The 45-percentage-point disability employment is robust to controls like age, sex, and time.

  • The 4.5-point racial employment gap shrinks to 4 points after controlling for age, sex, and time, and shrinks further to 2.9 points when controlling for disability status (including disability types).

  • Controlling for disability types, Black people have a 3-point larger effect of disability than non-Blacks.

DIFFS_PLUS_NUM = DIFFS + ['num_diffs']

DD_COLS = ['black_int', 'disability_int', 'black_disability']
CONTROLS = ['age', 'age2', 'female']

# Switch text columns to bools (and later ints).
cps['black_int'] = np.where(cps.black == 'Black', 1, 0)
cps['disability_int'] = np.where(cps.disability == 'Has disability', 1, 0)
# Create interactions.
cps['black_disability'] = cps.black_int * cps.disability_int
cps['black_covid'] = cps.black_int * cps.covid
cps['disability_covid'] = cps.disability_int * cps.covid
cps['black_disability_covid'] = cps.black_disability * cps.covid
# Make all signals ints for regression.
# cps *= 1
for i in DIFFS:
    cps[i + '_black'] = cps[i] * cps.black_int


def emp_model(xcols, data=cps):
    return sm.WLS(data.emp,
                  data[xcols + ['const']],
                  data.w).fit(cov_type='HC1')


# Run model without triple-diff first.
m_disability = emp_model(['disability_int'])
m_disability_controls = emp_model(['disability_int'] + month_fes + CONTROLS)
m_black = emp_model(['black_int'])
m_black_controls = emp_model(['black_int'] + month_fes + CONTROLS)
m_black_disability = emp_model(['black_int', 'disability_int'] + month_fes +
                               CONTROLS + DIFFS_PLUS_NUM)
m_dd = emp_model(DD_COLS + month_fes + CONTROLS)
m_dd_diffs = emp_model(DD_COLS + month_fes + CONTROLS + DIFFS_PLUS_NUM)

COVARIATE_NAMES = {
    'black_int': 'Black',
    'disability_int': 'Has disability',
    'black_disability': 'Black * Has disability',
    # Name difficulties following IPUMS labels, except diffrem.
    'diffhear': 'Hearing difficulty',
    'diffeye': 'Vision difficulty',
    'diffrem': 'Cognitive difficulty',
    'diffphys': 'Physical difficulty', 
    'diffmob': 'Mobility limitation',
    'diffcare': 'Personal care difficulty',
    'diffhear_black': 'Hearing difficulty * Black',
    'diffeye_black': 'Vision difficulty * Black',
    'diffrem_black': 'Cognitive difficulty * Black',
    'diffphys_black': 'Physical difficulty * Black', 
    'diffmob_black': 'Mobility limitation * Black',
    'diffcare_black': 'Personal care difficulty * Black',
    'num_diffs': 'Number of difficulties reported'
}

def starg(models, covariate_order=None):
    """ Creates formatted Stargazer object.
    """
    star = sg.Stargazer(models)
    if covariate_order is not None:
        star.covariate_order(covariate_order)
    star.rename_covariates(COVARIATE_NAMES)
    star.show_adj_r2 = False
    star.show_residual_std_err = False
    star.show_f_statistic = False
    return star


star = starg([m_disability, m_disability_controls,
              m_black, m_black_controls, m_black_disability,
              m_dd, m_dd_diffs],
              ['disability_int', 'black_int', 'black_disability'])
star.add_line('Controls', ['No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes'])
star.add_line('Individual difficulties',
              ['No', 'No', 'No', 'No', 'Yes', 'No', 'Yes'])
star.add_custom_notes(['Controls include year-month fixed effects, '
                       'sex, age and age-squared'])
star.title('Disability, race, and prime-age employment, Jan 2018 to May 2020')
/home/mghenis/anaconda3/lib/python3.7/site-packages/statsmodels/base/model.py:1832: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 40, but rank is 39

/home/mghenis/anaconda3/lib/python3.7/site-packages/statsmodels/base/model.py:1832: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 41, but rank is 40

star
Disability, race, and prime-age employment, Jan 2018 to May 2020
Dependent variable:emp
(1)(2)(3)(4)(5)(6)(7)
Has disability-45.385***-45.495***-26.688***-44.261***-26.199***
(0.199)(0.200)(0.405)(0.215)(0.408)
Black-4.543***-4.063***-2.946***-2.729***-2.733***
(0.138)(0.138)(0.131)(0.136)(0.136)
Black * Has disability-6.485***-2.988***
(0.563)(0.531)
ControlsNoYesNoYesYesYesYes
Individual difficultiesNoNoNoNoYesNoYes
Observations1,295,1431,295,1431,295,1431,295,1431,295,1431,295,1431,295,143
R20.0700.0990.0010.0300.1130.1000.113
Note: *p<0.1; **p<0.05; ***p<0.01
Controls include year-month fixed effects, sex, age and age-squared
mdf.add_weighted_metrics(cps, 'num_diffs', 'w')
# Needs to be weighted.
num_diffs = cps[cps.disability_int == 1].groupby('black')[
    ['num_diffs_m', 'w_m']].sum()
num_diffs['num_diffs'] = num_diffs.num_diffs_m / num_diffs.w_m
num_diffs.num_diffs.round(2)
black
Black        1.80
Not Black    1.71
Name: num_diffs, dtype: float64

Black people are especially likely to report physical (“serious difficulty walking or climbing stairs”) and mobility (persistent inability “to perform basic activities outside the home alone”) difficulties, which are two of the three most commonly reported difficulties.

def share_w_disability(disability, black):
    num = cps[(cps.black == black) & (cps[disability] == 1)].w.sum()
    denom = cps[(cps.black == black) &
                (cps.disability == 'Has disability')].w.sum()
    return num / denom

diffs_black = mdf.cartesian_product({'disability': DIFFS,
                                     'black': ['Black', 'Not Black']})
diffs_black['share'] = diffs_black.apply(
    lambda row: share_w_disability(row.disability, row.black), axis=1)
diffs_black.share *= 100
diffs_black['share_round'] = diffs_black.share.round(1)
diffs_black.replace(DIFFS,
                    ['Hearing', 'Vision', 'Cognitive', 'Physical',
                     'Mobility', 'Self-care'],
                    inplace=True)
# Sort by black for within-group ordering.
diffs_black.sort_values('black', ascending=False, inplace=True)
# Order chart by prevalence among Black people.
# TODO: Separate regressions for each difficulty, plotting black coefficient.
diff_order = diffs_black[diffs_black.black == 'Black'].sort_values(
    'share').disability

fig = px.bar(diffs_black, y='disability', x='share_round', color='black',
             barmode='group', orientation='h',
             color_discrete_map=COLOR_MAP)
fig.update_layout(
    title='Prevalence of each difficulty by race',
    yaxis_title='Difficulty',
    xaxis_title='Share among people who report any difficulty',
    xaxis_ticksuffix='%',
    legend_title_text='',
    font=dict(family='Roboto'),
    yaxis={'categoryorder': 'array',
           'categoryarray': diff_order},
    plot_bgcolor='white',
    legend={'traceorder': 'reversed'}
)
fig.update_traces(hovertemplate=None)
fig.show()

Focusing on the disabilities themselves shows that physical and mobility difficulties have the strongest effects on employment, reducing it by 34 and 30 points, respectively. While Black people report these disabilities at higher rates, even among people who report any disability, the effect of these disabilities is not significantly stronger or weaker than it is on non-Blacks.

m_diffs = emp_model(['black_int'] + month_fes + CONTROLS + DIFFS)
black_diffs = [i + '_black' for i in DIFFS]
m_diffs_black = emp_model(['black_int'] + month_fes + CONTROLS + DIFFS + 
                          black_diffs)

star = starg([m_diffs, m_diffs_black],
             ['black_int'] +
             list(mdf.flatten([[i] + [i + '_black'] for i in DIFFS])))
star.title('Employment by race and specific disability')
star.add_custom_notes(['All models controls for year-month fixed effects, '
                       'sex, age and age-squared'])
star
Employment by race and specific disability
Dependent variable:emp
(1)(2)
Black-3.032***-2.962***
(0.132)(0.135)
Hearing difficulty-3.642***-3.577***
(0.438)(0.446)
Hearing difficulty * Black-1.037
(1.814)
Vision difficulty-6.269***-6.700***
(0.517)(0.567)
Vision difficulty * Black2.280*
(1.357)
Cognitive difficulty-27.627***-26.852***
(0.334)(0.358)
Cognitive difficulty * Black-4.699***
(0.961)
Physical difficulty-34.372***-34.461***
(0.345)(0.372)
Physical difficulty * Black0.464
(0.946)
Mobility limitation-29.825***-29.945***
(0.409)(0.441)
Mobility limitation * Black0.715
(1.145)
Personal care difficulty0.052-0.263
(0.549)(0.598)
Personal care difficulty * Black1.785
(1.479)
Observations1,295,1431,295,143
R20.1080.108
Note: *p<0.1; **p<0.05; ***p<0.01
All models controls for year-month fixed effects, sex, age and age-squared

While people with disabilities represent a small part of the overall racial employment gap, they constitute a particularly acute element of it. As we rethink our approach to work in the age of coronavirus, we will have opportunities to close part of the enormous disability employment gap, which will in turn close part of the racial employment gap.