Мне было поручено перевести одну из наших текущих больших стохастических моделей из SAS на новый язык. Лично я предпочитаю традиционный скомпилированный язык, но PI хочет, чтобы я проверил R, который я никогда не использовал. Наша мотивация для выведения модели из SAS заключается в том, что (1) многие люди не имеют к ней доступа, поскольку SAS стоит дорого, (2) мы стремимся отойти от интерпретируемого языка, и (3) SAS работает медленно тип модели у нас есть.
Для (1) очевидно, что R удовлетворяет потребности быть свободным. Для (2) в идеале мы хотели бы создать исполняемый файл, но R обычно используется как язык сценариев. Я вижу, что кто-то недавно выпустил компилятор R - это было хорошо принято? Легко ли пользоваться? Мы бы не хотели, чтобы пользователь сам загружал R. Для (3) наша проблема с SAS - все время, затрачиваемое на запись / чтение наборов данных ввода / вывода. Наша модель требует больших вычислительных ресурсов, и мы часто ограничены временем выполнения. (Например, нередки случаи, когда кто-то угоняет компьютеры людей в выходные дни для выполнения пробежек.) У нас есть похожая модель, построенная на Фортране, которая не имеет такой же проблемы, потому что вся работа выполняется в памяти. Как работает R? Будет ли это так же, как SAS, в том, что он работает в шагах данных, чтение и запись файлов? Или он может делать манипуляции с массивами в памяти?
Ответы:
R работает в памяти - поэтому ваши данные должны помещаться в память для большинства функций.
Пакет компилятора, если я думаю о том, о чем вы думаете ( пакет компилятора Люка Тирни, поставляемый с R), не то же самое, что компилируемый язык в традиционном смысле (C, Fortran). Это байтовый компилятор для R в смысле байт-кода Java, выполняемого виртуальной машиной Java, или байтовой компиляции кода LISP Emacs. Он не компилирует R-код в машинный код, а подготавливает R-код в байт-код, чтобы его можно было использовать более эффективно, чем необработанный R-код для интерпретации.
Обратите внимание, что если вы хорошо сформировали Фортран, вы, вероятно, могли бы иметь лучшее из обоих миров; R может вызывать скомпилированные фортрановские процедуры.
источник
Я использовал в
SAS
течение 15 лет, и начал использоватьR
серьезно последние 6 месяцев, с некоторыми возиться в нем на пару лет вперед. С точки зрения программирования, осуществляетR
ли манипулирование данными напрямую, нет эквивалентаDATA
илиPROC SQL
процедур, потому что они не нужны (последний более эффективен,SAS
когда требуется много манипуляций с данными из внешних источников данных, например административных данных). Это означает, что теперь я понимаю, что манипулирование данными происходит быстрееR
и требует гораздо меньше кода.Основная проблема, с которой я столкнулся, - это память. Не все пакеты R допускают
WEIGHT
спецификации типов, поэтому, если у вас естьSAS
наборы данных с переменными, используемыми в выраженияхFREQ
илиREPLICATE
, у вас могут возникнуть проблемы. Я посмотрел наff
иbigmemory
пакетов в R , но они не появляются , чтобы быть совместимым со всеми пакетами R, поэтому если у вас есть очень большие наборы данных , которые требуют анализа, которые относительно редко, и были объединены, могут возникнуть проблемы с памятью.Для автоматизации, если у вас есть,
SAS macros
вы должны быть в состоянии запрограммировать эквивалент вR
и запустить как пакетный.Для кодирования
R
я использовалNotepad++
и установил языкR
, а теперь открываю радостиR Studio
. Оба эти продукта бесплатны и делают разметку языка как улучшенныйSAS
синтаксис GUI (я только когда-либо использовал экран синтаксиса вSAS
).Существует веб-сайт и соответствующая книга для людей, которые меняются с
SAS
наR
. Я нашел их полезными для того, чтобы попытаться понять, как перевести некоторыеSAS
команды вR
.Обновление: одна вещь , которая отвезла меня орехи , когда подходит к
R
, чтоR
не берет на себя все это набор данных (data frame
вR
просторечии), потому что это не статистический пакет таким образом , чтоSAS
,SPSS
,Stata
, и т.д.. Так, например, мне потребовалось некоторое время, чтобы заставитьif
операторы работать, потому что я продолжал получать помощь дляif
операторов с векторами (или, возможно, матрицами), тогда как мне нужно былоif
оператор, который работал сdata frames
. Таким образом, страницы справки, вероятно, нужно читать более внимательно, чем обычно, потому что вам нужно проверить, что команда, которую вы хотите выполнить, будет работать с вашим типом объекта данных.То, что до сих пор сводит меня с ума, когда я изучаю новую
R
команду (например, метод анализа в предоставленном пакете), заключается в том, что справка по командам часто не является полностью автономной. Я пойду на страницу справки, чтобы попытаться выучить команду, и в ней часто...
содержатся замечания по использованию . Иногда пытаясь понять, что может или должно пойти туда, куда...
ведет меня в рекурсивный цикл. Относительная краткость справочных заметок, изSAS
которых приводятся подробные примеры синтаксиса и рабочие примеры с объяснением исследования на этом примере, была довольно большим шоком.источник
R это язык программирования. Работает не по шагам. Он делает все, что вы хотите, потому что это всего лишь язык программирования, раб для ваших желаний, выраженный языком фигурных скобок и двоеточий.
Думайте об этом как о Fortran или C, но с неявной векторизацией, чтобы вам не приходилось зацикливаться на массивах, и динамическим управлением памятью, чтобы вам не приходилось использовать malloc () или объявлять размеры массивов в любое время.
Он в основном выполняет всю свою работу в памяти, но если вы хотите прочитать часть файла, скопировать его, затем выплюнуть некоторые результаты и прочитать следующий бит, ну, вы продолжаете и пишете программу на R, которая делает это
Вы противоречите себе, утверждая, что модель требует значительных вычислительных ресурсов, но SAS работает медленно из-за операций ввода-вывода ... Конечно, одно или другое ...
Если у вас уже есть что-то подобное в Фортране, и вы говорите, что хотите отойти от интерпретируемого языка, то почему бы просто не сделать это и в Фортране?
Компилятор R может привести к некоторому ускорению, но если ваш код R хорошо написан, вы не получите ничего слишком масштабного - не то же самое, что написать его на C или Fortran.
источник
Я понимаю, что по умолчанию SAS может работать с моделями, размер которых превышает объем памяти, но в случае с R это не так, если вы специально не используете такие пакеты, как biglm или ff.
Тем не менее, если вы выполняете работу с массивами в R, которая может быть векторизована, это будет очень быстро - возможно, в два раза быстрее, чем программа C в некоторых случаях, но если вы делаете что-то, что не может быть векторизовано, тогда это будет выглядеть довольно медленный. Чтобы дать вам пример:
Когда я увеличил N в десять раз до 100 000, я отказался от теста 4 через 20 минут, но тесты 1: 3 заняли 61, 3 и 37 миллисекунд каждый
Для N = 10 000 000 время испытаний 1: 3 составляет 3,3 с, 0,6 с и 1,6 с.
Обратите внимание, что это было сделано на ноутбуке i7 и на 480 МБ для N = 10 миллионов, память не была проблемой.
Для пользователей в 32-разрядных окнах существует ограничение в 1,5 ГБ для R независимо от того, сколько у вас памяти, но такого ограничения нет для 64-разрядных окон или 64-разрядных Linux. В наши дни память очень дешевая по сравнению со стоимостью часа моего времени, поэтому я просто покупаю больше памяти, а не трачу время, пытаясь обойти это. Но это предполагает, что ваша модель поместится в памяти.
источник
Да, и это хорошая причина для перехода на R. Интерес написания пакета R состоит в том, чтобы позволить пользователям легко заставить ваши функции взаимодействовать с другими инструментами, предоставляемыми R, например, передавать им загруженные данные ... или что угодно. Если вы не считаете это важным, придерживайтесь C / C ++ или вашего любимого скомпилированного языка.
rle()
Так что будь очень осторожен. После первых попыток у вас наверняка возникнет отвращение к R, потому что вы найдете его медленным, со странным синтаксисом и т. Д. Как только вы его узнаете, это может быть очень эффективным инструментом. Вы даже можете закончить, написав свои методы на R как предварительный этап для программирования C / C ++. Конечным этапом будет изучение API R для создания предварительно скомпилированных функций, и вы станете мастером R :)
источник
Манипулирование массивом в памяти - большая вещь для SAS, по-видимому. Я не знаю особенностей, касающихся R, но я предполагаю, что R работает в памяти по умолчанию, поскольку пакеты расширения памяти для R, ff и bigmemory перемещают данные из памяти на диск. У меня есть указатели для вас, если вы хотите улучшить скорость или использование памяти. Чтобы повысить скорость, вам сначала нужно использовать R по назначению, то есть: векторизовать ваш код и использовать компиляцию байтового кода. (Также: по возможности избегайте операций копирования в память.) Во-вторых, используйте предоставленный профилировщик кода Rprof (), чтобы идентифицировать медленные патчи в вашем коде, и переписать их на C или C ++, если это необходимо. Если вам нужно больше памяти, вы можете использовать аргумент skip в функции read.table () для одновременного считывания в ваших данных чанка, а также вы можете использовать пакет, такой как RMySQL, который добавляет утилиты манипулирования базой данных в R. Если вам нужно еще больше памяти и вы можете позволить себе сопутствующее снижение скорости, вы можете использовать пакет snow для запуска R параллельно. (Подробности об этом и многое другое можно найти в книге Нормана Мэтлоффа «Искусство программирования на R», опубликованной в конце прошлого года. Подробную информацию о пакетах, упомянутых здесь, можно найти в Интернете.)
источник