Вычесть линейный наклон из данных пакета после линейной регрессии - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу обработать данные "пакета" - временной ряд с пакетами. Данные могут быть довольно шумными. Меня действительно интересует только длительность пакета, но мой алгоритм обнаружения пакета действительно работает, только если данные не имеют наклона. Теперь мой вопрос: как найти линейный наклон для этого типа данных, не делая это вручную? Моя главная проблема в том, что могут быть всплески, которые превышают любой конец моей оси времени (x). В противном случае я мог бы просто найти среднее значение первых и последних 20 точек данных и подобрать линейную функцию. В основном я хочу найти красную линию на следующей картинке и вычесть ее. Я предполагаю, что линейная регрессия или через пакет или наклонную базовую линию добилась бы цели, но я как-то застрял.

enter image description here

Код:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rcParams,pylab 
from matplotlib.patches import Rectangle
import random

#set plot properties
sns.set_style("white")
rcParams['font.size'] = 14
FIG_SIZE=(12, 15)
# Simulate data
timepoints = 4000
r = pd.Series(np.floor(np.ones(timepoints)*20 + np.random.normal(scale=10, 
size=timepoints)))   #target events
r[r<0] = 0 #set negative values to 0
# #add some bursts to the data
heights = [35,45,50,55,40,60,70]
starts =[100,300,700,950,1200,1800,2100,2550,2800,3100,3500,3800]
ends=[200,400,800,1100,1500,1900,2400,2625,2950,3350,3700,4000]
for x,y in zip(starts,ends):
    r[x:y] = r[x:y] + random.choice(heights) #+ np.random.normal(scale=10, size=200)
# add linear slope to data
slope=0.02
linear_slope=np.arange(timepoints) *slope
burst_data_with_slope= r + linear_slope
#Fig setup
fig, (ax1, ax2) = plt.subplots(2, figsize=FIG_SIZE,sharey=False)
#
ax1.set_ylabel('proportion of target events', size=14)
ax1.set_xlabel('time (sec)', size=14)
ax2.set_xlabel('time (sec)', size=14)
ax2.set_ylabel('proportion of target events', size=14)
ax1.set_xlim([0, timepoints])
ax2.set_xlim([0, timepoints])
ax1.plot(burst_data_with_slope, color='#00bbcc', linewidth=1)
ax1.set_title('Original Data', size=14)
ax2.plot(burst_data_with_slope, color='#00bbcc', linewidth=1)
ax2.plot(linear_slope, color='red', linewidth=1)
ax2.set_title('Original Data substracted slope', size=14)



# Finaly plot
plt.subplots_adjust(hspace=0.5)
plt.show()

Заранее спасибо!

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