Квалификационная работа

Наименование программы Цифровой анализ медицинских данных
ФИО студента Штарк Андрей Константинович
Учебная группа ХББО-03-20

1. Исходные данные

#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)

2. Предобработка данных

#В рамках данного пункта необходимо выполнить так называемую “предобработку” данных. В предобработку данных включают следующие шаги:
1. Проверка качества данных, в т.ч. на наличие пропусков и соответствия типов данных заявленным.
2. В случае неудовлетворения качеством проводят мероприятия по улучшению качества данных.
3. Рассматривают основные характеристики переменных с точки зрения совокупного представления, в т.ч. на соразмерные величины переменных.
4. В случае неудовлетворенности проводят мероприятия по улучшению качества данных.

2.1 Проверка качества данных

#Для проверки качества данных уточним, какое количество строк в наших данных содержат пропуски значений (N/A): 100

#Так как значение не равно 0, но при этом мало относительно общего количества наблюдений, можно удалить некачественные наблюдения:

#Удаляем строки, содержащие пустые ячейки
data_0 <- data_0[complete.cases(data_0), ]

#Проверим и выводим количество строк, содержащих пустые значения
cat("Осталось наблюдений: ", nrow(data_0), "\nКоличество строк с отсутствующими значениями: ", sum(!complete.cases(data_0)))
## Осталось наблюдений:  1902 
## Количество строк с отсутствующими значениями:  0

2.2 Проверка сопоставимости числовых переменных

#Так как для некоторых методов анализа данных важно измерять переменные в сопоставимых единицах, рассмотрим основные характеристики полученного набора переменных:

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

Как видим из результата, переменные представлены в сопоставимой форме, то есть нет необходимости в проведении нормализации данных, либо их масштабировании

3. Визуализация данных

В контексте визуализации данных всегда важно помнить о конечной цели визуализации, то есть необходимо понять, что же именно мы хотим с помощью нее показать. Рассмотрим две основных визуализации, которые более остальных могут дать представление, как о структуре отдельных переменных, так и об их взаимосвязи

3.1 Боксплот

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

Построим боксплот диаграммы для переменной x1:

data_0 %>% 
  select(x1) %>% 
  ggplot(aes(y = x1)) +
  geom_boxplot() +
  labs(x = "", y = "x1",
       title = "Боксплот для переменной x1") +
    theme(axis.text.x = element_blank())

Аналогично построим для переменной x2:

3.2 Диаграмма рассеивания

Построим диаграммму рассеивания по каждой из возможных взаимосвязей переменных:

data_0 %>% 
  select(x1, x2) %>% 
  ggplot(aes(x = x1, y = x2)) +
  geom_point() +
  labs(x = "x1", 
       y = "x2", title = "Диаграмма рассеивания x2 от x1")

Аналогично поступим для прочих пар переменных:

4. Интерпретация результатов визуализации

По итогам визуализации можем увидеть основную структуру переменных x1 и x2, в том числе, основное распределение, средние величины и некоторые дополнительные характеристики. Основной интерес в данном случае представляют диаграммы рассеивания. Как видим из диаграмм, вероятнее всего, отсутствует связь между любыми парами переменных, кроме y1 и x1 соответственно. Это можно понять по характеру графика, но можно проверить это и по формальным признакам в дальнейшем.

5. Построение модели линейной регрессии

Для построения линейной регрессии желательно, чтобы к ней были какие-то предпосылки, например, через проведение корреляционного анализа.

5.1 Корреляционый анализ

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

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, что было видно и из построенной диаграммы рассеивания.

5.2 Построение модели линейной регрессии

Таким образом, возьмем переменную 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 коэффициенты модели и сама модель значимы, так как отвергается нулевая гипотеза о равенстве коэффициентов нулю и об одновременной незначимости коэффициентов модели.

6. Прогнозирование

Получим прогноз для сгенерированных значений переменной x1 и разместим их на графике рассеивания для y1-x1:

plot(x=predict(model), y=data_0$y1,
 xlab='Прогнозируемые значения',
 ylab='Реальные значения',
 main='График сравнения прогнозируемые и реальных значений функции')
abline(a = 0 , b = 1 )

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

Выводы

В результате проделанной работы нам на практике удалось еще раз убедиться в работоспособности основных методов анализа данных. Данные методы могут быть использованы в различных сферах деятельности, в том числе и для анализа медицинских данных. Работа с медицинскими данными, конечно, подразумевает некоторые особенности, касаемые сбора, хранения, передачи и обработки, но при этом вполне свободно подчиняется основным статистическим/экономическим законам.