Python 如何在动态数据框架上执行OLS回归并估计斜率系数?

Python 如何在动态数据框架上执行OLS回归并估计斜率系数?,python,numpy,pandas,regression,Python,Numpy,Pandas,Regression,我有一个如下所示的数据框,它的结构不是固定的,它可以在不同的时刻有不同的列数 A_Name B_Info Value_Yn Value_Yn-1 Value_Yn-2 ...... Value_Y1 0 AA X1 0.9 0.8 0.7 ...... 0.1 1 BB Y1 0.1 0.2 0.3 ...... 0

我有一个如下所示的数据框,它的结构不是固定的,它可以在不同的时刻有不同的列数

    A_Name  B_Info  Value_Yn  Value_Yn-1   Value_Yn-2   ......  Value_Y1
0   AA      X1        0.9       0.8           0.7       ......   0.1   
1   BB      Y1        0.1       0.2           0.3       ......   0.9
2   CC      Z1        -0.9       -0.8         -0.7      ......   -0.1
3   DD      L1        -0.1       -0.2         -0.3      ......   -0.9
我想对X和Y值如下的每一行执行线性回归

X = [n, n-1, n-2, .....2, 1]

Y = [Value_Yn, Value_Yn-1, Value_Yn-2.......Value_Y2, Value_Y1]
这里的“n”是将以“Value_389;”作为前缀的列数

假设n=9

我会有价值的

对于第0行

X = [9, 8, 7, 6, 5, 4, 3, 2, 1]
Y = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]
第1行

X = [9, 8, 7, 6, 5, 4, 3, 2, 1]
Y = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
类似地,对于其他行

我希望以这种格式输出

    A_Name  B_Info  Intercept  Slope_Coefficent
0   AA      X1        0         0.1  
1   BB      Y1        1         -0.1
2   CC      Z1        0         -0.1        
3   DD      L1        -1        0.1

数据集很大,通过循环来完成不是正确的方法…

这个问题可以用numpy和线性代数来解决。其基本思想是,因为您一次又一次地重用相同的x值,所以我们可以重用中间计算

推导。 线性回归通常是这样解决的:

  • 给定一个数据集(x_1,y_1)。。。(x_n,y_n),我们解一个最小二乘法 形式A x=b的问题
  • A是一个nx2矩阵,x值作为一列,第二列中的值,向量b包含y值,x具有斜率和截距
  • 我们用转置将两边相乘,得到A^T A x=A^T b,这是一个二维系统,对于斜率和截距是可解的
  • 假设您的数据帧有k行。对于相同的x值,但不同的y值,尝试进行最小二乘k次。这转化为用相同的A和不同的b来解决潜在的最小二乘问题k次

    我们可以通过两种方式利用这一点。第一种方法是只计算一次A^T A。第二,也是大部分加速的结果,是使用矩阵乘法同时解决所有k个最小二乘问题。其思想是将所有的kb作为矩阵b的列插入。然后,用右侧的大b替换小b,并执行所有相同的矩阵乘法。最终得到一个矩阵X,其列与B的列对应

    注意,B是矩阵的转置,其列为Y_1,Y_2。。。是的。这就是数据帧的转置

    换句话说,X=(A^ta)^(-1)A^tb,其中B是数据帧的转置。如果数学不清楚,下面是我的代码(使用虚拟数据)。如果有什么问题,请告诉我

    import numpy as np
    import numpy.linalg as la
    
    n = 3
    k= 10
    #replace this with your data matrix whose columns are the Y's
    yvals = np.arange(k*n).reshape(k,n)
    xvals = np.arange(1,n+1)
    print "X values:", xvals
    print "Y Values:"
    print yvals
    
    A = np.zeros((n,2))
    A[:,0] = xvals
    A[:,1] = 1
    
    Q = A.T.dot(A)
    #slopes are the first column, intercepts are the second
    res =  la.inv(Q).dot(A.T.dot(yvals.T)).T
    print res
    
    输出:

    X values: [1 2 3]
    Y Values:
    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10 11]
     [12 13 14]
     [15 16 17]
     [18 19 20]
     [21 22 23]
     [24 25 26]
     [27 28 29]]
    Result:
    [[  1.  -1.]
     [  1.   2.]
     [  1.   5.]
     [  1.   8.]
     [  1.  11.]
     [  1.  14.]
     [  1.  17.]
     [  1.  20.]
     [  1.  23.]
     [  1.  26.]]
    

    由于矩阵乘法的矢量化和渐进加速,这应该是相当快的。

    不太确定你在问什么。。。也许您想使用
    多处理
    并行处理多行?这只是一个转换,请查看输出…我不知道这里的多处理是什么意思…但我想要每行的回归…谢谢。这是他们在应用数学专业教你的。我也可以通过对度量做一些运算来调整R平方…可能吧。你可能还应该问一个后续问题,因为这个问题已经解决了。把链接给我,我会尽力回答的。