Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Are tbi behavioral-response results for TCJA reform different from non-tbi results? #1827

Closed
MattHJensen opened this issue Jan 14, 2018 · 15 comments
Labels

Comments

@MattHJensen
Copy link
Contributor

MattHJensen commented Jan 14, 2018

I am finding these on TaxBrain.

image

https://www.ospc.org/dynamic/behavior_results/820/

cc @codykallen @martinholmer @hdoupe @siervicul

@martinholmer
Copy link
Collaborator

@MattHJensen,

Do you get the same "very odd" results using the tc command-line tool?

If so, please post your tc results here and explain what about them is "very odd".

If not, then this issue should be moved to the PolicyBrain repository.

@MattHJensen
Copy link
Contributor Author

MattHJensen commented Jan 15, 2018

I have not replicated the results with the tc command line tool.

I opened this issue here because the TaxBrain PE page is an interface to Tax-Calculator and my intuition is that this is a problem in Tax-Calculator rather than TaxBrain. I could be wrong, but if I'm right, I thought other Tax-Calculator devs would want to know about this quickly.

The results are very odd because they say that the Tax Cuts and Jobs Act raises $6 Trillion of revenue over 10 years. The JCT, for instance, scores the individual side of TCJA as losing $1.1 T over the same period.

@GoFroggyRun
Copy link
Contributor

GoFroggyRun commented Jan 22, 2018

To provide more information regarding this PR, I created a TCJA reform that resembles the current TCJA preset on taxBrain, upon which the result here is generated, and got the following result based on the current TC master as of Jan.22, 2018:

screen shot 2018-01-22 at 3 16 54 pm

Here is its counterpart on TB:
screen shot 2018-01-22 at 3 22 31 pm

Based on the results in TC, the total combined liability over 10 years is $34,662.52 B, which yields a loss of $0.55 T over the period.

It seems to me that something went wrong in TB (particularly within the dynamic provision as static results do match between TB and TC) starting 2020.

Here is the reform file used:

{
    "policy": {
        "_II_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_II_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_II_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_II_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_II_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_II_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_II_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_II_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_II_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_II_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571,  92286, 158169, 184571]]},
        "_II_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_II_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_II_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406 ,567457, 283728, 535931, 567457]]},
        "_PT_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_PT_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_PT_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_PT_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_PT_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_PT_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_PT_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_PT_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_PT_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_PT_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571, 92286, 158169, 184571]]},
        "_PT_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_PT_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_PT_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406, 567457, 283728, 535931, 567457]]},
        "_PT_excl_rt":
            {"2018": [0.2],
             "2026": [0.0]},
        "_PT_excl_wagelim_rt":
            {"2018": [0.5],
             "2026": [9e99]},
        "_STD":
            {"2018": [[12000, 24000, 12000, 18000, 24000]],
             "2026": [[7655, 15311, 7655, 11272, 15311]]},
        "_II_em":
            {"2018": [0],
             "2026": [4883]},
        "_CTC_ps":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[75000, 110000, 55000, 75000, 75000]]},
        "_CTC_c":
            {"2018": [1400],
             "2022": [1500],
             "2025": [1600],
             "2026": [1000]},
        "_ALD_AlimonyPaid_hc":
            {"2019": [1],
             "2026": [0]},
        "_DependentCredit_Child_c":
            {"2018": [600],
             "2022": [500],
             "2025": [400],
             "2026": [0]},
        "_DependentCredit_Nonchild_c":
            {"2018": [500],
             "2026": [0]},
        "_DependentCredit_before_CTC":
            {"2018": [true]},  
        "_ACTC_Income_thd":
            {"2018": [2500],
             "2026": [3000]},
        "_AMT_em":
            {"2018": [[70300, 109400, 54700, 70300, 109400]],
             "2026": [[65462, 101870, 50935, 65461, 101870]]},
        "_AMT_em_ps":
            {"2018": [[500000, 1000000, 500000, 500000, 1000000]],
             "2026": [[145511, 193974, 96987, 145511, 193974]]},
        "_ALD_DomesticProduction_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_prt":
            {"2018": [0],
             "2026": [0.03]},
        "_ID_crt":
            {"2018": [1],
             "2026": [0.8]},
        "_ID_Charity_crt_all":
            {"2018": [0.6],
             "2026": [0.5]},
        "_ID_Casualty_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_AllTaxes_c":
            {"2018": [[10000, 10000, 5000, 10000, 10000]],
             "2026": [[9e99, 9e99, 9e99, 9e99, 9e99]]},
        "_ID_Miscellaneous_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_Medical_frt":
            {"2017": [0.075],
             "2019": [0.1]},
        "_cpi_offset":
            {"2017": [-0.0025]}  
    }
}

