P4 // Предобработка данных

Пакет с пакетами

Для выполнения заданий этой практики потребуется tidyverse.

install.packages("tidyverse")
library(tidyverse)
Сегодня на ужин экспериментальные данные

В исследовании изучался зрительный поиск иконок различных платформ смартфонов. Испытуемым надо было искать иконки поделиться (share) iOS и Android среди дисктракторов — других иконок, которые для обеих платформ отрисованы одинаково. Целевой стимул мог быть один — два условия: иконка iOS (Outgoing Tray) и иконка Android (Three Dots) — или их могло быть два — и тот, и другой. Дополнительно варьировалось количество стимулов в пробе — 8, 12, 16. Фиксировалось время поиска целевого стимула (время реакции) — от начала пробы до клика испытуемого — а также координаты клика. Дополнительно были записаны данные об используемой платформе смартфона — iOS или Android.

Основные задания

#1

Скачайте архив с данными и разархивируйте его в проект курса.

Сколько файлов данных есть в нашем распоряжении?

Описание формата инпута.

Подсказка

dir() + length()

#2

Поскольку все данные собирались на одном и том же ПО, справедливо предположить, что структура всех файлов одинакова. Поработаем сначала с одним из них. Например, с первым.

Загрузите данные из файла 01.xlsx в R. Изучите их структуру.

Описание формата инпута.

Подсказки
  • Формат файла данных — таблица Excel. Для её чтения есть специальные функции. Например, read_xlsx() из пакета readxl.
  • У файлов Excel есть одна особенность организации — в них может быть несколько датасетов одновременно. Изучите документацию функции read_xlsx, чтобы выяснить, как справиться с этой ситуацией.

#3

Для анализа данных нам нужны не все колонки, которые записал PsychoPy, а только следующие:

  • независимые переменные:
    • trialtype — тип пробы (какой был целевой стимул) (tray — Outgoing Tray, dots — Three Dots, both — оба)
    • setsize — количество стимулов в пробе (8, 12, 16)
  • зависимые переменные (или те переменные, на основе которых мы их посчитаем):
    • mouse_main1.time_raw — время до первого клика (s)
    • mouse_main1.x_raw — координата x первого клика (px)
    • mouse_main1.y_raw — координата y первого клика (px)
    • mouse_main2.time_raw — время до второго клика (s)
    • mouse_main2.x_raw — координата x второго клика (px)
    • mouse_main2.y_raw — координата y второго клика (px)
  • numtrial —- номер пробы в исходном файле с координатами

Отфильтруйте из данных необходимые переменные.

Описание формата инпута.

Подсказка

select()

#4

Поскольку работая с тибблом удобно обращаться к переменным по имени, полезно будет их переименовать, ибо обращаться по дефолтным именам совершенно неудобно.

Переименуйте отобранный колонки так, чтобы они назывались:

  • time1 — время до первого клика (s)
  • click1x — координата x первого клика (px)
  • click1y — координата y первого клика (px)
  • time2 — время до второго клика (s)
  • click2x — координата x второго клика (px)
  • click2y — координата y второго клика (px)

Описание формата инпута.

Подсказка

rename()

#5

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

Описание формата инпута.

Подсказкa

sapply(is.na) %>% apply(2, sum)

#6

Так как в эксперименте не было ограничения времени на ответ, обнаруженные пропуски имеют исключительно техническое происхождение и связаны с тем, как PsychoPy записывает данные в Excel-формат. После основного датасета он пропускает строчку и дописывает 8 строк служебной информации.

Так как в отобранных колонках этой информации нет, мы можем смело отрезать последние 9 строк датасета. Известно, что в эксперименте было всего 450 проб, а в аутпуте PsychoPy пишет в каждой строке одну пробу. Таким образом из данных нам нужны первы 450 строк.

Отберите необходимые строки из данных.

Описание формата инпута.

Подсказка

slice()

#7

Для анализа нам будут нужны не все пробы, а только те, в которых экспериментальное условие было tray или dots. Это связано с тем, что пробы both содержали два целевых стимула, и их анализ будет отличаться от остальных.

Отберите необходимые строки из данных.

Описание формата инпута.

Подсказка

filter()

#8

Мы почти привели наши данные к опрятному виду — осталось добавить индентификатор, чтобы мы могли различить данные разных испытуемых.

Добавьте в датасет столбец id, в котором будет содержаться значение 1 во всех строках, так как это данные первого испытуемого.

Описание формата инпута.

Подсказка

mutate()

#9

Отлично! Мы причесали наши данные. Теперь нам надо провернуть всё то же самые с остальными файлами. Чтобы оптимизировать этот процесс, давайте обрнем написанный нами код в функцию.

Напишите функцию, которая будет осуществлять предобработку данных. Функция должна принимать на вход два аргумента:

  • путь к файлу данных
  • id испытуемого

Функция должна загружать данные и производить их предобработку аналогично тому, что мы делали в заданиях выше.

Функция должна возвращать предобработанный датасет, соответствующий виду, который мы получили в предыдущем задании.

Проверьте, как отбработает функция на файле 02.xlsx.

Описание формата инпута.

#10

Наша конечная цель — получить единый датасет из всех данных, которые у нас в наличии. Мы уже добились того, что наша функция возвращает нам ровный и красивый tibble. Осталось лишь поставить их тибблы друг на друга, чтобы получить то, что нам нужно.

Объедините резльтаты предобработки данных 01.xlsx и 02.xlsx в один объект.

Описание формата инпута.

Подсказка

bind_rows()

#11

Всё готово для того, чтобы собрать итоговый датасет.

Напишите цикл, в котором данные будут загружаться, предобрабатываться и объединяться в объект share.

Описание формата инпута.

