Как вычислить стандартную ошибку из результатов 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 .

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

  • Быстрый метод взаимной корреляции в Python
  • Как применить фильтр к сигналу в python
  • Расчет корреляции Пирсона
  • Логистическая регрессия: объекты не выровнены
  • Matplot: Как построить истинные / ложные или активные / деактивированные данные?
  • Невозможно интерпретировать MATLAB interp2d в Python scipy.interp
  • Matplotlib - Быстрый способ создания множества подзаголовков?
  • корреляция столбцов pandas со статистической значимостью
  • Как выполнить кубическую сплайн-интерполяцию в python?
  • численно устойчивый обратный матрице 2x2
  • Функция программирования, содержащая разрез отрицательной мнимой оси
  • Python - лучший язык программирования в мире.