【问题标题】:How to do Linear Regression and get Standard Deviation (Python)如何进行线性回归并获得标准偏差(Python)
【发布时间】:2021-08-13 13:56:28
【问题描述】:

我有一个非常简单的问题,但不知何故我还没有找到解决方案:

我有两条曲线,A1 = [1,2,3] A2 = [4,5,6]

我想用线性回归将这些曲线拟合到另一条曲线 B1 = [4,5,3] 所以 B1 = aA1 + bA2

这可以通过 sklearn LinearRegression 轻松完成 - 但 sklearn 不会为您提供拟合参数的标准差。

我尝试使用 statsmodels...但不知何故我无法正确获取格式

import numpy as np

import statsmodels.api as sm

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([4, 5, 3])

ols = sm.OLS(a, b)

错误:ValueError:endog 和 exog 矩阵的大小不同

【问题讨论】:

  • 您想要预测的 STD 还是系数的 STD?

标签: python numpy statsmodels


【解决方案1】:

如果你的公式是B1 = aA1 + bA2,那么数组 b 是你的内生的,而数组 a 是你的外生的。你需要转置你的外源:

ols = sm.OLS(b, a.T)
res = ols.fit()
res.summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.250
Model:                            OLS   Adj. R-squared:                 -0.500
Method:                 Least Squares   F-statistic:                    0.3333
Date:                Sat, 14 Aug 2021   Prob (F-statistic):              0.667
Time:                        05:48:08   Log-Likelihood:                -3.2171
No. Observations:                   3   AIC:                             10.43
Df Residuals:                       1   BIC:                             8.631
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1            -2.1667      1.462     -1.481      0.378     -20.749      16.416
x2             1.6667      0.624      2.673      0.228      -6.257       9.590
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   3.000
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.531
Skew:                           0.707   Prob(JB):                        0.767
Kurtosis:                       1.500   Cond. No.                         12.3
==============================================================================

来自 sklearn:

from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=False).fit(a.T,b)
reg.coef_
array([-2.16666667,  1.66666667])

【讨论】:

【解决方案2】:

假设您有一个数据矩阵 X,其中每一行是一个观察值,一个列向量 y,则 OLS 解决方案由下式给出

beta_hat = (X'X)^(-1)*X'*y

其中X' 是X 的转置,X^(-1) 是倒置的。

系数的方差为

Var(beta)= s^2*(X'*X)

s^2 是您数据的估计方差。

您可以使用任何 linalg 工具,例如 numpy 来轻松进行计算

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2014-02-23
    • 2016-07-24
    • 1970-01-01
    • 2019-08-16
    • 2021-10-21
    相关资源
    最近更新 更多