The assumption content:

{2018: {'_BE_sub': [0.25]}}

@MattHJensen
Copy link
Contributor Author

Thanks very much @GoFroggyRun. Sounds like this issue does belong in PolicyBrain then. Could you reopen over there? Closing here.

@martinholmer
Copy link
Collaborator

@GoFroggyRun, Thanks for providing in issue #1827 TCJA reform behavioral results generated directly by Tax-Calculator. Am I reading your comment correctly when I say your analysis suggests that the odd results @MattHJensen got using TaxBrain might be a TaxBrain problem? To be sure about that, I guess you need to determine that you get the kind of results you reported above calling tbi functions rather than calling Behavior directly, which is what I imagine you did. What script did you run to get your results?

@hdoupe

@GoFroggyRun
Copy link
Contributor

@martinholmer thanks for your suggestion. I actually tried to generate results via tbi, it seems that, however, in order to replicate the results on TB, the base line has to be 2017_law.json. And I am not aware of how to do that via tbi.

@hdoupe
Copy link
Collaborator

hdoupe commented Jan 22, 2018

@GoFroggyRun tbi is the last hand off from taxcalc to TaxBrain. It would be nice to inspect the results from that before we dive into the TaxBrain side. You can modify this script here to do this.

import taxcalc
import numpy as np
import pandas as pd

kw = {
    'start_year': 2017,
    'use_full_sample': True,
    'user_mods': {
        u'policy': {
            2017: {
                u'_FICA_ss_trt': [0.01],
            }
        },
        u'growdiff_response': {},
        u'behavior': {},
        u'consumption': {},
        u'growdiff_baseline': {}
    },
    'year_n': 0,
    'use_puf_not_cps': True,
    'return_dict': False
}

results_df = taxcalc.tbi.run_nth_year_tax_calc_model(**kw)

assert np.allclose(
    (results_df['dist1_xdec']['iitax_0'] +
     results_df['dist1_xdec']['payrolltax_0']).values,
     results_df['dist1_xdec']['combined_0'].values,
     atol=0.0,
     rtol=0.01
)

assert np.allclose(
    (results_df['dist2_xdec']['iitax_0'] +
     results_df['dist2_xdec']['payrolltax_0']).values,
     results_df['dist2_xdec']['combined_0'].values,
     atol=0.0,
     rtol=0.01
)


kw['return_dict'] = True
results_dict = taxcalc.tbi.run_nth_year_tax_calc_model(**kw)

dist_labels = [str((lab, col)) for lab, col in zip(taxcalc.DIST_TABLE_LABELS, taxcalc.DIST_TABLE_COLUMNS)]
diff_labels = [str((lab, col)) for lab, col in zip(taxcalc.DIFF_TABLE_LABELS, taxcalc.DIFF_TABLE_COLUMNS)]


for table_id, _var, labels in [('dist1_xdec', '0-10_0', dist_labels),
                               ('dist1_xbin', '<$10K_0', dist_labels),
                               ('diff_itax_xdec', '0-10_0', diff_labels),
                               ('diff_ptax_xbin', '<$10K_0', diff_labels)]:
    dict_0_10 = {k: [v] for k, v in zip(labels, results_dict[table_id][_var])}
    dict_df_0_10 = pd.DataFrame(dict_0_10)


    print('\n\ncurrent law dist table by {} for year 0 and var {}'.format(table_id, _var))
    print('\ndataframe version\n')
    print(results_df[table_id].iloc[0])
    print('\ndict version\n')
    print(dict_df_0_10.T)


