OCF 國際交流計劃: useR!2016會議心得

緣起

    在就讀台大基因體與系統生物學時,開始碰觸生物資訊,因而開始學習R語言,進而慢慢認識這個有趣且開源的程式語言,在2016年初時,參與了DSP智庫驅動所舉辦的資料科學營隊,主旨是學習開源R語言來做數據分析,小組成員背景迥異,有統計學系、計算機科系、計量金融、醫療背景,而我們小組在幾天營期中,討論出了一個有趣的題目:分析並且了解台中友善老人的程度,在搜集了許多資料後,我們使用WHO裡面的Age-friendly guideline來做基底,結合台灣開放政府的資料來建立指標,最後以地理視覺化的方式來呈現,在營隊結束後,為了進一步好好讓我們的成果能更完善,我們決定要投稿一個會議來激勵我們持續的改進,最後選擇了useR!2016的會議來當作我們的目標,一方面,useR會議是R語言會議裡面最重要的,且今年舉辦地在史丹佛大學,非常值得一試,而在準備投稿的期間,我們把分析的對象擴大到全台灣的縣市,也將視覺化的部分調整更美觀。

為何選擇useR!2016會議

    在準備要投稿前對於整個R語言的生態圈不是非常理解,在準備的過程才慢慢理解R語言社群中最重要的會議便是每年一次的useR!會議,裡面會有軟件開發者的發表和交流,且會接受各種R語言相關的海報投稿,而相信這會議蠻值得一去的,畢竟學習開源語言最快速的方法便是積極與其他開發者學習交流!

useR!2016的特色

    此useR!會議每年的舉辦地和舉辦人都不同,今年舉辦的地方是在著名的史丹佛大學,位於美國的西岸矽谷的心臟地帶,且獲得灣區地方的大公司贊助,如google、microsoft、H2O、teradata、Oracle、datacamp、RStudio、ebay、Alteryx、AT&T,而主軸演講邀請到很多的大師,如S語言的開發者Richard Becker、Donald Knuth、Deborah Nolan、Hadley Wickham等等。

投稿策略的思考

    決定要報名useR!2016會議後,便開始研讀useR!2016會議裡面撰寫的細節,其中適合學生等級可以投稿的為lighting talk和poster session,對於投稿的內容和主題需要如何細化內容和方向,就藉由閱讀2015會議的abstract來一窺究竟,而發現大多數投稿的項目可以大致分為:統計方法的精進、開發新的套件、R語言在各領域的應用,我們的項目變很適合在第三個類別來投稿,再來分析投稿上人的資歷和組織,發現我們這組非“博士”以上層級,大概比較適合投稿poster,所以最後變決定以poster的形式來投稿。其中撰寫項目介紹的時候,我們盡量用關鍵字搜尋2015年的資訊,學習裡面的用字遣詞和文章結構,盡量言簡意賅且用字要精準地表達某個領域的關鍵。

投稿時程和內容需求

useR!2016的報名系統主要是用typeform做成的,流程很順暢清楚,主要需要提供:摘要、專題相關的網站、專案的github,這三項是最需要費盡準備的,其中與投稿專題相關的網站,我們使用在營隊裡團隊討論的hackpad,裡面有詳細記錄我們整個從題目發想、工作分工、資料收集、分析結果,專案的github建置則參考網路上各種“分析專案”的資料夾架構,便是用程式碼、分析結果、分析資料,三個大分類來置放整個分析過程產生的資料,準備工作大概花費一個多月,將整個專題內容比較有條理的整理成摘要,變且建置乾淨整潔的github repository。

會議參與的補助:開放文化基金會

    當知道投稿通過後,我們開始思考如何獲得補助來參與會議,其實對於這類開源會議的補助,從校方或是教育部方面來著手都會比較困難,一方面是這類補助的規定會比較死,通常都需要找尋指導老師,而我們組成來自各個學校,很難用這種方式來申請,最後找到開放文化基金會裡補助青年參與國際開源會議的計畫,恰巧符合我的需求,開放文化基金會這計畫需要繳交的資料便是:1.參與會議的介紹,和值得參與的理由、2.投稿的內容、2.經費的估算,整個過程非常順利,對於學生參與國外大型開源會議來說是非常好的資源!

    在實務面來說,開放文化基金會的申請是遞交後便開始審核,整體對於規劃機票和住宿的費用申請很有彈性,相對於學校或教育部需要以“三個月一季”為單位,將會議開始的時間點來推算申請日程,造成會議開始時間點和得知補助通過的時間點很接近,造成購買機票或是規劃住宿費用提升。除此之外,開放文化基金會要求回國後要舉辦分享會,將在國外的所見所聞分享,而籌備的過程需要自主積極的規劃,而基金會也會提供非常多的意見和幫忙!

