在 Gnuplot 中拟合后使用相关矩阵

Using the correlation matrix after a fit in Gnuplot

说我需要将一些数据拟合成抛物线,然后执行一些涉及拟合参数的相关矩阵元素的计算:有没有办法在拟合收敛后直接在gnuplot中使用这些参数?它们是否存储在某些变量中,例如误差估计?

我引用了我遇到的明确问题。所有这些都写入 plot.gp 文本文件和 运行 以及 gnuplot plot.gp

我在开头加上set fit errorbariables,然后继续:

f(x)=a+b*x+c*x*x
fit f(x) 'file.dat' u 1:2:3 yerrors via a,b,c

拟合完成后,我可以直接在 plot.gp 中使用 a、b、c 的值及其误差 a_err、b_err 和 c_err脚本;我的问题是:我可以对参数的相关矩阵做同样的事情吗?

问题是一旦脚本完成 运行:

,矩阵就会打印到终端
correlation matrix of the fit parameters:
                a      b      e      
a               1.000 
b               0.910  1.000 
c              -0.956 -0.987  1.000 

矩阵的条目是否存储在某些变量(如 a_err、b_err)中,我可以在拟合完成后但在脚本结束前访问?

编辑: 我当然错过了 gnuplot 通过选项 covariancevariables 的预期方式(显然自 gnuplot 5.0 起可用)。 Ethan 的回答是要走的路。 尽管如此,我还是留下了我的答案,经过一些修改,从拟合输出中提取其他内容可能会有用。

也许我错过了,但我不知道您可以直接将相关矩阵的元素存储到变量中,但是,您可以通过一些变通方法来做到这一点。

您可以为拟合结果设置输出文件(检查 help set fit)。将使用选项 results 创建最短的输出。结果将写入此文件(实际上,如果文件已存在,则附加)。

示例:

After 5 iterations the fit converged.
final sum of squares of residuals : 0.45
rel. change during last iteration : -3.96255e-10

degrees of freedom    (FIT_NDF)                        : 1
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 0.67082
variance of residuals (reduced chisquare) = WSSR/ndf   : 0.45

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a               = 1.75             +/- 0.3354       (19.17%)
b               = -2.65            +/- 1.704        (64.29%)
c               = 1.75             +/- 1.867        (106.7%)

correlation matrix of the fit parameters:
                a      b      c      
a               1.000 
b              -0.984  1.000 
c               0.898 -0.955  1.000

现在,您可以将此文件读回数据块(检查 )并从 last 行(此处:3)中提取值,检查 help wordcheck real.

脚本:

### get fit correlation matrix into variables
reset session

$Data <<EOD
1   1
2   3
3   10
4   19
EOD

f(x) = a*x**2 + b*x + c

myFitFILE = "SO71788523_fit.dat"
set fit results logfile myFitFILE
fit f(x) $Data u 1:2 via a,b,c 

set key top left
set grid x,y

# load file 1:1 into datablock
FileToDatablock(f,d) = GPVAL_SYSNAME[1:7] eq "Windows" ? \
                       sprintf('< echo   %s ^<^<EOD  & type "%s"',d,f) : \
                       sprintf('< echo "\%s   <<EOD" & cat  "%s"',d,f)     # Linux/MacOS
load FileToDatablock(myFitFILE,'$FIT')

# extract parameters into variables
N = 3           # number of parameters
getValue(p1,p2) = real(word($FIT[|$FIT|-N+p1],p2+1))   # extract value as floating point number
aa = getValue(1,1)
ba = getValue(2,1)
bb = getValue(2,2)
ca = getValue(3,1)
cb = getValue(3,2)
cc = getValue(3,3)

set label 1 at graph 0.1,graph 0.8 \
    sprintf("Correlation matrix:\naa: %g\nba: %g\nbb: %g\nca: %g\ncb: %g\ncc: %g",aa,ba,bb,ca,cb,cc) 

plot $Data u 1:2 w lp pt 7 lc "red", \
     f(x) w l lc "blue" title sprintf("fit: a=%g, b=%g, c=%g",a,b,c)

### end of script

结果:

我想你要找的命令是

set fit covariancevariables

 If the `covariancevariables` option is turned on, the covariances between
 final parameters will be saved to user-defined variables. The variable name
 for a certain parameter combination is formed by prepending "FIT_COV_" to
 the name of the first parameter and combining the two parameter names by
 "_". For example given the parameters "a" and "b" the covariance variable is
 named "FIT_COV_a_b".