print('\n\ncurrent law aggregate results')
print('\ndataframe version\n')
print(results_df['aggr_d'])
print('\ndict version\n')
print(results_dict['aggr_d'])

You'll need to get the policy in dictionary form from taxcalc.Calculator.read_json_param_objects() and plug that in to the policy keyword in the kw dictionary above.

Thanks for looking into this. Please let me know if you have any problems/questions.

@GoFroggyRun
Copy link
Contributor

@hdoupe I'm a bit confused. Could you clarify how the script you provided allows me to specify alternative baseline for behavioral assumptions?

@MattHJensen MattHJensen reopened this Jan 22, 2018
@hdoupe
Copy link
Collaborator

hdoupe commented Jan 22, 2018

@GoFroggyRun is this what you have in mind?

import taxcalc
print('taxcalc vers:', taxcalc.__version__)
import numpy as np
import pandas as pd
#https://github.com/hdoupe/PolicyBrain/blob/17a8043d0e7d4e16d600e27918b56723b4e7574d/webapp/apps/test_assets/test_tcja.py
tcja_json = """
// Title: Tax Cuts and Jobs Act, Reconciliation version
// Reform_File_Author: Cody Kallen
// Reform_Reference: http://docs.house.gov/billsthisweek/20171218/CRPT-115HRPT-466.pdf
// Reform_Baseline: 2017_law.json
// Reform_Description:
// -  New personal income tax schedule (regular/non-AMT/non-pass-through) (1)
// -  New pass-through income tax schedule (2)
// -  New standard deductions (3)
// -  Repeal personal exemption (4)
// -  Modification to child tax credit, nonrefundable dependent credits (5)
// -  Modification of Alternative Minimum Tax exemption (6)
// -  Repeal of certain above the line deductions (7)
// -  Changes to itemized deductions (8)
// -  Switch to chained CPI from CPI-U for tax parameter adjustment (9)
// Reform_Parameter_Map:
// - 1: _II_*
// - 2: _PT_*
// - 3: _STD (can safely ignore WARNINGs about 2026+ values)
// - 4: _II_em
// - 5: _DependentCredit_*, _CTC_c, _CTC_ps, _ACTC_Income_thd
// - 6: _AMT_rt*
// - 7: _ALD_*
// - 8: _ID_* (can safely ignore WARNINGs about values for several parameters)
// - 9: _cpi_offset
// Note: _II_rt*, _PT_rt*, _STD and _II_em are rounded to the nearest integer value.
{
    "policy": {
        "_II_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_II_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_II_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_II_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_II_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_II_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_II_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_II_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_II_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_II_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571,  92286, 158169, 184571]]},
        "_II_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_II_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_II_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406 ,567457, 283728, 535931, 567457]]},
        "_PT_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_PT_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_PT_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_PT_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_PT_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_PT_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_PT_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_PT_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_PT_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_PT_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571, 92286, 158169, 184571]]},
        "_PT_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_PT_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_PT_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406, 567457, 283728, 535931, 567457]]},
        "_PT_exclusion_rt":
            {"2018": [0.2],
             "2026": [0.0]},
        "_PT_exclusion_wage_limit":
            {"2018": [0.5],
             "2026": [9e+99]},
        "_STD":
            {"2018": [[12000, 24000, 12000, 18000, 24000]],
             "2026": [[7655, 15311, 7655, 11272, 15311]]},
        "_II_em":
            {"2018": [0],
             "2026": [4883]},
        "_CTC_ps":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[75000, 110000, 55000, 75000, 75000]]},
        "_CTC_c":
            {"2018": [1400],
             "2022": [1500],
             "2025": [1600],
             "2026": [1000]},
        "_DependentCredit_Child_c":
            {"2018": [600],
             "2022": [500],
             "2025": [400],
             "2026": [0]},
        "_DependentCredit_Nonchild_c":
            {"2018": [500],
             "2026": [0]},
        "_DependentCredit_before_CTC":
            {"2018": [true]},
        "_ACTC_Income_thd":
            {"2018": [2500],
             "2026": [3000]},
        "_AMT_em":
            {"2018": [[70300, 109400, 54700, 70300, 109400]],
             "2026": [[65462, 101870, 50935, 65461, 101870]]},
        "_AMT_em_ps":
            {"2018": [[500000, 1000000, 500000, 500000, 1000000]],
             "2026": [[145511, 193974, 96987, 145511, 193974]]},
        "_ALD_DomesticProduction_hc":
            {"2018": [1],
             "2026": [0]},
        "_ALD_Alimony_hc":
            {"2019": [1],
             "2026": [0]},
        "_ID_prt":
            {"2018": [0],
             "2026": [0.03]},
        "_ID_crt":
            {"2018": [1],
             "2026": [0.8]},
        "_ID_Charity_crt_all":
            {"2018": [0.6],
             "2026": [0.5]},
        "_ID_Casualty_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_AllTaxes_c":
            {"2018": [[10000, 10000, 5000, 10000, 10000]],
             "2026": [[9e99, 9e99, 9e99, 9e99, 9e99]]},
        "_ID_Miscellaneous_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_Medical_frt":
            {"2017": [0.075],
             "2019": [0.1]},
        "_cpi_offset":
            {"2017": [-0.0025]}
    }
}"""

