Replies: 3 comments
-
SOI, Returns of Active Corporations 6.1 has the relevant variables (gross receipts, net income, labor compensation) for S corporations broken down by major industry. Latest year available is 2017. SOI, Returns of Active Corporations (excluding S, RIC, REIT) has the relevant variables for C corporations (gross receipts, net income, labor compensation) broken down by major industry. Latest year available is 2013. NIPA Table 1.14 has national income and compensation of employees for the corporate sector (C and S combined) |
Beta Was this translation helpful? Give feedback.
-
Current Method (work by @jorgebarro):C-corp and Pass-through Capital SharesThe goal is to estimate capital shares of income by industry (as defined by 2-digit NAICS codes) and by business formation type, i.e., C-corporations (C-corps) versus pass-through entities, including S-corporations (S-corps), partnerships, and prorietorships. The IRS's SOI data provides income statement values aggregated by industry and form of business. The BEA's NIPA tables provide employee compensation and value added (i.e., GDP) by industry. Determining the respective shares of labor and value-added by C-corporations and pass-throughs in the SOI data allows for the proper calculation of labor outlays and value-added by business form in the NIPA data. Then, solving 1 minus the ratio of labor payments to total income by industry and form of business provides the capital share of income by industry and form of business. Estimating C-corp and Pass-through Wages and Income by IndustrySince the NIPA data for labor outlays and value-added is only available by industry and not by business formation, this requires determining the percentage of labor outlays and value-added by C-corp and pass-through for every industry. The calculation requires summing all labor outlays and value-added for each industry by business formation in the IRS/SOI data. While the labor outlays are straightforward and reasonably correspond to employee compensation in the NIPA tables, the same is not necessarily true for value-added. Instead, an assumption is required that value-added is at least proportional to total revenue received by the corresponding businesses (since value-added is not reported in the IRS/SOI data). All IRS/SOI data is estimated from 2013 tables, since it is the most recent year that all necessary values can be attained from public data. For C-corps and S-corps, wage outlays are defined as the sum of the following variables in the SOI data: Salaries and wages; Employee benefit programs Pension, profit-sharing, etc., plans; and Compensation of officers. For partnerships, employee outlays are defined as the sum of Salaries and wages; Employee benefit programs; Retirement plans, etc.; and Guaranteed payments to partners. Finally, proprietorship labor outlays are defined as the sum of Salaries and wages; Commissions; Contract labor; Pension and profit-sharing plans; Employee benefits; and Net income, since this is the proprietor's payment for their labor. For each business formation, the income variable, which is a proxy for value-added, is total business receipts. Estimating C-corp and Pass-through Capital SharesGiven the respective shares of labor outlays and income by C-corps and pass-throughs in each industry, the magnitudes of labor outlays and value-added in NIPA data can be attributed to each form of business for each industry. Mathematically, let The outcome of these calculations are provided in the table below. Several capital-intensive industries (e.g., Agriculture and Mining) have relatively high capital shares, whereas service industries, like Accommodation and Food Services and Health Care and Social Assistance have lower capital shares. The average capital share over all industries is roughly 0.47, which is in line with recent estimates of capital shares. Capital Shares TableBelow are the capital shares (rounded to two decimal points) by 2-digit NAICS code and by business form (see attached code to generate these).
|
Beta Was this translation helpful? Give feedback.
-
Add code to implement the above (also by @jorgebarro): #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 5 12:18:25 2024
@author: jbarro
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def generate_irs_data( file_name, naics_columns, relabel_columns=True ):
try:
corp_data = pd.read_excel('IRS Files/' + file_name, usecols=naics_columns)
except:
corp_data = pd.read_excel('https://www.irs.gov/pub/irs-soi/' + file_name, usecols=naics_columns)
if relabel_columns==True:
corp_data.columns = corp_data.iloc[2 ,:]
corp_data = corp_data.iloc[3:,:]
return corp_data
def generate_naics_shares( ):
# Defining NAICS Industries
# Link (4/7/2024): https://www.census.gov/programs-surveys/economic-census/year/2022/guidance/understanding-naics.html
naics_industries = ['Agriculture, Forestry, Fishing and Hunting',\
'Mining, Quarrying, and Oil and Gas Extraction',\
'Utilities',\
'Construction',\
'Manufacturing',\
'Wholesale Trade',\
'Retail Trade',\
'Transportation and Warehousing',\
'Information',\
'Finance and Insurance',\
'Real Estate and Rental and Leasing',\
'Professional, Scientific, and Technical Services',\
'Management of Companies and Enterprises',\
'Administrative and Support and Waste Management and Remediation Services',\
'Educational Services',\
'Health Care and Social Assistance',\
'Arts, Entertainment, and Recreation',\
'Accommodation and Food Services',\
'Other Services (except Public Administration)']
# Determining C-corp share of corporate wages and income
# Calculating C-corp by industry (2013)
# Link: https://www.irs.gov/statistics/soi-tax-stats-table-16-returns-of-active-corporations-form-1120
naics_columns='C,G,H,I,M,AI,AM,BA,BH,BO,BT,BX,BY,BZ,CC,CD,CH,CK,CN'
c_corp_data = generate_irs_data( '13co16ccr.xls', naics_columns )
n_naics = len(naics_industries)
c_salaries = np.zeros(n_naics)
c_officer_compensation = np.zeros(n_naics)
c_employee_benefits = np.zeros(n_naics)
c_pension_profits = np.zeros(n_naics)
c_corp_income = np.zeros(n_naics)
# Employee compensation
for i in range(n_naics):
c_salaries [i] = c_corp_data.iloc[51,i]
c_officer_compensation[i] = c_corp_data.iloc[50,i]
c_employee_benefits [i] = c_corp_data.iloc[63,i]
c_pension_profits [i] = c_corp_data.iloc[62,i]
c_corp_income [i] = c_corp_data.iloc[35,i]
c_total_wages = c_salaries + c_officer_compensation + c_employee_benefits + c_pension_profits
c_wage_shares = pd.DataFrame(c_total_wages/np.sum(c_total_wages),columns=['shares'])
c_wage_shares.index = naics_industries
c_income_shares = pd.DataFrame(c_corp_income/np.sum(c_corp_income),columns=['shares'])
c_income_shares.index = naics_industries
# Calculating S-corp by industry
# Link: https://www.irs.gov/statistics/soi-tax-stats-returns-of-active-corporations-form-1120s-table-7
s_corp_data = generate_irs_data( '13co07s.xls', naics_columns, False )
# NAICS columns are the same for S-corps as they are for C-corps
s_salaries = np.zeros(n_naics)
s_officer_compensation = np.zeros(n_naics)
s_employee_benefits = np.zeros(n_naics)
s_pension_profits = np.zeros(n_naics)
s_corp_income = np.zeros(n_naics)
# Employee compensation
for i in range(n_naics):
s_salaries [i] = s_corp_data.iloc[47,i]
s_officer_compensation[i] = s_corp_data.iloc[46,i]
s_employee_benefits [i] = s_corp_data.iloc[58,i]
s_pension_profits [i] = s_corp_data.iloc[57,i]
s_corp_income [i] = s_corp_data.iloc[39,i]
s_total_wages = s_salaries + s_officer_compensation + s_employee_benefits + s_pension_profits
# Calculating Partnership by industry
naics_columns_partnership='C,I,M,N,Z,AU,AY,BL,BV,CC,CL,CU,DE,DF,DI,DJ,DT,DX,EA'
partnership_data = generate_irs_data( '13pa01.xls', naics_columns_partnership, False )
n_naics = len(naics_industries)
p_salaries = np.zeros(n_naics)
p_officer_compensation = np.zeros(n_naics)
p_employee_benefits = np.zeros(n_naics)
p_pension_profits = np.zeros(n_naics)
p_corp_income = np.zeros(n_naics)
# Employee compensation
for i in range(n_naics):
p_salaries [i] = partnership_data.iloc[29,i]
p_officer_compensation[i] = partnership_data.iloc[30,i]
# "Officer compesnation" here is "Guaranteed payments to partners"
p_employee_benefits [i] = partnership_data.iloc[39,i]
p_pension_profits [i] = partnership_data.iloc[38,i]
# "Pension profits" here is "Retirement plans, etc."
p_corp_income [i] = partnership_data.iloc[15,i]
p_total_wages = p_salaries + p_officer_compensation + p_employee_benefits + p_pension_profits
# Calculating Proprietor by industry
# https://www.irs.gov/statistics/soi-tax-stats-nonfarm-sole-proprietorship-statistics
naics_columns_proprietor = 'C,H,L,M,Q,AK,AO,BB,BL,BQ,CB,CO,DG,DI,DJ,DK,EA,EE,EK'
# NOTE: 'DI' was added here as a degenerate placeholder for 'Management of Companies...' because
# that category does not exist for proprietors. The corresponding column index is skipped in the calculations.
proprietor_data = generate_irs_data( '13sp02is.xls', naics_columns_proprietor, False )
n_naics = len(naics_industries)
sp_salaries = np.zeros(n_naics)
sp_commissions = np.zeros(n_naics)
sp_contract_labor = np.zeros(n_naics)
sp_officer_compensation = np.zeros(n_naics)
sp_employee_benefits = np.zeros(n_naics)
sp_pension_profits = np.zeros(n_naics)
sp_corp_income = np.zeros(n_naics)
sp_net_income = np.zeros(n_naics)
# Employee compensation
for i in range(n_naics):
if i==12:
# Skipping 'Management of companies...' because it doesn't exist for prorietors.
continue
sp_salaries [i] = proprietor_data.iloc[40,i]
sp_commissions [i] = proprietor_data.iloc[24,i]
sp_contract_labor [i] = proprietor_data.iloc[25,i]
sp_employee_benefits [i] = proprietor_data.iloc[28,i]
sp_pension_profits [i] = proprietor_data.iloc[35,i]
sp_net_income [i] = proprietor_data.iloc[49,i]
sp_corp_income [i] = proprietor_data.iloc[11,i]
sp_total_wages = sp_salaries + sp_commissions + sp_contract_labor + sp_employee_benefits \
+ sp_pension_profits + sp_net_income
# Calculating wage shares by industry for passthroughs
passthrough_total_wages = s_total_wages + p_total_wages + sp_total_wages
passthrough_wage_shares = pd.DataFrame(passthrough_total_wages/np.sum(passthrough_total_wages),columns=['shares'])
passthrough_wage_shares.index = naics_industries
# Calculating income shares by industry for passthroughs
passthrough_total_income = s_corp_income + p_corp_income + sp_corp_income
passthrough_income_shares = pd.DataFrame(passthrough_total_income/np.sum(passthrough_total_income),columns=['shares'])
passthrough_income_shares.index = naics_industries
# Calculating total % by C-corp vs passthrough
wage_shares_c = c_total_wages/(c_total_wages + passthrough_total_wages)
income_shares_c = c_corp_income / (c_corp_income + passthrough_total_income)
# Constructing dict for results
naics_shares = dict()
naics_shares['industries' ] = naics_industries
naics_shares['c_wage_shares' ] = c_wage_shares
naics_shares['c_income_shares'] = c_income_shares
naics_shares['passthrough_wage_shares' ] = passthrough_wage_shares
naics_shares['passthrough_income_shares'] = passthrough_income_shares
naics_shares['wage_shares_c' ] = wage_shares_c
naics_shares['income_shares_c'] = income_shares_c
return naics_shares
def generate_capshares():
# Reading in GDP by NAICS code
valueadded_by_naics = pd.read_excel('https://apps.bea.gov/industry/Release/XLS/GDPxInd/ValueAdded.xlsx',\
sheet_name='TVA105-A',usecols='B,I')
naics_indexes = [9,12,16,17,18,40,41,46,55,61,66,72,76,77,81,82,88,91,94]
valueadded_by_naics = valueadded_by_naics.iloc[naics_indexes,1]
gdp_by_naics = pd.read_excel('https://www.bea.gov/sites/default/files/2024-03/gdp4q23-3rd.xlsx',\
sheet_name='Table 17',usecols='B:C')
naics_indexes = [6,7,8,9,10,13,14,15,16,18,19,21,22,23,25,26,28,29,30]
gdp_by_naics = gdp_by_naics.iloc[naics_indexes,1]
# Reading in employee compensation by NAICS code
emp_comp_bynaics = pd.read_excel('https://apps.bea.gov/national/Release/XLS/Survey/Section6All_xls.xlsx',\
sheet_name='T60200D-A',usecols='B,AB')
naics_indexes = [10,13,17,18,19,41,44,49,58,63,68,71,75,76,79,80,85,88,91]
emp_comp_bynaics = emp_comp_bynaics.iloc[naics_indexes,1]
labor_shares = np.array(emp_comp_bynaics)/np.array(valueadded_by_naics.astype('float'))
# Apportioning shares by business formation
naics_shares = generate_naics_shares()
emp_comp_c = naics_shares['wage_shares_c'] * np.array(emp_comp_bynaics)
emp_comp_p = (1-naics_shares['wage_shares_c']) * np.array(emp_comp_bynaics)
income_c = naics_shares['income_shares_c'] * np.array(valueadded_by_naics.astype('float'))
income_p = (1-naics_shares['income_shares_c']) * np.array(valueadded_by_naics.astype('float'))
labor_shares_c = emp_comp_c / income_c
labor_shares_p = emp_comp_p / income_p
cap_shares_c = pd.DataFrame(1-labor_shares_c)
cap_shares_p = pd.DataFrame(1-labor_shares_p)
cap_shares_combined = pd.DataFrame(1-labor_shares )
capital_shares = pd.concat([cap_shares_c, cap_shares_p, cap_shares_combined],axis=1,ignore_index=True)
capital_shares.index = naics_shares['industries']
capital_shares.columns =['C-corps','Passthroughs','Combined']
capital_shares.to_csv('CapitalShares.csv')
# For reporting in Markdown
capital_shares_rounded = round(capital_shares,3)
print(capital_shares_rounded.to_markdown())
return capital_shares |
Beta Was this translation helpful? Give feedback.
-
A nice BEA article on labor shares by industry.
hat tip @jorgebarro
Beta Was this translation helpful? Give feedback.
All reactions