Skip to content

Commit da1a1d2

Browse files
authored
Merge pull request statsmodels#8907 from josef-pkt/bug_mnlogit_wald_tests
BUG: mnlogit wald tests, ravel, string cov_names
2 parents 77cb066 + 947b5b8 commit da1a1d2

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

statsmodels/base/model.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,7 +1639,11 @@ def t_test(self, r_matrix, cov_p=None, use_t=None):
16391639
"""
16401640
from patsy import DesignInfo
16411641
use_t = bool_like(use_t, "use_t", strict=True, optional=True)
1642-
names = self.model.data.cov_names
1642+
if self.params.ndim == 2:
1643+
names = ['y{}_{}'.format(i[0], i[1])
1644+
for i in self.model.data.cov_names]
1645+
else:
1646+
names = self.model.data.cov_names
16431647
LC = DesignInfo(names).linear_constraint(r_matrix)
16441648
r_matrix, q_matrix = LC.coefs, LC.constants
16451649
num_ttests = r_matrix.shape[0]
@@ -1649,7 +1653,7 @@ def t_test(self, r_matrix, cov_p=None, use_t=None):
16491653
not hasattr(self, 'cov_params_default')):
16501654
raise ValueError('Need covariance of parameters for computing '
16511655
'T statistics')
1652-
params = self.params.ravel()
1656+
params = self.params.ravel(order="F")
16531657
if num_params != params.shape[0]:
16541658
raise ValueError('r_matrix and params are not aligned')
16551659
if q_matrix is None:
@@ -1853,8 +1857,12 @@ def wald_test(self, r_matrix, cov_p=None, invcov=None,
18531857
use_f = (hasattr(self, 'use_t') and self.use_t)
18541858

18551859
from patsy import DesignInfo
1856-
names = self.model.data.cov_names
1857-
params = self.params.ravel()
1860+
if self.params.ndim == 2:
1861+
names = ['y{}_{}'.format(i[0], i[1])
1862+
for i in self.model.data.cov_names]
1863+
else:
1864+
names = self.model.data.cov_names
1865+
params = self.params.ravel(order="F")
18581866
LC = DesignInfo(names).linear_constraint(r_matrix)
18591867
r_matrix, q_matrix = LC.coefs, LC.constants
18601868

statsmodels/discrete/tests/test_discrete.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2586,16 +2586,15 @@ def test_cov_confint_pandas():
25862586
assert isinstance(ci.index, pd.MultiIndex)
25872587

25882588

2589-
def test_t_test():
2589+
def test_mlogit_t_test():
25902590
# GH669, check t_test works in multivariate model
2591-
data = load_anes96()
2591+
data = sm.datasets.anes96.load()
25922592
exog = sm.add_constant(data.exog, prepend=False)
25932593
res1 = sm.MNLogit(data.endog, exog).fit(disp=0)
25942594
r = np.ones(res1.cov_params().shape[0])
25952595
t1 = res1.t_test(r)
25962596
f1 = res1.f_test(r)
25972597

2598-
data = sm.datasets.anes96.load()
25992598
exog = sm.add_constant(data.exog, prepend=False)
26002599
endog, exog = np.asarray(data.endog), np.asarray(exog)
26012600
res2 = sm.MNLogit(endog, exog).fit(disp=0)
@@ -2604,3 +2603,20 @@ def test_t_test():
26042603

26052604
assert_allclose(t1.effect, t2.effect)
26062605
assert_allclose(f1.statistic, f2.statistic)
2606+
2607+
tt = res1.t_test(np.eye(np.size(res2.params)))
2608+
assert_allclose(tt.tvalue.reshape(6,6, order="F"), res1.tvalues.to_numpy())
2609+
tt = res2.t_test(np.eye(np.size(res2.params)))
2610+
assert_allclose(tt.tvalue.reshape(6,6, order="F"), res2.tvalues)
2611+
2612+
wt = res1.wald_test(np.eye(np.size(res2.params))[0], scalar=True)
2613+
assert_allclose(wt.pvalue, res1.pvalues.to_numpy()[0, 0])
2614+
2615+
2616+
tt = res1.t_test("y1_logpopul")
2617+
wt = res1.wald_test("y1_logpopul", scalar=True)
2618+
assert_allclose(tt.pvalue, wt.pvalue)
2619+
2620+
wt = res1.wald_test("y1_logpopul, y2_logpopul", scalar=True)
2621+
# regression test
2622+
assert_allclose(wt.statistic, 5.68660562, rtol=1e-8)

0 commit comments

Comments
 (0)