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

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

> Анализ медицинских данных в R и SAS
hot_assay
сообщение 26.03.2014 - 17:47
Сообщение #1





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



Здравствуйте!
Буду благодарен за рекомендации по использованию R и SAS в анализе данных клинических исследований (хотя бы минимальные, общего характера, с учётом того, что пользователю, привыкшему к Graphical user interface, нужно въехать в специфику рассматриваемо ПО laugh.gif )) . Интересуют преимущества данных систем по сравнению с другими (например, Statsoft STATISTICA). Какие модули необходимо иметь для решения медицинских задач? Заменяют ли R и SAS друг друга в плане фукционала? Отдельное спасибо за ссылки с практическими примерами по рассматриваемому вопросу.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
 
Открыть тему
Ответов
TheThing
сообщение 15.09.2014 - 13:59
Сообщение #2





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



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

Решил глянуть, как реализован пакет MDR в R - все хорошо, практически ничем по фичам не уступает аналогу GUI на JAVA http://sourceforge.net/projects/mdr/. Но ВРЕМЯ выполнения!! Массив из 250 наблюдений 25 предикторов - время анализа в R: 221 секунда, MDR Java: 1.2 секунд; массив 250 наблюдений 50 предикторов - R: 1950 секунд!!!, Java: 3,9 секунды. Ну и так далее...50 предикторов в генетических исследованиях - это очень мало, следовательно MDR в R пока сложно пользоваться (мне хотелось еще прикрутить алгоритм в shiny, там вообще браузер зависнет навека (((. Подобные пакеты,как mbMDR и другие работают также..

Решил взять другой пример, вычислить массивный полином (100) 500 000 раз. Код в R (время выполнения 4 минуты)

trpol2 <- function(n,x) {
mu <<- 10.0
pu <<- 0.0
pol <<- 1:100
tp1 <<- 2.0
tm1 <<- 1/2.0
for (i in 1:n) {
for (j in 1:100) {
mu <<- (mu + tp1) * tm1
pol[j] <<- mu
}
s <<- 0.0;
for (j in 1:100) {
s <<- x*s + pol[j];
}
pu <- s+pu;
}
print(pu)
}

trpol2(500000,0.2)

Код на Java, время выполнения в браузере! http://www.browxy.com/ - 2 секунды.

public class HelloWorld {
static public void main(String argv[]) {
float mu = (float)10.0;
float x,s;
float pu = (float)0.0;
int su, i, j, n;
float pol[] = new float[100];

n = 500000;
x = (float)0.2;
for(i=0; i<n; i++) {
for (j=0; j<100; j++) {
mu = (mu + (float)2.0) / (float)2.0;
pol[j] = mu;
}
s = (float)0.0;
for (j=0; j<100; j++) {
s = x*s + pol[j];
}
pu += s;
}
System.out.println(pu);
}
}

Самое смешное, код на Python, время выполнения 6 секунд:

n = 500000
x = 0.2

def t(x):
mu = 10.0
pu = 0.0
pol =[0] * 100
r = range(0,100)

for i in range(0,n):
for j in r:
pol[j] = mu = (mu + 2.0) / 2.0
su = 0.0
for j in r:
su = x * su + pol[j]
pu = pu + su
print pu

t(x)

Немного расстроился..Ладно с этими полиномами, но мне реально хотелось работать с многофакторным уменьшением размерности в R, видимо, не судьба.. weep.gif

Сообщение отредактировал TheThing - 15.09.2014 - 19:00
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 13.10.2014 - 13:10
Сообщение #3





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



Цитата(TheThing @ 15.09.2014 - 13:59) *
Не с целью продолжения холивара на тему языков программирования, а просто обыденный случай.


да да, конечно smile.gif

1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка smile.gif ) можно вставить в инлайн вставку кода c++ smile.gif


2) никакого примера о тормозах MDR в письме нет -- и комментировать собственно нечего.


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
TheThing
сообщение 23.10.2014 - 07:09
Сообщение #4





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



Цитата(p2004r @ 13.10.2014 - 13:10) *
1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка smile.gif ) можно вставить в инлайн вставку кода c++ smile.gif


Значит, чтобы решить задачу с полиномом (а таких примеров множество), человек должен знать как R так и с++? В вышеприведенном примере я использовал базовые возможности языка Java, Python и т.д., не пользуясь никакими сторонними библиотеками. Хотелось бы увидеть Вашу PRO-версию векторизированного родного R кода, которая бы могла составить конкуренцию хотя бы Python по скорости выполнения..

Цитата
2) никакого примера о тормозах MDR в письме нет -- и комментировать собственно нечего.


Прокомментируйте, пожалуйста и запаситесь терпением:

library(MDR)
data(mdr2)

fit.cv<-mdr.cv(data = mdr2, K = 3, cv = 10, ratio = NULL, equal = "HR", genotype = c(0, 1, 2))

Эта база имеет всего лишь 100 предикторов, у меня в реальной работе их тысячи. На Java и в SAS у меня это занимает секунды, а сколько у Вас в R? smile.gif

Сообщение отредактировал TheThing - 23.10.2014 - 09:35
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 23.10.2014 - 20:49
Сообщение #5





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



Цитата(TheThing @ 23.10.2014 - 07:09) *
Прокомментируйте, пожалуйста и запаситесь терпением:

library(MDR)
data(mdr2)

fit.cv<-mdr.cv(data = mdr2, K = 3, cv = 10, ratio = NULL, equal = "HR", genotype = c(0, 1, 2))

Эта база имеет всего лишь 100 предикторов, у меня в реальной работе их тысячи. На Java и в SAS у меня это занимает секунды, а сколько у Вас в R? smile.gif


внутри mdr.cv() как и любой другой кроссвалидации находится <s>неонка</s> цикл. В этом легко убедится набрав просто mdr.cv.

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


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
TheThing
сообщение 23.10.2014 - 21:21
Сообщение #6





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



Цитата(p2004r @ 23.10.2014 - 20:49) *
внутри mdr.cv() как и любой другой кроссвалидации находится <s>неонка</s> цикл. В этом легко убедится набрав просто mdr.cv.

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


С чего Вы взяли, что я истинный питонист?
Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением?

Сообщение отредактировал TheThing - 23.10.2014 - 21:23
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 23.10.2014 - 22:03
Сообщение #7





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



Цитата(TheThing @ 23.10.2014 - 21:21) *
С чего Вы взяли, что я истинный питонист?
Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением?


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

переписать цикл кроссвалидации в неустраивающей вас процедуре тривиальная операция, и её код намного меньше занимает места, чем ваши упражнения в остроумии на этом форуме.


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
TheThing
сообщение 23.10.2014 - 23:29
Сообщение #8





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



Цитата(p2004r @ 23.10.2014 - 22:03) *
тон которым вы "просите" "помочь сообществу", а вернее себе, не оставляет никаких шансов что кто то кинется вам помогать.


Поверьте, что количество моих постов и личных сообщений, где я помог людям, значительно превосходят те случаи, когда я просил о помощи smile.gif
В этом вопросе мне помощь не нужна, я пользуюсь прекрасной реализацией MDR на Java, был интерес, как пользоваться этим алгоритмом в R, но благодаря Вам - интерес пропал, видимо это у нас взаимно smile.gif
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 24.10.2014 - 11:33
Сообщение #9





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



Цитата(TheThing @ 23.10.2014 - 23:29) *
Поверьте, что количество моих постов и личных сообщений, где я помог людям, значительно превосходят те случаи, когда я просил о помощи smile.gif
В этом вопросе мне помощь не нужна, я пользуюсь прекрасной реализацией MDR на Java, был интерес, как пользоваться этим алгоритмом в R, но благодаря Вам - интерес пропал, видимо это у нас взаимно smile.gif


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

PS

вот код в mdr() который вызывает проблему

counts[, 1] <- apply(case, 1, compare, mat = part, k = k)
counts[, 2] <- apply(ctrl, 1, compare, mat = part, k = k)

поскольку

case <- cbind(rep(1, g^k), expand.grid(rep(geno, k)))
ctrl <- cbind(rep(0, g^k), expand.grid(rep(geno, k)))

решить это очень просто заменив apply() на эквивалент работающий параллельно --- например parApply(cl, X, MARGIN, FUN, ...)

Или возможно эффективными окажуться
parRapply(cl, x, fun, ...)
parCapply(cl, x, fun, ...)

В результате сколько машин вы поднимете в кластере, столько и будет эффективноть ваших расчетов. В пределе она сойдется к скорости рассылки case и ctrl между нодами кластера.

PPS заметьте, что это не "личное сообщение" и действительно полезно всем.

PPPS

я рыдал (С)

Код
> compare
function (mat, vec, k)
{
    b <- 1
    match <- 1:dim(mat)[1]
    while (b <= (k + 1)) {
        match <- match[mat[match, b] == as.numeric(vec[b])]
        b <- b + 1
    }
    return(length(match))
}
<environment: namespace:MDR>


