|
7 | 7 | from numpy import (abs, arange, argwhere, array, ceil, cumsum, diff, empty,
|
8 | 8 | float64, hstack, inf, int32, int64, interp, log, nan, ones,
|
9 | 9 | pi, polyval, power, sort, sqrt, squeeze, sum)
|
10 |
| -from numpy.linalg import inv, pinv, qr, solve |
| 10 | +from numpy.linalg import inv, pinv, qr, solve, matrix_rank |
11 | 11 | from pandas import DataFrame
|
12 | 12 | from scipy.stats import norm
|
13 | 13 | from statsmodels.iolib.summary import Summary
|
@@ -208,12 +208,13 @@ def _autolag_ols(endog, exog, startlag, maxlag, method):
|
208 | 208 | qpy = q.T.dot(endog)
|
209 | 209 | ypy = endog.T.dot(endog)
|
210 | 210 | xpx = exog.T.dot(exog)
|
| 211 | + effective_max_lag = min(maxlag, matrix_rank(xpx) - startlag) |
211 | 212 |
|
212 |
| - sigma2 = empty(maxlag + 1) |
213 |
| - tstat = empty(maxlag + 1) |
| 213 | + sigma2 = empty(effective_max_lag + 1) |
| 214 | + tstat = empty(effective_max_lag + 1) |
214 | 215 | nobs = float(endog.shape[0])
|
215 | 216 | tstat[0] = inf
|
216 |
| - for i in range(startlag, startlag + maxlag + 1): |
| 217 | + for i in range(startlag, startlag + effective_max_lag + 1): |
217 | 218 | b = solve(r[:i, :i], qpy[:i])
|
218 | 219 | sigma2[i - startlag] = (ypy - b.T.dot(xpx[:i, :i]).dot(b)) / nobs
|
219 | 220 | if method == 't-stat' and i > startlag:
|
@@ -256,8 +257,14 @@ def _df_select_lags(y, trend, max_lags, method, low_memory=False):
|
256 | 257 | If max_lags is None, the default value of 12 * (nobs/100)**(1/4) is used.
|
257 | 258 | """
|
258 | 259 | nobs = y.shape[0]
|
| 260 | + # This is the absolute maximum number of lags possible, |
| 261 | + # only needed to very short time series. |
| 262 | + max_max_lags = nobs // 2 - 1 |
| 263 | + if trend != 'nc': |
| 264 | + max_max_lags -= len(trend) |
259 | 265 | if max_lags is None:
|
260 | 266 | max_lags = int(ceil(12. * power(nobs / 100., 1 / 4.)))
|
| 267 | + max_lags = max(min(max_lags, max_max_lags), 0) |
261 | 268 | if low_memory:
|
262 | 269 | out = _autolag_ols_low_memory(y, max_lags, trend, method)
|
263 | 270 | return out
|
|
0 commit comments