useR!2016會議架構

    今年的會議議程總共有四天,從6/27到6/30,會議場地遍佈史丹佛校園的各個場館,從台灣轉機直接搭到聖荷西機場,再轉搭接駁公車和火車到史丹佛大學,史丹佛大學的校區就在帕羅奧圖站,從火車站下車其實就到校區,校區裡面有醫院、購物中心,內有大學公車在大學內,住宿方面則因為在灣區的關係非常昂貴,普通旅館幾乎都要一晚上一萬元左右,但會議有提供史丹佛大學宿舍可以申請,費用可稍微節省許多,但名額不多,會先讓講者或是報告者申請,議會內容形式主要有:工作坊、大師講題、小型演講、海報分享等內容,所有的會議內容都有錄影,這次微軟負責直播和錄影,整體的錄影效果非常好,會後已經將影片放置在microsoft的channel 9 平台上,是非常好的學習資源。

    會議四天都有提供午餐和點心,第一天以工作坊為主,主題從機器學習、模型建置、統計分析、R工作流管理、RStudio新功能介紹,休息時間則有咖啡甜點供應,第二天到第四天則以大師講座、小型演講、海報演講為主,會議採用Sched平台,四天下來大大小小的演講超過400多場平行議程,如何選擇常常事件令人頭痛的問題,而Sched剛好提供一良好的個人會議議程規劃,可以安排自己有興趣的講題,且可以用地圖的遠近來挑選,才不會發現最後安排的行程不順路,最後會將每個人的會議議程選擇自動匯整成為個人行程,如同google日曆一般,前一天晚上會提醒你隔天要去哪邊,且每一場講座都有清楚的摘要和介紹,另外使用這套系統的有趣之處在於你可以看到其他人的行程安排,同一場會議有誰要去,事前知道哪一場會議是最熱門的,連海報session都可以是先看到誰對這主題有興趣,這種把網路社交的概念帶入會議參與中,可以發揮networking最大化的效果。

useR!會議工作坊

   第一天為工作坊時段,總共有18場可供選擇,每場三小時,中間會有一個休息時間,講師皆為資深的開發者,資料科學家、技術叢書作者、教授、線上課程講師,在工作坊前就能看到每個工作坊的事前閱讀和安裝準備文件,大多數講者都有準備好的課程github頁面,將所有需要的東西放在裡面,工作坊的過程底下的參與者也能一同修改內容,互動良好,在教學上,有的講者在AWS上架設RStudio的server,裡面先設置好需要的環境提供給參與者,參與者直接連線到遠端帳號上操作,如此便可以減少安裝環境和依賴包所需的時間(通常現場網速都很慢),讓參與者儘速可以動手,或是使用Jupyter notebook裝上R kernel,在上面展演分析的過程,可以學習他們這種分享的方式,不限於使用簡報而已,更多的與參與者一同演練。

useR!會議的大師講座

    這次會議的大師講座剛好串起最近R社群很火熱的主題:如何創造好的開源社群(Richard Becker從S語言的興衰來思考R語言的興盛)、Literate programming(Donald Knuth從其經典著作The Art of Computer Programming談好的程序撰寫)、資料科學的教學風氣(Deborah Nolan以其在伯克萊教學經驗談“好的”資料科學該怎麼教或是學)、Hadley Wickham(針對gg系列未來發展方向的解說),Daniela M. Witten是知名統計學家Rob Tibshirani的“嫡傳弟子”,研究專注於高維度資料的機器學習,尤其是基因組測序資料。

Richard A.Becher是S語言的創造者,在R語言出現之前,S語言發展了將近四十年,Richard Becher是當時貝爾實驗室的研究領導學者,在1970年代貝爾實驗室便是當時統計編程的重要發源地, S語言便是應貝爾實驗室裡頭科學家、工程師們的需求而存在的,此次演講變分享他是如何讓S語言茁壯和當時開發的種種心得,其提到其開發S語言秉持者一些基本原則,第一,其開發的功能都是在貝爾實驗室裡頭所需要的,第二,S語言只有其和少數幾位專家們決議重要的發展發現,第三,其開發跟者當時的unix系統,所以移植性佳,最後Becher也省思了為何S語言會消逝,或許這場演講是為了讓R開源社群的夥伴更理解一個語言的興起和衰弱,是存在哪些因素,並且從其中借鑑。

Donald Knuth是史丹佛的計算機科學教授,開發了目前為人熟知的Tex,其一發布其原代碼幾乎沒有錯誤,他撰寫的編程的藝術(the Art of Computer Programming)在計算機科學裡佔有非常重要的角色,這次他演講的題目literature programming正式R開源社群近年來很重視的議題,如何撰寫更reproducible以及sharable的代碼和工具,所以他就分享他對於literature programming的看法。

Deborah Nolan是柏克萊大學的統計教授,他分享了其對於所謂“資料科學”的教學心得和應該要有的方向,批判了傳統統計學總是以學理公式的方式來傳授,Nolan教授更強調要在“脈絡”下去學習分析資料,從中學習統計的觀念,且搭配者編程語言,讓學生能更“動手”地來學習,最好從資料最“原始”未受清理的階段開始,可以從他的書Data Science in R: A Case Studies Approach to Computational Reasoning and Problem Solving來學習他整套的資料科學教學方式,書中便是一章章使用案例的方式,帶出一個科學思維的脈絡,並從資料最“原始”的狀態開始處理,他的演講可以對於我們學習資料科學有更好的思維準備。

Hadley Wickham是目前R語言界最呼風喚雨的才子,本身是Rstudio的首席科學家,有一群很好的夥伴在開發各式各樣的R語言封包,其中最讓大家知道的是ggplot2,但除此之外,他其實有一整套開發思維,在於如何讓人們能更有效率地使用R在進行資料分析,這次主要帶來其tibble、tidyr、dpylr的想法,整個演講內容提綱挈領,且搭配者操作與台下的互動,相信未來他會開發出更多好用的封包,甚至整個改變了R語言的撰寫風格。

Daniela M. Witten是統計學術界的新星,目前是華盛頓大學統計系的教授,本身專注於處理高維度數據機器學習的方法,跟有名的史丹佛統計學家Rob Tibshiran一起寫過An Introduction to Statistic Learning,是其在史丹佛大學的嫡傳弟子,開發出許多機器學習相關的R語言封包,這次分享其使用Convex Penalties來做回歸分析。

這幾位大師級的分享,串鏈了這幾年社群裡面很火熱的議題,很值得把原始的演講影片調出來欣賞。
(Microsoft channel9平台裡面有這次演講的直播影片)

在眾多的Lighting talk裡面(因為有400多場),有的只有簡短五分鐘,大多數都會分門別類的,比如資料視覺化、生物資訊、醫療數據、資料庫、雲端計算、統計模型、應用等等,大多是開發者分享和介紹自己的項目,希望大家多多使用,這些分享可以清楚讓我們這些R語言終端使用者深深體會到其實我們並沒有跟開發者距離那麼遠,他們其實很希望使用者們跟他們建立關係,回應需求,甚至提供改善的意見,且也會發現到R語言的封包如此多種,要小心謹慎的選擇可靠的開發者,才不會浪費學習成本,但到頭來開發者停止繼續改善。而優秀的開發者會把使用者遇到的困難當作是自己的問題,努力去降低使用的障礙,比如Hadley便是這種極端偏執於開發出好用的封包。

在第三天下午則是我個人的海報發表時間,場地是在戶外草地搭建的區域,每個人可以提早大約十天寄電子檔給大會幫忙輸出,展位大小約莫全開紙張大,旁邊就是贊助商的攤位,發放各式各樣的宣傳禮品,間接帶動來這邊看海報發表的人群,為了準備好如何介紹發表的內容練習了很多版本,因為每個人有興趣的程度都不一樣,這種練習介紹自己在做什麼的方式蠻棒的,可以很快速地拉近參與者,相對於午餐搭訕,更有正當的話題,同時,也可以觀察每個人海報製作的邏輯都不太一樣,生物背景分享者的海報、計算機科學背景分享者的海報、數學物理背景分享者的海報都不同,大抵是機器學習相關的主題最讓大家有興趣。

這趟的useR!2016會議經驗其實非常的難得,一方面舉辦地點在史丹佛大學,可以趁機會到附近逛逛,體會一下矽谷的風情,另一方面,則是會議參與者都是R語言開發者,可以近距離觀察高手們在想什麼,整個R語言社群有什麼很熱門的話題,檯面上的大人物有誰,在會議過程中可以觀察和學習不同國家的交流方式和開場白,都是很有目的性的溝通,短時間內介紹自己的職位在做些什麼事情,如何談段大家有興趣的話題,避免尷尬,甚至很多參與者在會議前都有書信溝通,要在會議當天見面和討論合作內容,唯有不斷提升自己的專業能力,才有機會在國際舞台上跟更多人溝通和來往,希望這些心得分享能鼓勵更多台灣的夥伴跟開放文化基金會爭取出國補助機會,或是讓對useR!會議有興趣的同好能有更多的參考資訊。

