精通 R 是一種怎樣的體驗?
精通 Java 是一種怎樣的體驗? - 計算機
精通 C++ 是一種怎樣的體驗? - 計算機
(精力有限對底層不是很精通)[原]數據流編程教程:R語言與DataFrame
首先,感謝RStudio公司的工程師們以及其他R語言開發者對R語言做出不可磨滅的貢獻!
參考前文 [原]基於RStudio Webinars的統計報告Web化與工程化實踐總結,我們將數據流編程分為數據讀取、數據清洗、數據處理、數據可視化以及數據建模五個模塊。
數據讀取 readr/httr/DBIreadrreadr簡化了我們讀取多種格式表格型數據的方法,包括分割文件withread_delim(),read_csv()、read_tsv()、read_csv2()、固定寬度文件讀取的read_fwf()、read_table()以及read_log()來讀取Web日誌文件。在參數配置方面是和原生的http://read.xxx()函數族是看齊的。
readr是利用C++和RCpp編寫的,所以執行的速度是相當快的,不過相對於直接用C語言寫的data.table::fread()就稍微慢大概1.2-2倍左右。在實際使用中,data.talbe::fread()的讀取速度可以比原生的read.csv有3-10倍的提升速度。
httrhttr是一個高級的網路請求庫,類似於Python中的Tornado和Requests,除了提供基本的Restful介面設計功能,比如GET(), HEAD(), PATCH(), PUT(), DELETE() 和 POST(),還提供了OAuth的調用,比如oauth1.0_token()和oauth2.0_token()。而且httr還提供了諸如session、cookie、SSL、header、proxy、timeoutd等更過高級管理功能。當然你可以用它來做簡單的爬蟲應用,如果需要更高級的爬蟲,我們需要投入rvest的懷抱來支持諸如xpath等高級爬蟲特性。
DBIDBI是一個為R與資料庫通訊的資料庫介面。相當於Java裡面的DAO,Python里的Torndb和Tornlite,方便多種關係型資料庫的SQL請求。其中最亮眼的是,R中的DataFrame和資料庫之前可以以整個數據框插入的形式插入數據而不需要再拼接SQL語句。
以下是一個官方文檔的示例:
library(DBI)
# 創建一個臨時內存的 RSQLite 資料庫
con &<- dbConnect(RSQLite::SQLite(), dbname = ":memory:")
dbListTables(con)
# 直接插入整個數據框到資料庫中
dbWriteTable(con, "mtcars", mtcars)
dbListTables(con)
dbListFields(con, "mtcars")
dbReadTable(con, "mtcars")
# 你可以獲取所有結果:
res &<- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(res)
dbClearResult(res)
# 或者一次取一塊
res &<- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
while(!dbHasCompleted(res)){
chunk &<- dbFetch(res, n = 5)
print(nrow(chunk))
}
dbClearResult(res)
dbDisconnect(con)
數據清洗 tidyr/jsonlitetidyr
tidyr是一個數據清洗的新包,正在取代reshape2、spreadsheets等包。清潔的數據在數據處理的後續流程中十分重要,比如數據變化(dplyr),可視化(ggplot2/ggvis)以及數據建模等。tidyr主要提供了一個類似Excel中數據透視表(pivot table)的功能,提供gather和spread函數將數據在長格式和寬格式之間相互轉化,應用在比如稀疏矩陣和稠密矩陣之間的轉化。此外,separate和union方法提供了數據分組拆分、合併的功能,應用在nominal數據的轉化上。
jsonlite類似於Python中的json庫,參考前文 [原]數據流編程教程:R語言與非結構化數據共舞,我們可以知道jsonlite是一個標準的json轉化庫,依賴於jsonlite我們可以自由地在JSON和DataFrame之間相互轉化。
數據處理 dplyr/rlist/purrrdplyrdplyr包是現在數據流編程的核心,同時支持主流的管道操作 %&>%,主要的數據處理方法包括:
高級查詢操作:
select(): 按列變數選擇
filter(): 按行名稱分片slice(): 按行索引分片mutate(): 在原數據集最後一列追加一些數據集summarise(): 每組聚合為一個小數量的匯總統計,通常結合gruop_by()使用arrange(): 按行排序關聯表查詢
inner_join(x, y): 匹配 x + y
left_join(x, y): 所有 x + 匹配 ysemi_join(x, y): 所有 x 在 y 中匹配的部分
anti_join(x, y): 所有 x 在 y 中不匹配的部分集合操作
intersect(x, y): x 和 y 的交集(按行)
union(x, y): x 和 y 的並集(按行)setdiff(x, y): x 和 y 的補集 (在x中不在y中)更多詳細操作可以參考由SupStats翻譯的 數據再加工速查表,比Python的老鼠書直觀很多。
rlist參考前文 [原]數據流編程教程:R語言與非結構化數據共舞,我們知道,區別於dplyr包,rlist包是針對非結構化數據處理而生的,也對以list為核心的數據結構提供了類似DataFrame的高級查詢、管道操作等等方法。
purrrpurrr向Scala這樣的具有高級類型系統的函數式編程語言學習,為data frame的操作提供更多的函數式編程方法,比如map、lambda表達式。此外,purrr引入了靜態類型,來解決原生的apply函數族類型系統不穩定的情況。
我遇到過一個非常頭疼的apply函數的問題:apply內的表達式計算結果不一致。
# 原來表達式是這樣的,但是返回的計算結果不對:
# x1,x2,x3都是一個含有NA值的一個10x10的矩陣
apply(x1*x2-x1*x3,1,sum,na.rm=T)
於是改成分步計算才能得到正確答案。
t1 &<- apply(x1 * x2,1,sum,na.rm=T)
t2 &<- apply(x1 * x3,1,sum,na.rm=T)
t3 &<- t1 - t2
如果使用purrr包就可以很好的解決這一問題。參考 Wisdom"s Quintessence: Purrr package for R is good for performance 的例子:
library(purrr)
mtcars %&>%
split(.$cyl) %&>%
map(~ lm(mpg ~ wt, data = .)) %&>%
map(summary) %&>%
map_dbl("r.squared")
具體使用可以參考Rstudio Blog:purrr 0.2.0。
數據可視化 ggplot2/ggvisggplot2ggplot2 是一個增強的數據可視化R包,幫助我們輕鬆創建令人驚嘆的多層圖形。它的設計理念類似於PhotoShop,具體參數包含設計對象、藝術渲染、統計量、尺寸調整、坐標系統、分片顯示、位置調整、動畫效果等等。
更多操作可以查看ggplot2與數據可視化速查表 和 官方文檔
實戰可以參考R Graphics Cookbook一書。
ggvisggvis是吸收了ggplot2、vega以及d3的精華,目標旨在配合shiny打造動態可交互的可視化組件。ggvis最明顯的區別就是在作圖時直接支持%&>%的管道操作,比如:
diamonds %&>% ggvis(~carat, ~price, fill=~clarity) %&>% layer_points(opacity:=1/2)
ggplot2與ggvis的關係類似於plyr與dplyr的關係,都是一種演化過程。
數據建模 broombroom在機器學習的本質其實就是各種姿勢的回歸,而在R中的各種回歸分析往往不會返回一個整齊的data frame 結果。比如:
lmfit &<- lm(mpg ~ wt, mtcars)
lmfit
##
## Call:
## lm(formula = mpg ~ wt, data = mtcars)
##
## Coefficients:
## (Intercept) wt
## 37.285 -5.344
這時候broom包就派上用場了,直接將統計結果轉化為data frame格式:
library(broom)
tidy(lmfit)
## term estimate std.error statistic p.value
## 1 (Intercept) 37.285126 1.877627 19.857575 8.241799e-19
## 2 wt -5.344472 0.559101 -9.559044 1.293959e-10
augment()函數返回data frame格式的s其所有他參數結果
head(augment(lmfit))
## .rownames mpg wt .fitted .se.fit .resid .hat .sigma .cooksd .std.resid
## 1 Mazda RX4 21.0 2.620 23.28261 0.6335798 -2.2826106 0.04326896 3.067494 1.327407e-02 -0.76616765
## 2 Mazda RX4 Wag 21.0 2.875 21.91977 0.5714319 -0.9197704 0.03519677 3.093068 1.723963e-03 -0.30743051
## 3 Datsun 710 22.8 2.320 24.88595 0.7359177 -2.0859521 0.05837573 3.072127 1.543937e-02 -0.70575249
## 4 Hornet 4 Drive 21.4 3.215 20.10265 0.5384424 1.2973499 0.03125017 3.088268 3.020558e-03 0.43275114
## 5 Hornet Sportabout 18.7 3.440 18.90014 0.5526562 -0.2001440 0.03292182 3.097722 7.599578e-05 -0.06681879
## 6 Valiant 18.1 3.460 18.79325 0.5552829 -0.6932545 0.03323551 3.095184 9.210650e-04 -0.23148309
glance()函數,返回data frame格式的部分參數結果
glance(lmfit)
## r.squared adj.r.squared sigma statistic p.value df logLik
## 1 0.7528328 0.7445939 3.045882 91.37533 1.293959e-10 2 -80.01471
## AIC BIC deviance df.residual
## 1 166.0294 170.4266 278.3219 30
DataFrame優化data.table
眾所周知,data.frame的幾個缺點有:
大數據集列印緩慢
內部搜索緩慢
語法複雜
缺乏內部的聚合操作
針對這幾個問題,data.table應運而生。data.table完美兼容data.frame,這意味著之前對data.frame的操作我們可以完全保留,並且支持更多方便的數據操作方法。
data.table還參考了NoSQL中流行的Key-Value形式,引入了setkey()函數,為數據框設置關鍵字索引。
值得一提的是data.table引入了全新的索引形式,大大簡化了data frame的分片形式,提供接近於原生矩陣的操作方式並直接利用C語言構造底層,保證操作的速度。
更多操作詳情可查看data.table速查表。
DataFrame可視化DTDT包是謝溢輝老師的大作,為data frame數據提供了非常好的可視化功能,並且提供了篩選、分頁、排序、搜索等數據查詢操作。
library(DT)
datatable(iris)
此外,DT包還提供了大量的UI定製的功能,對html、css和js進行深度定製。比如:
m = matrix(c(
"&Bold&", "&Emphasize&", "&RStudio&",
"&Hello&"
), 2)
colnames(m) = c("&Column 1&", "&Column 2&")
datatable(m) # 默認 escape = TRUE
datatable(m, escape = FALSE)
分散式DataFrameDDF
DDF的全稱是 Distributed Data Frame, 也就是分散式數據框。DDF用一個統一的跨引擎API簡化了多數據源的分析操作,進一步將data frame底層的分散式傻瓜化。
在R中使用DDF,我們不需要修改之前任何的代碼,並且繞過Hadoop的絕對限制,就可以讓data frame格式的數據,自動獲得分散式處理的能力!
# 創建 DDF 管理器來運行Spark引擎
dm &<- DDFManager("spark")
# 從表格中創建 DDF
ddf &<- sql2ddf(dm, "select * from mtcars")
/*Basic Stats*/
# 返回行/列的值
ncol(ddf)
nrow(ddf)
# 在 DDF 上進行運行標準匯總
summary(ddf)
更多具體操作可以參考官方指南
DataFrame在R、Python和Spark三者中的聯繫操作RPythonSpark庫basePandasspark SQL讀取csvread.csv()read_csv()spark-csv計數nrow()pandasDF.count()sparkDF.count()分片head(data,5)pandasDF.head(5)sparkDF.show(5)推斷類型自動推斷自動推斷默認為string類型標準差計算中的NaN處理視為NA自動排除視為NaN特徵工程dplyr::mutate()pandasDF["new"]sparkDF.withColumn()參考資料Medium:6 Differences Between Pandas And Spark DataFrames
Quora:What are the differences of DataFrame between R and Pandas?
R Tutorial: Data Frame
Python Pandas 官方文檔
知乎:R語言讀大數據?
知乎的高分問答:如何使用 ggplot2?
R Graphs Cookbook
SparkR: Distributed data frames with Spark and R
Vimeo:R Data Structures
Announcing SparkR: R on Spark
amplab: SparkR R frontend for Spark
codementor: data frame operations with SparkR
Spark Summit: Distributed DataFrame (DDF) Simplifying Big Data For The Rest Of Us
SparkR 官方文檔
作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR專欄:FinanceR - SegmentFault,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio
商業使用請聯繫作者。
用R編了四五年,總結起來說。1. 熟練R後,很多小數據分析任務,你的思路是讀入數據,如何利用現有Cran上R包,如何進一步改進演算法,如何利用GG plot2之類visualization包呈現數據分析結果。2. 對於大數據分析任務,利用並行計算工具和RCPP等package優化程序計算速度是首要考量。3. sas就是亂收費的壞公司!! 如果用R和一些Python,C,計算會明顯自由而且快於Sas,而且免費!4. 利用knitr和rmarkdown等工具可以高效寫reproducable的網頁,pdf和beamer等等。。。
我自從入了統計和數據科學這一行,使用r已經有大幾年了。工作以後又開始使用python,總體比較起來,r在數據分析方面比python還是要便利許多。
r讓人最爽的地方就是數據操作非常靈活,特別是那些功能各異的package,能夠讓你很輕鬆的體驗一站式輸入就得到結果而不用自己一步步實現的體驗。大部分統計演算法都會有相應的package可以直接用。
特別要推薦的是dplyr包,能夠讓你在數據分析方面有如神助。
在ide方面如果你使用rstudio,那種趕腳比你用付費版的pycharm寫python還要爽一個檔次。
如果你要寫dashbpard,用shiny能夠非常快的就有一個prototype開始迭代。
以前人們總說r慢,其實隨著r的逐步改進,這已經不再是個問題。
我總體的體驗是一種暢快淋漓,飛一樣的感覺。。。不請自來。從12年起大量使用R,不敢說精通,但基本熟練沒有問題。說幾點自己的感觸。
其一,如此前很多達人們已提到的,R是一門專註數據分析的語言,因此R的背後更多是統計學和數據分析的套路。要真正用好R,熟悉統計理論也是必須的。當然,就個人的奇葩經歷來看,在大量使用R的過程中基本熟悉主流統計理論還是可能的(我自己是金融出身,但玩著玩著就變成統計多於金融了)。
其二,由於R有非常之多的包,且不同包的開發者有不一樣的寫作習慣,因此,入門R其實需要花不少時間。但在基本熟悉之後,你會發現它的語法是簡單的,要再上手新的包,乃至各種測試和開發工具,會很便利。說到這,不得不提RStudio。早年我堅持用文本編輯器寫代碼再發送到RGui,後來隨著RStudio集成rmarkdown、shiny和devtools,逐漸切換到RStudio開發環境,目前已經離不開了。
其三,R畢竟是為統計學家服務的,所以雖然近年有神器Rcpp,但在實際生產環境,R還是很難直接用於開發。說到這,我又有經驗教訓可說。去年至今,在公司跟IT協同部署了不少用R做開發的數據平台(由於每天低頻更新,所以還能較好應對)。但在一些實時性要求較高的項目中,R就多少顯得勉為其難,不得不考慮切換到python乃至java或c。當然,這並不妨礙R作為基本研發工具的優勢。就個人習慣而言,已基本習慣從文檔、程序到最終打包的模塊化程序包全用R寫的標準套路。
以上,供參考。先說一下自己理解的「精通R」。
和其它的通用型語言不同,R是專註於數據分析的語言,也就是domain-specific language。從這個角度看和matlab、SAS是比較類似的。
因此,與其說精通R,不如說精通數據分析的方法。
但是數據分析又是分領域的,不同的domain有不同的數據分析方法。且看官網上的task view都有幾十個了,從生物信息的數據分析到自然語言處理的數據分析,應有盡有。進入不同領域的數據分析之前,需要具備起碼的基礎專業知識,否則數據意義都理解不了。
因此,與其說精通數據分析,不如說精通某個專業。
R有5000個包,每個包後面可能都有一篇專業論文的支撐,不可能每個都精通。就像是一個有5000個面的鑽石,我只能看到某些面。只熟悉關於統計、機器學習、文本處理等一些常用的方法和包。其它的也不在我掌握之中了。
再說一下熟悉R之後的感受。
有助於打通多個專業的知識。有一句說的很好,統計學家可以隨意的進入其它學科的後院。因為很多專業的數據方法是通用的。例如看一篇疾病預測的論文,其中對基因篩選使用就是互信息方法。這正好也是文本挖掘中,對空間向量模型降維的一種方法。掌握的東西越多越會融合在一起,也會遇到越來越多的新奇東西。就這樣從一個後院跳到另一個後院,會看到整個格局,比較有趣。
對數據的思考和實踐都比以前快。類似於五筆打字,熟練的人看到一個字,不用思考如何去拆字,手指會自動跳到相應的部首鍵位上去。我現在看到數據,可以直接用R的函數來思考怎麼折騰它。
可以更好的賺錢和交朋友。這個就不用多說了。經常被請去幫人寫程序。
@肖凱 寫到了R出色的一方面,我來說點不出色的方面。
我大概接觸R四年多了,現在倒是用的越來越少了,只有畫圖的時候才會用到,隨著我對R更加熟悉,我就更加想拋棄R。我以前是經濟學科班出身,在學R之前只會半調子水平的C和熟練的VB6,初學R的時候,我很高興能夠有一個十分靈活的工具,R的dataframe是一個非常不錯的想法,這樣的設計很好地滿足了在處理數據的時候既要把數據分觀測值來考慮又要分變數來考慮的需求。R對dataframe的靈活操作也比STATA的egen等命令方便許多。作為開源軟體的愛好者,我對能掌握一種新的開源工具也十分滿意,至少不用再去用盜版的STATA了。R和LaTeX的聯動也讓我這個TeX用戶非常滿意。之後又接觸到了ggplot2這個優雅而華麗的繪圖系統,改變了我對數據可視化的認識,給了我一套新的看待統計圖形的視角。後來又去聽了R會議,參加過一些統計之都的活動,覺得R的社區還是比較活躍的。
但是,隨著我用R用的越來越多,我覺得R的基礎架構實在難以讓我滿意,用一門程序設計語言的標準來看,實在太粗糙了。相信很多用過R的人都為R的read.table/read.csv函數的報錯而抓狂,而且光看錯誤信息又很難知道出了什麼錯,用得多了,憑經驗才能定位到出錯的地方。R的顯式循環慢的令人髮指,需要寫成apply系函數,有些時候apply系函數也不能令人滿意,還需要調用C的擴展。當我開始需要自己去寫一些演算法的時候,我發現R的面向對象程序設計太簡陋了,完全無法滿足我的要求。S3 Class將所有東西都視為list和vector的組合,實在說不上好用。很多R包都不是用R寫出來的,這就導致R更像是一個把不同東西粘合起來的膠水。R有著很多好的思想,但是R自己實現地並不好。R把所有東西都讀入內存這點則成為了R的致命缺陷。在學術界,數據量都很小,這點完全不會暴露,但是在業界搬磚的時候,這個問題讓我完全沒法去用R。
R還有一個問題是封裝的太過嚴重,大部分東西都是以一個黑箱的形式呈現給用戶的,這導致的一個直接問題就是大部分R的用戶都只有使用黑箱的能力。我初學R的時候也是這樣,我還曾因為自己可以依賴各種黑箱而使得自己論文中的模型複雜程度遠勝其他人而竊喜,現在回想起來,那真心是Naive的中二時代。隨著我統計學的知識逐步積累,我發現自己不會的東西越來越多,只有當我能明白一個東西的原理的時候我才會去使用這個封裝好的工具。如果需要使用黑箱,那我明顯更傾向SAS,我相信SAS的品質,而R包的質量實在參差不齊。直接在不明白原理的情況下去使用黑箱,很可能沒有用對,而自己又不知道,最後就得到了錯誤的結果。
另外,熟悉R的過程可能會促進向程序員的轉型,黑箱用多了,總會觸發自己製造輪子的渴望的,我就是這樣一步步學起了數據結構等一堆相關的技能,然後就這麼逃離了經濟學,之前看到一個經濟學需要掌握哪些編程語言的問題的時候,發現好多人也都是這樣的感覺。
我現在R用的越來越少了,只有在畫圖的時候才會拿起ggplot2,還是要膜拜Hadley大神,不過現在Python下也有了ggplot2項目,我會去嘗試pull request,希望我能為完善那些R裡面想法很好但是R自己實現的不好的東西貢獻一點力量。我感覺精通R差不多等價於精通統計學.
精通統計學後, 花一點點時間學習R的語法, 以及常用的統計包, 就精通R語言了.
相反, 不懂統計學, 學了R語法, 只能把R語言當成C語言來用. 那些統計包根本學不起來, 文檔都看不懂, 這個函數是幹嘛的啊?! 這個參數是什麼意思?!
R非常適合用來建模,搭配caret等包,在模型的選擇上非常省力。而且現在國外最新的學術論文上很多新的方法都在R上實現了演算法,這可以使得我們非常方便就能夠對演算法進行測試和比較。
至於上面大部分提到的用在工業上,這是確實R的弱項,他在性能上確實沒有其他語言優秀,而且用他做後台什麼的也不現實,但是對於我們來說,這些具體的實現並不是我們所關心的,我們關心的只是模型的效果。模型做出來之後,完全可以交給其他語言JAVA C去部署,去實現。不敢說自己有多麼精通,但是現在用R解決工作學習上的問題已經遊刃有餘了。對於SPSS、SAS、eviews、stata、matlab我以前或多或少都有用過,但是掌握R以後這些軟體我幾乎都再也沒有碰過了。。。因為R真是太好用了。。。尤其是用R結合Python來處理問題,絕對是一種享受!
本科沒學過任何計算機語言,現在非常熟練掌握stata/SAS/R,熟悉和正在進一步學習Unix和Python。主要目的是做生物統計和基因分析。stata是最早接觸的因為比較簡單/語言非常固定,語言也比較死板。是做meta-analysis的好工具。SAS是比較正規的語言,尤其在clinical trial方面。整個界面都透出來一種正規軍的霸氣和死板,圖也不是非常好看,但勝在規範,因此業界對SAS的分析結果認可度最高。R比起前兩種,就靈活高效非常多,功能強大作圖也超贊。如果做基因分析,有很多很多package可以用。可以先找本書用幾天把基礎R刷一遍,然後剩下的就是根據需要尋找和學習package。就像前面一位答主說的,熟悉R的感覺就是看見這個dataset,腦子裡就反映出在R裡面一步步怎麼把要做的分析拆解實現。Python沒有非常系統地學,只在做基因分析的時候學過基礎的,感覺比起R更靈活,尤其在寫function或者loop的時候。但初學者也許會覺得平台不統一,學起來略混亂。Unix也還沒有系統地學,最開始只是為了去cloud上調數據,後來才開始接觸怎樣來簡單地處理數據和操作電腦。總體感覺是各有各的好處吧,每一種都有其他語言不方便/實現不了的地方。多學多練總歸沒有壞處,用熟了真心會覺得爽。
不會空大。
其實我只想說最終你還是要用Excel來幹活……
謝瑤,剛做完周報過來答一下,對R只能算熟悉而已,精通還差的很遠。
經常會有的感受就是:我擦,這貨還能幹這個?!太牛了...以及,我擦,這貨這玩意竟然這都幹不了?!鬧哪樣...不夠精通的強行回答一記。轉學統計就開始學R,之前會一毛錢的c++,兩毛錢的matlab。到現在剛好兩年。書的話認真看過兩本,R in action和advanced R,其他就靠用的時候摸索研究吧,我特別不好意思的說,不太懂計算機的人都不太遇到他們說的那些問題,也不太在意這種問題。不提R在業界的應用,說實在的,有些工作非要用R做感覺屬於自己提高難度。R在我所見,更像一個統計學家交流的平台,每當有人有什麼很牛的方法就馬上寫到R裡面秀一下。現在統計學界應該幾乎所有的simulation部分都是用R來做的,所以如果不熟悉這個也還挺麻煩的。甚至我還見過專門寫paper來介紹他的package的,我也是醉了。於是,當你習慣了這個套路之後,當你再搞什麼事情的時候,也總是想到先去R裡面試試,而且R裡面對於小數據的處理非常的方便友好。同時,大家也不斷地提到了R比較強大的可視化,我也就不說這對於在研究中方法的改進啟發有多大了。另外,R能做有一些很有意思的小工作,我感覺對於學統計來說,不斷的在R裡面嘗試並且體驗數據還蠻重要的。舉個例子,剛開始學的時候,寫過一個mcmc做fisher exact test,不斷的調整,和已有的package進行比較,感覺還是一個增廣見識的過程,後來發現其實mcmc這個東西有時候就是看感覺。。。還有個比較雷的故事是有個老師和我閑聊說他監考的時候無聊把班裡人前面的作業quiz調出來用R做了個graphical model來看誰和誰有可能作弊,然後重點盯防,然而並沒有卵用。當然,我感到R最大的問題就是大家都詬病的那個for loop慢如龜。。。最近要試一下去年JASA發的那篇adaptive resampling test,裡面用了兩次bootstrap,所以慢的簡直無法想像。嗯,我還挺好奇還有沒有人總用Boston做例子的!
個人覺得,R的本質應該是統計問題本身,所以才說的一個 package後面幾篇paper的說法,至於拿來做生產力工具,本質還是C或者C++,所謂的精通R更多應該關注在精通背後的模型上.要不然隨便拿來一個function用,考慮效率之類的,用python,c都差不多的.
幫老闆省了SAS的年費
只用了兩年左右,對R的認識基本上是從自己開始寫某個函數,到搜搜stack overflow發現有現成的包可以做,然後發現一下子節省很多運算時間。
對於黑箱,每個統計包里都包含了很多函數,統計包的介紹說明裡也會有原理的講解。比如mlogit包里有講離散選擇模型的推導和參數估計。很多參數估計的模型都是用的Maximum Likelihood Estimation,所以想了解黑箱內幕的話不妨自己去roll up log-likelihood function,然後用一些非線性優化函數去解。優化函數里也有很多不同的演算法,有要求hessian的,還有hessian free的演算法。自己可以搜搜看看,也挺有意思,以後遇到singularity的報錯也知道什麼原理了。
R處理數據方面確實不錯,各種時間函數,table整合計算,字元串提取之類的。但是數據量大的時候會很慢,平時做做研究用用還行。至少我知道的大公司都是用SAS,比如Discover Financial。
離精通還太遠,不過以後要是不做研究了,估計會越來越疏遠吧,sigh。不請自來,大四開始開始學習R語言,到現在本科畢業剛剛好一年,精通談不上,最多只能說可以用來解決一些生物信息學問題。本來實驗室編程語言大頭就是Python和shell(現在為了用TensorFlow和keras,必須把Python撿起來了 ),但是之前PHP中毒太深不知為何讓我對Python一直沒法有很大的進步,後來為了做機器學習和玩玩kaggle數據,遂入了R的坑。進入正題,到現在我用的最多的也是ggplot2,dplyr,data.table,caret,randomforest,corrplot,e1071,string_r,tm,RCurl,mice等包,還有其他一些統計學檢驗的函數,現在一直在數據挖掘的路上默默地爬行,畢竟還是菜鳥級別,不敢說大話。就個人來說,R編程可以通過看函數文檔來解決,但是建立的機器學習模型和統計學檢驗還是很需要有一定的統計學基礎的,精通R需要在編程和統計學兩個方向都要有一定的積累。FYI,有些R包是真好用~給那些作者們點贊;管道符真tm好用;R跑的是真慢
小菜鳥的感覺就是大雜燴,同樣的功能很多的實現方式,包太多質量參差不齊,報錯信息很難定位問題根因
推薦閱讀: