Можно считать, что распределение случайной величины X – результаты теста IQ – является нормальным. В большинстве современных исследований средний результат равняется 100 баллам, а стандартное отклонение – 15 баллам. В какой вероятностью случайно выбранный человек, пройдя тест IQ, наберет:
меньше, чем 50, 70, 80, 90, 100, 110, 170 баллов?
больше, чем 50, 70, 80, 90, 100, 110, 170 баллов?
между 50 и 60, 70 и 80, 80 и 90, 90 и 100, 100 и 110, 110 и 120, 170 и 180 баллами?
Указания к решению задачи:
x <- c(50, 70, 80, 90, 100, 110, 120, 170)
Воспользуйтесь функцией pnorm()
для рассчета вероятностей. Не забывайте про аргументы!
Округлите значения вероятностей до 4 знака после запятой.
Результатом решения задачи должна стать таблица из 6 колонок:
Зачение случайной величины X,
P(X<xi),
P(X>xi),
Значение верхней границы для отрезка из пункта 3. Обратите внимание, значение случайной величины X везде является нижней границей отрезка, а длина отрезка всегда постоянна. Как можно преобразовать вектор значений случайной величины X, чтобы получить вектор значений верхних границ отрезка xupper?
P(X<xupper);
P(xi<X<xupper).
Объясните, почему P(90<X<100)=P(100<X<110).
Сохраните получившуюся таблицу в файл расширения .csv.
Комментарий. Для того, чтобы таблица открывалась в Excel, нужно воспользоваться функцией write.csv2()
.
Рассчитаем вероятности того, что X не превысит каждое из значений, данное в векторе x
, а затем округлим до 4 знака после запятой.
p_less_x <- pnorm(x, mean = 100, sd = 15, lower.tail = T)
p_less_x <- round(p_less_x, 4)
p_less_x
## [1] 0.0004 0.0228 0.0912 0.2525 0.5000 0.7475 0.9088 1.0000
Рассчитаем вероятности того, что X превысит каждое из значений, данное в векторе x
, а затем округлим до 4 знака после запятой. Это можно сделать двумя способами: прописав аргумент lower.tail = F
в функции pnorm()
или вычтя из единицы вектор вероятностей, который мы получили на прошлом шаге:
p_more_x <- pnorm(x, mean = 100, sd = 15, lower.tail = F)
p_more_x <- round(p_more_x, 4)
p_more_x
## [1] 0.9996 0.9772 0.9088 0.7475 0.5000 0.2525 0.0912 0.0000
Проверим, что сумма двух вероятностей действительно равна 1.
p_less_x + p_more_x
## [1] 1 1 1 1 1 1 1 1
Создадим вектор верхних границ отрезков из пункта три.
x_upper <- x + 10
x
## [1] 50 70 80 90 100 110 120 170
x_upper
## [1] 60 80 90 100 110 120 130 180
Рассчитаем значения функции распределения от верхних границ отрезков и округлим до 4 знака после запятой.
p_less_upper <- pnorm(x_upper, mean = 100, sd = 15, lower.tail = T)
p_less_upper <- round(p_less_upper, 4)
p_less_upper
## [1] 0.0038 0.0912 0.2525 0.5000 0.7475 0.9088 0.9772 1.0000
Рассчитаем вероятность P(xlower<X<xupper):
p_between <- p_less_upper - p_less_x
p_between
## [1] 0.0034 0.0684 0.1613 0.2475 0.2475 0.1613 0.0684 0.0000
Обратите внимание, что мы получили три пары одинаковых вероятностей. Так получается, потому что стандартное распределение симметрично относительно среднего, а у нас все отрезки равной длины.
Осталось собрать табличку. Это делается функцией data.frame()
:
df <- data.frame(values = x, p_less_x, p_more_x,
values_upper = x_upper, p_less_upper = p_less_upper,
p_between)
df
## values p_less_x p_more_x values_upper p_less_upper p_between
## 1 50 0.0004 0.9996 60 0.0038 0.0034
## 2 70 0.0228 0.9772 80 0.0912 0.0684
## 3 80 0.0912 0.9088 90 0.2525 0.1613
## 4 90 0.2525 0.7475 100 0.5000 0.2475
## 5 100 0.5000 0.5000 110 0.7475 0.2475
## 6 110 0.7475 0.2525 120 0.9088 0.1613
## 7 120 0.9088 0.0912 130 0.9772 0.0684
## 8 170 1.0000 0.0000 180 1.0000 0.0000
Откроем базу данных, содержащую результаты эксперимента, проведенного на первом практическом занятии. Мы можем загрузить базу напрямую из интернета:
df <- read.csv2("http://math-info.hse.ru/f/2018-19/psych-ms/data/psych_survey.csv")
Узнаем, сколько в базе наблюдений (первое значение) и переменных (второе значение):
dim(df)
## [1] 123 9
Посмотрим на структуру базы: какие переменные в ней содержатся и каких типов. Обратите внимание, что перед каждой переменной стоит знак $
– он используется для того, чтобы обращаться к переменной в базе:
str(df)
## 'data.frame': 123 obs. of 9 variables:
## $ height : num 169 168 164 158 186 ...
## $ math : int 76 62 80 75 62 70 NA 79 50 70 ...
## $ bio : int 96 79 94 77 74 65 68 69 63 79 ...
## $ subject : int 1 2 2 4 2 1 4 1 2 4 ...
## $ gender : int 2 1 1 1 2 1 2 1 2 1 ...
## $ residence: int 2 1 2 1 2 1 1 1 1 1 ...
## $ length : num 0 0 18 43 20 25 30 35 35 40 ...
## $ angle : num 0 0 11 12 15 15 15 15 15 15 ...
## $ soft : Factor w/ 2 levels "R","SPSS": 1 1 1 1 1 1 1 2 1 1 ...
Мы можем посмотреть на верхние 6 строчек базы, используя функцию head()
:
head(df)
## height math bio subject gender residence length angle soft
## 1 169.0 76 96 1 2 2 0 0 R
## 2 168.0 62 79 2 1 1 0 0 R
## 3 164.0 80 94 2 1 2 18 11 R
## 4 158.0 75 77 4 1 1 43 12 R
## 5 186.0 62 74 2 2 2 20 15 R
## 6 168.5 70 65 1 1 1 25 15 R
Можно попросить R показать первые n строчек:
head(df, 10)
## height math bio subject gender residence length angle soft
## 1 169.0 76 96 1 2 2 0 0 R
## 2 168.0 62 79 2 1 1 0 0 R
## 3 164.0 80 94 2 1 2 18 11 R
## 4 158.0 75 77 4 1 1 43 12 R
## 5 186.0 62 74 2 2 2 20 15 R
## 6 168.5 70 65 1 1 1 25 15 R
## 7 180.0 NA 68 4 2 1 30 15 R
## 8 176.0 79 69 1 1 1 35 15 SPSS
## 9 183.0 50 63 2 2 1 35 15 R
## 10 174.0 70 79 4 1 1 40 15 R
Аналогично мы можем посмотреть на нижние строчки в базе, используя функцию tail()
:
tail(df)
## height math bio subject gender residence length angle soft
## 118 169 70 77 2 1 1 20 45 R
## 119 150 70 77 2 2 2 20 45 R
## 120 176 56 78 4 1 2 25 45 R
## 121 175 77 86 5 1 1 5 50 R
## 122 163 74 96 2 1 2 3 60 R
## 123 163 74 96 2 1 2 3 60 R
tail(df, 10)
## height math bio subject gender residence length angle soft
## 114 160 84 60 1 1 1 24 38 R
## 115 189 59 70 1 1 2 26 38 R
## 116 170 72 60 1 1 2 25 40 SPSS
## 117 170 72 96 2 1 1 5 45 R
## 118 169 70 77 2 1 1 20 45 R
## 119 150 70 77 2 2 2 20 45 R
## 120 176 56 78 4 1 2 25 45 R
## 121 175 77 86 5 1 1 5 50 R
## 122 163 74 96 2 1 2 3 60 R
## 123 163 74 96 2 1 2 3 60 R
Иногда нам требуется отсортировать таблицу по какой-либо переменной. Это делается с помощью функции order()
. Обратите внимание на код ниже: в этой строчке мы просим R расположить строчки в таблице в соответствии с отсортированной переменнйо роста. (Если Вы просто прогоните команду order(df$height)
, то обнаружите, что у Вас отсортировалась не таблица, а только переменная):
sort <- df[order(df$height), ]
head(sort)
## height math bio subject gender residence length angle soft
## 23 145 99 100 4 3 1 25 20 R
## 119 150 70 77 2 2 2 20 45 R
## 111 151 70 92 4 1 1 23 35 R
## 70 152 NA NA 3 1 2 24 27 SPSS
## 72 156 68 77 5 1 3 19 28 SPSS
## 91 156 72 66 5 1 1 25 30 R
Мы можем сортировать наблюдения по убыванию. Для этого требуется поставить минус перед сортирующей переменной:
sort <- df[order(-df$height), ]
head(sort)
## height math bio subject gender residence length angle soft
## 14 190 72 86 2 2 2 24 18 R
## 115 189 59 70 1 1 2 26 38 R
## 30 187 84 89 1 2 1 25 20 SPSS
## 5 186 62 74 2 2 2 20 15 R
## 49 186 80 92 5 2 2 25 25 SPSS
## 94 185 70 88 2 2 2 35 30 R
Важная задача – посмотреть, как распределились респонденты по категориям ответов на вопросы, которые предлагают выбор из предложенных вариантов. Это делается с помощью подсчета частот.
Для начала посмотрим на распределение количества ответов по переменной гендера:
table(df$gender)
##
## 1 2 3 22
## 97 23 1 1
Мы заметили, что помимо ответов 1 – девушка и 2 – молодой человек у нас в базе оказались бессмысленные значения. Для корректной работы их нужно преобразовать: например, в пропущенные значения. Это делается следующим образом – мы производим замену в переменной внутри базы данных и сохраняем ее в ту же переменую внутри базы:
df$gender <- replace(df$gender, df$gender == 3 | df$gender == 22, NA)
table(df$gender)
##
## 1 2
## 97 23
Чтобы подсчитать частоты, нужно применить функцию prop.table()
к выдаче функции table()
. В строке ниже я вставляю функцию внутрь функции, а затем округляю получившийся результ до второго знака после запятой:
gender_table <- prop.table(table(df$gender))
round(gender_table, 2)
##
## 1 2
## 0.81 0.19
Для характеристики количественных переменных нам требуются более сложные инструменты (подумайте, почему нам не подходят таблицы частот?). Для этого используются описательные статистики. Их можно считать как для всей базы, так и для отдельных переменных. Выведем описательные статистики для переменной количества баллов ЕГЭ по математике.
summary(df$math)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 50.00 70.00 74.00 73.31 78.00 99.00 17
Выдача содержит максимальное и минимальное значение, нижнюю и верхнюю квартиль, медиану, среднее значение и количество пропущенных наблюдений.