如何理解statsmodels.ols的输出结果?ols计算的线性回归结果以及手动计算的结果的对比

  • Post author:
  • Post category:其他


手动计算

def linegress(l_1,l_2):  #求两列数据的线性回归参数
  import numpy as np
  from numpy.linalg import solve
  sumx = np.sum(l_1)  #x列的和
  sumy = np.sum(l_2)  #y列的和
  n = len(l_1)  #数据的个数
  sumxy = np.sum(np.array(l_1)*np.array(l_2))  #xy两列的乘积的和
  sumx2 = np.sum(np.array(l_1)**2)  #x的平方的和
  a = np.mat([[sumx,n],[sumx2,sumx]])  #用np.mat传入第一个矩阵
  b = np.mat([sumy,sumxy]).T  #用np.mat.T传入第二个矩阵
  x = solve(a,b) #求出ab
  return x #输出

这里得到以下输出结果

matrix([[ 0.88632061], [-89.12267277]])

上面的就是我们手动笔算线性回归参数的时候会得到的结果,a=0.886,b=-89.123

我们把我们得到的ab代入Y=ax+b来计算新的y列,并求出r2

"""計算"""
import numpy as np
x = np.array([171,180,169,173,173,163,168,176,173,174,164,171,172,172,175,163,163,162,167,170,173,170,170,175,170]) #x列
y = np.array([62,71,53,78,59,54,62,60,62,60,50,66,69,63,62,65,53,52,60,67,70,67,56,68,56]) #y列
a = 0.886
b = -89.123
y_pred = 0.886*x-89.123
s2=((y-y.mean())**2).sum(axis=0)/len(x)
delta=((y-y_pred)**2).sum(axis=0)/len(x)
r2 = (s2-delta)/s2
print('r2=',r2)

我们会得到以下输出结果。

r2= 0.35430340124555104

所以,我们再手动去计算x,y的线性回归的时候,会得到以下的结果:

a=0.886,b=-89.123,r2= 0.354

statsmodels.ols的计算结果

import statsmodels.api as sm
X = sm.add_constant(x)
results = sm.OLS(y,X).fit()
print(results.params)

我们会得到以下结果:

[-89.12267277 0.88632061]

和我们手动计算得到的结果是完全一样的。

打印拟合的详细结果

print(results.summary())

右上角有一个r2,0.354,和我们计算的结果依然是一样的。

然后打印结果中间有一个coef,这个就是我们得到的a和b。不一样的地方是,const的coef就是我们所说的截距,而x1的coef就是我们所说的系数。如果你做的是重回归,那么除了x1之外还会有x234,他们的coef同样是系数,而const依然是截距。



版权声明:本文为Kurumi0729原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。