Линейная интерполяция для отсутствующих данных в R - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть набор данных, в котором записан размер зрачка в разных условиях.Как и ожидалось, в данных присутствуют артефакты моргания (представленные экстремальным падением значения размера зрачка во время начала мигания и «-1», когда глаз полностью закрыт, после чего снова постепенно увеличивается размер зрачка).

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

Пример данных:

df<-structure(list(Pupil_Avg = c(8.984, 8.984, 8.988001, 8.988001, 
8.978001, 8.978001, 8.9780005, 8.9780005, 8.9780005, 8.9780005, 
8.9780005, 8.9800005, 8.981, 8.9810005, 8.979, 8.979, 8.979, 
8.979, 8.979, 8.979, 8.979, 8.979, 8.979, 8.979, 8.9750005, 8.964, 
8.964001, 8.9660005, 8.9650005, 8.964001, 8.9610005, 8.9620005, 
8.9630005, 8.9630005, 8.963001, 8.963001, 8.96, 8.96, 8.9600005, 
8.962, 8.962, 8.969001, 8.9730005, 8.9670005, 8.9610005, 8.9610005, 
8.9610005, 8.9610005, 8.9610005, 8.9520005, 8.949001, 8.9450005, 
8.9450005, 8.9400005, 8.933001, 8.938001, 8.9510005, 8.956001, 
8.956001, 8.956001, 8.956001, 8.956001, 8.943001, 8.9280005, 
8.9280005, 8.9280005, 8.9280005, 8.9280005, 8.9350005, 8.9470005, 
8.95, 8.9530005, 8.957001, 8.9480005, 8.946, 8.944, 8.944, 8.9460005, 
8.9460005, 8.9480005, 8.9440005, 8.941, 8.938, 8.9280005, 8.9280005, 
8.9280005, 8.9280005, 8.9280005, 8.9280005, 8.929, 8.929, 8.9280005, 
8.9280005, 8.9210005, 8.918, 8.919, 8.92, 8.92, 8.92, 8.9170005, 
8.9100005, 8.9100005, 8.92, 8.9220005, 8.9220005, 8.9100005, 
8.9100005, 8.912, 8.912, 8.912, 8.912, 8.912, 8.9340005, 8.9610005, 
8.958001, 8.985, 8.978, 8.9880005, 8.9880005, 9.014, 9.014, 9.014, 
9.014, 9.014, 8.9740005, 8.9520005, 8.789, 8.6460005, 8.471001, 
8.326, 8.129001, 7.862, 7.862, 7.862, 7.862, 7.862, 7.862, 7.174, 
6.6910005, 6.518, 2.461, 2.182, 1.942, 1.942, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1.487, -1, 
-1, -1, -1, 2.202, 2.202, 2.281, 2.344, 6.265, 6.378, 6.4910005, 
6.8980005, 6.925, 7.04, 7.591, 7.7900005, 7.8470005, 7.978001, 
7.978001, 7.978001, 7.978001, 7.978001, 8.159, 8.1300005, 8.154, 
8.227, 8.281, 8.3160005, 8.353, 8.4430005, 8.4970005, 8.4970005, 
8.4970005, 8.4970005, 8.5150005, 8.6390005, 8.9930005, 9.0110005, 
9.0330005, 9.035, 9.0360005), BLINK_IDENTIFICATION = c(NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Blink Onset", NA, NA, 
NA, "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
"Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", 
NA, "Eye Closed", "Eye Closed", "Eye Closed", "Eye Closed", "Blink Offset", 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-651L))

Как видно из столбца BLINK_IDENTIFICATION, были определены начало (строка 141) и смещение (строка 615) мигания.Когда глаз закрыт (-1 в столбце Pupil_Avg) также был идентифицирован между этими метками.

Моя главная цель состоит в том, чтобы линейно интерполировать данные от "начала мигания" до x числа наблюдений после "смещение "на основе значений до и после мигания начинается и заканчивается.

Может кто-нибудь предложить способ сделать это?По-видимому, в R существуют различные интерполяционные функции (например, ок ()).Я просто не уверен на 100%, как их реализовать.В идеале я бы хотел по возможности избегать использования for loop, поскольку мой полный набор данных имеет длину в миллионы строк, но я буду работать с циклом for, если другого пути нет.

РЕДАКТИРОВАТЬ: ВотПример функции, работающей с указанным выше набором данных для интерполяции мерцания:

install.packages("zoo")
library('zoo')
library(dplyr)

# replace every '-1' value with 'NA'
df$Pupil_Avg[df$Pupil_Avg == -1] <- NA

df<-df%>%mutate(approx = na.approx(Pupil_Avg))

Вышеуказанное приводит к интерполяции с первого закрытого глаза (NA в столбце Pupil_Avg и далее).Это начало, но мне нужно, чтобы интерполяция начиналась в строке перед «Blink Onset», как уже говорилось ранее.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 10 ноября 2018

Вы можете сделать это следующим образом:

library("imputeTS")
onset <- which("Blink Onset" == df$BLINK_IDENTIFICATION)[[1]]
offset <- which("Blink Offset" == df$BLINK_IDENTIFICATION)[[1]]

df$BLINK_IDENTIFICATION[onset:offset] <- -1
df$Pupil_Avg[df$BLINK_IDENTIFICATION == -1] <- NA
df <- na.interpolation(df$Pupil_Avg, option ="linear")

Это работает, если у вас есть ровно 1 blink_onset и смещение в вашем временном ряду.Если у вас есть несколько в вашей серии, просто удалите [[1]] в функции which, тогда вы получите список всех вхождений.Затем вы используете эти два вектора вхождений, чтобы установить для соответствующих частей вашей серии значение NA.

В примере теперь используется функция интерполяции imputeTS вместо zoo ,Оба делают работу.Функция imputeTS немного быстрее, но, вероятно, в любом случае другой код занимает большую часть вычислительного времени.Вы можете установить опцию «сплайн» и «стайн», чтобы перейти от линейной интерполяции к сплайн или интерполяции Стайнмана.(na.spline, если вы используете зоопарк)

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