Como este sitio está bastante adormecido, esto es lo que he encontrado. No soy en absoluto un experto, así que por favor modifique mi/sugiera mejoras a/añada su propia solución.
El scipy.odr
doc es muy limitado, por desgracia, pero indagando he encontrado por fin el guía original de odrpack por Paul T. Boggs, Richard H. Byrd, Janet E. Rogers y Robert B. Schnabel del NIST, NISTIR 4834, 1992.
Página 74, sobre la matriz de covarianza explica cómo calcular el intervalo de confianza a partir de la desviación estándar del parámetro ( sd_beta
en su scipy
Resultado de la ODR, devuelto por run
.). Se trata del elemento de la matriz de covarianza diagonal escalado que a su vez está escalado por la varianza residual (que es casi $\chi^2/DOF$ por lo que veo, véase también el enlace en cuestión), o al menos debería serlo - al publicar esto la matriz de covarianza en scipy.odr
no está escalado por la varianza residual, lo cual es un error. sd_beta
es bueno sin embargo.
Toma esto, y multiplícalo por el prueba t de student para el intervalo de confianza que buscas y los grados de libertad. El enlace es a la Wikipedia, que por lo que veo tiene una buena tabla, aunque es fácil encontrar fuentes más sólidas y extensas - Se pueden calcular de antemano, o tomar directamente de la tabla.
La versión corta:
-
Diga r=odr.ODR(data,model,beta0=(initial params)).run()
-
Busque el valor apropiado de la T de Student para el intervalo de confianza que desea y dado su DOF (para un sistema normal esto es la cantidad de puntos de datos - cantidad de parámetros (no fijos) en su modelo, almacenado en r.iwork[-15]
ver página 94 IWORK(IDFI)) sólo la tabla T del estudiante de Google, o utilizar https://en.wikipedia.org/wiki/Student%27s_t-distribution#Table_of_selected_values . EDITAR : scipy
tiene algo incorporado, ver más abajo.
-
Digamos que quiere un intervalo de confianza del 99% para dos grados de libertad, obtendría t=9.925
.
-
Intervalo de confianza para el parámetro i
está dada por:
r.beta[i]+-t*r.sd_beta[i]
Por lo tanto, el intervalo de confianza no se encuentra directamente variando la varianza residual, sino que se vincula a ella a través del parámetro std.
Obtención del valor t
Debería haber adivinado scipy
tiene algo tan trivial incorporado:
>>>from scipy.stats import t as studentt
>>>studentt.interval(0.95,9)
(-2.2621571627409915, 2.2621571627409915)
daría el valor t apropiado para la región de confianza del 95% (doble cara) con 9 DOF - 2,262.