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
Поработаем с регулярным выражениями. У нас есть вектор с датами, которые указаны в совершенно разных форматах. Кроме того, некоторые из них явно содержать ошибки. Напишем регулярку, которая позволить отобрать корректные даты.
<- c('21.92.2001', '19.11.12', '16.o1.2001', '01.04.1994', '5-3-2011', '6/04/1999') dates
В заданиях 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
, в которой будет обозначено с помощью логического значения, является ли клик в данной пробе верным. - Рассчитайте точность кликов каждого респондента в каждом из сочетаний экспериментальных условий.
Описание формата инпута.