policy_dict = taxcalc.Calculator.read_json_param_objects(tcja_json, None)

kw = {
    'start_year': 2018,
    'use_full_sample': True,
    'user_mods': {
        u'policy': policy_dict['policy'],
        u'growdiff_response': {},
        u'behavior': {2018: {"_BE_sub": [0.25]}},
        u'consumption': {},
        u'growdiff_baseline': {}
    },
    'year_n': 0,
    'use_puf_not_cps': True,
    'return_dict': False
}

results_dfs = {}
for year in range(0, 10):
    kw["year_n"] = year
    results_dfs[year] = taxcalc.tbi.run_nth_year_tax_calc_model(**kw)

    print('aggr_d results for year: ', year)
    print(results_dfs[year]['aggr_d'])

@GoFroggyRun
Copy link
Contributor

GoFroggyRun commented Jan 22, 2018

@hdoupe thanks for your advice. I was having troubles with defining pre-TCJA baseline, and realized that I don't have to worry about it at all if I were working with TC ver 0.14.2.

For TC release 0.14.2, which is the version that the result here is based on, the tbi interface yield exactly same results as TaxBrain. The difference table generated via tbi looks like the following:

2018 2019 2020 2021 2022 2023 2024 2025 2026 2027
Individual Diff -143.2 -73.9 2,069.9 1,795.9 1,669.5 782.3 -148.2 47.2 25.7 29.7
Payroll Diff 9.8 17.0 75.3 68.3 64.1 39.3 11.8 32.8 -0.7 -0.8
Combined Diff -133.4 -56.9 2,145.1 1,864.2 1,733.7 821.6 -136.4 79.9 25.0 28.9

Given my previous comment, looks like the real issue here lies within tbi, instead of PolicyBrain. In particular, tbi's result doesn't agree with tax-calculator (at least for 0.14.2).

Raw results:

puf-read-time= 2.1
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 67.4
('aggr_d results for year: ', 0)
                          0_0
ind_tax      -143,190,327,631
payroll_tax     9,770,324,193
combined_tax -133,420,003,438
puf-read-time= 2.2
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 51.4
('aggr_d results for year: ', 1)
                         0_1
ind_tax      -73,879,740,558
payroll_tax   17,019,124,295
combined_tax -56,860,616,263
puf-read-time= 2.1
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 50.5
('aggr_d results for year: ', 2)
                           0_2
ind_tax      2,069,919,789,705
payroll_tax     75,225,190,671
combined_tax 2,145,144,980,376
puf-read-time= 1.9
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 51.6
('aggr_d results for year: ', 3)
                           0_3
ind_tax      1,795,928,293,107
payroll_tax     68,267,871,627
combined_tax 1,864,196,164,734
puf-read-time= 1.9
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 50.7
('aggr_d results for year: ', 4)
                           0_4
ind_tax      1,669,543,103,182
payroll_tax     64,109,567,267
combined_tax 1,733,652,670,449
puf-read-time= 1.9
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 49.9
('aggr_d results for year: ', 5)
                         0_5
