Как вычислить стандартную ошибку из результатов ODR?

Я использую scipy.odr , чтобы приспособиться с неопределенностями как на x, так и на y, следуя этому вопросу. Правильная установка с scipy curve_fit, включая ошибки в x?

После подгонки я хотел бы вычислить неопределенности по параметрам. Таким образом, я смотрю на квадратный корень диагональных элементов ковариационной матрицы. Я получил :

 >>> print(np.sqrt(np.diag(output.cov_beta))) [ 0.17516591 0.33020487 0.27856021] 

Но в Output также есть output.sd_beta который, согласно документу на odr

Стандартные ошибки оцененных параметров, формы (p,).

Но это не дает мне таких же результатов:

 >>> print(output.sd_beta) [ 0.19705029 0.37145907 0.31336217] 

РЕДАКТИРОВАТЬ

Это пример ноутбука: https://nbviewer.jupyter.org/github/gvallverdu/cookbook/blob/master/fit_odr.ipynb

С наименьшим квадратом

 stop reason: ['Sum of squares convergence'] params: [ -1.94792946 11.03369235 -5.43265555] info: 1 sd_beta: [ 0.26176284 0.49877962 0.35510071] sqrt(diag(cov): [ 0.25066236 0.47762805 0.34004208] 

С ODR

 stop reason: ['Sum of squares convergence'] params: [-1.93538595 6.141885 -3.80784384] info: 1 sd_beta: [ 0.6941821 0.88909997 0.17292514] sqrt(diag(cov): [ 0.01093697 0.01400794 0.00272447] 

One Solution collect form web for “Как вычислить стандартную ошибку из результатов ODR?”

Причиной несоответствия является то, что sd_beta масштабируется по остаточной дисперсии, тогда как cov_beta – нет.

scipy.odr – это интерфейс для библиотеки ODRPACK FORTRAN, которая тонко завернута в __odrpack.c . sd_beta и cov_beta восстанавливаются путем индексирования в work вектор, который используется внутренне с помощью процедуры FORTRAN. Индексами их первых элементов в work являются переменные с именем sd и vcv (см. Здесь ).

Из документации ODRPACK (стр.85):

WORK(SDI) – это первый элемент массива p × 1 SD содержащий стандартные отклонения ̂σβK от параметров функции β , т. ̂σβK Квадратные корни диагональных элементов ковариационной матрицы, где

 WORK(SDI-1+K) = SD(K) = ̂V 1/2 β (K, K) = ̂σβK 

для K = 1,... ,p .

WORK(VCVI) – это первый элемент массива p × p VCV содержащий значения ковариационной матрицы параметров β до масштабирования по остаточной дисперсии , где

 WORK(VCVI-1+I+(J-1)*(NP)) = VCV(I,J) = ̂σ⁻²V β(I, J) 

для I = 1,... ,p и J = 1,... ,p .

Другими словами, np.sqrt(np.diag(output.cov_beta * output.res_var)) даст вам тот же результат, что и output.sd_beta .

Я открыл отчет об ошибке здесь .

  • ndimage отсутствует из scipy
  • Эволюция PyData
  • Как оценить локальную касательную плоскость для трехмерных точек?
  • Доверительный интервал для экспоненциальной кривой
  • Pandas разреженные данныеПеревод к разреженной матрице без создания плотной матрицы в памяти
  • Факториал в numpy и scipy
  • Пиксельные соседи в массиве 2d (изображение) с использованием Python
  • Обратное преобразование Box-Cox
  • Python - лучший язык программирования в мире.