Frances C. Arrillaga Alumini Center為會議的主場館,在這邊註冊,裡面有三個會議場地,分別為MaCaw hal、Barne/McDowell 、Lane, ,此處還有提供午餐和點心的戶外座椅區。

p1240715

海報在第二十號攤位,第三天的海報發表就站在這海報前分享自己的專題內容,旁邊都是知名資料科學公司的攤位。P1240727.JPG

在主場館裡的Lane會議廳實景P1240732.JPG

大師演講系列裡每個教授都有直播服務,避免場館會坐不下所有人。

P1240731.JPG

會議場地McGaw Hall,所有的大師講座會舉辦在這邊。
P1240720.JPG

在Campbell Rehearsal Hall,在另一個區域,R工作坊的舉辦地。P1240725.JPG

機器學習裡的簡單回歸分析

回歸分析本是傳統統計學裡面很重要的一個領域,而近年來在計算機科學裡的“機器學習”也佔有一席之地,因其可以用來建立對於線性數值的預測模型。

Linear model always be your starting point

— Brian Caffo, Proffessor in Johns Hopkins

機器學習某個角度來說就是數據+統計+演算法的結合,在冠上新的名稱,其中的重點在於如何不斷修正統計模型,已達到更好的預測效果,而數據越多,能做出更好的預測。

這邊簡單紀錄以機器學習觀點下的線性回歸,使用線性模型的好處是其對於:1. 模型訓練資料量相對需求小、2. .模型中的x和y的關係易於闡述、3. 可以建立出好的預測模型

當我們使用回歸方法來分析兩個連續變數之間的關係時,其實就暗示者他們之間有者因果關係,其中的"因"通常就以x代表(predictor, independent variable),"果"就以y代表(response, dependent variable)。也就是我們希望建立出來的模型,可以使用x來獲得y的預測值!

評估建立的線性模型,是否符合資料,可以使用兩種方式來確定:很棒的簡介影片

第一種,計算RMSE

RMSE = \sqrt { \frac{\sum_{i=1}^{n}(y_i - \hat y )^2) }{n}}

簡單的說,RMSE是計算殘差(residuals)的標準差(standard deviation),越小值代表,使用模型預估出來的預測值和實際值的誤差越小,模型越接近真實情況,此模型的特性是會對數值中的特異值會有比較大的放大效果!

第二種,計算R squared

R squared 代表模型可以解釋預測出來Y值的變異性, 數值越接近1代表模型符合原始資料。
SSres = \sqrt { \sum_{i=1}^{n}(y_i - \hat y )^2) } {1}{n-1}\sum_{i=1}^{n}(X_i – \bar x)(y_i – \bar y)$

cor(x,y) = \frac{cov(x,y)}{S_xS_y }

<pre>#import library</pre>
library(tibble)
library(dplyr)
library(ggplot2)
library(UsingR)
data(galton)

#import data
dim(galton)
str(galton)
family.height.data <- as_tibble(table(galton)) #exploratory the data with scatter ggplot(data = filter(family.height.data, n > 0), aes(x = parent, y = child)) + geom_point(aes(size=n))

[/code ]

#build the linear regression with lm package
lm.height <- lm(child ~ parent, data = galton)
parent.height <- galton
parent.height$child <- NULL
lm.predict.result <- predict(lm.height, parent.height)

res <- galton$child - lm.predict.result
#Two Ways of assessments
#RMSE
rmse <- sqrt(sum(res^2)/nrow(galton))



```

2.236134

```


#R.square
ss_res <- sum(res^2)
ss_tot <- sum((galton$child - mean(galton$child))^2)

R.squared <- 1 - ss_res/ss_tot 

``` 0.2105 ```

 summary(lm.height) [/code ]   ``` Call: lm(formula = child ~ parent, data = galton) Residuals: Min      1Q  Median      3Q     Max -7.8050 -1.3661  0.0487  1.6339  5.9264 Coefficients: Estimate Std. Error t value Pr(>|t|)
(Intercept) 23.94153    2.81088   8.517   <2e-16 ***
parent       0.64629    0.04114  15.711   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.239 on 926 degrees of freedom
Multiple R-squared:  0.2105,    Adjusted R-squared:  0.2096
F-statistic: 246.8 on 1 and 926 DF,  p-value: < 2.2e-16

```