Сообщение отредактировал p2004r - 24.10.2014 - 19:14


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 24.10.2014 - 19:48
Сообщение #10





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



Код
function (mat, vec, k)
{
    b <- 1
    match <- 1:dim(mat)[1]
    while (b <= (k + 1)) {
        match <- match[mat[match, b] == as.numeric(vec[b])]
        if (length(math)==0) break   ### !!!!!!!
        b <- b + 1
    }
    return(length(match))
}


но на удивление эта фигня довольно оптимально работает smile.gif

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

PS Оказывается всё уже написали http://cran.r-project.org/web/packages/for...tes/foreach.pdf на стр.11 реализация apply() поверх %dopar% с настраиваемым числом (увеличивать до загрузки всех ядер) передаваемых в неё колонок (поэтому исходную матрицу транспонировать надо будет)



Сообщение отредактировал p2004r - 25.10.2014 - 20:06


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

Сообщений в этой теме
- hot_assay   Анализ медицинских данных в R и SAS   26.03.2014 - 17:47
- - p2004r   Цитата(hot_assay @ 26.03.2014 - 17:4...   26.03.2014 - 18:56
- - hot_assay   Цитата(p2004r @ 26.03.2014 - 19:56) ...   27.03.2014 - 05:34
|- - DoctorStat   Цитата(hot_assay @ 27.03.2014 - 06:3...   27.03.2014 - 09:59
||- - TheThing   1) Первая и, наверное, самая главная причина, поче...   27.03.2014 - 10:44
|||- - p2004r   Цитата(TheThing @ 27.03.2014 - 10:44...   27.03.2014 - 10:53
||||- - TheThing   Цитата(p2004r @ 27.03.2014 - 11:53) ...   27.03.2014 - 12:45
||||- - p2004r   Цитата(TheThing @ 27.03.2014 - 12:45...   27.03.2014 - 22:33
||||- - TheThing   Цитата(p2004r @ 27.03.2014 - 22:33) ...   28.03.2014 - 11:17
||||- - p2004r   Цитата(TheThing @ 28.03.2014 - 11:17...   29.03.2014 - 10:49
|||- - DoctorStat   Цитата(TheThing @ 27.03.2014 - 11:44...   27.03.2014 - 12:53
||- - p2004r   Цитата(DoctorStat @ 27.03.2014 - 09...   27.03.2014 - 10:52
||- - Вале а   Цитата(DoctorStat @ 27.03.2014 - 10...   11.10.2014 - 16:33
|- - p2004r   Цитата(hot_assay @ 27.03.2014 - 05:3...   27.03.2014 - 10:57
- - hot_assay   Всем большое спасибо за информацию! Возникает ...   27.03.2014 - 16:34
|- - p2004r   Цитата(hot_assay @ 27.03.2014 - 16:3...   27.03.2014 - 22:36
- - DrgLena   Ответ есть не только в сети, но и на этом форуме...   27.03.2014 - 18:04
- - TheThing   Не с целью продолжения холивара на тему языков про...   15.09.2014 - 13:59
|- - p2004r   Цитата(TheThing @ 15.09.2014 - 13:59...   13.10.2014 - 13:10
|- - TheThing   Цитата(p2004r @ 13.10.2014 - 13:10) ...   23.10.2014 - 07:09
|- - p2004r   Цитата(TheThing @ 23.10.2014 - 07:09...   23.10.2014 - 19:35
||- - TheThing   Цитата(p2004r @ 23.10.2014 - 19:35) ...   23.10.2014 - 21:07
||- - p2004r   Цитата(TheThing @ 23.10.2014 - 21:07...   23.10.2014 - 22:16
|- - p2004r   Цитата(TheThing @ 23.10.2014 - 07:09...   23.10.2014 - 20:49
|- - TheThing   Цитата(p2004r @ 23.10.2014 - 20:49) ...   23.10.2014 - 21:21
|- - p2004r   Цитата(TheThing @ 23.10.2014 - 21:21...   23.10.2014 - 22:03
|- - TheThing   Цитата(p2004r @ 23.10.2014 - 22:03) ...   23.10.2014 - 23:29
|- - p2004r   Цитата(TheThing @ 23.10.2014 - 23:29...   24.10.2014 - 11:33
|- - p2004r   Кодfunction (mat, vec, k) { b <- 1 ...   24.10.2014 - 19:48
- - Вале а   Вы смотрели научно-художественный боевик "R п...   24.10.2014 - 17:48


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