Нахождение среднего расчетного значения после пошагового ответа - PullRequest
3 голосов
/ 02 июля 2011

Я работаю со сбором данных из системы биологического мониторинга.Они должны знать среднее значение плато после внесения изменений в систему, как показано ниже.

Это данные в течение примерно 4 минут, поскольку показано, что между событием и установившимся режимом имеется приличное время задержкиответ.

enter image description here

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

Я чувствую себя прилично компетентным как программист, но не уверен, каким будет самый эффективный способ найти эти значения.

Будем весьма благодарны за любые алгоритмы, идеи или подходы.Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Простой метод может состоять в том, чтобы вычислить и отследить скользящее среднее (то есть, усреднить последние N выборок).Когда среднее значение изменяется менее чем на пороговое значение, вы можете предположить, что оно является устойчивым.

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

Это похоже на интересный проект - удачи!

1 голос
/ 03 июля 2011

Вы можете получить хорошее начало, просто проанализировав первую производную. Считайте процесс устойчивым, если первая производная близка к нулю. Но, пожалуйста, обратите внимание, что это не решение типа «серебряной пули», а несколько неприятных угловых случаев.

В любом случае, исходя из вышеизложенного, следует простая демонстрация:

import numpy as np

# create first some artificial observations
obs= np.array([[0, 1, 1.5, 3.5, 4, 4.5, 7, 9.2, 10.5, 15],
               [1, 2, 6, 6.01, 5.5, 4, 4.7, 3.3, 3.7, 3.65]])
x= np.linspace(obs[0][0], obs[0][-1], 1e2)
y= np.interp(x, obs[0], obs[1])
# and add some noise to it
y+= 1e-3* np.random.randn(y.shape[0])

# now find steady state based on first derivative< abs(trh), but
# smooth the signal first by convolving it with suitable kernel
y_s= np.convolve(y, [.2, .6, .2])
d, trh= np.diff(y_s), .015
stable= (np.abs(d)< trh)[:-1]

# and inspect visually
from pylab import grid, plot, show
plot(x, y), plot(x, y_s[1: -1])
plot(x[stable], np.ones(stable.sum()), 's')
grid(True), show()

С выводом наподобие (где красные точки указывают на предполагаемый процесс устойчивого состояния): enter image description here

...