#Visualization
predict.data <- tibble(child = lm.predict.result, parent=galton$parent)
predict.data <- as_tibble(table(predict.data)) %>% filter(n > 0)
predict.data$child <- as.double(predict.data$child)
predict.data$parent <- as.double(predict.data$parent)
predict.data$type <- "predict"
origin.data  <- tibble(child = galton$child, parent = galton$parent)
origin.data  <- as_tibble(table(origin.data)) %>% filter( n > 0)
origin.data$child <- as.double(origin.data$child)
origin.data$parent <- as.double(origin.data$parent)
origin.data$type <- "origin"
total.data <- bind_rows(predict.data, origin.data)

ggplot(data = total.data) + geom_point(aes(x = parent, y = child, colour = type, size = n)) +
geom_abline(intercept = lm.height$coefficients[1], slope = lm.height$coefficients[2])

screenshot.png

淺思考:散布圖(scatter chart)、相關(correlation)和回歸(regression)

 

在統計分析生物或是醫療資料時,當我們要探討兩個連續型變量(continuous variables)的關係時,比如說父母身高跟小孩身高的關係、一個人身高跟體重的關係等等,最好的方法便是先作圖(visualization),此時散布圖(scatter)便是很好的工具。而我們把資料用散布圖呈現的時候,另一個重點便是要去思考這兩個變量的關係(我們當然不會沒事來探討,通常都覺得這兩個“有關係”)。

但兩個變數之間會有什麼關係呢?首先,我們其實已經知道,這兩個變數之間不太可能有如像是物理學裡F=ma這種非常清楚的函數關係存在,畢竟是來自於生物醫療上的資料,往往都是以“不確定的函數關係”存在。這時候常常會先尋找,這變量間是否可以用相關(correlation)或是回歸(regression)分析去解釋變數之間的聯繫。

連續變數間最常見的關係便是:1. 因果關係 2.平行關係。

screenshot.png

因果關係是指一個變量受另一個變量影響,而平行關係通常代表兩個變量同時受某個因素影響

簡單將數據以散布圖的方式就能對兩個變數間的關係有些許覺察。

screenshot.png

screenshot.png
Nature Methods 12,999-1000(2015) doi:10.1038/nmeth.3627

從散布圖就可以先觀察幾個重點:

  1. 變量間的關係性質和程度
  2. 變量關係的類型,是直線還是曲線
  3. 是否有異常觀測值的干擾

而之後就可以思考要用相關分析或是回歸分析來探討兩個變數!當使用回歸分析的時候,通常就是假定一個變數主要受另一個變數影響,被影響的變數通常稱為應變量(dependent variable), 常用y表示, 影響別人的變數通常稱作自變量(independent variable),常用x表示。

當兩個變量間為平行關係時,可使用相關分析,此時兩個變量間其實沒有應變量和自變量的差別,且兩者同時都存在隨機誤差。對兩個變量間的直線關係進行分析則稱為直線相關分析(linear correlation analysis)或是簡單相關分析(simple correlation analysis)

當兩個變量間有因果關係時,我們使用回歸分析,此時應變量(dependent variable)隨自變量(independent variable)改變,且應變量伴隨者隨機誤差存在,當研究一個應變量與一個自變量的關係則稱為一元回歸分析(one factor regression analysis),研究多因一果實,則稱為多元回歸分析(multiple regression analysis)

 

 

關於R function的幾點小事

寫好function一點都不簡單,這邊分享和整理在撰寫function要思考的事情。而這邊主要是講R語言裡的function,但其實很多觀念是可以供通的,可以分別為:一個function的組成什麼是好的function各種function的類型何時要寫function撰寫function的流程。

function是一連串expression包裝(encapsulate)起來而成,expression的多寡決定一個function可以處理事情的多寡,恰當好處的功能,是一個好function的關鍵,能解決問題的function就是有用的,而function裡面細節的設計則決定會不會讓使用者愛用。

首先,理解在R裡面,一個 function基本由什麼組成:

  • 參數arguments
    • 可以使用formals()檢視
  • 主體的代碼body:
    • 可以使用body()檢視
  • 函數中使用變數對應的“變數空間”environment:
    • 可以使用environment()檢視

再來理解,怎麼樣是一個好的function:

  1. 能解決當下問題(最重要)
  2. 易讀性
  3. 輸入輸出高穩定性(stable / pure function )
  4. 對於錯誤訊息的處理(error handling)
  5. 減少對於hidden argument的依賴(比如環境變數等等)

