Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум врачей-аспирантов _ Медицинская статистика _ Теория графов в медицине

Автор: med-ick 15.10.2017 - 16:20

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

 dataset.zip ( 21,42 килобайт ) : 227
 

Автор: passant 15.10.2017 - 17:22

Цитата(med-ick @ 15.10.2017 - 16:20) *
Приветствую всех, моя тема косвенно связано с медицинской. а именно в случае медстраховки.
Подскажите, а можно ли в R методом теории графов найти зависимости между 2-мя людьми, как в этом датасете, например найти связи между одинаковыми фамилиями?

Что вы понимаете под "связи (во множественном числе!?) между одинаковыми фамилиями"???
Что вы понимаете под "зависимостями между людьми"?
Отличается-ли "зависмости между людьми" и "связи между фамилиями"?
Что за пары приведены в вашем датасете?
При чем тут вообще теория графов?

Автор: med-ick 15.10.2017 - 18:14

я просто стажер
мне дали задачу
дословно формулировка звучит так
Основная задача: проанализировать выборку мед. страх событий (например аварии с двумя участниками) на возможное мошенничество. Выделить тех клиентов, относительно которых существует подозрение на мошеннические действия; обосновать подозрение.
я спросил , где доп. данные, сказали, решать методом графов.

Автор: ogurtsov 15.10.2017 - 18:43

Цитата(med-ick @ 15.10.2017 - 18:14) *
я просто стажер
мне дали задачу
дословно формулировка звучит так
Основная задача: проанализировать выборку мед. страх событий (например аварии с двумя участниками) на возможное мошенничество. Выделить тех клиентов, относительно которых существует подозрение на мошеннические действия; обосновать подозрение.
я спросил , где доп. данные, сказали, решать методом графов.

Это классическая задача под названием fraud detection. На неразмеченных данных не решается (точнее, теоретически решается, но непонятно как оценивать качество решения).

Автор: p2004r 15.10.2017 - 19:13

Цитата(med-ick @ 15.10.2017 - 16:20) *
Приветствую всех, моя тема косвенно связано с медицинской. а именно в случае медстраховки.
Подскажите, а можно ли в R методом теории графов найти зависимости между 2-мя людьми, как в этом датасете, например найти связи между одинаковыми фамилиями?


Слинковать не трудно даже базовыми средствами R.

Код
df.data <- read.csv2("data.csv", stringsAsFactors = F)
merge(data.frame(fio=gsub("^([^ ]+).*", "\\1", df.data[,2]), stringsAsFactors = F) ,
           data.frame(fio=gsub("^([^ ]+).*", "\\1", df.data[,3]), stringsAsFactors = F))
         fio
1  Dorofeeva
2  Dorofeeva
3  Dorofeeva
4  Dorofeeva
5  Dorofeeva
6  Dorofeeva
7      Komin
8    Korobov
9     Kotova
10    Kotova
11    Kozlov
12  Mamontov
13  Mamontov
14   Pavlova
15   Pavlova
16  Rogachev
17  Soloviev
18  Vorobyov
19  Vorobyov


Есть record linkage средства в списке пакетов. Готовых функций преобразования имен в отчества и т.п. нет.

Визуализация делается library(igraph).

Но обычно средства "интеллектуальной разведки" вокруг RDF баз всяких базируются. Старинный RelFinder на флеше написанный подключается к sparql точке (на какмлибо триплесторе поднятой) куда загружаются слинкованные таблицы (R умеет в SPARQL) и уже в нем ищут "цепочки фактов".

Автор: med-ick 16.10.2017 - 11:50

p2004r, добрый день. Скажите, а чем тогда обосновать выбор этих людей. Я не могу просто сдать и сказать вот они, ловите))

Автор: p2004r 16.10.2017 - 19:57

Цитата(med-ick @ 16.10.2017 - 11:50) *
p2004r, добрый день. Скажите, а чем тогда обосновать выбор этих людей. Я не могу просто сдать и сказать вот они, ловите))


Тем что они (или их потенциальные родственники) есть и среди "пострадавших" и среди "виновников".

Вы почитали что нибудь по ключевым словам которые я написал в ответе вам?

Автор: med-ick 16.10.2017 - 21:39

p2004r, не злитесь, пожалуйста, я просто хотел проверить верно ли я понял Ваш ход мысли. Видимо врно:)

Цитата
Визуализация делается library(igraph).

может помочь как мне график спрогать, я просто не знаю как организовать дуги и узлы
как тут
воспроизводимый пример
library(igraph)
g <- barabasi.game(100)
plot( g, vertex.size=0, vertex.label=NA, edge.arrow.size=0 )

Автор: p2004r 17.10.2017 - 00:19

Цитата(med-ick @ 16.10.2017 - 21:39) *
p2004r, не злитесь, пожалуйста, я просто хотел проверить верно ли я понял Ваш ход мысли. Видимо врно:)

может помочь как мне график спрогать, я просто не знаю как организовать дуги и узлы
как тут
воспроизводимый пример
library(igraph)
g <- barabasi.game(100)
plot( g, vertex.size=0, vertex.label=NA, edge.arrow.size=0 )


Экий вы нежный smile.gif

Ну раз igraph не по зубам рисуйте тогда в http://www.bioconductor.org/packages/release/bioc/vignettes/Rgraphviz/inst/doc/newRgraphvizInterface.pdf там всё прозрачно.

Автор: med-ick 17.10.2017 - 14:43

p2004r, а вы можете вот сказать, в этом массиве данных, когда делаю feature selection в statistica 12, все предикторы хорошо влияют на зависимую переменную. Все до одного
но когда строю модель лог регресии, точность 55%.
Как же так ,если вроде все хорошо влияет\
Вот сами данные
Что не так, почему один метод показывает такое сильное влияние, а второй имеет слабую точность

 

 ук.zip ( 1,41 мегабайт ) : 209
 

Автор: p2004r 17.10.2017 - 19:05

Цитата(med-ick @ 17.10.2017 - 14:43) *
p2004r, а вы можете вот сказать, в этом массиве данных, когда делаю feature selection в statistica 12, все предикторы хорошо влияют на зависимую переменную. Все до одного
но когда строю модель лог регресии, точность 55%.
Как же так ,если вроде все хорошо влияет\
Вот сами данные
Что не так, почему один метод показывает такое сильное влияние, а второй имеет слабую точность



А размер выборки в >60000 не смущает? smile.gif

Ну сделайте перестановку в каждой переменной и её "уровень p"TM посчитанный в ксиквадрате (а лучше такую перестановку сделать много раз и взять процентиль 5%) возьмите за пороговую величину.

Но лучше конечно взять готовый метод, кластер и дождаться когда library(Boruta) посчитает что достоверно влияет и с какой величиной эффекта.

Если лень, то включайте в модель (начиная сверху своего списка, оно вполне адекватен) предикторы и смотрите на n-fold кроссвалидацию.

Автор: med-ick 18.10.2017 - 19:34

Дано:
Сервер
xeon cpu-e5-1650 3600Ghz
64 гигов оперативки

library("Boruta")
mydat=na.omit(mydat)
bor=Boruta(POLICY_IS_REEWED~.,data=mydat)
getSelectedAttributes(bor, withTentative = T)

после двух часов работы этого кода,


[1] "POLICY_BEGI_MOTH"
[3] "POLICY_ED_MOTH" "POLICY_SALES_CHAEL"
[5] "POLICY_SALES_CHAEL_GROUP" "POLICY_MI_AGE"
[7] "POLICY_MI_DRIVIG_EXPERIECE" "VEHICLE_EGIE_POWER"
[9] "VEHICLE_I_CREDIT" "VEHICLE_SUM_ISURED"
[11] "POLICY_ITERMEDIARY" "ISURER_GEDER"
[13] "POLICY_CLM_" "POLICY_CLM_GLT_"
[15] "POLICY_PRV_CLM_" "POLICY_PRV_CLM_GLT_"
[17] "CLIET_HAS_DAGO" "CLIET_HAS_OSAGO"
[19] "POLICY_COURT_SIG" "CLAIM_AVG_ACC_ST_PRD"
[21] "POLICY_HAS_COMPLAITS" "POLICY_YEARS_REEWED_"
[23] "POLICY_DEDUCT_VALUE" "POLICY_PRICE_CHAGE"

те же самые переменные и та же самая история с подгонкой
myfit <- glm(POLICY_IS_RENEWED~.,data=mydat_tr, family=binomial(link ="logit"))



второй аспект

Код
А размер выборки в >60000 не смущает?

этот размер критичен для feature selection или лог.регрессия рассчитана на до 60 000 наблюдений?

