Download the notebook here
How to generate publication quality tables¶
estimagic helps you generate publication quality html and LaTex tables, given a list of estimation results.
Set up¶
[1]:
import io
import re
from collections import namedtuple
from copy import copy
from copy import deepcopy
import numpy as np
import pandas as pd
import statsmodels.api as sm
from IPython.core.display import HTML
from IPython.core.display import Latex
import estimagic.visualization.estimation_table as et
from estimagic.config import TEST_DIR
[2]:
# Load dataset
df = pd.read_csv(TEST_DIR / "visualization" / "diabetes.csv", index_col=0)
[3]:
df.head()
[3]:
Age | Sex | BMI | ABP | S1 | S2 | S3 | S4 | S5 | S6 | target | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.038076 | 0.050680 | 0.061696 | 0.021872 | -0.044223 | -0.034821 | -0.043401 | -0.002592 | 0.019908 | -0.017646 | 151.0 |
1 | -0.001882 | -0.044642 | -0.051474 | -0.026328 | -0.008449 | -0.019163 | 0.074412 | -0.039493 | -0.068330 | -0.092204 | 75.0 |
2 | 0.085299 | 0.050680 | 0.044451 | -0.005671 | -0.045599 | -0.034194 | -0.032356 | -0.002592 | 0.002864 | -0.025930 | 141.0 |
3 | -0.089063 | -0.044642 | -0.011595 | -0.036656 | 0.012191 | 0.024991 | -0.036038 | 0.034309 | 0.022692 | -0.009362 | 206.0 |
4 | 0.005383 | -0.044642 | -0.036385 | 0.021872 | 0.003935 | 0.015596 | 0.008142 | -0.002592 | -0.031991 | -0.046641 | 135.0 |
[4]:
# Fit regressions
est = sm.OLS(endog=df["target"], exog=sm.add_constant(df[df.columns[0:4]])).fit()
est2 = sm.OLS(endog=df["target"], exog=sm.add_constant(df[df.columns[0:6]])).fit()
The estimation results can be passed as statsmodels
regression results, or as a tuple with attributes params
(pandas DataFrame), with parameter values, standard errors and/or confidence intervals and p-values, and info
(dict) with summary statistics of the model.
[5]:
# Extract `params` and `info`
namedtuplee = namedtuple("namedtuplee", "params info")
est3 = namedtuplee(
params=et._extract_params_from_sm(est),
info={**et._extract_info_from_sm(est)},
)
# Remove redundant information
del est3.info["df_model"]
del est3.info["df_resid"]
The resulting dictionary contains all the information we need:
[6]:
est3[0]
[6]:
value | pvalue | standard_error | ci_lower | ci_upper | |
---|---|---|---|---|---|
const | 152.133484 | 2.048808e-193 | 2.852749 | 146.526671 | 157.740298 |
Age | 37.241211 | 5.616557e-01 | 64.117433 | -88.775663 | 163.258084 |
Sex | -106.577520 | 8.695658e-02 | 62.125062 | -228.678572 | 15.523532 |
BMI | 787.179313 | 5.345260e-29 | 65.424126 | 658.594255 | 915.764371 |
ABP | 416.673772 | 4.245663e-09 | 69.494666 | 280.088446 | 553.259097 |
[7]:
est3[1]
[7]:
{'rsquared': 0.40026108237713975,
'rsquared_adj': 0.3947714813005003,
'fvalue': 72.912599073987,
'f_pvalue': 2.7007228809503304e-47,
'dependent_variable': 'target',
'resid_std_err': 59.97560860753489,
'n_obs': 442.0}
[8]:
# Make copy of estimation results
est4 = {}
est4["params"] = deepcopy(est3.params)
est4["info"] = deepcopy(est3.info)
est5 = {}
est5["params"] = deepcopy(est3.params)
est5["info"] = deepcopy(est3.info)
Basics¶
Basic features include custom title and custom names for models, columns, index and parameters.
Basic table, without title¶
[9]:
ex_html = et.estimation_table([est, est2, est3, est4, est5], return_type="html")
HTML(ex_html)
[9]:
(1) | (2) | (3) | (4) | (5) | |
---|---|---|---|---|---|
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[10]:
ex_latex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
left_decimals=4,
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_latex)
[10]:
Basic table, with title¶
[11]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
)
HTML(ex_html)
[11]:
(1) | (2) | (3) | (4) | (5) | |
---|---|---|---|---|---|
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[12]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
left_decimals=4,
return_type="latex",
render_options={"caption": "This is a caption"},
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[12]:
Column names¶
[13]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
custom_col_names=list("abcde"),
)
HTML(ex_html)
[13]:
a | b | c | d | e | |
---|---|---|---|---|---|
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[14]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={"caption": "This is a caption"},
left_decimals=4,
custom_col_names=list("abcde"),
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[14]:
Column names can be hidden by passing show_col_names=False
:
[15]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
show_col_names=False,
)
HTML(ex_html)
[15]:
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
---|---|---|---|---|---|
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[16]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={"caption": "This is a caption"},
left_decimals=4,
show_col_names=False,
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[16]:
Model names¶
[17]:
custom_mod_names = {"M a": [0], "M b-d": [1, 2, 3], "M e": [4]}
[18]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
custom_model_names=custom_mod_names,
custom_col_names=list("abcde"),
)
HTML(ex_html)
[18]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
a | b | c | d | e | |
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[19]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={"caption": "This is a caption"},
left_decimals=4,
custom_model_names=custom_mod_names,
custom_col_names=list("abcde"),
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[19]:
Index name¶
By default, the index name is “index”:
[20]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption", "index_names": True},
custom_model_names=custom_mod_names,
)
HTML(ex_html)
[20]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
(1) | (2) | (3) | (4) | (5) | |
index | |||||
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[21]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={"caption": "This is a caption", "index_names": True},
left_decimals=4,
custom_model_names=custom_mod_names,
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[21]:
This can be customized by passing a different index name to custom_index_names
:
[22]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
custom_model_names=custom_mod_names,
)
HTML(ex_html)
[22]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
(1) | (2) | (3) | (4) | (5) | |
Variables | |||||
const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[23]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
left_decimals=4,
custom_model_names=custom_mod_names,
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[23]:
Parameter names¶
Custom parameter names can be specified by passing a dictionary to custom_param_names
:
[24]:
cust_par_names = {"const": "Intercept", "Sex": "Gender"}
[25]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
custom_model_names=custom_mod_names,
custom_param_names=cust_par_names,
)
HTML(ex_html)
[25]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
(1) | (2) | (3) | (4) | (5) | |
Variables | |||||
Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Gender | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[26]:
ex_tex = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="latex",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
left_decimals=4,
custom_model_names=custom_mod_names,
custom_param_names=cust_par_names,
alignment_warning=False,
siunitx_warning=False,
)
Latex(ex_tex)
[26]:
Advanced¶
Confidence intervals¶
[27]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
custom_model_names=custom_mod_names,
custom_param_names=cust_par_names,
confidence_intervals=True,
)
HTML(ex_html)
[27]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
(1) | (2) | (3) | (4) | (5) | |
Variables | |||||
Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(146.53 ; 157.74) | (146.53 ; 157.74) | (146.53 ; 157.74) | (146.53 ; 157.74) | (146.53 ; 157.74) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(-88.78 ; 163.26) | (-103.86 ; 153.26) | (-88.78 ; 163.26) | (-88.78 ; 163.26) | (-88.78 ; 163.26) | |
Gender | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(-228.68 ; 15.52) | (-210.32 ; 44.6) | (-228.68 ; 15.52) | (-228.68 ; 15.52) | (-228.68 ; 15.52) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(658.59 ; 915.76) | (658.28 ; 921.2) | (658.59 ; 915.76) | (658.59 ; 915.76) | (658.59 ; 915.76) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(280.09 ; 553.26) | (258.29 ; 536.87) | (280.09 ; 553.26) | (280.09 ; 553.26) | (280.09 ; 553.26) | |
S1 | 197.85$^{ }$ | ||||
(-84.8 ; 480.51) | |||||
S2 | -169.25$^{ }$ | ||||
(-449.8 ; 111.3) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[28]:
ex_tex = et.estimation_table(
[est, est2, est3, est4],
return_type="latex",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
left_decimals=4,
custom_model_names=None,
custom_param_names=cust_par_names,
alignment_warning=False,
siunitx_warning=False,
confidence_intervals=True,
)
Latex(ex_tex)
[28]:
Passing confidence_intervals=False
prints standard errors. To hide both standard errors and confidence intervals you need to pass show_inference=False
:
[29]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
custom_index_names=["Variables"],
custom_model_names=custom_mod_names,
custom_param_names=cust_par_names,
show_inference=False,
)
HTML(ex_html)
[29]:
M a | M b-d | M e | |||
---|---|---|---|---|---|
(1) | (2) | (3) | (4) | (5) | |
Variables | |||||
Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
Gender | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
S1 | 197.85$^{ }$ | ||||
S2 | -169.25$^{ }$ | ||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 |
[30]:
ex_tex = et.estimation_table(
[est, est2, est3, est4],
return_type="latex",
render_options={
"caption": "This is a caption",
},
custom_index_names=["Variables"],
left_decimals=4,
custom_model_names=None,
custom_param_names=cust_par_names,
alignment_warning=False,
siunitx_warning=False,
show_inference=False,
)
Latex(ex_tex)
[30]:
Custom notes¶
[33]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
custom_param_names=cust_par_names,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
)
HTML(ex_html)
[33]:
(1) | (2) | (3) | (4) | (5) | |
---|---|---|---|---|---|
Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Gender | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
Observations | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | 0.39 | 0.39 |
Residual Std. Error | 59.98 | 59.98 | 59.98 | 59.98 | 59.98 |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ | 72.91$^{***}$ |
Note: | ***p<0.01; **p<0.05; *p<0.1 | ||||
This is the first note of some length | |||||
This is the second note probably of larger length |
[34]:
ex_tex = et.estimation_table(
[est, est2, est3, est4],
return_type="latex",
render_options={
"caption": "This is a caption",
},
left_decimals=4,
custom_model_names=None,
custom_param_names=cust_par_names,
alignment_warning=False,
siunitx_warning=False,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
)
Latex(ex_tex)
[34]:
Custom names for summary statistics¶
[35]:
ex_html = et.estimation_table(
[est, est2, est3, est4, est5],
return_type="html",
render_options={"caption": "This is a caption"},
custom_param_names=cust_par_names,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
stats_dict={"R$^2$": "rsquared", "N. Obs": "n_obs"},
)
HTML(ex_html)
[35]:
(1) | (2) | (3) | (4) | (5) | |
---|---|---|---|---|---|
Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | (2.85) | (2.85) | |
Age | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | (64.12) | (64.12) | |
Gender | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | -106.58$^{* }$ | -106.58$^{* }$ |
(62.13) | (64.85) | (62.13) | (62.13) | (62.13) | |
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ | 787.18$^{*** }$ |
(65.42) | (66.89) | (65.42) | (65.42) | (65.42) | |
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ | 416.67$^{*** }$ |
(69.49) | (70.87) | (69.49) | (69.49) | (69.49) | |
S1 | 197.85$^{ }$ | ||||
(143.81) | |||||
S2 | -169.25$^{ }$ | ||||
(142.74) | |||||
R$^2$ | 0.4 | 0.4 | 0.4 | 0.4 | 0.4 |
N. Obs | 442.0 | 442.0 | 442.0 | 442.0 | 442.0 |
Note: | ***p<0.01; **p<0.05; *p<0.1 | ||||
This is the first note of some length | |||||
This is the second note probably of larger length |
MultiIndex¶
Set up¶
[36]:
# Convert `params` DataFrame to MultiIndex
df = et._extract_params_from_sm(est)
df.index = pd.MultiIndex.from_arrays(
np.array([["Intercept", "Slope", "Slope", "Slope", "Slope"], df.index.values])
)
df
[36]:
value | pvalue | standard_error | ci_lower | ci_upper | ||
---|---|---|---|---|---|---|
Intercept | const | 152.133484 | 2.048808e-193 | 2.852749 | 146.526671 | 157.740298 |
Slope | Age | 37.241211 | 5.616557e-01 | 64.117433 | -88.775663 | 163.258084 |
Sex | -106.577520 | 8.695658e-02 | 62.125062 | -228.678572 | 15.523532 | |
BMI | 787.179313 | 5.345260e-29 | 65.424126 | 658.594255 | 915.764371 | |
ABP | 416.673772 | 4.245663e-09 | 69.494666 | 280.088446 | 553.259097 |
[37]:
# Extract info and generate tuple of estimation results for `est1`
info = et._extract_info_from_sm(est)
est_mi = namedtuplee(params=df, info=info)
[38]:
# Repeat for `est2`
df = et._extract_params_from_sm(est2)
df.index = pd.MultiIndex.from_arrays(
np.array(
[
["Intercept", "Slope", "Slope", "Slope", "Slope", "Else", "Else"],
df.index.values,
]
)
)
info = et._extract_info_from_sm(est2)
est_mi2 = namedtuplee(params=df, info=info)
Basics¶
[39]:
ex_html = et.estimation_table(
[est_mi, est_mi2],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_param_names=cust_par_names,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
)
HTML(ex_html)
[39]:
(1) | (2) | ||
---|---|---|---|
Intercept | Intercept | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | ||
Slope | Age | 37.24$^{ }$ | 24.7$^{ }$ |
(64.12) | (65.41) | ||
Gender | -106.58$^{* }$ | -82.86$^{ }$ | |
(62.13) | (64.85) | ||
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | |
(65.42) | (66.89) | ||
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | |
(69.49) | (70.87) | ||
Else | S1 | 197.85$^{ }$ | |
(143.81) | |||
S2 | -169.25$^{ }$ | ||
(142.74) | |||
Observations | 442.0 | 442.0 | |
R$^2$ | 0.4 | 0.4 | |
Adj. R$^2$ | 0.39 | 0.39 | |
Residual Std. Error | 59.98 | 59.98 | |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | |
Note: | ***p<0.01; **p<0.05; *p<0.1 | ||
This is the first note of some length | |||
This is the second note probably of larger length |
[40]:
ex_tex = et.estimation_table(
[est_mi, est_mi2],
return_type="latex",
render_options={
"caption": "This is a caption",
},
left_decimals=3,
custom_model_names=None,
custom_param_names=cust_par_names,
alignment_warning=False,
siunitx_warning=False,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
)
Latex(ex_tex)
[40]:
Parameter names¶
[41]:
ex_html = et.estimation_table(
[est_mi, est_mi2],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
custom_param_names={"Age": "Maturity", "Else": "Additionally"},
)
HTML(ex_html)
[41]:
(1) | (2) | ||
---|---|---|---|
Intercept | const | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | ||
Slope | Maturity | 37.24$^{ }$ | 24.7$^{ }$ |
(64.12) | (65.41) | ||
Sex | -106.58$^{* }$ | -82.86$^{ }$ | |
(62.13) | (64.85) | ||
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | |
(65.42) | (66.89) | ||
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | |
(69.49) | (70.87) | ||
Additionally | S1 | 197.85$^{ }$ | |
(143.81) | |||
S2 | -169.25$^{ }$ | ||
(142.74) | |||
Observations | 442.0 | 442.0 | |
R$^2$ | 0.4 | 0.4 | |
Adj. R$^2$ | 0.39 | 0.39 | |
Residual Std. Error | 59.98 | 59.98 | |
F Statistic | 72.91$^{***}$ | 48.91$^{***}$ | |
Note: | ***p<0.01; **p<0.05; *p<0.1 | ||
This is the first note of some length | |||
This is the second note probably of larger length |
[42]:
ex_tex = et.estimation_table(
[est_mi, est_mi2],
return_type="latex",
render_options={
"caption": "This is a caption",
},
left_decimals=3,
custom_model_names=None,
alignment_warning=False,
siunitx_warning=False,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
custom_param_names={"Age": "Maturity", "Else": "Additionally"},
)
Latex(ex_tex)
[42]:
Index and model names¶
[43]:
stats_dict = {
"Observations": "n_obs",
"R$^2$": "rsquared",
"Adj. R$^2$": "rsquared_adj",
"Residual Std. Error": "resid_std_err",
"F Statistic": "fvalue",
"show_dof": True,
}
[44]:
ex_html = et.estimation_table(
[est_mi, est_mi2, est_mi],
return_type="html",
render_options={
"caption": "This is a caption",
},
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
custom_param_names={"Age": "Maturity", "Else": "Additionally"},
custom_index_names=["Category", "Variable"],
custom_model_names={"M1-2": [0, 1], "M3": [2]},
stats_dict=stats_dict,
)
HTML(ex_html)
[44]:
M1-2 | M3 | |||
---|---|---|---|---|
(1) | (2) | (3) | ||
Category | Variable | |||
Intercept | const | 152.13$^{*** }$ | 152.13$^{*** }$ | 152.13$^{*** }$ |
(2.85) | (2.85) | (2.85) | ||
Slope | Maturity | 37.24$^{ }$ | 24.7$^{ }$ | 37.24$^{ }$ |
(64.12) | (65.41) | (64.12) | ||
Sex | -106.58$^{* }$ | -82.86$^{ }$ | -106.58$^{* }$ | |
(62.13) | (64.85) | (62.13) | ||
BMI | 787.18$^{*** }$ | 789.74$^{*** }$ | 787.18$^{*** }$ | |
(65.42) | (66.89) | (65.42) | ||
ABP | 416.67$^{*** }$ | 397.58$^{*** }$ | 416.67$^{*** }$ | |
(69.49) | (70.87) | (69.49) | ||
Additionally | S1 | 197.85$^{ }$ | ||
(143.81) | ||||
S2 | -169.25$^{ }$ | |||
(142.74) | ||||
Observations | 442.0 | 442.0 | 442.0 | |
R$^2$ | 0.4 | 0.4 | 0.4 | |
Adj. R$^2$ | 0.39 | 0.39 | 0.39 | |
Residual Std. Error | 59.98(df=437.0) | 59.98(df=435.0) | 59.98(df=437.0) | |
F Statistic | 72.91$^{***}$(df=4.0;437.0) | 48.91$^{***}$(df=6.0;435.0) | 72.91$^{***}$(df=4.0;437.0) | |
Note: | ***p<0.01; **p<0.05; *p<0.1 | |||
This is the first note of some length | ||||
This is the second note probably of larger length |
[45]:
ex_tex = et.estimation_table(
[est_mi, est_mi2],
return_type="latex",
render_options={
"caption": "This is a caption",
},
left_decimals=4,
alignment_warning=False,
siunitx_warning=False,
custom_notes=[
"This is the first note of some length",
"This is the second note probably of larger length",
],
custom_param_names={"Age": "Maturity", "Else": "Additionally"},
custom_index_names=["Category", "Variable"],
custom_model_names={"M1": [0], "M2": [1]},
stats_dict=stats_dict,
)
Latex(ex_tex)
[45]: