HW2 // Матрицы и списки. Функции

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

#1

Сгенерируйте две матрицы, которые будут содержать по 50 выборок, объемом по 70 наблюдений, из генеральной совокупности, в которой распределение некоторого признака подчиняется нормальному распределению (rnorm()) с параметрами mean = 20.5 и sd = 3.48. Каждой выборке в матрице должен соответствовать один столбец. Сохраните результаты генерации в перемененые sim1 и sim2.

Ослабим контроль случайности

Так как задание подразумевает генерацию случайных чисел, для воспроизводимых результатов нужно установить зерно датчика случайных чисел. Однако нам нужно сгенерировать две разные матрицы — нет смысла работать с двумя одинаковыми. Если же мы установим одинаковое зерно датчика перед обоими строками с генерацией матриц, то получим как раз две одинаковые матрицы. Поэтому в данном задании set.seed нужно выполнить один раз перед двумя последующими генерациями. Шаблон кода будет выглядеть так

set.seed(420)
sim1 <- ...
sim2 <- ...

Автопроверка настроена на результаты, получаемые при значении зерна датчика случайных чисел set.seed(420).

В качестве самопроверки введите значения из первой строки первого солбца первой и второй матриц (иммено в таком порядке). Значения округлите до сотых по арифметическим правилам и разделите запятой. Проверка игнорирует все пробелы.

Подсказки
Как делать задание?
  • Используя функцию rnorm() нужно сгенерировать вектор, длиной равной количеству выборок, умноженному на количество наблюдений в одной выборке.
  • Затем «сложить» вектор в матрицу, размером число наблюдений в выборке × число выборок.
  • Сохранить результат генерации в переменную sim1.
  • Повторить шаги генерации и сохранить результат в переменную sim2.
Ответ неверный
  • Проверьте, выполнили ли вы строчку строчку с установкой зерна датчика случайных чисел перед генерацией вектора.
  • Проверьте, разделили ли вы значения запятой.
  • Проверьте округление — округлить необходимо по арифметическим правилам: \(9.434 \rightarrow 9.43, \, 9.435 \rightarrow 9.44\).

#2

Напишите функцию mean_sd, которая будет вычислять среднее (mean()) и стандартное отклонение (sd()) по всем выборкам (столбцам) одной матрицы.

Функция должна принимать на вход матрицу произвольного размера и возвращать матрицу, в которой первой строкой будут средние по каждому столбцу матрицы, а второй — стандартные отклонения. Количество столбцов матрицы аутпута (результата работы функции) должно совпадать с количеством столбцов входной матрицы.

Для проверки корректности работы функции выполните её на матрице

\[ \pmatrix{1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9} \] В поле ответа введите сначала строку со средними, разделив их запятыми, затем точку с запятой, а затем строку со стандартными отклонениями, также разделив их запятыми. Проверка проигнорирует все пробелы, поэтому для удобства ввода можете их использовать.

Привет формата ответа:

1.2, 2.3, 3.4; 0.1, 0.2, 0.3.

Подсказки
Как делать задание?
  • В функции необходимо вызвать функцию apply() для расчета каждой из статистик — среднего и стандартного отклонения.
  • Результаты работы функций необходимо объединить в матрицу — можно воспользоваться matrix() или rbind().
  • При использовании matrix() необходимо указать число столбцов, которое равно числу столбцов входной матрицы.
Ответ неверный
  • Проверьте правильность создания или генерации тестовой матрицы.
  • Проверьте, разделили ли вы значения строк запятыми.
  • Проверьте, разделили ли вы строки матрицы точкой с запятой.

#3

Примените функцию, написанную в задании 2, к матрице sim1.

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

Подсказки
Как делать задание?
  • Необходимо вызвать созданную функцию mean_sd() на ранее сгенерированной матрице sim1.
  • Для округления можно использоваться функцию round(), где вторым аргументом указать 2.
Ответ неверный
  • Проверьте, разделили ли вы значения строк запятыми.
  • Проверьте, разделили ли вы строки матрицы точкой с запятой.
  • Проверьте округление — округлить необходимо по арифметическим правилам: \(9.434 \rightarrow 9.43, \, 9.435 \rightarrow 9.44\).

#4

Выполните t-тест на первых колонках матриц sim1 и sim2 и сохраните результат в переменную ttest_res.

t-тест выполняется с помощью функции t.test(), в которую необходимо передать в качестве аргументов два вектора. Синтаксис выглядит так:

t.test(vector1, vector2)

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

В качестве ответа для самопроверки введите t-значение (statistics), полученное при выполнении теста, округленная до сотых по арифметическим правилам.

Подсказки
Как делать задание?
  • Выделите первые колонки сгенерированных матриц sim1 и sim2
  • Передайте их в функцию t.test()
  • Сохраните результат работы функции в переменную ttest
  • Выведите содержимое переменной в консоль, чтобы получить значение для ввода в поле самопроверки.
Ответ неверный
  • Проверьте, что из матриц были выделены колонки.
  • Проверьте, что были выделены имеено первые колонки.
  • Проверьте, что в поле самопроверки вы вводите именно значение t-статистики.
  • Проверьте округление — округлить необходимо по арифметическим правилам: \(9.434 \rightarrow 9.43, \, 9.435 \rightarrow 9.44\).

#5

Извлеките из результатов t-теста оценки средних по выборкам (estimate), значение статистики (statistic) и p-value (p.value).

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

Подсказки
Как делать задание?
  • Изучите структуру переменной ttest — это список.
  • Проиндексируйте список с помощью имен его элементов.
  • Выведите значения в консоль.

#6

Объедините извлеченные значения в именнованый список. Названия элементов сохраните исходными — estimate, statistic и p.value соответственно.

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

Подсказки
Как делать задание?
  • Необходимо создать список, в который сохранить часть значений из переменной ttest.
  • Список должен состоять из трех элементов, которым необходимо присвоить при создании имена, указанные в задании.

#7

У нас есть кирпичики для сбора новой функции.

Основываясь на предыдущих заданиях, напишите функцию, которая выполняет серию t-тестов на соответствующих выборках (столбцах матриц). Сохраните функцию в переменную stat_testing.

Функция должна:

  • принимать на вход две матрицы
  • возвращать список, каждый элементов которого является результат одного t-теста
  • каждый результат t-теста также является списком и состоит из трех элементов — estimate, statistic и p.value (как в задании 6)

Пример синтаксиса функции и результата её работы на матрицах A и B:

\[ A = \pmatrix{1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9}, \quad B = \pmatrix{10 & 40 & 70 \\ 20 & 50 & 80 \\ 30 & 60 & 90} \]

stat_testing(A, B) # A and B both are matrices
[[1]]
[[1]]$estimate
mean of x mean of y 
        2        20 

[[1]]$statistic
        t 
-3.102219 

[[1]]$p.value
[1] 0.0878746


[[2]]
[[2]]$estimate
mean of x mean of y 
        5        50 

[[2]]$statistic
        t 
-7.755547 

[[2]]$p.value
[1] 0.0153293


[[3]]
[[3]]$estimate
mean of x mean of y 
        8        80 

[[3]]$statistic
        t 
-12.40888 

[[3]]$p.value
[1] 0.005968456

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

Подсказки
Как делать задание?
  • Необходимо создать функцию, аргументами которой будут две матрицы
  • Внутри функции должен быть цикл, который будет перебирать столбцы матриц и выполнять на них t-тест
  • Из результатов t-тесты необходимо извлекать три значения, аналогично заданию 6.
  • Извлеченные результаты должны сохраняться в список результатов, который необходимо создать в начале функции.
  • В конце тела функции с помощью return() нужно вернуть получившийся список с результатами.
  • Количество элементов списка результатов должно совпадать с числом колонок входных матриц.

#8

Выполните функцию из задания 7 на матрицах sim1 и sim2. Результат работы функции сохраните в переменную stat_testing_res.

Для самопроверки в качестве ответа введите среднее значение (estimate) по выборке y (mean of y) из 30-го t-теста, округленное до сотых по арифметическим правилам.

#9

Извлеките из списка stat_testing_res вектор p-значений (p.value).

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

Подсказки
Как делать задание?
  • Чтобы извлечь p-значения, необходимо выполнить функцию, которая извлекает p-значения, на элементах списка.
  • Используйте для этого функцию Map()
  • В качестве её первого аргумента пропишите анонимную функцию, которая вытаскивает элемент p.value из списка путем индексации по имени.
  • Функция Map() возвращается список, который необходимо превратить в вектор с помощью функции unlist().
Ответ неверный
  • Проверьте, что в вектор извлекаются именно p-значения.
  • Проверьте, что индексируете необходимый элемент вектора.
  • Проверьте округление — округлить необходимо по арифметическим правилам: \(9.434 \rightarrow 9.43, \, 9.435 \rightarrow 9.44\).

#10

Проверьте, сколько результатов тестов было статистически значимым. Считайте статистически значимым те результаты, где p-значение было меньше 0.05.

Для самопроверки в поле ниже введите получившееся значение.

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

#1

Модифицируйте функцию из задания 2, чтобы в её аутпуте строки были подписаны соответственно mean и sd.

Сохраните модифицированную функцию в переменную mean_sd_1.

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

#2

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

Сохраните модифицированную функцию в переменную mean_sd_2.

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

#3

Модифицируйте функцию из задания 7, чтобы:

  • она проверяла, совпадает ли количество столбцов во входных матрицах,
    • в случае совпадения выполняла свой основной код
    • в случае несовпадения заканчивала свою работу с ошибкой Number of columns does not match
  • можно было задать параметр paired для t-тестов с дефолтным значением таким же, как у функции t.test()

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

#4

Модифицируйте функцию из предыдущего задания, чтобы можно было использовать для статистических тестов не только функцию t.test(), но и другие. Функция должна без ошибок обрабатывать входные параметры внутренних статистических функций. Сохраните модифицированную функцию в переменную stat_testing_2.

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

#5

Напишите функцию, которая решает квадратные уравнения.

Квадратное уравнение задается тремя коэффициентами \(a\), \(b\) и \(c\):

\[ ax^2 + bx + c = 0 \]

Функция должна:

  • принимать на вход три аргумента — коэффициенты квадратного уравнения \(a\), \(b\) и \(c\)
    • коэффициент \(a\) является обязательным, иначе уравнение не является квадратным
      • значение \(a\) не может равняться нулю по той же причине — функция должна в этом случае выдать ошибку The equation is not quadratic
    • если какой-либо из коэффициентов \(b\) и \(c\) не передан в функцию, его значение считается равным нулю
  • возвращать именованный вектор решений квадратного уравнения
    • если два решения различны, необходимо вернуть оба с именами x1 и x2 в порядке возрастания
    • если два решения совпадают, необходимо вернуть только одно с именем x
    • если решений нет, необходимо вернуть пропущенное значение и сообщение No solutions

Известно, что уравнения вида \(x^2 + 1 = 0\) в общем случае корректны, и функция должна уметь их решать.

  • По умолчанию функция должна решать уравнение в вещественных числах.
  • Если пользователь хочет, чтобы уравнение решалось в комплексных числах, ему необходимо указать аргумент функции complex = TRUE.

Сохраните функцию в переменную quadeqsolve.

Примеры работы функции представлены ниже.

quadeqsolve(a = 1, b = -5, c = 4)
x1 x2 
 1  4 
quadeqsolve(b = -3, c = 2)
Error in quadeqsolve(b = -3, c = 2): argument "a" is missing, with no default
quadeqsolve(a = 0, b = -3, c = 2)
Error in quadeqsolve(a = 0, b = -3, c = 2): The equation is not quadratic
quadeqsolve(a = -4, c = 2)
        x1         x2 
 0.7071068 -0.7071068 
quadeqsolve(a = 3, c = 2)
No solutions
[1] NA
quadeqsolve(a = 3, c = 2, complex = TRUE)
          x1           x2 
0-0.8164966i 0+0.8164966i

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