ind_tax      782,285,868,153
payroll_tax   39,277,596,627
combined_tax 821,563,464,780
puf-read-time= 1.9
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 50.8
('aggr_d results for year: ', 6)
                          0_6
ind_tax      -148,244,067,068
payroll_tax    11,794,610,301
combined_tax -136,449,456,767
puf-read-time= 2.1
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 50.3
('aggr_d results for year: ', 7)
                        0_7
ind_tax      47,150,744,073
payroll_tax  32,792,569,397
combined_tax 79,943,313,470
puf-read-time= 1.8
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 53.2
('aggr_d results for year: ', 8)
                        0_8
ind_tax      25,663,017,542
payroll_tax    -668,074,598
combined_tax 24,994,942,943
puf-read-time= 2.2
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
You loaded data for 2009.
Tax-Calculator startup automatically extrapolated your data to 2013.
seed=4014022474
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

Exception ValueError: "Buffer dtype mismatch, expected 'Python object' but got 'long'" in 'pandas._libs.lib.is_bool_array' ignored
elapsed time for this run: 50.8
('aggr_d results for year: ', 9)
                        0_9
ind_tax      29,661,748,014
payroll_tax    -755,190,231
combined_tax 28,906,557,783

Code:

import pandas as pd
import numpy as np 
import sys
import taxcalc

tcja_tb='''
{
    "policy": {
        "_II_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_II_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_II_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_II_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_II_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_II_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_II_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_II_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_II_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_II_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571,  92286, 158169, 184571]]},
        "_II_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_II_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_II_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406 ,567457, 283728, 535931, 567457]]},
        "_PT_rt1":
            {"2018": [0.1],
             "2026": [0.1]},
        "_PT_rt2":
            {"2018": [0.12],
             "2026": [0.15]},
        "_PT_rt3":
            {"2018": [0.22],
             "2026": [0.25]},
        "_PT_rt4":
            {"2018": [0.24],
             "2026": [0.28]},
        "_PT_rt5":
            {"2018": [0.32],
             "2026": [0.33]},
        "_PT_rt6":
            {"2018": [0.35],
             "2026": [0.35]},
        "_PT_rt7":
            {"2018": [0.37],
             "2026": [0.396]},
        "_PT_brk1":
            {"2018": [[9525, 19050, 9525, 13600, 19050]],
             "2026": [[11242, 22484, 11242, 16094, 22484]]},
        "_PT_brk2":
            {"2018": [[38700, 77400, 38700, 51800, 77400]],
             "2026": [[45751, 91502, 45751, 61242, 91502]]},
        "_PT_brk3":
            {"2018": [[82500, 165000, 82500, 82500, 165000]],
             "2026": [[110791, 184571, 92286, 158169, 184571]]},
        "_PT_brk4":
            {"2018": [[157500, 315000, 157500, 157500, 315000]],
             "2026": [[231045, 281317, 140659, 256181, 281317]]},
        "_PT_brk5":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[502356, 502356, 251178, 502356, 502356]]},
        "_PT_brk6":
            {"2018": [[500000, 600000, 300000, 500000, 500000]],
             "2026": [[504406, 567457, 283728, 535931, 567457]]},
        "_PT_exclusion_rt":
            {"2018": [0.2],
             "2026": [0.0]},
        "_PT_exclusion_wage_limit":
            {"2018": [0.5],
             "2026": [9e99]},
        "_STD":
            {"2018": [[12000, 24000, 12000, 18000, 24000]],
             "2026": [[7655, 15311, 7655, 11272, 15311]]},
        "_II_em":
            {"2018": [0],
             "2026": [4883]},
        "_CTC_ps":
            {"2018": [[200000, 400000, 200000, 200000, 400000]],
             "2026": [[75000, 110000, 55000, 75000, 75000]]},
        "_CTC_c":
            {"2018": [1400],
             "2022": [1500],
             "2025": [1600],
             "2026": [1000]},
        "_ALD_Alimony_hc":
            {"2019": [1],
             "2026": [0]},
        "_DependentCredit_Child_c":
            {"2018": [600],
             "2022": [500],
             "2025": [400],
             "2026": [0]},
        "_DependentCredit_Nonchild_c":
            {"2018": [500],
             "2026": [0]},
        "_DependentCredit_before_CTC":
            {"2018": [true]},  
        "_ACTC_Income_thd":
            {"2018": [2500],
             "2026": [3000]},
        "_AMT_em":
            {"2018": [[70300, 109400, 54700, 70300, 109400]],
             "2026": [[65462, 101870, 50935, 65461, 101870]]},
        "_AMT_em_ps":
            {"2018": [[500000, 1000000, 500000, 500000, 1000000]],
             "2026": [[145511, 193974, 96987, 145511, 193974]]},
        "_ALD_DomesticProduction_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_prt":
            {"2018": [0],
             "2026": [0.03]},
        "_ID_crt":
            {"2018": [1],
             "2026": [0.8]},
        "_ID_Charity_crt_all":
            {"2018": [0.6],
             "2026": [0.5]},
        "_ID_Casualty_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_AllTaxes_c":
            {"2018": [[10000, 10000, 5000, 10000, 10000]],
             "2026": [[9e99, 9e99, 9e99, 9e99, 9e99]]},
        "_ID_Miscellaneous_hc":
            {"2018": [1],
             "2026": [0]},
        "_ID_Medical_frt":
            {"2017": [0.075],
             "2019": [0.1]},
        "_cpi_offset":
            {"2017": [-0.0025]}  
    }
}
'''

