Найти в Дзене

ГЕНЕРАТОР ЗАДАНИЙ

Каждый год я стараюсь придумать для своих студентов что-нибудь этакое. То приплетаю к математическим методам экспериментальную психологию, то начинаю объяснять на котиках. А в последний раз я выдал каждому студенту индивидуальную таблицу с данными. Там, описательную статистику посчитать, доказательную… Индивидуальность гарантировала, что студент никоим образом не сможет получить правильный ответ, кроме как решив задачу.

Была, впрочем, проблема - генерация таких датасетов через Excel занимала много времени. Нужно же сделать все правдоподобно - одни показатели должны коррелировать друг с другом, другие нет. Да и потом это все самостоятельно нужно было порешать. В общем - сложно.

Но в этом году у меня произошел качественный рывок - я вплотную познакомился с программированием на R (кстати, благодаря этому курсу). А это значит, что вместо того, чтобы делать все руками, можно написать программу, которая сгенерирует датасеты за меня. И вторую - которая все это решит (для моих студентов - её здесь нет).

Значит, легенда, такая - учащимся дается база данных об успеваемости студентов за 4 года (это для мер различий для связанных выборок). Кроме того - здесь есть ряд факторов, которые могут быть связаны с успеваемостью: интеллект, экстраверсия, нейротизм, добросовестность, доброжелательность, открытость опыту (все количественные), пол и студенческая группа (качественные).

Принцип довольно простой. Первым шагом мы генерируем успеваемость за первый год вот таким кодом, создающим нормально распределенную переменную.

usp1=rnorm(200,mean=60,sd=10)
usp1=sort(usp1)

Этот код создает выборку в 200 человек из нормально распределенной генеральной совокупности, со средним значением успеваемости в 60 и стандартным отклонением в 10. Далее мы начинаем генерировать остальные переменные. Например, интеллект. Если мы хотим, чтобы связь была нулевая, то используем такой код.

intellect=rnorm(200,mean=105,sd=5)

Если мы хотим, чтобы у нас была умеренная корреляция - то добавляем такую конструкцию

intellect=sort(intellect)
intellect=intellect+sample(-10:30,200,replace = T)

Первая команда сортирует новую переменную в порядке возрастания. Корреляция между интеллектом и успеваемостью будет равна 1 (чем больше одно, тем больше другое). Если добавить в скобки параметр decreasing=T, то связь превратиться в обратную (чем больше, тем меньше).

Вторая команда прибавляет к каждому значению интеллекта случайное число от -10 до 30. Чем больше будет разброс между двумя этими числами, тем меньше будет абсолютное значение коэффициента корреляции. Также, очевидно, что если второе число будет по модулю больше первого (как в примере), то вы получите сдвиг значений в правую сторону.

Проверять корреляции и сдвиги можно с помощью вот этих команд.

cor(intellect,usp1)
t.test(intellect,usp1,paired = T)

Качественные переменные можно генерировать с помощью вот такого блока команд.

group=sample(x = c(2,3),200,replace = T)
group=sort(group)
group=group+sample(x = c(1,2),200,replace = T)

На выходе получаются цифры, к которым, потом, разумеется надо дать пояснения (типа 1 - "Группа клинических психологов", 2 - "Группа общих психологов" и т.д.).

После того, как мы сгенерировали все переменные, которые хотели, нужно их объединить и сохранить. Делается все это с помощью вот такой команды.

df=data.frame('Успеваемость_1'=usp1,'Успеваемость_2'=usp2, 'Успеваемость_3'=usp3, 'Успеваемость_4'=usp4, 'Интеллект'=intellect, 'Экстраверсия'=ext, 'Нейротизм'=neyro, 'Доброжелательность'=dobrzh, 'Добросовестность'=dobro, 'Открытость_опыту'=otkr, 'Пол'=sex, 'Группа'=group)

df=round(df)
write_xlsx(df,paste0(i,'.xlsx'))

Первая команда делает из всего этого таблицу с данными. Вторая - округляет значения до целых. А третья - сохраняет в xlsx файл (правда для этого нужна библиотека writexl).

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

names=readLines('ФИО.csv')
for (i in names) {
КОД ГЕНЕРАТОРА}

Первая команда считывает из файла имена студентов. Вторая - генерирует каждому таблицу.

Теперь все действительно готово.

Сразу скажу - полный код я выкладывать не буду. По разным причинам. В том числе и потому что его можно использовать в неправедных целях. Но если вы являетесь преподавателем статистики или матметодов и хотите привнести в свои занятия индивидуальный подход - напишите мне в ВК или на почту, и я без проблем его вам вышлю.

Подписывайтесь на Яндекс.Дзен и вступайте в группу ВК.