install.packages("tidyverse")
library(tidyverse)P4 // Предобработка данных
Для выполнения заданий этой практики потребуется 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
- Переведите данные
share_aggв длинный формат. - Переведите данные
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.
Первые два задают границы клика по горизонтали, а вторые два — по вертикали. Если координаты клика испытуемого попадают вэти диапазоны, то клик считается верным. Если не попадают, то клик ошибочен.
- Добавьте в датасет
shareколонкуcorrect, в которой будет обозначено с помощью логического значения, является ли клик в данной пробе верным. - Рассчитайте точность кликов каждого респондента в каждом из сочетаний экспериментальных условий.
Описание формата инпута.