policy_dict = taxcalc.Calculator.read_json_param_objects(tcja_tb, None)
kw = {
    'start_year': 2018,
    'use_full_sample': True,
    'user_mods': {
        u'policy': policy_dict['policy'],
        u'growdiff_response': {},
        u'behavior': {2018: {"_BE_sub": [0.25]}},
        u'consumption': {},
        u'growdiff_baseline': {}
    },
    'year_n': 0,
    'use_puf_not_cps': True,
    'return_dict': False
}

print('taxcalc vers:', taxcalc.__version__)
results_dfs = {}
for year in range(0, 10):
    kw["year_n"] = year
    results_dfs[year] = taxcalc.tbi.run_nth_year_tax_calc_model(**kw)
    print('aggr_d results for year: ', year)
    print(results_dfs[year]['aggr_d'])

@martinholmer
Copy link
Collaborator

@GoFroggyRun, Thanks for your Tax-Calculator bug report.

@martinholmer martinholmer changed the title Very odd TCJA results with small positive substitution elasticity tbi TCJA behavioral response results differ from non-tbi results Jan 23, 2018
@martinholmer martinholmer self-assigned this Jan 23, 2018
@martinholmer martinholmer changed the title tbi TCJA behavioral response results differ from non-tbi results tbi behavioral response results for TCJA reform differ from non-tbi results Jan 23, 2018
@martinholmer
Copy link
Collaborator

@GoFroggyRun said his code included this statement:

print('taxcalc vers:', taxcalc.__version__)

But I don't see the results of this print statement in the output you posted.
Were you using a taxcalc package? If so, what version?

@GoFroggyRun
Copy link
Contributor

@martinholmer Right. I only included the output for the loop part.

I'm using a taxcalc package, and its version is 0.14.2, which is the version Policy Brain uses when the result here is found.

@martinholmer martinholmer added question and removed bug labels Jan 23, 2018
@martinholmer martinholmer changed the title tbi behavioral response results for TCJA reform differ from non-tbi results Are tbi behavioral-response results for TCJA reform different from non-tbi results? Jan 23, 2018
@martinholmer martinholmer removed their assignment Jan 23, 2018
@martinholmer
Copy link
Collaborator

@GoFroggyRun referred in the discussion of pull request #1840 to this issue #1827 using the phrase:

the bug report in #1827

Perhaps it is a bug, I don't really know for certain. If you think there is a bug in Tax-Calculator, we have a standard procedure to deal with bugs. You should prepare a two-part pull request that does this:

  1. Identify bug by creating a new test that fails because of the buggy logic

  2. Correct bug by fixing the buggy logic so that the new test now passes and all old tests continue to pass

We look forward to your pull request.

@martinholmer
Copy link
Collaborator

The "odd" results reported in the first comment in issue #1827 has been resolve by the merge of pull request #1858.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants