Расчет времени до первой фиксации, продолжительности первой фиксации и продолжительности посещения по серии фиксаций (отслеживание взгляда; R)

Я надеюсь, что у всех все хорошо.

В настоящее время я работаю с набором данных отслеживания глаз. Я обработал фиксации с помощью пути взгляда пакета R. Это дало мне вывод привязок к определенным координатам на плоскости x/y.

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

Для этого исследования у меня есть две основные Области интересов — глаза и рот. Например, скажем, глаза были расположены от x1 – 0,200 до x2 – 0,300 и y1 – 0,500 до y1 – 0,600 А лицо было расположено от x1 – 0,100 до x2 – 0,500 и y1 от 0,100 до y2 ,800. .

Таким образом, в приведенном ниже примере для пробы 1, смотрящей на лицо, должно быть выведено что-то вроде: время до первой фиксации = 1; продолжительность первой фиксации =250; общая продолжительность фиксации = 2116,667

Я хотел бы сделать это для каждого испытания и каждого AOI. Помощь в создании цикла для серии тематических файлов и сохранении вывода для каждой отдельной темы также будет очень признательна.

Спасибо за ваше время и внимание! Береги себя, Кэролайн

df1 <- data.frame(Participant = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ), 
Trial = c(1,1,1,1,2, 2,2,2,2,2), 
FixationDuration = c(250, 950, 250, 666.6666667, 216.6666667, 383.3333333, 433.3333333, 500, 383.3333333, 550),
StartTimeforFixation= c(1, 301, 1284, 1584, 2301, 2567, 3001, 3484, 4034, 4451), 
EndTimeforFixation = c(250, 1250, 1533, 2250, 2516, 2950, 3433, 3983, 4416, 5000),
mean_x = c(0.464453,  0.499141, 0.491302, 0.496063, 0.491435, 0.494063, 0.498093, 0.487845, 0.492093, 0.497614),
mean_y = c(0.638584, 0.515769, 0.604171, 0.685817, 0.546331, 0.70222,0.528106, 0.615643, 0.551993, 0.661424),
POGsdSacAmp = c(4.84E-05, 0.000103, 6.69E-05, 0.000111, 0.000118, 0.000108, 
7.15E-05, 7.31E-05, 6.76E-05, 7.10E-05),
RMS = c(6.61E-05, 0.000128, 7.89E-05, 8.27E-05, 0.000156, 0.000151, 7.85E-05, 6.91E-05,  8.86E-05, 9.17E-05))


person Caroline    schedule 20.09.2020    source источник
comment
Как вы придумали total fixation duration = 2116.667? А как вы учитываете AOI, вы фильтруете по mean_x и mean_y?   -  person Alexlok    schedule 21.09.2020
comment
Привет! Спасибо Вам за Ваш вопрос. Я рассчитал это на основе предположения в текущем примере, что все фиксации приземлились в области области aoi лица (на основе среднего x и среднего значения y, что означает, что он должен быть между нижним и верхним диапазоном для местоположения aoi). Затем я суммировал все фиксации для пробной версии, что дало 2116 миллисекунд.   -  person Caroline    schedule 21.09.2020
comment
Нахожу 2113, поэтому и спрашиваю. В любом случае, я публикую ответ (скоро), посмотрите, почему это несоответствие.   -  person Alexlok    schedule 22.09.2020


Ответы (1)


Используя dplyr, этого можно легко добиться путем группировки.

library(tidyverse)
df1 <- tibble(Participant = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ), 
                  Trial = c(1,1,1,1,2, 2,2,2,2,2), 
                  FixationDuration = c(250, 950, 250, 666.6666667, 216.6666667, 383.3333333, 433.3333333, 500, 383.3333333, 550),
                  StartTimeforFixation= c(1, 301, 1284, 1584, 2301, 2567, 3001, 3484, 4034, 4451), 
                  EndTimeforFixation = c(250, 1250, 1533, 2250, 2516, 2950, 3433, 3983, 4416, 5000),
                  mean_x = c(0.464453,  0.499141, 0.491302, 0.496063, 0.491435, 0.494063, 0.498093, 0.487845, 0.492093, 0.497614),
                  mean_y = c(0.638584, 0.515769, 0.604171, 0.685817, 0.546331, 0.70222,0.528106, 0.615643, 0.551993, 0.661424),
                  POGsdSacAmp = c(4.84E-05, 0.000103, 6.69E-05, 0.000111, 0.000118, 0.000108, 
                                  7.15E-05, 7.31E-05, 6.76E-05, 7.10E-05),
                  RMS = c(6.61E-05, 0.000128, 7.89E-05, 8.27E-05, 0.000156, 0.000151, 7.85E-05, 6.91E-05,  8.86E-05, 9.17E-05))

Во-первых, нам нужно вычислить отдельные длительности:

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation)
# A tibble: 10 x 10
#   Participant Trial FixationDuration StartTimeforFixat~ EndTimeforFixati~ mean_x mean_y POGsdSacAmp     RMS fix_time
#   <chr>       <dbl>            <dbl>              <dbl>             <dbl>  <dbl>  <dbl>       <dbl>   <dbl>    <dbl>
# 1 A               1             250                   1               250  0.464  0.639   0.0000484 6.61e-5      249
# 2 A               1             950                 301              1250  0.499  0.516   0.000103  1.28e-4      949
# 3 A               1             250                1284              1533  0.491  0.604   0.0000669 7.89e-5      249
# 4 A               1             667.               1584              2250  0.496  0.686   0.000111  8.27e-5      666
...

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

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

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation) %>%
  group_by(Participant, Trial) %>%
  summarize(tot_duration = sum(fix_time))
# A tibble: 2 x 3
# Groups:   Participant [1]
#  Participant Trial tot_duration
#  <chr>       <dbl>        <dbl>
#1 A               1         2113
#2 A               2         2460

Конечно, в операторе summarize вы также можете вычислить mean(), var(), sd() или что-то еще, что вас интересует.

Теперь, что вы должны сделать, чтобы вычислить статистику испытаний только в нужной области? Вы можете использовать filter перед вычислением:

df1 %>%
  mutate(fix_time = EndTimeforFixation - StartTimeforFixation,
         AOI_face = (mean_x >= .100 & mean_x <= .500 & mean_y >= .100 & mean_y <= .800),
         AOI_eyes = (mean_x >= .200 & mean_x <= .300 & mean_y >= .500 & mean_y <= .600)) %>%
  filter(AOI_face) %>%
  group_by(Participant, Trial) %>%
  summarize(tot_duration = sum(fix_time))

Здесь я предполагаю, что одно испытание может быть в нескольких AOI. Если вместо этого вы назначите один AOI для каждого испытания, вы захотите создать один столбец AOI со значениями face, eyes, ... и group_by(Participant, Trial, AOI) для вычисления среднего значения для каждого.

Наконец, для сохранения результатов на диск я бы рекомендовал write_csv().

person Alexlok    schedule 21.09.2020
comment
Привет Алекс, это здорово! Благодарю вас! Это работает для определения продолжительности посещения. Я полагаю, что различия в наших ответах связаны с тем, что я использовал переменную продолжительности, а вы рассчитали ее путем вычитания времени окончания из времени начала. Есть ли у вас какие-либо мысли о том, как выбрать продолжительность первой фиксации и время до первой фиксации для каждого испытания? Большое спасибо еще раз! Заботиться. - person Caroline; 22.09.2020
comment
А как насчет first() (все еще в dplyr)? Вы можете использовать его внутри summarize(). - person Alexlok; 23.09.2020
comment
Это сработало отлично! Большое спасибо за вашу помощь! - person Caroline; 07.10.2020