我正在对某些大小有限的物理系统进行计算机仿真,然后在此基础上外推到无穷大(热力学极限)。一些理论认为数据应该随系统大小线性缩放,因此我正在进行线性回归。
我拥有的数据比较嘈杂,但是对于每个数据点,我都可以估算误差线。因此,例如,数据点如下所示:
x_list = [0.3333333333333333, 0.2886751345948129, 0.25, 0.23570226039551587, 0.22360679774997896, 0.20412414523193154, 0.2, 0.16666666666666666]
y_list = [0.13250359351851854, 0.12098339583333334, 0.12398501145833334, 0.09152715, 0.11167239583333334, 0.10876248333333333, 0.09814170444444444, 0.08560799305555555]
y_err = [0.003306749165349316, 0.003818446389148108, 0.0056036878203831785, 0.0036635292592592595, 0.0037034897788415424, 0.007576672222222223, 0.002981084130692832, 0.0034913019065973983]
假设我正在尝试使用Python进行此操作。
m, c, r_value, p_value, std_err = scipy.stats.linregress(x_list, y_list)
我知道这给了我结果的误差条,但这没有考虑初始数据的误差条。
m, c = numpy.polynomial.polynomial.polyfit(x_list, y_list, 1, w = [1.0 / ty for ty in y_err], full=False)
在这里,我们使用每个点的误差线的倒数作为最小二乘近似中使用的权重。因此,如果一个点确实不是那么可靠,那么它将不会对结果产生很大的影响,这是合理的。
但是我不知道如何获得将这两种方法结合在一起的东西。
我真正想要的是第二种方法的作用,这意味着当每个点以不同的权重影响结果时,请使用回归。但是同时我想知道我的结果有多准确,也就是说,我想知道什么是所得系数的误差线。
我怎样才能做到这一点?
最佳答案
不能完全确定这是否是您的意思,但是…使用pandas,statsmodels和patsy,我们可以比较普通的最小二乘拟合和加权最小二乘拟合,后者使用您提供的噪声的倒数作为权重矩阵(顺便说一下,statsmodels会提示样本大小import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplmpl.rcParams['figure.dpi'] = 300import statsmodels.formula.api as smx_list = [0.3333333333333333, 0.2886751345948129, 0.25, 0.23570226039551587, 0.22360679774997896, 0.20412414523193154, 0.2, 0.16666666666666666]y_list = [0.13250359351851854, 0.12098339583333334, 0.12398501145833334, 0.09152715, 0.11167239583333334, 0.10876248333333333, 0.09814170444444444, 0.08560799305555555]y_err = [0.003306749165349316, 0.003818446389148108, 0.0056036878203831785, 0.0036635292592592595, 0.0037034897788415424, 0.007576672222222223, 0.002981084130692832, 0.0034913019065973983]# put x and y into a pandas DataFrame, and the weights into a Seriesws = pd.DataFrame({ 'x': x_list, 'y': y_list})weights = pd.Series(y_err)wls_fit = sm.wls('x ~ y', data=ws, weights=1 / weights).fit()ols_fit = sm.ols('x ~ y', data=ws).fit()# show the fit summary by calling wls_fit.summary()# wls fit r-squared is 0.754# ols fit r-squared is 0.701# let's plot our dataplt.clf()fig = plt.figure()ax = fig.add_subplot(111, facecolor='w')ws.plot( kind='scatter', x='x', y='y', style='o', alpha=1., ax=ax, title='x vs y scatter', edgecolor='#ff8300', s=40)# weighted predictionwp, = ax.plot( wls_fit.predict(), ws['y'], color='#e55ea2', lw=1., alpha=1.0,)# unweighted predictionop, = ax.plot( ols_fit.predict(), ws['y'], color='k', ls='solid', lw=1, alpha=1.0,)leg = plt.legend( (op, wp), ('Ordinary Least Squares', 'Weighted Least Squares'), loc='upper left', fontsize=8)plt.tight_layout()fig.set_size_inches(6.40, 5.12)plt.show()
WLS残差:
[0.025624005084707302,
0.013611438189866154,
-0.033569595462217161,
0.044110895217014695,
-0.025071632845910546,
-0.036308252199571928,
-0.010335514810672464,
-0.0081511479431851663]
加权拟合(wls_fit.mse_resid
或wls_fit.scale
)的残差的均方误差为 0.22964802498892287 ,拟合的r平方值为 0.754 。如果需要每个可用属性和方法的列表,则可以通过调用其
summary()
方法和/或执行dir(wls_fit)
获得有关拟合的大量数据。关于python - 如何在考虑误差线的情况下进行线性回归?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21469620/