Производная Бурдета в R с сглаживающим окном

Я рассчитываю производные давления, используя алгоритмы из этого PDF:

Производные Алгоритмы

Я смог относительно легко реализовать методы "две точки" и "три последовательных точки", используя функции запаздывания / опережения dplyr для смещения исходных столбцов вперед и назад на одну строку.

Проблема этих двух методов заключается в том, что в данных высокого разрешения, которые мы используем, может быть много шума. Вот почему существует третий метод, "сглаженные точки", который значительно сложнее реализовать. Существует определенная пользователем "ширина окна",W, которая обычно составляет от 0 до 0,5. Алгоритм выбирает point_L и point_R первыми, так что ln (deltaP / deltaP_L)> W и ln (deltaP / deltaP_R)> W. Вот что у меня так далеко:

#If necessary install DPLYR

#install.packages("dplyr")
library(dplyr)

#Create initial Data Frame
elapsedTime <- c(0.09583, 0.10833, 0.12083, 0.13333, 0.14583, 0.1680, 
0.18383, 0.25583)
deltaP <- c(71.95, 80.68,   88.39, 97.12, 104.24, 108.34, 110.67, 122.29)
df <- data.frame(elapsedTime,deltaP)

#Shift the elapsedTime and deltaP columns forward and back one row
df$lagTime <- lag(df$elapsedTime,1)
df$leadTime <- lead(df$elapsedTime,1)
df$lagP <- lag(df$deltaP,1)
df$leadP <- lead(df$deltaP,1)

#Calculate the 2 and 3 point derivatives using nearest neighbors
df$TwoPtDer <- (df$leadP - df$lagP) / log(df$leadTime/df$lagTime)

df$ThreeConsDer <- ((df$deltaP-df$lagP)/(log(df$elapsedTime/df$lagTime)))*               
((log(df$leadTime/df$elapsedTime))/(log(df$leadTime/df$lagTime))) +
((df$leadP-df$deltaP)/(log(df$leadTime/df$elapsedTime)))*                  
((log(df$elapsedTime/df$lagTime))/(log(df$leadTime/df$lagTime)))

#Calculate the window value for the current 1 row shift
df$lnDeltaT_left <- abs(log(df$elapsedTime/df$lagTime))
df$lnDeltaT_right <- abs(log(df$elapsedTime/df$leadTime))

Результирующая таблица данных

Если вы посмотрите на картинку, приведенную выше, то увидите, что на основе W, равной 0,1, только строка 2 соответствует этому критерию как для левой, так и для правой точки. Просто к сведению, этот набор данных является расширением данных, использованных в примере 2.5 в ссылочном PDF.

Итак, мой последний вопрос: как я могу выбрать правильные point_L и point_R, чтобы они соответствовали вышеуказанным критериям? Мои первоначальные мысли - это что-то вроде цикла while, но, будучи неопытным программистом, у меня возникают проблемы при написании цикла, который приближается к тому, для чего я снимаюсь.

Спасибо за любые ваши предложения!

0 ответов

Другие вопросы по тегам