Python / Numpy - вернуть наклон для простой линейной регрессии в новом массиве - PullRequest
0 голосов
/ 26 мая 2020

Я ищу ответ на следующую проблему:

Я хочу создать массив numpy, в котором хранятся все пересечения и наклоны. Наклон - это увеличение means над years. Я нашел несколько способов вычислить перехват / наклон, но мне очень не хватает ссылки, чтобы получить их в новом массиве (я новичок в Numpy, поэтому logi c медленно добирается туда, но теперь я был застрял на день ..)

Итак ... У меня есть массив, который имеет такую ​​структуру:

x = np.array([(2000, 'A', '1',5), (2001, 'A', '1', 10),
              (2003, 'A', '1',15), (2004, 'A', '1', 20),
              (2000, 'A', '2',1), (2001, 'A', '2', 2),
              (2002, 'A', '2', 3), (2003, 'A', '2', 4)],
             dtype=[('year', 'i4'), ('group1', 'U2'), ('group2', 'U2'), ('means', 'i2')])

И я хотел бы получить такой массив:

>desired_array
array([('A', '1', 5, 5), 
       ('A', '2', 1, 1)],
       dtype=[('group1', '<U2'), ('group2', '<U2'), ('intercept', '<i2'), ('slope', '<i2')])

Я дошел до этого момента:

ans, indices = np.unique(x[['group1', 'group2']], return_inverse=True)
desired_array = np.empty(2, dtype=[('group1', 'U2'), ('group2', 'U2'), ('intercept', '<f8'),
                                   ('slope', '<f8')])
desired_array['group1'] = ans['group1']
desired_array['group2'] = ans['group2']
x = x[x['year'] == 2000]
desired_array['intercept'] = x['means']

это немного грубо, и я все еще могу улучшить, но главный вопрос для меня, где я застреваю, - как добавить наклон для каждой регрессии строку в массив.

Было бы здорово, если бы мне кто-нибудь помог :)

1 Ответ

1 голос
/ 26 мая 2020

Вы можете просто рассчитать свои уклоны и пересечения в списках и добавить их.

x = np.array([(2000, 'A', '1',5), (2001, 'A', '1', 10),
              (2002, 'A', '1',15), (2003, 'A', '1', 20),
              (2000, 'A', '2',1), (2001, 'A', '2', 2),
              (2002, 'A', '2', 3), (2003, 'A', '2', 4)],
             dtype=[('year', 'i4'), ('group1', 'U2'), ('group2', 'U2'), ('means', 'i2')])

Обратите внимание, что я изменил значение года в строках 3 и 4 на 2002 и 2003, а не на 2003 и 2004 год, так как тогда это была не прямая линия. В этом примере я рассматриваю годы как ось x, а средства - как ось y. Естественно, тогда slope, m = (y2-y1)/(x2-x1) и точка пересечения будет c = y - m*x для любой пары (x, y) в соответствующей строке. Сохраните наклон и точку пересечения в двух списках при просмотре каждой уникальной пары групп.

unique_groups = np.unique(x[['group1', 'group2']])

slopes, intercepts = [],[]
for group in unique_groups:
    current_group = x[x[['group1', 'group2']]==group]
    x_g = current_group['year']
    y_g = current_group['means']
    slope = (y_g.max()-y_g.min())/(x_g.max()-x_g.min())
    intercept = y_g[0]-slope*x_g[0]
    slopes.append(slope)
    intercepts.append(intercept)

Просто вставьте вычисленные значения в желаемый массив.

desired_array = np.empty(len(unique_groups), dtype=[('group1', 'U2'), ('group2', 'U2'), ('intercept', '<f8'),
                                   ('slope', '<f8')])
desired_array['group1'] = unique_groups['group1']
desired_array['group2'] = unique_groups['group2']
desired_array['intercept'] = intercepts
desired_array['slope'] = slopes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...