Saya telah ditugaskan untuk memindahkan salah satu model stokastik besar kami saat ini dari SAS dan ke bahasa baru. Secara pribadi, saya lebih suka bahasa kompilasi tradisional, tetapi PI ingin saya memeriksa R, yang saya tidak pernah gunakan. Motivasi kami untuk mengeluarkan model dari SAS adalah (1) banyak orang tidak memiliki akses ke sana karena SAS mahal, (2) kami ingin menjauh dari bahasa yang ditafsirkan, dan (3) SAS lambat untuk jenis model yang kita miliki.
Untuk (1), jelas R memenuhi kebutuhan untuk bebas. Untuk (2), idealnya, kami ingin membuat executable, tetapi R biasanya digunakan sebagai bahasa skrip. Saya melihat bahwa seseorang baru-baru ini mengeluarkan kompiler R - apakah ini telah diterima dengan baik? Apakah mudah digunakan? Kami lebih suka tidak memaksa pengguna untuk mengunduh R sendiri. Untuk (3), masalah kita dengan SAS adalah semua waktu yang dihabiskan dalam penulisan I / O dan membaca set data. Model kami intensif secara komputasi, dan kami sering dibatasi oleh runtime. (mis. Tidak biasa bagi seseorang untuk membajak komputer orang selama akhir pekan untuk menjalankan.) Kami memiliki model serupa yang dibangun di Fortran yang tidak memiliki masalah yang sama karena semua pekerjaan dilakukan dalam memori. Bagaimana cara kerja R? Apakah akan sama dengan SAS, dalam hal ia bekerja di datasteps, membaca dan menulis file? Atau bisakah ia melakukan manipulasi array dalam memori?
Jawaban:
R bekerja di memori - jadi data Anda perlu masuk ke memori untuk sebagian besar fungsi.
Paket kompiler, jika saya memikirkan hal yang Anda pikirkan ( paket kompiler Luke Tierney disertakan dengan R), bukan hal yang sama dengan bahasa yang dikompilasi dalam pengertian tradisional (C, Fortran). Ini adalah kompiler byte untuk R dalam arti bytecode Java yang dieksekusi oleh Java VM atau kompilasi byte dari kode LISP Emacs. Itu tidak mengkompilasi kode R ke dalam kode mesin tetapi lebih mempersiapkan kode R ke dalam bytecode sehingga dapat digunakan lebih efisien daripada kode R mentah untuk ditafsirkan.
Perhatikan bahwa jika Anda telah membentuk Fortran dengan baik, Anda mungkin memiliki yang terbaik dari kedua dunia; R dapat memanggil rutin Fortran yang dikompilasi.
sumber
Saya telah menggunakan
SAS
selama 15 tahun, dan telah mulai menggunakan denganR
serius selama 6 bulan terakhir, dengan beberapa bermain-main di dalamnya selama beberapa tahun sebelumnya. Dari perspektif pemrograman,R
apakah manipulasi data secara langsung, tidak ada yang setara denganDATA
atauPROC SQL
prosedur karena mereka tidak diperlukan (yang terakhir menjadi lebih efisienSAS
ketika ada banyak manipulasi data yang harus dilakukan dari sumber data eksternal, misalnya data administrasi). Ini berarti bahwa, sekarang saya mengerti, manipulasi data lebih cepatR
dan memerlukan kode jauh lebih sedikit.Masalah utama yang saya temui adalah memori. Tidak semua paket R mengizinkan
WEIGHT
spesifikasi tipe, jadi jika Anda memilikiSAS
dataset dengan variabel yang digunakan diFREQ
atauREPLICATE
pernyataan, Anda mungkin memiliki masalah. Saya telah melihat paketff
danbigmemory
dalam R tetapi tampaknya tidak kompatibel dengan semua paket R, jadi jika Anda memiliki kumpulan data yang sangat besar yang memerlukan analisis yang relatif tidak umum, dan telah dikumpulkan, Anda mungkin memiliki masalah dengan memori.Untuk otomatisasi, jika Anda punya
SAS macros
Anda harus dapat memprogram yang setaraR
dan dijalankan sebagai batch.Untuk pengkodean
R
, saya menggunakanNotepad++
dan mengatur bahasaR
, dan sekarang saya menemukan kegembiraanR Studio
. Kedua produk ini gratis, dan melakukan markup bahasa sepertiSAS
GUI sintaksis yang ditingkatkan (Saya hanya pernah menggunakan layar sintaksis dalamSAS
).Ada situs , dan buku yang terkait, untuk orang-orang swapping dari
SAS
keR
. Saya menemukan mereka berguna untuk mencoba mencari cara menerjemahkannyaSAS
perintahR
.Update: satu hal yang membuat saya gila ketika datang ke
R
adalah bahwaR
tidak menganggap segala sesuatu adalah kumpulan data (data frame
dalamR
istilah), karena itu bukan paket statistik dalam cara yangSAS
,SPSS
,Stata
, dll. Jadi, misalnya, butuh beberapa saat untuk membuatif
pernyataan berfungsi karena saya terus mendapatkan bantuan untukif
pernyataan dengan vektor (atau mungkin matriks) sedangkan saya membutuhkanif
pernyataan yang bekerja dengandata frames
. Jadi halaman bantuan mungkin perlu dibaca lebih dekat dari biasanya, karena Anda harus memeriksa bahwa perintah yang ingin Anda lakukan akan beroperasi dengan tipe objek data yang Anda miliki.Bit yang masih membuatku gila ketika mempelajari
R
perintah baru (misalnya metode analisis dalam paket kontribusi) adalah bahwa bantuan untuk perintah sering tidak sepenuhnya mandiri. Saya akan pergi ke halaman bantuan untuk mencoba mempelajari perintah dan catatan penggunaan sering...
terkandung di dalamnya. Kadang-kadang mencoba mencari tahu apa yang bisa atau harus pergi ke tempat yang...
telah membawa saya ke dalam lingkaran rekursif. Singkatnya relatif dari catatan bantuan, yangSAS
darinya memberikan contoh terperinci sintaks dan contoh yang berhasil dengan penjelasan studi dalam contoh, adalah kejutan yang cukup besar.sumber
R adalah bahasa pemrograman. Ini tidak bekerja di datasteps. Ia melakukan apa pun yang Anda ingin lakukan, karena itu hanya bahasa pemrograman, seorang budak untuk keinginan Anda, diekspresikan dalam bahasa kurung keriting dan titik dua.
Anggap saja seperti Fortran atau C, tetapi dengan vektorisasi implisit sehingga Anda tidak perlu mengulang array, dan manajemen memori dinamis sehingga Anda tidak perlu malloc () atau mendeklarasikan ukuran array kapan saja.
Sebagian besar melakukan semua pekerjaannya di memori, tetapi jika Anda ingin membaca bagian dari file di, mung itu, lalu memuntahkan beberapa hasilnya, dan membaca bit berikutnya, yah, Anda teruskan dan menulis program R yang apakah itu.
Anda menentang diri Anda dengan mengatakan bahwa model ini intensif secara komputasi, tetapi SAS lambat karena I / O ... Yang satu atau yang lain pasti ...
Jika Anda sudah memiliki sesuatu yang serupa di Fortran, dan Anda mengatakan Anda ingin pindah dari bahasa yang ditafsirkan, lalu mengapa tidak melakukannya di Fortran juga?
Kompiler R dapat menyebabkan beberapa peningkatan, tetapi jika kode R Anda ditulis dengan baik, Anda tidak akan mendapatkan sesuatu yang terlalu besar - tidak seperti menulisnya dalam C atau Fortran.
sumber
Saya mengerti bahwa secara default SAS dapat bekerja dengan model yang lebih besar dari memori, tetapi ini tidak terjadi dengan R, kecuali jika Anda secara khusus menggunakan paket seperti biglm atau ff.
Namun, jika Anda melakukan pekerjaan array di R yang dapat di-vectorised itu akan sangat cepat - mungkin setengah dari kecepatan program C dalam beberapa kasus, tetapi jika Anda melakukan sesuatu yang tidak dapat di-vector, maka itu akan tampak cukup lambat. Untuk memberi Anda sebuah contoh:
Ketika saya meningkatkan N dengan faktor sepuluh hingga 100.000, saya menyerah pada tes 4 setelah 20 menit, tetapi tes 1: 3 masing-masing mengambil 61, 3 dan 37 mili- detik
Untuk N = 10.000.000 waktu untuk pengujian 1: 3 adalah 3.3s, 0.6s dan 1.6s
Perhatikan bahwa ini dilakukan pada laptop i7 dan pada 480mb untuk N = 10million, memori tidak menjadi masalah.
Untuk pengguna di windows 32-bit ada batas memori 1,5gb untuk R tidak peduli berapa banyak memori yang Anda miliki, tetapi tidak ada batasan untuk windows 64-bit atau 64-bit linux. Memori hari ini sangat murah dibandingkan dengan biaya satu jam waktu saya, jadi saya hanya membeli lebih banyak memori daripada menghabiskan waktu untuk menyiasati ini. Tetapi ini mengasumsikan bahwa model Anda akan sesuai dengan memori.
sumber
Ya, dan ini adalah alasan bagus untuk pindah ke R. Minat menulis paket R adalah untuk memungkinkan pengguna untuk dengan mudah membuat fungsi Anda berinteraksi dengan alat lain yang disediakan oleh R, misalnya memberi mereka data bootstraped ... atau apa pun yang mereka mau. Jika menurut Anda ini tidak penting, tetap gunakan C / C ++ atau bahasa kompilasi favorit Anda.
Saya ingin menambahkan peringatan: Anda sudah menjadi programmer, belajar R akan mudah dan cepat; belajar pemrograman R yang efisien akan lebih lama. Karena R ditafsirkan, konstanta disembunyikan dalamO ( ) dari kompleksitas asimptotik bisa besar atau kecil ... misalnya, jika Anda tertarik menjalankan data Anda, Anda akan menggunakannya
rle()
, itu akan cepat (ini adalah fungsi yang dikompilasi sebelumnya). Jika Anda skrip algoritma yang sama persis, itu akan lambat (itu akan ditafsirkan). Ini adalah contoh dasar: Anda memiliki banyak trik menggunakan vektor dan matriks, untuk menghindari loop ditafsirkan dan membuat fungsi yang dikompilasi melakukan semua pekerjaan.Jadi berhati-hatilah. Setelah percobaan pertama Anda, Anda pasti akan merasa jijik dengan R, karena Anda akan menemukannya lambat, dengan sintaks aneh, dll. Setelah Anda mengetahuinya, itu bisa menjadi alat yang sangat efisien. Anda bahkan dapat mengakhiri dengan menulis metode Anda dalam R sebagai fase awal untuk pengkodean C / C ++. Tahap akhir adalah mempelajari API R untuk membuat fungsi yang dikompilasi, dan Anda akan menjadi pemandu R :)
sumber
Manipulasi array dalam memori adalah hal besar bagi SAS, tampaknya. Saya tidak tahu secara spesifik tentang R, tetapi saya menduga bahwa R beroperasi dalam memori secara default, karena paket memori yang diperluas untuk R, ff dan bigmemory, memindahkan data dari memori ke disk. Saya punya petunjuk untuk Anda jika Anda ingin meningkatkan kecepatan atau penggunaan memori. Untuk meningkatkan kecepatan, Anda harus terlebih dahulu menggunakan R sebagaimana dimaksud, yaitu: membuat vektor kode Anda dan menggunakan kompilasi kode byte. (Juga: hindari operasi penyalinan memori sebanyak mungkin.) Kedua, gunakan kode profiler yang disediakan Rprof () untuk mengidentifikasi tambalan lambat dalam kode Anda, dan tulis ulang dalam C atau C ++ jika perlu. Jika Anda membutuhkan lebih banyak memori, Anda dapat menggunakan argumen loncatan di fungsi read.table () untuk membaca sepotong data sekaligus dan Anda juga dapat menggunakan paket seperti RMySQL, yang menambahkan utilitas manipulasi basis data ke R. Jika Anda masih membutuhkan lebih banyak memori dan mampu menurunkan kecepatan secara bersamaan, Anda dapat menggunakan paket salju untuk menjalankan R secara paralel. (Anda dapat menemukan detail tentang ini, dan banyak lagi, dalam buku "The Art of R Programming", oleh Norman Matloff, yang diterbitkan pada akhir tahun lalu. Rincian tentang paket yang disebutkan di sini dapat ditemukan online).
sumber