特殊的Function:

  • infix function:(或可以稱為binary operator)
    • 函數出現在兩個參數之間,像是%%, %*%, %/%, %in%, %o%, %x%.
    • 可以這樣來定義:

[ code language="r" ]

%g%

paste(left, right)

}

[/code ]

  • replacement function
    • 函數只接改變其參數的數值。
  • pure function
    • 沒有side effect,輸入跟輸入乾淨
  • function with side effect
    • 會直接改變環境中的設定library()、setwd()、 Sys.setenv()Sys.setlocale()plot()、write()、write.csv()saveRDS()、options()par()

 

何時是寫function的好時機呢?

這邊可以參考這本Executive Data Science  裡面的說法,當你開始寫個code來完成一件事情的時候,這時候就要仔細記錄使用場景,要第次用這個代碼來完成事情的時候,便可以考慮一下撰寫function,當第次依舊需要再做一樣的事情時,就可以規劃來把function包成packages。

 

撰寫function的基本流程

  1. 先定義好自己function要完成的事情
  2. 先用一連串的expression來做快速的prototype
  3. 將其包裝成function
  4. 進行重構(refactoring),盡量讓代碼完成最小單位的事情,過多的複雜會使代碼難以閱讀和管理
  5. 進行vectorize,盡量讓函數的輸入維持成單個數入,避免過度的使function的表現更好預測
  6. 設定default值

使用python來調用pubmed API快速整理文獻

在pubmed上用關鍵字取得的文獻後,想要把這些文獻直接收集起來,可以使用pubmed所提供的API,可以很簡單快速的達到自己想要的資料收集方式,這邊使用python來實作:

#載入需要用到的包
import requests
import json
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

#第一部分,先取得目標搜尋字串,相關的UID
此部分先使用pubmed的ESearch utilities
db = "pubmed"

#要查詢的字串

query = "Hsuan-Yu Chen"
base = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/'
url = base + "esearch.fcgi?db=" + db + "&term=" + query + "&retmode=json"+ "&reldate=360&datetype=pdat" + "&retmax=100" + "&usehistory=y"
re = requests.get(url)
result = re.text
 

可以看以下,搜尋到返回的json格式文件長什麼樣子:

<pre>{
    "header": {
        "type": "esearch",
        "version": "0.3"
    },
    "esearchresult": {
        "count": "14",
        "retmax": "14",
        "retstart": "0",
        "querykey": "1",
        "webenv": "NCID_1_45838404_165.112.9.28_9001_1475480153_920070247_0MetA0_S_MegaStore_F_1",
        "idlist": [
            "27536893",
            "27480787",
            "27449093",
            "27437769",
            "27429846",
            "27384480",
            "27323831",
            "26930648",
            "26904216",
            "26859295",
            "26824984",
            "26655923",
            "26645716",
            "26580398"
        ],
        "translationset": [
            {
                "from": "Hsuan-Yu Chen",
                "to": "Chen, Hsuan Yu[Full Author Name]"
            }
        ],
        "translationstack": [
            {
                "term": "Chen, Hsuan Yu[Full Author Name]",
                "field": "Full Author Name",
                "count": "82",
                "explode": "N"
            },
            {
                "term": "2015/10/09[PDAT]",
                "field": "PDAT",
                "count": "0",
                "explode": "N"
            },
            {
                "term": "2016/10/03[PDAT]",
                "field": "PDAT",
                "count": "0",
                "explode": "N"
            },
            "RANGE",
            "AND"
        ],
        "querytranslation": "Chen, Hsuan Yu[Full Author Name] AND 2015/10/09[PDAT] : 2016/10/03[PDAT]"
    }
}
</pre>

我們只想要其中的idlist,在使用這一串UID再去下載其原本的文獻內容!

#將搜索到回傳的text,提取UID列表
data = json.loads(result)
idlist = data["esearchresult"]["idlist"]
string = ""
number = len(idlist)
lastone = idlist[number - 1]
for item in idlist:
    if item == lastone:
        string = string + item
    else:
        string = string + item + "," 

接者使用NCBU API E-utilities中的EFetch,來取得相關文獻的摘要、作者、連結等資料。
以下為pubmed,所能提供回傳的資料型態
screenshot.png


#決定要回傳的格式
retmode = "xml"
rettype = ""
re = requests.get("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=" + retmode + "&id=" + string + "&rettype=" + rettype)
#使用python 內建的xml處理函數
tree = ET.fromstring(re.text.encode("utf-8"))

