在 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 word
和 check 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".
说我需要将一些数据拟合成抛物线,然后执行一些涉及拟合参数的相关矩阵元素的计算:有没有办法在拟合收敛后直接在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
现在,您可以将此文件读回数据块(检查 help word
和 check 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".