layout: post title: gnuplot拟合参数的误差及相关系数 categories:
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给出的拟合参数的误差完全相同.
zzl
问个问题,明明是负相关的数据,怎么计算出来的是正值?Jerkwin
哪个数是正值? R^2肯定是正值的, R为负值.