Подсказка

Ошибка? Посмотрите, что за файлы лежат в папке с данными.

#12

Изучите структуру получившихся данных. Проверьте, совпадает ли число индентификаторов с количеством данных.

Описание формата инпута.

#13

  • Отсортируйте датасет по номеру пробы (numtrial) от первого до последнего.
  • Отсортируйте датасет по номеру пробы (numtrial) и идентификатору испытуемого (id).

Описание формата инпута.

Подсказка

arrange()

#14

Проверьте, все ли сочетания экспериментальных условий — trialtype и setsize — представлены в датасете.

Описание формата инпута.

Подсказка

distinct()

#15

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

Загрузите данные о платформе в объект platform.

Описание формата инпута.

#16

Чтобы наши данные содержали все переменные, которые фиксировались в эксперименте, нам необходимо объединить датасеты share и platfrom. При этом объединение необходимо произвести так, чтобы совпали id между датасетами, так как строки с одним и тем же индентификатором относятся к одному и тому же испытуемому.

Объедините датасеты share и platform по переменной id. Перезапишите объект share.

Описание формата инпута.

Подсказка

..._join()

#17

Супер! Наши данные готовы к тому, чтобы мы что-нибудь на них посчитали.

Для анализа нам необходимо аггрегироваь данные — посчитать среднее время реакции и его стандартное отклонение по всем сочетаниям условий для каждого респондента. Для этого нам понадобится группировка. Разберемся сначала с ней отдельно.

Сгруппируйте датасет share по идентификатору испытуемого.

Что изменилось в датасете?

Описание формата инпута.

Подсказка

group_by()

#18

Рассчитайте среднее время реакции и его стандартное отклонение по всем сочетаниям условий для каждого респондента на данных share. Результат сохраните в объект share_agg.

Описание формата инпута.

Подсказка

group_by() %>% summarise(), summarise(..., .by = ...)

#19

  1. Переведите данные share_agg в длинный формат.
  2. Переведите данные share_agg в широкий формат так, чтобы в каждой колонке было среднее время реакции для одного из условий переменной setsize.

Описание формата инпута.

Подсказки

pivot_longer(), pivot_wider()

#20

Экспортируйте результат аггрегации данных в задания 18 в формате CSV.

Описание формата инпута.

Подсказка

write_csv()

Дополнительные задания

#1

Поработаем с регулярным выражениями. У нас есть вектор с датами, которые указаны в совершенно разных форматах. Кроме того, некоторые из них явно содержать ошибки. Напишем регулярку, которая позволить отобрать корректные даты.

dates <- c('21.92.2001', '19.11.12', '16.o1.2001', '01.04.1994', '5-3-2011', '6/04/1999')

В заданиях 1–5 будем работать с форматом даты dd.mm.yyyy. Проверять работу регулярный выражений будем с помощью функции str_detect().

Создайте вектор dates с помощью кода выше.

Описание формата инпута.

#2

Напишите регулярное выражение, которое будет отбирать даты с точками. Проверьте корректность её работы.

Описание формата инпута.

#3

Напишите регулярное выражение, которое будет отбирать даты, в которых между точками содержатся только цифры. Проверьте корректность её работы.

Описание формата инпута.

#4

Напишите регулярное выражение, которое будет отбирать даты, в которых между точками будет содержатся только определенное количество цифр — две в дне, две в месяце и четыре в году. Проверьте корректность её работы.

Описание формата инпута.

#5

Напишите регулярное выражение, которое будет отбирать даты, в которых между точками будет содержатся только определенное количество цифр — две в дне, две в месяце и четыре в году — при этом в первой цифре дня и месяца могуть встречаться только допустимые цифры. Проверьте корректность её работы.

Описание формата инпута.

#6

Отлично! С регулярками понакомились. Теперь задачка посерьезнее.

По ссылке лежит файл CSV, в котором перечислены названия файлов данных некоторого эксперимента. Названия имеют следующую структуру:

000AAAA_entire_exp_2022-06-01_15h12.27.341.csv
  • 000AAAA — идентификатор респондента
  • entire_exp — название файла эксперимента
  • 2022-06-01 — дата прохождения эксперимента
  • 15h12.27.341 — время начала эксперимента (с точностью до миллисекунд).

Загрузите данные в объект fls. Добавьте к имеющейся колонке file:

  • колонку id, в которой будет содержаться идентификатор респондента, извлеченный из названия файла
  • колонку datetime, в которой будут содержаться дата и время прохождения эксперимента (без миллисекунд), извлеченные из названия файла (формат оставьте без изменения).

Перезапишите объект fls.

Описание формата инпута.

#7

Приведите содержимое колонки datetime к формату yyyy-mm-dd hh:mm:ss. Перезапишите объект fls.

Описание формата инпута.

#8

Экспортируйте получившийся датасет fls в формате CSV.

Описание формата инпута.

#9

Возьмите датасет share из задания 16 и объедините его с данными из файла targetpositions.xlsx, с которым мы сталкивались, когда запускали цикл.

Перезапишите объект share.

Описание формата инпута.

#10

В этом файле targetpositions.xlsx содержатся координаты, в которые должен был попасть испытуемый при клике на целевой стимул. Нам интересуют столбцы posxmin1, posixmax1, posymin1 и posymax1.

Первые два задают границы клика по горизонтали, а вторые два — по вертикали. Если координаты клика испытуемого попадают вэти диапазоны, то клик считается верным. Если не попадают, то клик ошибочен.

  1. Добавьте в датасет share колонку correct, в которой будет обозначено с помощью логического значения, является ли клик в данной пробе верным.
  2. Рассчитайте точность кликов каждого респондента в каждом из сочетаний экспериментальных условий.

Описание формата инпута.