простите , что много вопросов, я стажируюсь, поэтому и возникают проблемы.

Автор: p2004r 18.10.2017 - 22:32

А withTentative = T что бы точно всё включило? Ах, да "я не местный люди добрые ... "(С) smile.gif

plot(bor, cex.axis=0.5) и смотреть в каком порядке включать в модель показатели

Тут и не такие "стажеры" пробегали за время существования форума. Ну какая связь между страховкой и медицинской статистикой? Никакой и интереса читателям тоже 0. Более того будь это настоящая экзаменационная задача, то просить кого то её решить за тебя самого просто глупо (пытаться подсовывать эти задачи специалистам "ради лузлов", вообще уподобляться цыганке из анекдотов про гинеколога выносящего мусор после трудового дня).

PS

Если так хочется именно этот датасет разобрать, то надо идти "медленно и печально" разбирать _каждый_ показатель (мне это делать откровенно лень на каком то учебном датасете), и восстанавливать в какой шкале оно на самом деле было измерено. Потом перекодировать этот датасет. Потом в каком нибудь caret строить поиск в пространстве гиперпараметров (включающим и состав предикторов), и смотреть по кроссвалидации лучшую модель (или их ансамбль). Ну или ручками в керасе строить "мега модель всего" со всякими эмбедингами, и опять же крутить состав показателей уже в ней, тоже попутно смотря на получающуюся кроссвалидацию.

Вот так вот "в лоб", датасет дает всего AUC в районе 0.66

Автор: med-ick 19.10.2017 - 00:11

Не злитесь, это страховая статистика, но по мед.тематики
withTentative = T , что T,что F
дает те же переменные. Я ж пробовал, когда курил мануал к боруте

и в любом случае, ответ на этот вопрос был бы ценен

Цитата
А размер выборки в >60000 не смущает?

этот размер критичен для feature selection или лог.регрессия рассчитана на до 60 000 наблюдений?

простите , что много вопросов, я стажируюсь, поэтому и возникают проблемы.

Автор: p2004r 19.10.2017 - 10:53

Цитата(med-ick @ 19.10.2017 - 00:11) *
Не злитесь, это страховая статистика, но по мед.тематики
withTentative = T , что T,что F
дает те же переменные. Я ж пробовал, когда курил мануал к боруте

и в любом случае, ответ на этот вопрос был бы ценен


1. Кто "злиться" то? smile.gif Как "стажер стажеру"ТМ говорю -- тут нет никакой медицинской тематики, это автомобильная страховка.

2. Борута рисует график _величины_ достоверных эффектов. При выборке стремящейся к бесконечности будет достоверным отличие практически _любой_ малости. Решите какой размер эффекта будет включен в модель путем проверки кроссвалидацией метрики качества подогнанной модели.

Но сначала разберитесь с показателями в датасете.

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

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

 

Автор: med-ick 19.10.2017 - 12:05

Цитата
Все ранговое и номинальное надо в онехот (думми) переводить, и тогда уже смотреть борутой что выкидывать, а что оставлять.

т.е. есть переменная
1- очень плохой водитель
2.плохой
3.хороший
4. очень хороший

мне из одного столбца нужно сделать 4 столбца?
очень плохой водитель 1-да, 0 -нет


https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F
в statistica 12 можно сделать эти думми переменные?
POLICY_SALES_CHAEL_GROUP это номинативная переменная, кодирован канал выдачи мед. полиса

Автор: p2004r 19.10.2017 - 13:09

Цитата(med-ick @ 19.10.2017 - 12:05) *
т.е. есть переменная
1- очень плохой водитель
2.плохой
3.хороший
4. очень хороший

мне из одного столбца нужно сделать 4 столбца?
очень плохой водитель 1-да, 0 -нет


https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F
в statistica 12 можно сделать эти думми переменные?
POLICY_SALES_CHAEL_GROUP это номинативная переменная, кодирован канал выдачи мед. полиса


Да именно так, это называется one hot кодирование или https://en.wikipedia.org/wiki/Dummy_variable_(statistics)

Все переменные которые на pairs() выглядят как "решетка-сетка" преобразуются в такой набор. (И более того там есть например первые две в списке, коды которых явно можно вообще склеить вместе (их суммарно уровней меньше получиться чем по отдельности) если будет последующий эмбеддинг делаться). На результат можно напускать методы отбора значимых переменных.


Автор: med-ick 19.10.2017 - 14:21

Я не хочу в ручную, как в statistica это сделать?))

Автор: p2004r 19.10.2017 - 15:05

Цитата(med-ick @ 19.10.2017 - 14:21) *
Я не хочу в ручную, как в statistica это сделать?))


Написать в техподдержку статистики? smile.gif

Автор: med-ick 19.10.2017 - 15:10

вряд ли)) У меня чуть-чуть не лицензионная, так бы написал, а по-другому разбить никак, там в экселе каком-нибудь.
Есть другие способы?

Автор: p2004r 19.10.2017 - 15:20

Цитата(med-ick @ 19.10.2017 - 15:10) *
вряд ли)) У меня чуть-чуть не лицензионная, так бы написал, а по-другому разбить никак, там в экселе каком-нибудь.
Есть другие способы?


А чем R не подходит? sparse.model.matrix() на формулу и данные размеченные в факторы и в xgb.cv() через xgb.DMatrix() с целевой переменной, лучшую по мета параметрам модель обучить обычным xgboost() и оттуда xgb.importance() достать собственно значимости переменных, с топовыми повторить цикл. Ну или ещё куча способов думми сгенерить из факторов есть.

Код
Жили-были в одном городишке два ассенизатора ? отец и сын.
Канализации у них там не было, а просто ямы с этим самым.
И они это самое вычерпывали ведром и заливали в свою бочку, причем отец, как более опытный специалист, спускался в яму, а сын сверху подавал ему ведро.
И вот однажды сын это ведро не удержал и обрушил обратно на батю.
Ну, батя утерся, посмотрел на него снизу вверх и сказал ему с горечью:
?Чучело ты, ? говорит, ? огородное, тундра! Никакого толка в тебе не видно. Так всю жизнь наверху и проторчишь?.

Автор: comisora 24.10.2017 - 16:01

Уважаемые стажёры (им). Вопрос про боруту, rf и порядковые шкалы.
1. Для клинических шкал нужно ли каждую категорию переводить в фиктивные переменные? Пример шкала депрессии madrs, 10 симптомов, каждый от 0 до 6, суммарный балл от 0 до 60.
2. Как поступать, если зависимая переменная является клинической шкалой? Пример шкала тревоги и депрессии hads. Тревога и депрессия меряются отдельно.

Автор: p2004r 24.10.2017 - 20:16

Цитата(comisora @ 24.10.2017 - 16:01) *
Уважаемые стажёры (им). Вопрос про боруту, rf и порядковые шкалы.
1. Для клинических шкал нужно ли каждую категорию переводить в фиктивные переменные? Пример шкала депрессии madrs, 10 симптомов, каждый от 0 до 6, суммарный балл от 0 до 60.
2. Как поступать, если зависимая переменная является клинической шкалой? Пример шкала тревоги и депрессии hads. Тревога и депрессия меряются отдельно.


1. Там сейчас по умолчанию library(ranger) под капотом, и по умолчанию все факторы ordered(). Если в номинальной шкале (обычный factor()) более 40-50 уровней то придется по техническим причинам делать dummy, само оно больше уровней не тянет (что то с реализацией алгоритма).

2. Регрессии борута прекрасно тоже считает (как и модели выживаемости).

Автор: comisora 26.10.2017 - 20:56

2p2004r
+сто нефти, спасибо

Автор: med-ick 26.10.2017 - 21:46

p2004r, а что делать со случайным лесом, например номинативные переменные можно раздробить на дамми, а как быть с метрическими, где значение может быть от 0 до 1000 к примеру,
а рандом форест работет только с 54 категориями, по крайней мера в R)
что все 1000 значений не раздробишь, например если речь идет о температуре
не может же быть есть 1 градус, нет один градус, есть 2 градуса, нет 2 градуса

Автор: p2004r 27.10.2017 - 20:47

Цитата(med-ick @ 26.10.2017 - 21:46) *
p2004r, а что делать со случайным лесом, например номинативные переменные можно раздробить на дамми, а как быть с метрическими, где значение может быть от 0 до 1000 к примеру,
а рандом форест работет только с 54 категориями, по крайней мера в R)
что все 1000 значений не раздробишь, например если речь идет о температуре
не может же быть есть 1 градус, нет один градус, есть 2 градуса, нет 2 градуса


попробуйте сделать над собой усилие и ничего не делать с такими переменными (даже распределение не корректируйте)... должно попустить smile.gif

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)