StatsModel квантильная регрессия ValueError

Я получил ошибку после запуска квантильной регрессии в модуле Python StatsModel. Ошибка следующая:


ValueError                                Traceback (most recent call last)
<ipython-input-221-3547de1b5e0d> in <module>()
 16 model = smf.quantreg(fit_formula, train)
 17
---> 18 fitted_model = model.fit(0.2)
 19
 20 #fitted_model.predict(test)

 in fit(self, q, vcov, kernel, bandwidth, max_iter, p_tol, **kwargs)
177             resid = np.abs(resid)
178             xstar = exog / resid[:, np.newaxis]
--> 179             diff = np.max(np.abs(beta - beta0))
180             history['params'].append(beta)
181             history['mse'].append(np.mean(resid*resid))

ValueError: operands could not be broadcast together with shapes (178,) (176,)

Я думал, что это, возможно, было вызвано постоянными функциями, поэтому я удалил их, но я все еще получил ту же ошибку. Мне интересно, в чем причина. Мой код следующий:

quantiles = np.arange(.05, .99, .1)

cols = train.columns.tolist()[1:-2]
fit_formula = ''
for c in cols:
    fit_formula =  fit_formula + ' + ' + c
fit_formula = 'revenue ~ ' + train.columns.tolist()[0] + fit_formula

model = smf.quantreg(fit_formula, train)

fitted_model = model.fit(0.2)

1 ответ

Решение

Я думаю, что ваша матрица дизайна является единственной, то есть это не относится к вашим данным:

np.linalg.matrix_rank(model.exog) == model.exog.shape[1]

Гадание по взгляду на код: параметр, бета, инициализируется для цикла итерации с

exog_rank = np_matrix_rank(self.exog)
beta = np.ones(exog_rank)

который имеет длину, отличную от бета от вспомогательной взвешенной регрессии наименьших квадратов, и проверка сходимости не проходит. Итеративно переоцененный шаг использовал обобщенный инверс, pinv, который не вызывает исключения из-за единственной матрицы дизайна.

Исходя из вашей трассировки (178,) (176,), у вас все равно будет два коллинеарных столбца, которые нужно отбросить.

(Это ошибка: либо он должен вызвать правильное исключение для единственного случая, либо обрабатывать его с помощью pinv).

Другие вопросы по тегам