2016-10-09 3 views
0

J'ai quelques points de données avec des erreurs dans les coordonnées x et y sur ces points de données. Je veux donc utiliser l'outil ODR de python pour calculer la pente la mieux ajustée et l'erreur sur cette pente. J'ai essayé de le faire pour mes données réelles mais je ne trouve pas de bons résultats. Par conséquent, j'ai d'abord essayé d'utiliser ODR avec un exemple simple comme suit:Compréhension simple de la régression orthogonale de distance (ODR)

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.odr import * 

def linear_func(B, x): 
    return B[0]*x+B[1] 

x_data=np.array([0.0, 1.0, 2.0, 3.0]) 
y_data=np.array([0.0, 1.0, 2.0, 3.0]) 
x_err=np.array([1.0, 1.0, 1.0, 1.0]) 
y_err=np.array([5.0, 5.0, 5.0, 5.0]) 

linear=Model(linear_func) 
data=RealData(x_data, y_data, sx=x_err, sy=y_err) 
odr=ODR(data, linear, beta0=[1.0, 0.0]) 
out=odr.run() 
out.pprint() 

La ligne pprint() donne:

Beta: [ 1. 0.] 
Beta Std Error: [ 0. 0.] 
Beta Covariance: [[ 5.20000039 -7.80000026] 
[ -7.80000026 18.1999991 ]] 
Residual Variance: 0.0 
Inverse Condition #: 0.0315397386692 
Reason(s) for Halting: 
    Sum of squares convergence 

Les valeurs bêta resutling sont présentés à 1,0 et 0,0, que je épect. Mais pourquoi les erreurs standard, Beta Std Error, sont-elles toutes les deux nulles si mes erreurs sur les points de données sont assez importantes? Quelqu'un peut-il offrir un aperçu?

Répondre

1

Je ne vois aucune anomalie ici. Votre exemple de modèle correspond parfaitement à vos données, donc les poids que vous passez aux données n'ont pas d'importance. De plus, votre estimation initiale beta0=[1.0, 0.0] est un vecteur de paramètres donnant une solution optimale, de sorte que la machine ODR ne peut pas trouver une amélioration itérative des paramètres et se ferme après des itérations nulles. Les erreurs associées sont nulles car pour une donnée donnée la solution trouvée est infiniment meilleure que toute autre solution possible car votre sum of squares à B=[1, 0] est nulle.

Pour voir ce qui se passe réellement dans la fonction ODR.run(), ajoutez odr.set_iprint(init=2, iter=2, final=2) avant d'exécuter la régression. En particulier, la sortie suivante confirme que ODR atteint la condition d'arrêt immédiatement:

--- STOPPING CONDITIONS: 
     INFO =  1 ==> SUM OF SQUARES CONVERGENCE. 
     NITER =  0   (NUMBER OF ITERATIONS) 

Notez comment les erreurs ne pas zéro, et NITER seront un nombre entier si l'votre x_data est inégale à y_data ou si beta0 ne correspond pas à la solution optimale. Dans ce cas, les erreurs renvoyées par ODR seront non nulles, bien qu'encore incroyablement petites.

+0

Merci pour votre réponse, Vlas. Ce que je ne comprends pas, c'est pourquoi il n'y a pas d'erreur fondamentale sur la pente. Je pensais que ODR était supposé calculer l'erreur inhérente à la pente de la ligne ainsi que sa valeur si on donnait des données avec des barres d'erreur. Comment calcule-t-on l'erreur inhérente à la pente si ce n'est pas ainsi? – user4437416

+0

La valeur de 'Beta Std Error' ne reflète pas l'erreur absolue que vous lui transmettez - seulement les" poids "relatifs assignés aux points de données. Je ne comprends pas vraiment comment ces valeurs sont calculées, mais peut-être que vous pouvez le comprendre en lisant ordpack [documentation] (http://docs.scipy.org/doc/external/odrpack_guide.pdf). –

+0

Une façon de prendre en compte vos scalages absolus de 'x_err' et' y_err' est d'estimer vos incertitudes de paramètre comme 'B_err = np.sqrt (np.diag (out.cov_beta))' - la racine carrée des entrées diagonales de la matrice de covariance. La section "4.B" dans le document lié ci-dessus va dans un peu de détail sur la qualité d'une approximation c'est. –