#提取跟文獻iod相關的資訊
d = tree.findall("PubmedArticle/")
doi_list = []
n = -1
for item in d:
temp = len(doi_list)
if item.tag == "PubmedData":
for doii in item.findall("ArticleIdList"):

for link in doii:
if link.attrib["IdType"] == "doi":
doi_list.append(link.text)
if temp == len(doi_list):
doi_list.append("No doi")

#提取文章標題的資訊
p = tree.findall("PubmedArticle/MedlineCitation/Article/ArticleTitle")

#提取文章相關摘要的資訊
a = tree.findall("PubmedArticle/MedlineCitation/Article/Abstract/AbstractText")

#提取跟文章相關的引用資料
lastname_list = tree.findall("PubmedArticle/MedlineCitation/Article/")
name_list = []
for item in lastname_list:
if item.tag == "AuthorList":
lastnamelist = []
firstnamelist = []
name = []
for lastname in item.findall("Author/LastName"):
#print lastname.text
lastnamelist.append(lastname.text)
for firstname in item.findall("Author/ForeName"):
#print firstname.text
firstnamelist.append(firstname.text)
for number in range(len(lastnamelist)):
name.append("{second} {first}".format(first = lastnamelist[number], second = firstnamelist[number]))
name_list.append(name)
result = dict()

for numb in range(len(p)):

result[p[numb].text] = [a[numb].text, name_list[numb], doi_list[numb]]

#重整全部提取出來的文章資料,在此整理匯出的資料樣子
for item in result:
print item, "\n"

string = ""
number = len(result[item][1])
lastone = result[item][1][number - 1]

for name in result[item][1] :
if name == lastone:
string = string + name
else:
string = string + name + ", "
print string, "\n"
print result[item][2], "\n"
print result[item][0], "\n\n\n"
print "-"*90, "\n\n\n"

Implementation and Quality Control of Lung Cancer EGFR Genetic Testing by MALDI-TOF Mass Spectrometry in Taiwan Clinical Practice.

Kang-Yi Su, Jau-Tsuen Kao, Bing-Ching Ho, Hsuan-Yu Chen, Gee-Cheng Chang, Chao-Chi Ho, Sung-Liang Yu

10.1038/srep30944

Molecular diagnostics in cancer pharmacogenomics is indispensable for making targeted therapy decisions especially in lung cancer. For routine clinical practice, the flexible testing platform and implemented quality system are important for failure rate and turnaround time (TAT) reduction. We established and validated the multiplex EGFR testing by MALDI-TOF MS according to ISO15189 regulation and CLIA recommendation in Taiwan. Totally 8,147 cases from Aug-2011 to Jul-2015 were assayed and statistical characteristics were reported. The intra-run precision of EGFR mutation frequency was CV 2.15% (L858R) and 2.77% (T790M); the inter-run precision was CV 3.50% (L858R) and 2.84% (T790M). Accuracy tests by consensus reference biomaterials showed 100% consistence with datasheet (public database). Both analytical sensitivity and specificity were 100% while taking Sanger sequencing as the gold-standard method for comparison. EGFR mutation frequency of peripheral blood mononuclear cell for reference range determination was 0.002 ± 0.016% (95% CI: 0.000-0.036) (L858R) and 0.292 ± 0.289% (95% CI: 0.000-0.871) (T790M). The average TAT was 4.5 working days and the failure rate was less than 0.1%. In conclusion, this study provides a comprehensive report of lung cancer EGFR mutation detection from platform establishment, method validation to clinical routine practice. It may be a reference model for molecular diagnostics in cancer pharmacogenomics.


Purine-Type Compounds Induce Microtubule Fragmentation and Lung Cancer Cell Death through Interaction with Katanin.

Ting-Chun Kuo, Ling-Wei Li, Szu-Hua Pan, Jim-Min Fang, Jyung-Hurng Liu, Ting-Jen Cheng, Chia-Jen Wang, Pei-Fang Hung, Hsuan-Yu Chen, Tse-Ming Hong, Yuan-Ling Hsu, Chi-Huey Wong, Pan-Chyr Yang

10.1021/acs.jmedchem.6b00797

