| Наименование программы | Цифровой анализ медицинских данных |
| ФИО студента | Штарк Андрей Константинович |
| Учебная группа | ХББО-03-20 |
#Cоблюдая следующие правила:*
- Минимум 2 переменные являются
числовыми непрерывными
- Минимум 1 из переменных намеренно содержит
пропуски данных
- Минимум 1 из переменных представляет собой
бинарную категорию (например, есть признак (1) или нет (0)).
#Специально для данной работы сгенерируем набор исходных данных,
состоящий из 4 переменных: x1, x2, y1,
y2. Переменные x сгенерируем независимо, а вот переменные
y1 и y2 зададим формулами:
\[y_1~ = 4*x_1+1+\varepsilon_1,\]
\[y_2~ = (4*x_2+1+\varepsilon_2)\% 2,\]
где % - остаток от деления.
#Это позволит применить к данным различные методы анализа, результаты
которых можно будет соотнести с известной формулой генерации этих
элементов.
#Специально заменим в полученных переменных в пяти процентах строк от одного до трех значений на N/A для удовлетворения исходным условиям задания. В итоге получаем таблицу значений. Пример и описание первых шести строк из нее:
# раскомментируйте для установки пакетов
# install.packages("data.table")
# install.packages("ggplot2")
# install.packages("dplyr")
library(data.table)
library(ggplot2)
library(dplyr)
##
## Присоединяю пакет: 'dplyr'
## Следующие объекты скрыты от 'package:data.table':
##
## between, first, last
## Следующие объекты скрыты от 'package:stats':
##
## filter, lag
## Следующие объекты скрыты от 'package:base':
##
## intersect, setdiff, setequal, union
#Установим зерно генерации значений
set.seed(2002)
#Сгенерируем независимые переменные x1 и x2
x1 <- rnorm(2002, mean = 10, sd = 2)
x2 <- runif(2002, min = 0, max = 30)
#Сгенерируем ошибки epsilon_1 и epsilon_2
e1 <- rnorm(2002, mean = 0, sd = 1)
e2 <- rnorm(2002, mean = 0, sd = 2)
#Сгенерируем независимые переменные y1 и y2
y1 <- 4*x1+1+e1
y2 <- round(4*x2-1+e2, digits = 0)%%2
#Объединить данные в data.frame
data_0 <- data.frame(x1, x2, y1, y2)
#Сгенерируем номера строк, в которых будут пропуски
lines_w_na <- sample(x = 1:nrow(data_0),
size = nrow(data_0)*0.05,
replace = FALSE)
#Для каждой строки с пропуски
for (line in lines_w_na) {
# выбираем до 3 колонок (случайным образом) и заменяем значения в них на NA
data_0[line, sample(1:ncol(data_0),
size = sample(1:3, 1, replace = FALSE))] <- NA
}
head(data_0)
#В рамках данного пункта необходимо выполнить так называемую
“предобработку” данных. В предобработку данных включают следующие
шаги:
1. Проверка качества данных, в т.ч. на наличие пропусков и
соответствия типов данных заявленным.
2. В случае
неудовлетворения качеством проводят мероприятия по улучшению качества
данных.
3. Рассматривают основные характеристики переменных с точки
зрения совокупного представления, в т.ч. на соразмерные величины
переменных.
4. В случае неудовлетворенности проводят мероприятия по
улучшению качества данных.
#Для проверки качества данных уточним, какое количество строк в наших данных содержат пропуски значений (N/A): 100
#Так как значение не равно 0, но при этом мало относительно общего количества наблюдений, можно удалить некачественные наблюдения:
#Удаляем строки, содержащие пустые ячейки
data_0 <- data_0[complete.cases(data_0), ]
#Проверим и выводим количество строк, содержащих пустые значения
cat("Осталось наблюдений: ", nrow(data_0), "\nКоличество строк с отсутствующими значениями: ", sum(!complete.cases(data_0)))
## Осталось наблюдений: 1902
## Количество строк с отсутствующими значениями: 0
#Так как для некоторых методов анализа данных важно измерять переменные в сопоставимых единицах, рассмотрим основные характеристики полученного набора переменных:
summary(data_0)
## x1 x2 y1 y2
## Min. : 3.323 Min. : 0.006466 Min. :13.37 Min. :0.0000
## 1st Qu.: 8.696 1st Qu.: 7.620653 1st Qu.:35.78 1st Qu.:0.0000
## Median : 9.997 Median :15.128466 Median :41.13 Median :1.0000
## Mean :10.021 Mean :15.147831 Mean :41.10 Mean :0.5216
## 3rd Qu.:11.405 3rd Qu.:22.713962 3rd Qu.:46.62 3rd Qu.:1.0000
## Max. :16.330 Max. :29.999799 Max. :67.12 Max. :1.0000
Как видим из результата, переменные представлены в сопоставимой форме, то есть нет необходимости в проведении нормализации данных, либо их масштабировании
В контексте визуализации данных всегда важно помнить о конечной цели визуализации, то есть необходимо понять, что же именно мы хотим с помощью нее показать. Рассмотрим две основных визуализации, которые более остальных могут дать представление, как о структуре отдельных переменных, так и об их взаимосвязи
Данная визуализация способна показать основную структуру переменных относительно их распределения, то есть по ней можно сделать выводы о средних значениях переменной, квартилях, размахе данных и наличии выбросов (отмечаются специальным образом).
Построим боксплот диаграммы для переменной x1:
data_0 %>%
select(x1) %>%
ggplot(aes(y = x1)) +
geom_boxplot() +
labs(x = "", y = "x1",
title = "Боксплот для переменной x1") +
theme(axis.text.x = element_blank())
Аналогично построим для переменной x2:
Построим диаграммму рассеивания по каждой из возможных взаимосвязей переменных:
data_0 %>%
select(x1, x2) %>%
ggplot(aes(x = x1, y = x2)) +
geom_point() +
labs(x = "x1",
y = "x2", title = "Диаграмма рассеивания x2 от x1")
Аналогично поступим для прочих пар переменных:
По итогам визуализации можем увидеть основную структуру переменных x1 и x2, в том числе, основное распределение, средние величины и некоторые дополнительные характеристики. Основной интерес в данном случае представляют диаграммы рассеивания. Как видим из диаграмм, вероятнее всего, отсутствует связь между любыми парами переменных, кроме y1 и x1 соответственно. Это можно понять по характеру графика, но можно проверить это и по формальным признакам в дальнейшем.
Для построения линейной регрессии желательно, чтобы к ней были какие-то предпосылки, например, через проведение корреляционного анализа.
Прежде чем перейти к построению модели линейной регрессии найдем парные коэффициенты корреляции для заданных переменных, чтобы определить, какая из пар предположительно будет обладать взаимосвязью
data_0 %>%
select(x1, x2, y1, y2) %>%
cor()
## x1 x2 y1 y2
## x1 1.000000000 -0.00886994 0.992245286 0.004952008
## x2 -0.008869940 1.00000000 -0.012431607 -0.026445714
## y1 0.992245286 -0.01243161 1.000000000 0.001590215
## y2 0.004952008 -0.02644571 0.001590215 1.000000000
Как видим из матрицы, есть сильная зависимость между переменными y1 и
x1, что было видно и из построенной диаграммы рассеивания.
Таким образом, возьмем переменную y1 в качестве зависимой переменной и проведем построение модели линейной регресии.
model <- lm(y1~x1, data = data_0)
summary(model)
##
## Call:
## lm(formula = y1 ~ x1, data = data_0)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.9612 -0.6739 -0.0039 0.6541 3.1264
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.9871 0.1176 8.396 <2e-16 ***
## x1 4.0033 0.0115 347.970 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.005 on 1900 degrees of freedom
## Multiple R-squared: 0.9846, Adjusted R-squared: 0.9845
## F-statistic: 1.211e+05 on 1 and 1900 DF, p-value: < 2.2e-16
Как видим по p-value коэффициенты модели и сама модель значимы, так как отвергается нулевая гипотеза о равенстве коэффициентов нулю и об одновременной незначимости коэффициентов модели.
Получим прогноз для сгенерированных значений переменной x1 и разместим их на графике рассеивания для y1-x1:
plot(x=predict(model), y=data_0$y1,
xlab='Прогнозируемые значения',
ylab='Реальные значения',
main='График сравнения прогнозируемые и реальных значений функции')
abline(a = 0 , b = 1 )
Как видим из графика, полученная модель является точной, что еще раз подтверждает выводы, полученные по итогам оценки формальных критериев модели линейной регрессии.
В результате проделанной работы нам на практике удалось еще раз убедиться в работоспособности основных методов анализа данных. Данные методы могут быть использованы в различных сферах деятельности, в том числе и для анализа медицинских данных. Работа с медицинскими данными, конечно, подразумевает некоторые особенности, касаемые сбора, хранения, передачи и обработки, но при этом вполне свободно подчиняется основным статистическим/экономическим законам.