Матричная алгебра - ValueError - Вычисление доверительных интервалов - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь использовать delta method для вычисления доверительных интервалов для нелинейных моделей регрессии. Мои стандартные ошибки - это массив 5,3,3, но я думаю, что стандартные ошибки должны быть 5 значений, а не матриц. Я получаю сообщение об ошибке при попытке добавить или вычесть массив standard_error из моих прогнозируемых значений. Любая помощь будет оценена.

df = pd.DataFrame({
        'cumsum_days': [1,2,3,4,5],
        'pred': [388.259631, 368.389649, 349.754534, 332.264306, 315.836485]})

cov = np.array([[2.67918945e+04, 2.62421460e+02, 9.08452505e+00],
       [2.62421460e+02, 4.31869566e+00, 1.24995272e-01],
       [9.08452505e+00, 1.24995272e-01, 3.90413410e-03]])

# estimate confidence interval for predicted probabilities
gradient = np.gradient(df['pred'], df['cumsum_days'])
std_errors = np.array([np.sqrt(np.dot(np.dot(g, cov), g)) for g in gradient])
c = 1.96 # multiplier for confidence interval

upper = np.maximum(0, np.minimum(1, (df['pred'] + std_errors * c)))
lower = np.maximum(0, np.minimum(1, (df['pred'] - std_errors * c)))

ValueError здесь:

print(df['pred'] + std_errors)
ValueError: operands could not be broadcast together with shapes (5,) (5,3,3) 

1 Ответ

1 голос
/ 27 января 2020

Это проблема формы, ваш градиент имеет форму (5,), а ваше поле имеет форму (3,3), итерируя по каждому элементу g в градиенте, np.dot (g, cov) просто умножит каждое элемент матрицы cov с помощью числа g (1), дающего форму (3,3) и создающего список из 5 элементов формы (3,3), отсюда и форма (5,3,3).

Я не знаю подробностей о дельта-методе, но мне кажется, что вы должны либо иметь матрицу cov формы (5,5), либо иметь градиент формы (3,), удалив первый и последний значение и тогда вы сможете сделать std_error = np.sqrt(np.dot(np.dot(gradient, cov), gradient))

...