Дискриминантный анализ. Однофакторная модель. Реализация в R Рассмотрим пример решения задачи классификации с помощью метода линейного дискриминантного анализа в пакете R. В медицине показатель АЧТВ (активированное частичное тромбопластиновое время) – время свёртываемости крови – является очень важным показателем. Нормой считается АЧВТ в 25,2 сек - 38,2 сек. При меньших значениях АЧВТ (т.е. повышенной скорости свёртываемости крови) есть риск развития тромбоза (заметим, что по данным медицинской статистики этим заболеванием страдают примерно 25% населения), слишком большие значения АЧВТ могут быть признаком гемофилии (это – редкое заболевание, им болеет 1 из 500 000). У нас есть данные о значениях показателя АЧТВ здоровых людей и пациентов, страдающих тромбозом. Данные по больным гемофилией отсутствуют. На основе анализа имеющихся данных мы должны сформулировать правило, которое позволит врачу поставить пациенту диагноз: «Здоров» (k=1), «Болен тромбозом» (k=2) или «Болен гемофилией» (k=3). Заметим сразу, что поскольку больных гемофилией среди обследованных пациентов не выявлено, 3 0 и, как следствие, правая часть формулы (2) равна нулю. Это означает, что у значения «3» нет шансов быть выбранным в качестве решения задачи классификации. Поэтому фактически будем делать выбор из двух классов («1» («Здоров») или «2» («Болен тромбозом»)). Рассмотрим код программы на языке R, # ================================================ # Установим нужный директорий (где находятся наши файлы) setwd("C://Olga/кэк/R") getwd() # -----------------------------------------------# Прочитаем результаты обследования: # Здоровые: acvtZ=read("ACVT_Zdorovye.txt") #acvtZ # -----------------------------------------------# Страдающие тромбозом: acvtT=scan("ACVT_Tromboz.txt") #acvtT # ================================================ # Найдём объемы выборок # nZ=length(acvtZ) 1 Дискриминантный анализ. Однофакторная модель. Реализация в R nT=length(acvtT) n=nZ+nT Pk=c(nZ,nT)/n # Гемофилию исключаем, т.к. для неё дискриминантная функция = 0 "Априорные вероятности : " Pk # ------------------------------------------------ Получили результат [1] "Априорные вероятности : " > Pk [1] 0.7384081 0.2615919 (Заметим, что полученные априорные значения вероятностей хорошо согласуются с приведённым выше утверждением о том, что тромбозом страдает примерно 25% населения.) # ================================================ # Найдём оценки параметров # -----------------------------------------------omuZ=mean(acvtZ) "Среднее выборочное значение АЧВТ для здоровых наблюдаемых=" omuZ # -----------------------------------------------omuT=mean(acvtT) "Среднее выборочное значение АЧВТ для наблюдаемых, страдающих тромбозом = " omuT # -----------------------------------------------osigZ=sd(acvtZ) "Среднее квадратическое отклонение АЧВТ для здоровых наблюдаемых = " osigZ # -----------------------------------------------osigT=sd(acvtT) "Среднее квадратическое отклонение АЧВТ для страдающих тромбозом = " osigT # ------------------------------------------------ Получили результат > # ================================================ > # Найдём оценки параметров > # -----------------------------------------------> omuZ=mean(acvtZ) > "Среднее выборочное значение АЧВТ для здоровых наблюдаемых = " [1] "Среднее выборочное значение АЧВТ для здоровых наблюдаемых = " 2 Дискриминантный анализ. Однофакторная модель. Реализация в R > omuZ [1] 48.3442 > # -----------------------------------------------> omuT=mean(acvtT) > "Среднее выборочное значение АЧВТ для наблюдаемых, страдающих тромбозом = " [1] "Среднее выборочное значение АЧВТ для наблюдаемых, страдающих тромбозом = " > omuT [1] 31.6422 > # -----------------------------------------------> osigZ=sd(acvtZ) > "Среднее квадратическое отклонение АЧВТ для здоровых наблюдаемых = " [1] "Среднее квадратическое отклонение АЧВТ для здоровых наблюдаемых = " > osigZ [1] 2.112788 > # -----------------------------------------------> osigT=sd(acvtT) > "Среднее квадратическое отклонение АЧВТ для страдающих тромбозом = " [1] "Среднее квадратическое отклонение АЧВТ для страдающих тромбозом = " > osigT [1] 2.04623 > # ------------------------------------------------ > Заметим, что полученные оценки среднего квадратического отклонения показателя АЧВТ довольно близки: 2.112788 для здоровых людей, прошедших обследование, и 2.04623 для тех, у кого выявлен тромбоз. Поэтому мы опускаем здесь проверку гипотезы о равенстве дисперсий генеральных совокупностей (АЧВТ здорового человека и АЧВТ страдающего тромбозом) – считаем, что она хорошо согласуется с опытными данными. Выберем в качестве общего значения среднего квадратического отклонения показателя АЧВТ. osig = (osigZ + osigT)/2 > osig [1] 2.079509 Построим гистограммы для АЧВТ для здоровых людей и больных и совместим их с графиками плотности. При этом в качестве значений параметров нормального распределения используем найденные оценки. Оценим визуально, насколько гипотеза о нормальности распределения 3 Дискриминантный анализ. Однофакторная модель. Реализация в R согласуется с опытными данными (хотя лучше было бы проверить её по критерию Хи-квадрат или Колмогорова-Смирнова). # -----------------------------------------------hist(acvtZ,col="green",freq=FALSE, main="Гистограмма показателя АЧВТ здоровых наблюдаемых") curve(dnorm(x,omuZ,osigZ),col="darkgreen",lwd=3,add=TRUE) # hist(acvtT,col="red",freq=FALSE, main="Гистограмма показателя АЧВТ наблюдаемых, страдающих тромбозом") curve(dnorm(x,omuT,osigT),col="red",lwd=3,add=TRUE) # ------------------------------------------------ 4 Дискриминантный анализ. Однофакторная модель. Реализация в R Как видим, визуально распределение значений показателя АЧВТ в обеих группах очень похоже на нормальное, поэтому мы опускаем здесь проверку гипотезы р=о (нормальном) законе распределения показателя АЧВТ, считая, что она хорошо согласуется с опытными данными. # -----------------------------------------------# Совместим графики плотности на одном рисунке # Для этого определим диапазон значений x, на котором будем делать построение a=min(min(acvtZ),min(acvtT)) b=max(max(acvtZ),max(acvtT)) curve(dnorm(x,omuZ,osig),a,b,col="darkgreen",lwd=3) curve(dnorm(x,omuT,osig),a,b,col="red",lwd=3,add=TRUE) # # ------------------------------------------------ Получили результат: 5 Дискриминантный анализ. Однофакторная модель. Реализация в R Мы видим, что красная кривая (она соответствует распределению показателя АЧВТ у больных, страдающих тромбозом) имеет ту же форму, что и зелёная кривая (плотность распределения АЧВТ у здоровых людей), поскольку средние квадратические отклонения у этих с.в. одинаковы, но смещена влево (т.к. больные тромбозом имеют в среднем более низкое значение показателя АЧВТ). Однако, как видно из полученного графика, небольшой процент больных тромбозом имеет довольно высокое значение показателя АЧВТ (более характерное для здоровых) и, напротив, небольшой процент здоровых людей имеет достаточно низкое значение показателя АЧВТ (более характерное для страдающих тромбозом). В каждом конкретном случае (т.е. при каждом конкретном значении показателя АЧВТ) нам поможет поставить диагноз дискриминантная функция (4): # -----------------------------------------------# Напишем функцию для постановки диагноза по значению АЧВТ fdiscr = function (x) { vZ = log(Pk[1]) + x*omuZ/(osig^2) - (omuZ^2)/(2*osig^2); vZ vT = log(Pk[2]) + x*omuT/(osig^2) - (omuT^2)/(2*osig^2); vT diag <- ifelse(vZ > vT,"ДИАГНОЗ : З Д О Р О В","ДИАГНОЗ : Т Р О М Б О З"); 6 Дискриминантный анализ. Однофакторная модель. Реализация в R return (diag); } # -----------------------------------------------# Поставим диагноз для разных значений АЧВТ # -----------------------------------------------x = 38.3 x d=fdiscr(x) d # -----------------------------------------------x = 24.9 x d=fdiscr(x) d # -----------------------------------------------x = 42.1 x d=fdiscr(x) d # -----------------------------------------------x = 29.7 x d=fdiscr(x) d # ------------------------------------------------ Получили результат: > # -----------------------------------------------> # Поставим диагноз для разных значений АЧВТ > # -----------------------------------------------> x = 38.3 > x [1] 38.3 > d=fdiscr(x) > d [1] "ДИАГНОЗ : З Д О Р О В" > # -----------------------------------------------> x = 24.9 > x [1] 24.9 > d=fdiscr(x) 7 Дискриминантный анализ. Однофакторная модель. Реализация в R > d [1] "ДИАГНОЗ : Т Р О М Б О З" > # -----------------------------------------------> x = 42.1 > x [1] 42.1 > d=fdiscr(x) > d [1] "ДИАГНОЗ : З Д О Р О В" > # -----------------------------------------------> x = 29.7 > x [1] 29.7 > d=fdiscr(x) > d [1] "ДИАГНОЗ : З Д О Р О В" > # ------------------------------------------------ Заметим, что «водоразделом» является абсцисса точки пересечения графиков плотностей распределения показателя АЧВТ здоровых людей и страдающих тромбозом (примерно 26 сек.). 8