【问题标题】:Linear regression:ValueError: all the input array dimensions except for the concatenation axis must match exactly线性回归:ValueError:除连接轴外的所有输入数组维度必须完全匹配
【发布时间】:2019-05-16 05:11:44
【问题描述】:

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

所以我的目标是计算回归分析并获得多行的斜率、截距、右值、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 变量和因变量,我想计算斜率、截距、右值、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 变量。

任何人都知道如何做到这一点并告诉我为什么我的不工作以及代码应该是什么样的?

谢谢!!

【问题讨论】:

  • 您是否介意添加文本数据而不是图像以实现minimal reproducible example,这样会更容易帮助您。甚至可以更好地提取您的 XLS 的简短 CSV 文件。
  • 如何添加 csv 数据提取?如果有帮助,我会用文本中的数字更新文件。
  • 可以用excel打开,然后保存成CSV格式。在文本编辑器中打开它并复制粘贴五个第一行。这应该够了吧。也可以使用代码环境格式化数据,方便阅读。

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


【解决方案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('&lt;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)

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

【讨论】:

  • 错误切换到(使用相同的代码,奇怪):ValueError:除连接轴外的所有输入数组维度必须完全匹配
  • @StevenPauly 如果没有minimal reproducible example,没有人将能够重现您的问题,然后我们将不得不猜测问题出在哪里。提供一个正是您正在加载的试验数据集,例如。将 DataFrame 的前五行转储到 json 中并将其粘贴(或将 XLS 导出为 CSV 文件),然后任何人都可以重新加载它并检查问题所在。
  • @StevenPauly 不需要所有数据:我认为数据框的几行CSV exportJSON dump 就足够了。
  • 我调整了最初的帖子。但是,我仍然不知道如何给你完整的数据集。对我来说,我不清楚我该怎么做。我尝试添加它,但它可能不是您想要的方式
  • 谢谢!。但是如果我有 10000 行呢?如果它来自 xlsx 文件,如何调整数字字符串?
猜你喜欢
  • 2018-07-08
  • 2021-05-09
  • 2017-11-26
  • 2020-02-19
  • 2017-10-20
  • 2020-07-25
  • 2020-02-03
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多