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
代码
gnuplot | |
---|---|
1 2 3 4 5 6 7 8 9 | mean(x)=m # 拟合后m即为Y的平均值
fit mean(x) 'File' u 1:2:3 via m
SST = FIT_WSSR # 对平均值的方差, 即SST
f(x)=A+B*x # 线性模型
fit f(x) 'File' u 1:2:3 via A, B
SSE=FIT_WSSR # 对线性模型的方差, 即SSE
print "R^2=", 1-SSE/SST
|
结果
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给出的拟合参数的误差完全相同.
网络资料
评论
- 2017-01-19 10:22:05
zzl
问个问题,明明是负相关的数据,怎么计算出来的是正值? - 2017-01-19 15:53:25
Jerkwin
哪个数是正值? R^2肯定是正值的, R为负值.