Microtubule targeting agents (MTAs) constitute a class of drugs for cancer treatment. Despite many MTAs have been proven to significantly improve the treatment outcomes of various malignancies, resistance has usually occurred. By selection from a two million entry chemical library based on the efficacy and safety, we identified purine-type compounds that were active against lung small cell lung cancer (NSCLC). The purine compound 5a (GRC0321) was an MTA with good effects against NSCLC. Lung cancer cells H1975 treated with 5a could induce microtubule fragmentation, leading to G2/M cell cycle arrest and intrinsic apoptosis. Compound 5a directly targeted katanin and regulated the severing activity of katanin, which cut the cellular microtubules into short pieces and activated c-Jun N-terminal kinases (JNK). The microtubule fragmenting effect of 5a is a unique mechanism in MTAs. It might overcome the resistance problems that most of the MTAs have faced.


Pubmed API介紹

Pubmed是全世界最大生物醫學文獻資料庫,想要暸解最新文獻資訊時總會使用Pubmed來獲取資料並且將其彙整,使用Pubmed API的話,可以減少很多人力使用web page收集資料的時間。只要稍微一點http傳輸的概念,搭配相關語言的包(比如常用R的人可以使用httpr包、常用python的人可以使用requests包),可以很輕鬆地獲取想要的資料並且快速整理!

對於R的使用者,就更方便了,目前有RISmed, pubmed.mineR這兩個包,裡面利用Pubmed API來開發的封包,RISmed主要提供下載資料的接口,而pubmed.mineR則更偏重文獻分析的演算法,可參閱他原發表論文裡有提供三個範例。

在pubmed的官網有對於各種API使用的說明和範例, 其中Entrez Programming Utilities提供以下的幫助:

<br />The Entrez Programming Utilities (E-utilities) are a set of eight server-side programs that provide a stable interface into the Entrez query and database system at the National Center for Biotechnology Information (NCBI). The E-utilities use a <strong><span style="color: #ff0000;">fixed URL syntax that translates a standard set of input parameters into the values necessary for various NCBI software components to search for and retrieve the requested data</span></strong>. The E-utilities are therefore the structured interface to the Entrez system, which currently includes 38 databases covering a variety of <strong><span style="color: #ff9900;">biomedical data, including nucleotide and protein sequences, gene records, three-dimensional molecular structures, and the biomedical literature</span></strong>.

他主要使用固定的url字串語法,操作簡單易懂,且在Sample Applicatioins of the E-utilities章中提供大量的pseudo code以方便理解!

主要有九種utilities提供使用,分別是:EInfo, ESearch, EPost, ESummary, EFetch, ELink, EGQuery,  ESpell, ECitMatch。每一個都使用不同的URL作為基礎request字串。

 

EInfo (database statistics)

eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi

提供NCBI各資料庫的基本統計資料,和與其他資料庫連結的網址。

ESearch (text searches)

eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi

提供用文字搜尋的方式,取得各資料庫中吻合的相關資料UID號碼,可用來繼續於ESummary, EFetch, ELink搜尋使用。

EPost (UID uploads)

eutils.ncbi.nlm.nih.gov/entrez/eutils/epost.fcgi

指定資料UID後,可用來上傳資料

ESummary (document summary downloads)

eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi

指定資料UID,可回傳目標資料的摘要(summary)

EFetch (data record downloads)

eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi

指定資料的UID,可以回傳的資料格式和紀錄

EGQuery (global query)

eutils.ncbi.nlm.nih.gov/entrez/eutils/egquery.fcgi

文字索引,取得相關資料庫的entrez 資訊

ESpell (spelling suggestions)

eutils.ncbi.nlm.nih.gov/entrez/eutils/espell.fcgi

取得特定文字索引後,資料庫建議的索引文字

 

 

這邊有可以查詢的所有NCBI database

screenshot.pngscreenshot.png

可擴展標記語言XML是什麼?

XML(extensible markup language)全名可擴展標記語言,是一種在文本文件中組織數據的語言,使用簡單的樹狀結構定義資料,在過去十年中,XML數據格式已經成為大型機構常用的數據傳輸格式,如政府網站、NCBI的Pubmed,  Mesh數據庫等。

XML文檔結構會根據一份文件類型定義(Document Type Definition, DTD)組織其內節點而成,而DTD則可以自行定義,如NCBI裡XML文件的DTD文件,裡頭就會詳述基本的文件結構,所有xml節點則會以其定義的DTD來儲存資料。所以當取得一份xml文件時,可以順便了解其DTD文檔,加速處理資料的速度。

XML的結構簡單,一個XML文件代表一個結構化的訊息樹,如下圖示,為從NCBI取得的xml格式資料:

screenshot.png

一份DTD文件,其從上而下定義其文件的包含節點,但以扁平方式來表達文件結構,從下面由US National Library of Medicine取得關於MEDLINE®/PubMed® DTD

screenshot.png