Polyfit是一个很好的工具,可以将一组点拟合成一条直线。但是我的数据具有不同程度的统计显著性。
例如,对于一个点(x1,y2),我可能只有10个观测值,而对于另一个点(x2,y2),我可能有10,000个观测值。通常我至少有10个点,并且在使用polyfit时我想根据统计显著性对每个点进行加权。是否有任何方法(或类似的函数)允许这样做?
Polyfit是一个很好的工具,可以将一组点拟合成一条直线。但是我的数据具有不同程度的统计显著性。
例如,对于一个点(x1,y2),我可能只有10个观测值,而对于另一个点(x2,y2),我可能有10,000个观测值。通常我至少有10个点,并且在使用polyfit时我想根据统计显著性对每个点进行加权。是否有任何方法(或类似的函数)允许这样做?
statsmodels
中使用加权最小二乘法来完成。大致如下:y为响应变量或内生变量(endog
),x为您的一维自变量,w为权重数组,权重越高,对该观察值的关注度就越高。通过获取多项式矩阵并拟合来实现。import numpy as np
import statsmodels.api as sm
exog = np.vander(x, degree+1)
result = sm.WLS(y, exog, weight=w).fit()
参数在result.params
中。拟合值在result.fittedvalues
中。
预测在不同版本间有所改变。使用0.4版本时,您可以使用:
result.predict(np.vander(x_new, degree+1))
import numpy as np
result = np.polynomial.polynomial.polyfit(x,y,deg,w=weight of each observation)
我不了解numpy,但你可以编写自己的polyfit函数。Polyfit只是解线性方程的过程。
http://en.wikipedia.org/wiki/Polynomial_regression#Matrix_form_and_calculation_of_estimates
(在你的情况下,epsilon可能为0)
你可以看到,你所要做的就是将y中的每一行和x中的每一行乘以你的系数。
这应该只需要大约10行代码(我记得我自己重新发明最小二乘方程花了4个小时,但在MATLAB中只需要2行代码)。