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

Significant digits by column and/or for R^2 #84

Open
merubhanot opened this issue Feb 28, 2022 · 1 comment
Open

Significant digits by column and/or for R^2 #84

merubhanot opened this issue Feb 28, 2022 · 1 comment

Comments

@merubhanot
Copy link

Right now, there seems to be only 1 way to set significant digits that affects the whole table, but frequently I find that I want to set different significant digits by column (depending on variable scale) and/or for R^2 (where you usually want 2 decimal places). Is there a way to add more flexibility to this?

@vvoutilainen
Copy link

I solved the issue for R2 by overriding HTMLRenderer.generate_r2 and LaTeXRenderer.generate_r2 with my own renderers that use a custom float formatter. My full solution below. I guess the same idea could be utilized in a 'real' solution as well, perhaps even in variable-specific formatting.

def import_stargazer_with_overrides():
    """Import Stargazer with override that allows alternate R2 stats float accuracy vs. sig_digits.

    Returns
    ----------
    Imported Stargazer class.

    Notes
    ----------
    Created Stargazer objects need attribute *sig_digits_r2* set.

    Examples
    ----------
    >>> Stargazer = import_stargazer_with_overrides()
    >>> table = Stargazer([res1, res2])
    >>> table.sig_digits_r2 = 2
    >>> display(table)
    """
    # Create a new float formatter aimed for R2 statistics
    from stargazer.stargazer import Renderer
    def _float_format_r2(self, value):
        """
        Format value to string, using the precision set by the user.
        """
        if value is None:
            return ''

        return '{{:.{prec}f}}'.format(prec=self.sig_digits_r2).format(value)
    Renderer._float_format_r2 = _float_format_r2

    # Override R2 statistics in HTMLRenderer
    from stargazer.stargazer import HTMLRenderer
    def generate_r2_htmlrenderer(self):
        r2_text = ''
        r2_text += '<tr><td style="text-align: left">R<sup>2</sup></td>'
        for md in self.model_data:
            r2_text += '<td>' + self._float_format_r2(md['r2']) + '</td>'
        r2_text += '</tr>'
        return r2_text
    HTMLRenderer.generate_r2 = generate_r2_htmlrenderer
    def generate_r2_adj_htmlrenderer(self):
        r2_text = ''
        r2_text += '<tr><td style="text-align: left">Adjusted R<sup>2</sup></td>'
        for md in self.model_data:
            r2_text += '<td>' + self._float_format_r2(md['r2_adj']) + '</td>'
        r2_text += '</tr>'
        return r2_text
    HTMLRenderer.generate_r2_adj = generate_r2_adj_htmlrenderer

    # Override R2 statistics in LaTeXRenderer
    from stargazer.stargazer import LaTeXRenderer
    def generate_r2_latexrenderer(self):
        r2_text = ' $R^2$ '
        for md in self.model_data:
            r2_text += '& ' + self._float_format_r2(md['r2']) + ' '
        r2_text += '\\\\\n'
        return r2_text
    LaTeXRenderer.generate_r2 = generate_r2_latexrenderer
    def generate_r2_adj_latexrenderer(self):
        r2_text = ' Adjusted $R^2$ '
        for md in self.model_data:
            r2_text += '& ' + self._float_format_r2(md['r2_adj']) + ' '
        r2_text += '\\\\\n'
        return r2_text
    LaTeXRenderer.generate_r2_adj = generate_r2_adj_latexrenderer
    from stargazer.stargazer import Stargazer

    return Stargazer

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

No branches or pull requests

2 participants