Линейная регрессия: ValueError: все размеры входного массива, кроме оси конкатенации, должны точно совпадать - PullRequest
0 голосов
/ 15 декабря 2018

Я ищу решение для следующей проблемы, и оно просто не будет работать так, как я хочу.

Поэтому моя цель - вычислить регрессионный анализ и получить наклон, перехват, 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 голосов
/ 15 декабря 2018

Угадывая проблему

Скорее всего, ваша проблема в формате ваших чисел, вместо Unicode String 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 операцию, потому что добавление String 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)

Затем мы можем регрессировать во второй ряд по сравнению с первым :

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)

Вы отправили индексстроки вместо самой строки в метод регрессии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...