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

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

2 страниц V  < 1 2  
Добавить ответ в эту темуОткрыть тему
> Анализ медицинских данных в R и SAS
p2004r
сообщение 29.03.2014 - 10:49
Сообщение #16





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



Цитата(TheThing @ 28.03.2014 - 11:17) *
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 smile.gif

2. Я также написал, что есть обходные пути обработки - можно дождаться (а можно и не дождаться) - но это все доп. пакеты, доп. функции, в SAS это работает по-умолчанию, просто разные модели хранения данных.

3. Иногда, наверное, лучше выбрать неизвестный проприетарный алгоритм от SAS, который был апробирован в течении 30 лет, чем известный open source от дяди Васи (Вы же согласны с тем, что среди 5000 пакетов есть и пакеты от Васей? smile.gif )

4. Всю и не нужно, я говорю о тенденциях, в общем, литература по SAS более качественная. Возьмите рандомную выборку того и другого и проведите анализ - это уже сделали люди (не из SAS) и пришли к выводу, что документация лучше в SAS. По своим собственным наблюдениям я тоже так считаю.

Я уважаю Вашу любовь к R (сам его очень люблю smile.gif ), но Вы подаете информацию так, как-будто в R нет недостатков и это единственное, что нужно знать data scientist. Это ведь не так..


0. Никакой пандас считать быстрее лежащей в его основе библиотеки lapack не в состоянии даже теоретически smile.gif Безусловно есть хитрые схемы потоковых вычислений с очень хитрыми рекурсивными алгоритмами позволяющими полностью задействовать возможности кеширования данных современными процессорами и добится пиковой производительности процессора. Но это никакого отношения к питону не имеет, весь такой код низкоуровневый, и его гораздо вероятнее написать как вставку сишного кода в R smile.gif

Также могу заметить что питон и рядом не стоял с производительностью вот этого --- http://r-statistics.livejournal.com/41800.html Вы к сожалению не прочитали ничего из моего предыдущего поста. Этим я считаю что тема "может ли R обрабатывать большие данные и делать это быстро" закрыта smile.gif

Но чаще всего все упирается в забавные "техники программирования" которые большинство с неимоверным упорством использует, хотя достаточно прочитать "Введение в R" и начать жить нормальной хм... жизнью Вот наиболее спектакулярный и свежий пример http://stackoverflow.com/questions/2908822...-operation-in-r

1. SAS 1970го и SAS 2014 это тоже далеко "не одно и тоже", но вот сессия анализа в APL системе и сессия анализа в R практически неотличима http://flibusta.net/b/156597 Прочитайте этюд с анализом "тормозного пути автомобиля"

2. Ничего не понял, "R весь состоит из пакетов, а SAS монолитный кусок" .... лучшечемгрузиныТМ? smile.gif Ну покупайте у Революшен готовое решение на базе R где всё встроено. Все равно на порядок дешевле SAS будет. Или купите за те же деньги нормального программиста, и он Вам напишет макросы расширяющие синтаксис R для прозрачной работы именно так как Вам хочется. (хотя таких расширений, декларативно описывающих практически любой анализ, уже просто тонны существует).

3. Это уж простите никогда не будет правдой.

4. Какие могут быть "тенденции", если пользователь не в состоянии успеть прочитать имеющийся пул литературы? Просто потому что её становится больше пока он читает то что есть ? smile.gif Литература по R это не сборник рецептов, это советы как грамотно "говорить на R". Научившись говорить человек использует язык для того чтобы описать все свои действия по анализу данных. Причем именно "описать" в отличии от императивных языков. И именно "говорить" поскольку R так же выразителен в своей предметной области. Любой алгоритм сводится в паре строк (смотрите пример выше с циклами).


По поводу "любви к R" вот мой ответ ---
http://molbiol.ru/forums/index.php?showtop...t&p=1468917

Сообщение отредактировал p2004r - 29.03.2014 - 10:50


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
TheThing
сообщение 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, видимо, не судьба.. weep.gif

Сообщение отредактировал TheThing - 15.09.2014 - 19:00
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
Вале а
сообщение 11.10.2014 - 16:33
Сообщение #18





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



Цитата(DoctorStat @ 27.03.2014 - 10:59) *
SAS - всеми признанный пакет для статистических расчетов, а R - пакет программ, написанный студентами в перерыве между лекциями.


ну Френка Харрела, написавшего пакеты по регрессиям для R, я б студентом не назвал, его Regression Modeling Strategies уже классика
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 13.10.2014 - 13:10
Сообщение #19





Группа: Пользователи
Сообщений: 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
Сообщение #20





Группа: Пользователи
Сообщений: 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 - 19:35
Сообщение #21





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



Цитата(TheThing @ 23.10.2014 - 07:09) *
Значит, чтобы решить задачу с полиномом (а таких примеров множество), человек должен знать как 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 раз, ковыряться в "мегапримере" с точки зрения дальнейшей "оптимизации" мне простите не интересно.


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





Группа: Пользователи
Сообщений: 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:07
Сообщение #23





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



Цитата(p2004r @ 23.10.2014 - 19:35) *
Ваш <s>питоновский</s> эровский код, на самом деле не так тормозной как Вы тут нам описываете. Просто кроме своего питона надо знать минимальные возможности продукта который Вы собрались облажать.


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



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





Группа: Пользователи
Сообщений: 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
Сообщение #25





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



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


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

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


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





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



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


ваш "r-код" дословная калька вашего же питоновского примера, он был также механистично ускорен в пять раз, что вас в этом не устраивает господин тролль?

PS что еще по вашим же словам вы собрались "облажать"(С)?


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





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



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


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





Группа: Пользователи
Сообщений: 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
Вале а
сообщение 24.10.2014 - 17:48
Сообщение #29





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



Вы смотрели научно-художественный боевик "R против Python: Битва титанов" smile.gif
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 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))
}


но на удивление эта фигня довольно оптимально работает 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 

2 страниц V  < 1 2
Добавить ответ в эту темуОткрыть тему