如何从ODR结果计算标准误差?

时间:2016-12-07 22:54:15

标签: python numpy scipy regression curve-fitting

我使用>>> print(np.sqrt(np.diag(output.cov_beta))) [ 0.17516591 0.33020487 0.27856021] 以便在此问题Correct fitting with scipy curve_fit including errors in x?

后对x和y的不确定性进行拟合

在拟合之后,我想计算参数的不确定性。因此,我查看协方差矩阵的对角元素的平方根。我明白了:

Output

但根据doc on odr

,在output.sd_beta中还有>>> print(output.sd_beta) [ 0.19705029 0.37145907 0.31336217]
  

估计参数的标准误差,形状(p,)。

但是,它没有给我相同的结果:

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]

修改

这是笔记本上的示例:https://nbviewer.jupyter.org/github/gvallverdu/cookbook/blob/master/fit_odr.ipynb

最小方

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]

使用ODR

    @Override 
public void start(Stage primaryStage) {
    System.load("C:\\opencv\\build\\x64\\vc12\\bin\\opencv_ffmpeg_64.dll");
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Sample.fxml"));
        BorderPane root = (BorderPane) loader.load();
        Scene scene = new Scene(root, 400, 400);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        System.out.println("error opening camera gui");
    }
}

public static void main(String[] args) {
    launch(args);
}

1 个答案:

答案 0 :(得分:7)

出现差异的原因是sd_beta按剩余方差缩放,而cov_beta则不是。

scipy.odr是ODRPACK FORTRAN库的接口,它包含在__odrpack.c中。通过索引到FORTRAN例程内部使用的sd_beta向量来恢复cov_betaworkwork中第一个元素的索引是名为sdvcv的变量(请参阅here)。

来自ODRPACK documentation(第85页):

  

WORK(SDI) 是包含p × 1数组SD的第一个元素   函数参数̂σβ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,... ,pJ = 1,... ,p

换句话说,np.sqrt(np.diag(output.cov_beta * output.res_var))会给您与output.sd_beta相同的结果。

我已经打开了一个错误报告here