Skip to content

poisson_glm_utils module

Utilities for Poisson GLM.

PoissonGLMResults dataclass

Stores and formats the estimation results.

Parameters:

Name Type Description Default
X int

int

required
Y int

int

required
K int

int

required
number_households int

int

required
number_individuals int

int

required
estimated_gamma np.ndarray

np.ndarray

required
varcov_gamma np.ndarray

np.ndarray

required
stderrs_gamma np.ndarray

np.ndarray

required
estimated_beta np.ndarray

np.ndarray

required
estimated_u np.ndarray

np.ndarray

required
estimated_v np.ndarray

np.ndarray

required
varcov_beta np.ndarray

np.ndarray

required
stderrs_beta np.ndarray

np.ndarray

required
stderrs_u np.ndarray

np.ndarray

required
stderrs_v np.ndarray

np.ndarray

required
estimated_Phi np.ndarray

np.ndarray

required
Source code in cupid_matching/poisson_glm_utils.py
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
@dataclass
class PoissonGLMResults:
    """Stores and formats the estimation results.

    Args:
        X: int
        Y: int
        K: int
        number_households: int
        number_individuals: int
        estimated_gamma: np.ndarray
        varcov_gamma: np.ndarray
        stderrs_gamma: np.ndarray
        estimated_beta: np.ndarray
        estimated_u: np.ndarray
        estimated_v: np.ndarray
        varcov_beta: np.ndarray
        stderrs_beta: np.ndarray
        stderrs_u: np.ndarray
        stderrs_v: np.ndarray
        estimated_Phi: np.ndarray
    """

    X: int
    Y: int
    K: int
    number_households: int
    number_individuals: int
    estimated_gamma: np.ndarray
    varcov_gamma: np.ndarray
    stderrs_gamma: np.ndarray
    estimated_beta: np.ndarray
    varcov_beta: np.ndarray
    estimated_u: np.ndarray
    estimated_v: np.ndarray
    stderrs_beta: np.ndarray
    stderrs_u: np.ndarray
    stderrs_v: np.ndarray
    estimated_Phi: np.ndarray

    def __str__(self):
        line_stars = "*" * 80 + "\n"
        print_stars("Estimating a Choo and Siow model by Poisson GLM.")
        model_str = f"The data has {self.number_households} households\n\n"
        model_str += f"We use {self.K} basis functions.\n\n"
        repr_str = line_stars + model_str
        repr_str += "The estimated basis coefficients (and their standard errors) are\n\n"
        for i in range(self.K):
            repr_str += (
                f"   base_{i + 1}: {self.estimated_beta[i]: > 10.3f}  "
                + f"({self.stderrs_beta[i]: .3f})\n"
            )
        repr_str += (
            "The estimated utilities of men (and their standard errors) are\n\n"
        )
        for i in range(self.X):
            repr_str += (
                f"   u_{i + 1}: {self.estimated_u[i]: > 10.3f}  "
                + f"({self.stderrs_u[i]: .3f})\n"
            )
        repr_str += "The estimated utilities of women (and their standard errors) are\n\n"
        for i in range(self.Y):
            repr_str += (
                f"   v {i + 1}: {self.estimated_v[i]: > 10.3f}  "
                + f"({self.stderrs_v[i]: .3f})\n"
            )
        return repr_str + line_stars

    def print_results(
        self,
        lambda_true: Optional[np.ndarray] = None,
        u_true: Optional[np.ndarray] = None,
        v_true: Optional[np.ndarray] = None,
    ) -> float | None:
        estimates_beta = self.estimated_beta
        stderrs_beta = self.stderrs_beta

        if lambda_true is None:
            repr_str = "The  estimated coefficients "
            repr_str += "(and their standard errors) are\n\n"
            for i, coeff in enumerate(estimates_beta):
                repr_str += f" {coeff: > 10.3f}  ({stderrs_beta[i]: > 10.3f})\n"
            print_stars(repr_str)
        else:
            repr_str = "The  true and estimated coefficients "
            repr_str += "(and their standard errors) are\n\n"
            for i, coeff in enumerate(estimates_beta):
                repr_str += f"   base {i + 1}: {lambda_true[i]: > 10.3f} "
                repr_str += f" {coeff: > 10.3f}  ({stderrs_beta[i]: > 10.3f})\n"
            print_stars(repr_str)

        estimates_u = self.estimated_u
        stderrs_u = self.stderrs_u

        if u_true is None:
            repr_str = "The estimated utilities for men  "
            repr_str += "(and their standard errors) are:\n\n"
            for i, coeff in enumerate(estimates_u):
                repr_str += f" {coeff: > 10.3f}  ({stderrs_u[i]: > 10.3f})\n"
            print_stars(repr_str)
        else:
            repr_str = "The true and estimated utilities for men "
            repr_str += "(and their standard errors) are:\n\n"
            for i, coeff in enumerate(estimates_u):
                repr_str += f"   u_{i + 1}: {u_true[i]: > 10.3f} "
                repr_str += f" {coeff: > 10.3f}  ({stderrs_u[i]: > 10.3f})\n"
            print_stars(repr_str)

        estimates_v = self.estimated_v
        stderrs_v = self.stderrs_v
        if v_true is None:
            repr_str = "The estimated utilities for women "
            repr_str += "(and their standard errors) are:\n\n"
            for i, coeff in enumerate(estimates_v):
                repr_str += f" {coeff: > 10.3f}  ({stderrs_v[i]: > 10.3f})\n"
            print_stars(repr_str)
        else:
            repr_str = "The true and estimated utilities for women "
            repr_str += "(and their standard errors) are:\n\n"
            for i, coeff in enumerate(estimates_v):
                repr_str += f"   v_{i + 1}: {v_true[i]: > 10.3f} "
                repr_str += f" {coeff: > 10.3f}  ({stderrs_v[i]: > 10.3f})\n"
            print_stars(repr_str)

        if lambda_true is None:
            return None
        else:
            discrepancy = npmaxabs(lambda_true - estimates_beta)
            print_stars(
                f"The largest difference between true and estimated coefficients is {discrepancy: .2e}"
            )
            return discrepancy