![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 5 Регистрация: 26.03.2014 Пользователь №: 26244 ![]() |
Здравствуйте!
Буду благодарен за рекомендации по использованию R и SAS в анализе данных клинических исследований (хотя бы минимальные, общего характера, с учётом того, что пользователю, привыкшему к Graphical user interface, нужно въехать в специфику рассматриваемо ПО ![]() |
|
![]() |
![]() |
![]() |
![]()
Сообщение
#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, видимо, не судьба.. ![]() Сообщение отредактировал TheThing - 15.09.2014 - 19:00 |
|
![]() |
![]() |
![]()
Сообщение
#3
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Не с целью продолжения холивара на тему языков программирования, а просто обыденный случай. да да, конечно ![]() 1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка ![]() ![]() 2) никакого примера о тормозах MDR в письме нет -- и комментировать собственно нечего. ![]() |
|
![]() |
![]() |
![]()
Сообщение
#4
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 ![]() |
1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка ![]() ![]() Значит, чтобы решить задачу с полиномом (а таких примеров множество), человек должен знать как 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? ![]() Сообщение отредактировал TheThing - 23.10.2014 - 09:35 |
|
![]() |
![]() |
![]()
Сообщение
#5
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
Прокомментируйте, пожалуйста и запаситесь терпением: 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? ![]() внутри mdr.cv() как и любой другой кроссвалидации находится <s>неонка</s> цикл. В этом легко убедится набрав просто mdr.cv. Данный цикл Вы должны заменить (в нем нету ни глобального присваивания, ни прочих императивных извратов), как истинный питонист на foreach(). Оная конструкция прекрасно параллелится и на кластеры, и на некластеры. Делать это за Вас мне тоже неинтересно. ![]() |
|
![]() |
![]() |
![]()
Сообщение
#6
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 ![]() |
внутри mdr.cv() как и любой другой кроссвалидации находится <s>неонка</s> цикл. В этом легко убедится набрав просто mdr.cv. Данный цикл Вы должны заменить (в нем нету ни глобального присваивания, ни прочих императивных извратов), как истинный питонист на foreach(). Оная конструкция прекрасно параллелится и на кластеры, и на некластеры. Делать это за Вас мне тоже неинтересно. С чего Вы взяли, что я истинный питонист? Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением? Сообщение отредактировал TheThing - 23.10.2014 - 21:23 |
|
![]() |
![]() |
![]()
Сообщение
#7
|
|
![]() Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 ![]() |
С чего Вы взяли, что я истинный питонист? Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением? хватит троллить, у вас нет к этому призвания. вы получили исчерпывающий совет, переписать единственный цикл в доступной вам функции. тон которым вы "просите" "помочь сообществу", а вернее себе, не оставляет никаких шансов что кто то кинется вам помогать. переписать цикл кроссвалидации в неустраивающей вас процедуре тривиальная операция, и её код намного меньше занимает места, чем ваши упражнения в остроумии на этом форуме. ![]() |
|
![]() |
![]() |
![]()
Сообщение
#8
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 ![]() |
тон которым вы "просите" "помочь сообществу", а вернее себе, не оставляет никаких шансов что кто то кинется вам помогать. Поверьте, что количество моих постов и личных сообщений, где я помог людям, значительно превосходят те случаи, когда я просил о помощи ![]() В этом вопросе мне помощь не нужна, я пользуюсь прекрасной реализацией MDR на Java, был интерес, как пользоваться этим алгоритмом в R, но благодаря Вам - интерес пропал, видимо это у нас взаимно ![]() |
|
![]() |
![]() |
![]() ![]() |