def estimator_2sls_nn_ols_control(data,
                                  est_kwargs={},
                                  mrg_kwargs={},
                                  exog={},
                                  est_kwargs_first={},
                                  regression=True,
                                  splits=('Train', 'Test'),
                                  **kwargs):
    # Call 2SLS estimator
    betahat, expect, mrgeff = est.estimator_2sls(
        data=data,
        est_kwargs=est_kwargs,
        est_kwargs_first=est_kwargs_first,
        mrg_kwargs=mrg_kwargs,
        exog=exog,
        regression=regression,
        constant=True,
        estimate_2sls_1st=estimate_2sls_nn_1st,
        estimate_2sls_2nd=est.estimate_2sls_2nd_ols_control,
        splits=splits,
        **kwargs)

    #Return results
    return betahat, expect, mrgeff
def estimator_2sls_nn_control(data,
                              est_kwargs={},
                              mrg_kwargs={},
                              exog={},
                              est_kwargs_first={},
                              regression=True,
                              splits=('Train', 'Test'),
                              **kwargs):
    # Call 2SLS estimator
    # The main point is to specify first and second stage estimation techniques.
    betahat, expect, mrgeff = est.estimator_2sls(
        data=data,
        est_kwargs=est_kwargs,
        est_kwargs_first=est_kwargs_first,
        mrg_kwargs=mrg_kwargs,
        exog=exog,
        regression=regression,
        estimate_2sls_1st=estimate_2sls_nn_1st,
        estimate_2sls_2nd=estimate_2sls_nn_2nd_control,
        splits=splits,
        **kwargs)

    #Return results
    return betahat, expect, mrgeff