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

Я пытаюсь провести анализ, который требует извлечения нескольких (2 или 3) последовательных значений, в которых позже будет проведен дальнейший анализ.

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

a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)

Что я пытаюсь сделать, это определитьсамая однородная (стабильная) область (т. е. одно значение аналогично следующему) в этом наборе данных.

У меня была идея выполнить вычитание между a и b и рассмотреть абсолютное значениезначение:

c <- abs(a-b)

, что дает

c

 [1] 20  5 45  2  8  2  7 25 30 20 10 50  1 51

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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вот еще одна альтернатива:

a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)

res <- abs(a-b)

> which.min(diff(c(0, cumsum(res)), lag=3))
[1] 4
> res[(4):(4+2)]
[1] 2 8 2

Приведенный выше код использует cumsum, чтобы получить кумулятивные суммы ваших абсолютных разниц.Затем он вызывает diff с lag=3, чтобы получить различия между каждым элементом и положением элемента 3 от него.Наконец, он занимает позицию, в которой увеличение совокупной суммы по сравнению с последующими 3 элементами было наименьшим.

0 голосов
/ 12 сентября 2018

Исходные данные:

a <- c(150, 130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181)
b <- c(130, 135, 180, 182, 190, 188, 195, 170, 140, 120, 130, 180, 181, 130)

Найти абсолютную разницу между двумя векторами:

res <- abs(a - b)

Для каждого элемента в res получить соседей и вычислить сумму по абсолютной разнице:

# with res[(x-1):(x+1)] we extract x and it's neighbors 
resSimilarity <- sapply(seq_along(res), function(x) sum(res[(x-1):(x+1)]))

resPosition <- which.min(resSimilarity)
# [1] 5

Чтобы извлечь значения из исходных векторов, используйте:

a[(resPosition - 1):(resPosition + 1)]
# [1] 180 182 190
b[(resPosition - 1):(resPosition + 1)]
# [1] 182 190 188
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...