我曾经在计算表中运行DROITEREG
函数。这是一个例子:
在左上角,有数据,在底部是函数DROITEREG
的结果,这是2×5表。我写了几个单元格的标签。 a和b是线性回归的参数,u(a)和u(b)是a和b的不确定性。我想从一个numpy函数计算这些不确定性。
我从curve_fit
函数
import numpy as np
from scipy.stats import linregress
from scipy.optimize import curve_fit
data_o = """
0.42 2.0
0.97 5.0
1.71 10.0
2.49 20.0
3.53 50.0
3.72 100.0
"""
vo, So = np.loadtxt(data_o.split("\n"), unpack=True)
def f_model(x, a, b):
return a * x + b
popt, pcov = curve_fit(
f=f_model, # model function
xdata=1 / So, # x data
ydata=1 / vo, # y data
p0=(1, 1), # initial value of the parameters
)
# parameters
print(popt)
# uncertaintes :
print(np.sqrt(np.diag(pcov)))
输出如下,结果与使用DROITEREG
获得的结果一致:
[ 4.35522612 0.18629772]
[ 0.07564571 0.01699926]
但这并不完全令人满意,因为这应该可以从简单的最小二乘函数中轻松获得。所以我尝试使用polyfit
。
(a, b), Mcov = np.polyfit(1 / So, 1 / vo, 1, cov=True)
print("a = ", a, " b = ", b)
print("SSR = ", sum([(y - (a * x + b))**2 for x, y in zip(1 / So, 1 / vo)]))
print("Cov mat\n", Mcov)
print("Cov mat diag ", np.diag(Mcov))
print("sqrt 1/2 cov mat diag ", np.sqrt(0.5 * np.diag(Mcov)))
输出结果为:
a = 4.35522612104 b = 0.186297716685
SSR = 0.00398117627681
Cov mat
[[ 0.01144455 -0.00167853]
[-0.00167853 0.00057795]]
Cov mat diag [ 0.01144455 0.00057795]
sqrt 1/2 cov mat diag [ 0.07564571 0.01699926]
最后,我注意到polyfit
的Mcov矩阵是curve_fit
的pcov矩阵的2倍。如果我尝试用更大程度的多项式拟合,我看到该因子等于参数的数量。
我没有成功使用linregress
中的scipy.stats
,因为我不知道如何获取参数估计的协方差矩阵。我再次成功使用scipy.odr
,但它再次比上述解决方案更复杂,这对于一个简单的线性回归。也许我错过了一些东西,因为我对统计数据并不友好,我不太明白这个协方差矩阵的含义。
因此,我要知道的是获得线性回归参数和相关不确定性的最简单方法(相关系数也是一个好点,但计算起来更容易)。我的主要目标是例如给化学或物理学的学生提供简单的方法来进行线性回归并计算与该模型相关的参数。