Форум врачей-аспирантов

Здравствуйте, гость ( Вход | Регистрация )

> Как выделить сочетания признаков?, Есть девять признаков (поражений) надо выделить самые частые сочетания
Листопадничек
сообщение 19.10.2014 - 20:36
Сообщение #1





Группа: Пользователи
Сообщений: 1
Регистрация: 19.10.2014
Пользователь №: 26750



Здравствуйте, коллеги. Проблема такая: в конце работы возникла потребность выделить наиболее частые сочетания поражений. Имеется девять видов поражений, которые выявлены у определенного процента обследованных пациентов. И было бы неплохо как-то обозначить, какие именно сочетания этих поражений встречаются чаще.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
 
Открыть тему
Ответов
p2004r
сообщение 19.10.2014 - 21:54
Сообщение #2





Группа: Пользователи
Сообщений: 1091
Регистрация: 26.08.2010
Пользователь №: 22699



Цитата(Листопадничек @ 19.10.2014 - 20:36) *
Здравствуйте, коллеги. Проблема такая: в конце работы возникла потребность выделить наиболее частые сочетания поражений. Имеется девять видов поражений, которые выявлены у определенного процента обследованных пациентов. И было бы неплохо как-то обозначить, какие именно сочетания этих поражений встречаются чаще.


ну так посчитайте сочетания, что тут трудного?

поскольку данных как всегда нет, эмулируем нашего пациента:

Код
> x<-sample(c(1,0), 9, replace=TRUE)
> x
[1] 0 0 1 0 0 1 0 0 1


все сочетания осложнений у него получаем вот так:

Код
> outer(x, x, FUN=paste0)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[2,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[3,] "10" "10" "11" "10" "10" "11" "10" "10" "11"
[4,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[5,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[6,] "10" "10" "11" "10" "10" "11" "10" "10" "11"
[7,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[8,] "00" "00" "01" "00" "00" "01" "00" "00" "01"
[9,] "10" "10" "11" "10" "10" "11" "10" "10" "11"


но нас интересуют только уникальные "над или под диагональю":

Код
> outer(x, x, FUN=paste0)[upper.tri(matrix(nrow=9, ncol=9))]
[1] "00" "01" "01" "00" "00" "10" "00" "00" "10" "00" "01" "01" "11" "01" "01"
[16] "00" "00" "10" "00" "00" "10" "00" "00" "10" "00" "00" "10" "00" "01" "01"
[31] "11" "01" "01" "11" "01" "01"


объединяем все в функцию позволяющую получить данные одного пациента:

Код
> get.probe <- function(n=9) {x<-sample(c(1,0), n, replace=TRUE); outer(x, x, FUN=paste0)[upper.tri(matrix(nrow=n, ncol=n))]}
> get.probe()
[1] "10" "11" "01" "10" "00" "10" "10" "00" "10" "00" "10" "00" "10" "00" "00"
[16] "10" "00" "10" "00" "00" "00" "11" "01" "11" "01" "01" "01" "01" "11" "01"
[31] "11" "01" "01" "01" "01" "11"


получаем группу пациентов теперь (для компактности вывода они в "столбцах" smile.gif )

Код
> replicate(10, get.probe())
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] "01" "10" "11" "11" "01" "10" "00" "10" "00" "10"
[2,] "00" "10" "11" "11" "01" "10" "00" "10" "01" "11"
[3,] "10" "00" "11" "11" "11" "00" "00" "00" "01" "01"
[4,] "01" "11" "10" "10" "00" "10" "01" "10" "00" "10"
[5,] "11" "01" "10" "10" "10" "00" "01" "00" "00" "00"
[6,] "01" "01" "10" "10" "10" "00" "01" "00" "10" "10"
[7,] "01" "10" "11" "10" "00" "11" "00" "10" "01" "11"
[8,] "11" "00" "11" "10" "10" "01" "00" "00" "01" "01"
[9,] "01" "00" "11" "10" "10" "01" "00" "00" "11" "11"
[10,] "11" "10" "01" "00" "00" "01" "10" "00" "01" "01"
[11,] "00" "10" "10" "11" "00" "11" "00" "11" "01" "10"
[12,] "10" "00" "10" "11" "10" "01" "00" "01" "01" "00"
[13,] "00" "00" "10" "11" "10" "01" "00" "01" "11" "10"
[14,] "10" "10" "00" "01" "00" "01" "10" "01" "01" "00"
[15,] "10" "00" "10" "01" "00" "11" "00" "01" "11" "10"
[16,] "01" "11" "11" "10" "01" "10" "00" "11" "00" "10"
[17,] "11" "01" "11" "10" "11" "00" "00" "01" "00" "00"
[18,] "01" "01" "11" "10" "11" "00" "00" "01" "10" "10"
[19,] "11" "11" "01" "00" "01" "00" "10" "01" "00" "00"
[20,] "11" "01" "11" "00" "01" "10" "00" "01" "10" "10"
[21,] "01" "01" "01" "10" "01" "10" "00" "11" "10" "00"
[22,] "01" "10" "11" "10" "01" "10" "01" "10" "00" "10"
[23,] "11" "00" "11" "10" "11" "00" "01" "00" "00" "00"
[24,] "01" "00" "11" "10" "11" "00" "01" "00" "10" "10"
[25,] "11" "10" "01" "00" "01" "00" "11" "00" "00" "00"
[26,] "11" "00" "11" "00" "01" "10" "01" "00" "10" "10"
[27,] "01" "00" "01" "10" "01" "10" "01" "10" "10" "00"
[28,] "11" "10" "11" "00" "11" "00" "01" "10" "00" "00"
[29,] "01" "11" "10" "11" "01" "10" "01" "11" "01" "10"
[30,] "11" "01" "10" "11" "11" "00" "01" "01" "01" "00"
[31,] "01" "01" "10" "11" "11" "00" "01" "01" "11" "10"
[32,] "11" "11" "00" "01" "01" "00" "11" "01" "01" "00"
[33,] "11" "01" "10" "01" "01" "10" "01" "01" "11" "10"
[34,] "01" "01" "00" "11" "01" "10" "01" "11" "11" "00"
[35,] "11" "11" "10" "01" "11" "00" "01" "11" "01" "00"
[36,] "11" "01" "10" "01" "11" "00" "11" "01" "01" "00"


любое сочетание можно оценить применив table():

Код
> table(replicate(100, get.probe())[1,])

00 01 10 11
27 23 29 21


ну или все сочетания одновременно:

Код
> d <- replicate(100, get.probe())
> t(sapply(1:nrow(d), function(i) table(d[i,])))
      00 01 10 11
[1,] 28 22 22 28
[2,] 18 32 21 29
[3,] 22 28 17 33
[4,] 26 24 29 21
[5,] 27 23 28 22
[6,] 23 16 32 29
[7,] 25 25 24 26
[8,] 26 24 23 27
[9,] 18 21 31 30
[10,] 28 27 21 24
[11,] 24 26 25 25
[12,] 23 27 26 24
[13,] 21 18 28 33
[14,] 25 30 24 21
[15,] 24 25 25 26
[16,] 23 27 29 21
[17,] 20 30 32 18
[18,] 18 21 34 27
[19,] 26 29 26 19
[20,] 22 27 30 21
[21,] 27 22 25 26
[22,] 25 25 27 23
[23,] 27 23 25 25
[24,] 20 19 32 29
[25,] 31 24 21 24
[26,] 31 18 21 30
[27,] 28 21 24 27
[28,] 25 27 27 21
[29,] 22 28 24 26
[30,] 22 28 24 26
[31,] 17 22 29 32
[32,] 24 31 22 23
[33,] 25 24 21 30
[34,] 26 23 20 31
[35,] 26 26 20 28
[36,] 25 27 21 27


когда не все уровни в таблице населены, то понадобится их "прибить" гвоздями smile.gif

Код
> d <- replicate(10, get.probe())
> t(sapply(1:nrow(d), function(i) table(factor(d[i,], levels=c("00","01","10","11")))) )
      00 01 10 11
[1,]  2  2  5  1
[2,]  1  3  5  1
[3,]  5  2  1  2
[4,]  0  4  3  3
[5,]  2  5  1  2
[6,]  3  3  0  4
[7,]  3  1  4  2
[8,]  6  1  1  2
[9,]  4  2  3  1
[10,]  2  1  5  2
[11,]  2  2  6  0
[12,]  6  1  2  1
[13,]  6  0  2  2
[14,]  3  0  5  2
[15,]  6  1  2  1
[16,]  2  2  1  5
[17,]  1  6  2  1
[18,]  2  4  1  3
[19,]  1  2  2  5
[20,]  2  5  1  2
[21,]  3  5  0  2
[22,]  2  2  4  2
[23,]  5  2  1  2
[24,]  3  3  3  1
[25,]  1  2  5  2
[26,]  5  2  1  2
[27,]  5  3  1  1
[28,]  1  2  5  2
[29,]  2  2  2  4
[30,]  4  3  0  3
[31,]  2  4  2  2
[32,]  0  3  4  3
[33,]  3  4  1  2
[34,]  3  5  1  1
[35,]  1  2  3  4
[36,]  3  3  1  3


как то так smile.gif


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 

Сообщений в этой теме


Добавить ответ в эту темуОткрыть тему