//  [python]
def _run_interaction_regression(
        data, formula, formula_restricted, family, use_t, report_betas, i1, i2
    ) -> Generator[Dict, None, None]:
        # Regress Full Model
        y, X = patsy.dmatrices(formula, data, return_type="dataframe", NA_action="drop")
        y = fix_names(y)
        X = fix_names(X)
        est = sm.GLM(y, X, family=family).fit(use_t=use_t)

        # Regress Restricted Model
        y_restricted, X_restricted = patsy.dmatrices(
            formula_restricted, data, return_type="dataframe", NA_action="drop"
        )
        y_restricted = fix_names(y_restricted)
        X_restricted = fix_names(X_restricted)
        est_restricted = sm.GLM(y_restricted, X_restricted, family=family).fit(
            use_t=use_t
        )

        # Check convergence
        if est.converged & est_restricted.converged:
            lrdf = est_restricted.df_resid - est.df_resid
            lrstat = -2 * (est_restricted.llf - est.llf)
            lr_pvalue = scipy.stats.chi2.sf(lrstat, lrdf)
            # GITHUB/ISSUES 121: Handling LRT_Pvalue when lrstat and lrdf are
            # both 0. When lrstat (the test statistic) and lrdf (degrees of
            # freedom for the Likelihood Ratio Test) are both 0, it typically
            # suggests that both models are equivalent in terms of fit. In
            # other words, there is no significant difference between the two
            # models.
            #
            # However when both lrstat and lrdf are 0, calc the survival
            # function (sf) of a chi-squared distribution with 0 degrees of
            # freedom results in NaN. This is because mathematically, it's
            # undefined to perform this calculation under these circumstances.
            #
            # In such cases, it's important to handle this scenario separately
            # in the result based on the specific requirements of the analysis
            if lrdf == 0 and lrstat == 0:
                # Both models are equal
                yield {
                    "Converged": True,
                    "LRT_pvalue": lr_pvalue,
                    "Log": "Both models are equivalent in terms of fit",
                }
            elif np.isnan(lr_pvalue):
                # There is an issue with the LRT calculation
                # TODO: Extend the logs returns
                yield {
                    "Converged": True,
                    "LRT_pvalue": lr_pvalue,
                    "Log": "Both models are equivalent in terms of fit",
                }
            else:
                if report_betas:
                    # Get beta, SE, and pvalue from interaction terms
                    # Where interaction terms are those appearing in the full
                    # model and not in the reduced model return all terms
                    param_names = set(est.bse.index) - set(est_restricted.bse.index)
                    # The restricted model shouldn't have extra terms, unless
                    # there is some case we have overlooked.
                    assert len(set(est_restricted.bse.index) - set(est.bse.index)) == 0
                    # GITHUB/ISSUES 122: Open to show Terms Betas Values
                    for param_name in param_names:
                        # Names defined to aling with PLATO
                        # Split the input_string by ":"
                        term_1, term_2 = param_name.split(":")
                        yield {
                            "Term1": term_1,
                            "Term2": term_2,
                            "Converged": True,
                            "Parameter": param_name,
                            # Betas in Reduced Model
                            # Var1 --> Term 1
                            "Red_Var1_beta": est_restricted.params[term_1],
                            "Red_Var1_SE": est_restricted.bse[term_1],
                            "Red_Var1_Pval": est_restricted.pvalues[term_1],
                            # Var2 --> Term 2
                            "Red_Var2_beta": est_restricted.params[term_2],
                            "Red_Var2_SE": est_restricted.bse[term_2],
                            "Red_Var2_Pval": est_restricted.pvalues[term_2],
                            # Betas in Full Model
                            # Var1 --> Term 1
                            "Full_Var1_Var2_beta": est.params[param_name],
                            "Full_Var1_Var2_SE": est.bse[param_name],
                            "Full_Var1_Var2_Pval": est.pvalues[param_name],
                            # Var1 --> Term 1
                            "Full_Var1_beta": est.params[term_1],
                            "Full_Var1_SE": est.bse[term_1],
                            "Full_Var1_Pval": est.pvalues[term_1],
                            # Var2 --> Term 2
                            "Full_Var2_beta": est.params[term_2],
                            "Full_Var2_SE": est.bse[term_2],
                            "Full_Var2_Pval": est.pvalues[term_2],
                            "LRT_pvalue": lr_pvalue,
                            "Log": "",
                        }
                else:
                    # Only return the LRT result
                    yield {"Converged": True, "LRT_pvalue": lr_pvalue, "Log": ""}

        else:
            # Did not converge - nothing to update
            # yield dict()
            yield {
                "Converged": False,
                "LRT_pvalue": "NaN",
                "Log": "One or Both models NOT Converge",
            }