Анализ медицинских данных в R и SAS |
Здравствуйте, гость ( Вход | Регистрация )
Анализ медицинских данных в R и SAS |
29.03.2014 - 10:49
Сообщение
#16
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
0. Питон + Pandas могут обрабатывать огромные массивы данных значительно быстрее и эффективнее чем R, грустно, но факт. Я привел эту солянку не из своих собственных размышлений, а после просмотра многих требований по вакансии data scientist на западе. Вы можете (и я могу) использовать только R в своей работе, этого никто не запрещает, но этого недостаточно, чтобы получить data analytics например в google, а я все таки всегда ориентировался на западные тенденции, поскольку они лет на 200 впереди наших. К тому же на западе, Вы найдете намного быстрее и более оплачиваемую работу, если Вы знаете SAS, а не R (грустно, но тоже факт). Нужна кому-то эта вакансия или не нужна - это след. вопрос, может у нас (или у Вас) в стране data scientis и так жируют.. 1. R и S - это ведь не на 100% одно и тоже (хотя даже S вышел позже SAS). В своем 1 пункте я писал, что огромные институты использовали SAS и написали кучу кода, которую не будут переводить на R. Разве это не объясняет, почему люди не будут переходить на R? Вы пишите про S, но это ведь не объясняет почему люди используют SAS 2. Я также написал, что есть обходные пути обработки - можно дождаться (а можно и не дождаться) - но это все доп. пакеты, доп. функции, в SAS это работает по-умолчанию, просто разные модели хранения данных. 3. Иногда, наверное, лучше выбрать неизвестный проприетарный алгоритм от SAS, который был апробирован в течении 30 лет, чем известный open source от дяди Васи (Вы же согласны с тем, что среди 5000 пакетов есть и пакеты от Васей? ) 4. Всю и не нужно, я говорю о тенденциях, в общем, литература по SAS более качественная. Возьмите рандомную выборку того и другого и проведите анализ - это уже сделали люди (не из SAS) и пришли к выводу, что документация лучше в SAS. По своим собственным наблюдениям я тоже так считаю. Я уважаю Вашу любовь к R (сам его очень люблю ), но Вы подаете информацию так, как-будто в R нет недостатков и это единственное, что нужно знать data scientist. Это ведь не так.. 0. Никакой пандас считать быстрее лежащей в его основе библиотеки lapack не в состоянии даже теоретически Безусловно есть хитрые схемы потоковых вычислений с очень хитрыми рекурсивными алгоритмами позволяющими полностью задействовать возможности кеширования данных современными процессорами и добится пиковой производительности процессора. Но это никакого отношения к питону не имеет, весь такой код низкоуровневый, и его гораздо вероятнее написать как вставку сишного кода в R Также могу заметить что питон и рядом не стоял с производительностью вот этого --- http://r-statistics.livejournal.com/41800.html Вы к сожалению не прочитали ничего из моего предыдущего поста. Этим я считаю что тема "может ли R обрабатывать большие данные и делать это быстро" закрыта Но чаще всего все упирается в забавные "техники программирования" которые большинство с неимоверным упорством использует, хотя достаточно прочитать "Введение в R" и начать жить нормальной хм... жизнью Вот наиболее спектакулярный и свежий пример http://stackoverflow.com/questions/2908822...-operation-in-r 1. SAS 1970го и SAS 2014 это тоже далеко "не одно и тоже", но вот сессия анализа в APL системе и сессия анализа в R практически неотличима http://flibusta.net/b/156597 Прочитайте этюд с анализом "тормозного пути автомобиля" 2. Ничего не понял, "R весь состоит из пакетов, а SAS монолитный кусок" .... лучшечемгрузиныТМ? Ну покупайте у Революшен готовое решение на базе R где всё встроено. Все равно на порядок дешевле SAS будет. Или купите за те же деньги нормального программиста, и он Вам напишет макросы расширяющие синтаксис R для прозрачной работы именно так как Вам хочется. (хотя таких расширений, декларативно описывающих практически любой анализ, уже просто тонны существует). 3. Это уж простите никогда не будет правдой. 4. Какие могут быть "тенденции", если пользователь не в состоянии успеть прочитать имеющийся пул литературы? Просто потому что её становится больше пока он читает то что есть ? Литература по R это не сборник рецептов, это советы как грамотно "говорить на R". Научившись говорить человек использует язык для того чтобы описать все свои действия по анализу данных. Причем именно "описать" в отличии от императивных языков. И именно "говорить" поскольку R так же выразителен в своей предметной области. Любой алгоритм сводится в паре строк (смотрите пример выше с циклами). По поводу "любви к R" вот мой ответ --- http://molbiol.ru/forums/index.php?showtop...t&p=1468917 Сообщение отредактировал p2004r - 29.03.2014 - 10:50 |
|
15.09.2014 - 13:59
Сообщение
#17
|
|
Группа: Пользователи Сообщений: 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 |
|
11.10.2014 - 16:33
Сообщение
#18
|
|
Группа: Пользователи Сообщений: 33 Регистрация: 9.01.2012 Пользователь №: 23408 |
|
|
13.10.2014 - 13:10
Сообщение
#19
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Не с целью продолжения холивара на тему языков программирования, а просто обыденный случай. да да, конечно 1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка ) можно вставить в инлайн вставку кода c++ 2) никакого примера о тормозах MDR в письме нет -- и комментировать собственно нечего. |
|
23.10.2014 - 07:09
Сообщение
#20
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 |
1) если так непосильно писать векторизированный код, а писать портянки с рекурсивными форами "массивного полинома" чувствуете себя в силе, то в Вашем распоряжении Rcpp и практически без изменений "код на ява" (в силу весьма ограниченного объема использования возможностей языка ) можно вставить в инлайн вставку кода c++ Значит, чтобы решить задачу с полиномом (а таких примеров множество), человек должен знать как 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 |
|
23.10.2014 - 19:35
Сообщение
#21
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Значит, чтобы решить задачу с полиномом (а таких примеров множество), человек должен знать как R так и с++? В вышеприведенном примере я использовал базовые возможности языка Java, Python и т.д., не пользуясь никакими сторонними библиотеками. Хотелось бы увидеть Вашу PRO-версию векторизированного родного R кода, которая бы могла составить конкуренцию хотя бы Python по скорости выполнения.. Ваш <s>питоновский</s> эровский код, на самом деле не так тормозной как Вы тут нам описываете. Просто кроме своего питона надо знать минимальные возможности продукта который Вы собрались облажать. <pre> > system.time(trpol2(500000,0.2)) [1] 1250000 пользователь система прошло 202.948 9.268 210.290 > trpol2c <- cmpfun(trpol2) > system.time(res<-trpol2c(500000,0.2)) [1] 1250000 пользователь система прошло 40.648 0.992 41.505 </pre> улучшив Ваш результат в 5 раз, ковыряться в "мегапримере" с точки зрения дальнейшей "оптимизации" мне простите не интересно. |
|
23.10.2014 - 20:49
Сообщение
#22
|
|
Группа: Пользователи Сообщений: 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(). Оная конструкция прекрасно параллелится и на кластеры, и на некластеры. Делать это за Вас мне тоже неинтересно. |
|
23.10.2014 - 21:07
Сообщение
#23
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 |
Ваш <s>питоновский</s> эровский код, на самом деле не так тормозной как Вы тут нам описываете. Просто кроме своего питона надо знать минимальные возможности продукта который Вы собрались облажать. Питон - не мой и я вовсе не собирался "облажать" какой-либо из продуктов (Вы не найдете такого ни в одном из моих постов). Я привел примеры нативного кода каждого из языков для решения определенной задачи и получил результаты, а в Ваших комментариях (в этой ветке) считывается масса негатива, что не способствует конструктивному общению. Сообщение отредактировал TheThing - 23.10.2014 - 21:09 |
|
23.10.2014 - 21:21
Сообщение
#24
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 |
внутри mdr.cv() как и любой другой кроссвалидации находится <s>неонка</s> цикл. В этом легко убедится набрав просто mdr.cv. Данный цикл Вы должны заменить (в нем нету ни глобального присваивания, ни прочих императивных извратов), как истинный питонист на foreach(). Оная конструкция прекрасно параллелится и на кластеры, и на некластеры. Делать это за Вас мне тоже неинтересно. С чего Вы взяли, что я истинный питонист? Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением? Сообщение отредактировал TheThing - 23.10.2014 - 21:23 |
|
23.10.2014 - 22:03
Сообщение
#25
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
С чего Вы взяли, что я истинный питонист? Вы же сказали, что я не привел никакого кода в R по поводу метода MDR, поэтому обсуждать собственно нечего. Я привел пример своего ужасного неоптимизированного кода и в результате получил ответ чисто теоретического характера, а также что Вам это неинтересно. Почему просто не помочь сообществу в решении абсолютно конкретной задачи конкретным решением? хватит троллить, у вас нет к этому призвания. вы получили исчерпывающий совет, переписать единственный цикл в доступной вам функции. тон которым вы "просите" "помочь сообществу", а вернее себе, не оставляет никаких шансов что кто то кинется вам помогать. переписать цикл кроссвалидации в неустраивающей вас процедуре тривиальная операция, и её код намного меньше занимает места, чем ваши упражнения в остроумии на этом форуме. |
|
23.10.2014 - 22:16
Сообщение
#26
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Питон - не мой и я вовсе не собирался "облажать" какой-либо из продуктов (Вы не найдете такого ни в одном из моих постов). Я привел примеры нативного кода каждого из языков для решения определенной задачи и получил результаты, а в Ваших комментариях (в этой ветке) считывается масса негатива, что не способствует конструктивному общению. ваш "r-код" дословная калька вашего же питоновского примера, он был также механистично ускорен в пять раз, что вас в этом не устраивает господин тролль? PS что еще по вашим же словам вы собрались "облажать"(С)? |
|
23.10.2014 - 23:29
Сообщение
#27
|
|
Группа: Пользователи Сообщений: 116 Регистрация: 20.02.2011 Пользователь №: 23251 |
тон которым вы "просите" "помочь сообществу", а вернее себе, не оставляет никаких шансов что кто то кинется вам помогать. Поверьте, что количество моих постов и личных сообщений, где я помог людям, значительно превосходят те случаи, когда я просил о помощи В этом вопросе мне помощь не нужна, я пользуюсь прекрасной реализацией MDR на Java, был интерес, как пользоваться этим алгоритмом в R, но благодаря Вам - интерес пропал, видимо это у нас взаимно |
|
24.10.2014 - 11:33
Сообщение
#28
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Поверьте, что количество моих постов и личных сообщений, где я помог людям, значительно превосходят те случаи, когда я просил о помощи В этом вопросе мне помощь не нужна, я пользуюсь прекрасной реализацией MDR на Java, был интерес, как пользоваться этим алгоритмом в R, но благодаря Вам - интерес пропал, видимо это у нас взаимно понятно. видимо крутость этих "личных сообщений" недостаточно очевидна для окружающих, что бы вы не могли удержаться от поливания грязью и провокаций на этом форуме. 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 |
|
24.10.2014 - 17:48
Сообщение
#29
|
|
Группа: Пользователи Сообщений: 33 Регистрация: 9.01.2012 Пользователь №: 23408 |
Вы смотрели научно-художественный боевик "R против Python: Битва титанов"
|
|
24.10.2014 - 19:48
Сообщение
#30
|
|
Группа: Пользователи Сообщений: 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)) } но на удивление эта фигня довольно оптимально работает после профилирования кода получается, что реальное ускорение возможно получить только на clusterApplyLB(или иной разумный сплит массива на обработку) вставленных вместо обычных apply(), иначе высокие накладные расходы на пересылку. PS Оказывается всё уже написали http://cran.r-project.org/web/packages/for...tes/foreach.pdf на стр.11 реализация apply() поверх %dopar% с настраиваемым числом (увеличивать до загрузки всех ядер) передаваемых в неё колонок (поэтому исходную матрицу транспонировать надо будет) Сообщение отредактировал p2004r - 25.10.2014 - 20:06 |
|