线性回归:ValueError:除串联轴外,所有输入数组维必须完全匹配

时间:2018-12-14 23:14:12

标签: python python-3.x windows math statistics

我正在寻找以下问题的解决方案,但是它根本无法按我想要的方式工作。

所以我的目标是计算回归分析并获取多行的斜率,截距,rvalue,pvalue和stderr(这可能会达到10000)。在这个例子中,我有一个15行的文件。这是前两行:

array([

[   1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11,
          12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,
          23,   24],    

[ 100,   10,   61,   55,   29,   77,   61,   42,   70,   73,   98,
          62,   25,   86,   49,   68,   68,   26,   35,   62,  100,   56,
          10,   97]]
)

完整的试验数据集:

1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24

100 10  61  55  29  77  61  42  70  73  98  62  25  86  49  68  68  26  35  62  100 56  10  97

57  89  25  89  48  56  67  17  98  10  25  90  17  52  85  56  18  20  74  97  82  63  45  87

192 371 47  173 202 144 17  147 174 483 170 422 285 13  77  116 500 136 276 392 220 121 441 268

第一行是x变量,这是自变量。遍历下一行时,必须保持此状态不变。

对于下一行,y变量,因此是因变量,我想计算斜率,截距,rvalue,pvalue和stderr,并将它们放在一个数据框中(如果可能,添加到同一数据框中,但这是不必要)。

我尝试了以下代码:

import pandas as pd
import scipy.stats
import numpy as np
df = pd.read_excel("Directory\\file.xlsx")

def regr(row):
    r = scipy.stats.linregress(df.iloc[1:, :], row)
    return r

full_dataframe = None

for index,row in df.iterrows():
    x = regr(index)
   if full_dataframe is None: 
       full_dataframe = x.T
   else: 
       full_dataframe = full_dataframe.append([x.T])

full_dataframe.to_excel('Directory\\file.xlsx')

但这失败了,并出现以下错误:

ValueError: all the input array dimensions except for the concatenation axis 
must match exactly

我真的在这里迷路了。

因此,我想实现的是,从第二行开始,每行都有斜率,截距,pvalue,rvalue和stderr,因为第一行是x变量。

任何人都知道如何执行此操作,并告诉我为什么我的系统无法正常工作以及代码应为什么样?

谢谢!

1 个答案:

答案 0 :(得分:1)

猜测问题

最有可能的问题是数字的格式,而不是整数或浮点数,而是使用Unicode字符串dtype('<U21')

始终检查类型:

df.dtypes

使用以下方法铸造数据框:

df = df.astype(np.float64)

下面显示问题的一个小示例:

import numpy as np
import pandas as pd

# DataFrame without numbers (will not work for Math):
df = pd.DataFrame(['1', '2', '3'])
df.dtypes # object: placeholder for everything that is not number or timestamps (string, etc...)

# Casting DataFrame to make it suitable for Math Operations:
df = df.astype(np.float64) 
df.dtypes # float64

但是如果没有要使用的原始文件或数据,很难确定这一点。

仔细阅读异常

这与您获得的异常一致:

TypeError: ufunc 'add' did not contain a loop with signature matching types 
dtype('<U21') dtype('<U21') dtype('<U21')

方法scipy.stats.linregress引发一个TypeError(所以它与类型有关),并告诉您不能执行add操作,因为添加字符串dtype('<U21')不会产生任何作用线性回归的意义。

了解设计

加载数据:

import io

fh = io.StringIO("""1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
100 10  61  55  29  77  61  42  70  73  98  62  25  86  49  68  68  26  35  62  100 56  10  97
57  89  25  89  48  56  67  17  98  10  25  90  17  52  85  56  18  20  74  97  82  63  45  87
192 371 47  173 202 144 17  147 174 483 170 422 285 13  77  116 500 136 276 392 220 121 441 268""")

df = pd.read_fwf(fh).astype(np.float)

然后我们可以regress the second row vs the first

scipy.stats.linregress(df.iloc[0,:].values, df.iloc[1,:].values)

它返回:

LinregressResult(slope=0.12419744768547877, intercept=49.60998434527584, rvalue=0.11461693561751324, pvalue=0.5938303095361301, stderr=0.22949908667668056)

组装在一起:

result = pd.DataFrame(columns=["slope", "intercept", "rvalue"])
for i, row in df.iterrows():
    fit = scipy.stats.linregress(df.iloc[0,:], row)
    result.loc[i] = (fit.slope, fit.intercept, fit.rvalue)

返回:

      slope   intercept    rvalue
0  1.000000    0.000000  1.000000
1  0.124197   49.609984  0.114617
2 -1.095801  289.293224 -0.205150

据我所知,您的期望是什么?

您收到的第二个异常是由于以下原因:

x = regr(index)

您将行的索引而不是行本身发送给了回归方法。