仓库源文站点原文


layout: post title: gnuplot拟合参数的误差及相关系数 categories:


2015-01-09 11:10:33

gnuplot的fit命令可以做拟合, 但使用的是非线性拟合方法, 即便对于线性模型也是一样, 而且拟合结果中不会给出线性相关系数 $R^2$. stat命令可以给出线性相关系数, 可惜无法用于带误差的拟合. 如果我们需要 $R^2$ 的话, 可以利用fit命令, 并根据相关系数的定义进行计算. 具体方法如下.

根据线性回归的方差分析

$$SST=\sum_i (y_i-\bar y)^2 \ SSR=\sum_i (\hat y_i-\bar y)^2 \ SSE=\sum_i (y_i-\hat y_i)^2 \ SST=SSR+SSE \ R^2={SSR \over SST}={SST-SSE \over SST}=1-{SSE \over SST}=1-{\sum_i (\hat y_i-\bar y)^2 \over \sum_i (y_i-\bar y)^2}$$

其中, SST(sum of squares for total)为总平方和, 即数据的总体方差, SSR(sum of squares for regression, 也可写做模型平方和,SSM,sum of squares for model)为回归平方和, 即拟合数据的总体方差, SSE(sum of squares for error)为残差平方和, 即数据与其拟合值的方差.

gnuplot的fit命令会给出拟合后的sum of squares of residuals, 也称为拟合的 $\c^2$, 存于内置变量FIT_WSSR中. 名字中虽然有SSR, 但实际上它相应于SSE, 也就是残差的平方和. 知道了这一点, 再和上面的公式进行对比, 可以发现, SST可看作是数据对常数项拟合的FIT_WSSR, 而SSE则是数据对线性模型拟合的FIT_WSSR. 这样我们利用fit命令先做一次常数拟合得到SST, 再做一次线性拟合得到SSE, 就能计算出 $R^2$ 了.

测试数据

# X       Y      Yerr
1.23457  3.4326 0.1534
0.694444 4.7962 0.1788
0.444444 6.1129 0.1876
0.326531 6.6983 0.1290
0.25     7.1511 0.1468

代码

<table class="highlighttable"><th colspan="2" style="text-align:left">gnuplot</th><tr><td><div class="linenodiv" style="background-color: #f0f0f0; padding-right: 10px"><pre style="line-height: 125%">1 2 3 4 5 6 7 8 9</pre></div></td><td class="code"><div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%"><span style="color: #00A000">mean</span>(x)<span style="color: #666666">=</span>m <span style="color: #008800; font-style: italic"># 拟合后m即为Y的平均值</span> <span style="color: #AA22FF; font-weight: bold">fit</span> <span style="color: #00A000">mean</span>(x) <span style="color: #BB4444">'</span>File<span style="color: #BB4444">'</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">1:2:3</span> <span style="color: #AA22FF">via</span> m <span style="color: #B8860B">SST</span> <span style="color: #666666">=</span> FIT_WSSR <span style="color: #008800; font-style: italic"># 对平均值的方差, 即SST</span>

<span style="color: #AA22FF; font-weight: bold">f</span>(x)<span style="color: #666666">=</span>A<span style="color: #666666">+</span>B<span style="color: #666666">*</span>x <span style="color: #008800; font-style: italic"># 线性模型</span> <span style="color: #AA22FF; font-weight: bold">fit</span> <span style="color: #00A000">f</span>(x) <span style="color: #BB4444">'</span>File<span style="color: #BB4444">'</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">1:2:3</span> <span style="color: #AA22FF">via</span> A<span style="color: #666666">,</span> B <span style="color: #B8860B">SSE</span><span style="color: #666666">=</span>FIT_WSSR <span style="color: #008800; font-style: italic"># 对线性模型的方差, 即SSE</span>

<span style="color: #AA22FF; font-weight: bold">print</span> <span style="color: #BB4444">"R^2="</span><span style="color: #666666">,</span> <span style="color: #666666">1-</span>SSE<span style="color: #666666">/</span>SST </pre></div> </td></tr></table>

结果

After 4 iterations the fit converged.
final sum of squares of residuals : 11.001
rel. change during last iteration : -1.77313e-010

degrees of freedom    (FIT_NDF)                        : 3
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 1.91494
variance of residuals (reduced chisquare) = WSSR/ndf   : 3.66699
p-value of the Chisq distribution (FIT_P)              : 0.0117207

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
A               =  7.89179         +/- 0.2438       (3.09%)
B               = -3.75272         +/- 0.3618       (9.642%)

R^2=0.972868859990092

常用的origin软件Analysis-->Fit Linear给出的拟合结果如下:

Linear Regression for Data1_B:
Y = A + B * X
Weight given by Data1_C error bars.

Parameter  Value      Error
----------------------------------------
A          7.89179    0.12733
B         -3.75272    0.18895
----------------------------------------

R           SD         N    P
----------------------------------------
-0.98634    1.91494    5    0.00191
----------------------------------------

对比可知, 二者给出的SD相同, $R^2$ 相同, 拟合参数值也相同, 但参数的拟合误差不同. 检查后发现, 与origin的Analysis-->Fit Linear不同, gnuplot的fit给出的拟合参数误差是经过SD标度的误差. 比如, 对常数项A的误差, origin给出的是0.12733, 将其乘上SD 1.91494, 就得到0.2438293102, 这正是gnuplot给出的误差. 我不能确定这两种值哪个更合理或是更常用一些, 只是在这里提醒大家在对比时要注意到它们的不同. 此外, origin的非线性拟合可是使用误差项, 并可以指定不同的权重方法, 也可以选择是否对拟合参数的误差进行SD标度.

注意, 当不考虑误差项Yerr进行拟合时, gnuplot和origin给出的拟合参数的误差完全相同.

网络资料

评论