開放科學及建立數位資源引用

開放科學簡介

  • 「開放科學的概念是所有的科學知識都應在探索的過程中儘早開放」 — Michael Nielsen

什麼是「開放科學(Open Science)」?自二十一世紀後,「開放」的精神逐漸於學術界發酵,相同的目標都在追求打破知識或專有軟體(proprietary software)保護的障壁,期許能將知識予全體人類共享。開放科學和自由軟體(開放源碼是其要件之一)理念十分類似,其概念就是希望科學研究的過程及成果都是公開的,一方面能讓公眾了解科學的進展,並參與協作(collaboration)。另一方面開放的資料及研究過程能協助其他科學家確認其正確性及可再現性(reproducible)。一般而言開放科學有六項原則,分別為「開放資料」、「開放源碼」、「開放方法學」、「開放同儕審查」、「開放存取(期刊論文)」及「開放的教育資源」1


近幾年來,網路及資訊工具的普及化也同時造就科學研究的躍進,各式各樣的科學研究工具隨著自由軟體、開放源碼的精神下紛至沓來,例如 Python 語言的科學研究套件 SciPyNumPy ,或是專精統計計算的 R 語言等。其中多數的軟體源碼都置放在 Github 平台上給公眾使用、研究及開發。Github 是支援分散式版本控制系統(distributed version control system)的程式源碼(source code)代管平台,有許多著名專案都可在上面找到,例如自由地理資訊系統軟體 QGISJulia 語言、建構 Python 輕量化的網路框架 Flask 等。除了上述獨立的科學研究工具外,亦有幾個熱門的開放科學研究框架(framework),和軟體不同的是,你可以使用這些開放科學研究框架來發展新的研究流程、撰寫新程式,並且能夠重複使用其元件。目前熱門的開放科學研究框架有 rOpenSciOpen Science Framework 等。以 rOpenSci 為例,其專案於 2011 年由幾個科學研究工作者發起,主要的初衷是希望進行科學研究中的資料及分析過程可重複使用及共享資料及軟體,透過研究者社群的維護,發展出一系列的 R 的套件,並建構嚴謹的審查過程來把關。在 rOpenSci 社群中,參與者可使用社群中的 R 套件,亦可自行開發套件提交至社群平台上或是審查同儕的 R 套件2
當這類的開放源碼軟體及開放資料集愈來愈多時,該怎麼在研究論文引用呢?畢竟這些軟體或是資料集可能是研究者及作者花了許多時間和精力開發的!引用是對創作者最基本的尊重,也能鼓勵開放資料及開放源碼的開發者持續貢獻於社群。有些軟體工具會提供引用的指南,例如 R 語言內建的函示 citation() 即可顯示引用的格式:
> citation()To cite R in publications use(要在文章中引用 R 請使用:):  R Core Team (2018). R: A language and environment for statistical  computing. R Foundation for Statistical Computing, Vienna, Austria.  URL https://www.R-project.org/.(以下略)
但除了一般的文章之外,要如何使用建立識別碼來讓公眾引用你的作品呢?我們可以像期刊論文使用 DOI 來讓其他人引用,以下將以實際範例來教學,讓你能建立自己作品的 DOI。

DOI:數位資源的身份證

地址是定位空間上的一個特定位置,統一資源識別碼(Uniform Resource Identifier; URI)則是標定網路上的數位資源位置,例如網址(web address)是一種定位網路上的位置識別碼(通常稱為URL;Uniform Resource Locator)。但 URL 可能會因為伺服器或檔案變動而改變其名稱,另外其本身僅定義為數位資源的位址而非其本身的資訊,可能會造成後續管理上的問題。舉例來說,今天我開發了一個物種名錄產生器,把它放置在 Github 上並命名為 checklister,其 URL 為 http://github.com/mutolisp/checklister,但後來我建立了一個團隊並移到下列 URL http://github.com/TaiBON/checklister,此時這個軟體內容不變,但其 URL 已更動。為了解決這個問題,數位物件識別碼(Digital Object Identifier; DOI)因而產生,DOI 本身有兩部分並以「/」作為分隔,第一部分是前綴碼,主要由「國際物件識別號基金會(International Digital Object Identifier Foundation)」所制定,通常是代理註冊機構的代碼。第二部分則是屬於該機構底下的識別碼。以全球生物多樣性機構(Global Biodiversity Information Facility; GBIF)所製發的 DOI 為例:
10.15468/dl.bfgeg7
上述其 DOI 的前綴碼為 10.15468,後面 dl.bfgeg7 則是數位資源,若你將這個 DOI 前方加上 http://doi.org,即 http://doi.org/10.15468/dl.bfgeg7,透過瀏覽器就會直接連到 GBIF 的 iNaturalist Research-grade Observations in Taiwan 的數位資源頁面,並顯示引用的格式為 「GBIF.org (05 September 2018) GBIF Occurrence Download https://doi.org/10.15468/dl.bfgeg71。此時若你透過這個頁面下載資料並分析,在發表的研究報告或論文中就能使用這個引用格式了。若你是開發者,想讓其他公眾能引用你的作品,建議將源碼放置 Github 並使用 Zenodo 來建立 DOI,詳細說明請參考下節。

開放科學的資料倉儲庫

Zenodo2 是歐盟 OpenAIRE(Open Access Infrastructure for Research in Europe;歐洲研究開放存取建設)計畫中的一份子。由 CERN (European Organization for Nuclear Research;歐洲核子研究組織)所開發的的巨量資料管理及開放科學、開放資料的數位圖書館。Zenodo 主要支援開放科學的服務,不僅限於科學領域,人文學科領域也一樣適用;你可以上傳相當廣泛的數位資源類型,例如研究論文草稿、預印本(preprint)3、資料集(dataset)、軟體(software)、海報(poster)等。每一筆上傳資源都能夠建立一個全球獨一無二的 DOI,分享給大眾使用並能被引用。

實例教學:分享並建立你的程式 DOI

了解 DOI 後,我們實際來建立一個程式或軟體的 DOI 。在以下教學文件中,你將知道如何建立一個 Github repository,發布釋出版(Release)和公眾共享你的科學研究分析軟體。最後透過 Zenodo 來建立你的程式 DOI,讓其他人能引用你的數位成果並表彰貢獻。
1. 建立一個 Github repository 及釋出版
請先註冊一個 Github 帳號,並參考建立一個 repository(Create a repository)的說明。開始寫源碼,並提交(commit)至版本控制庫中,最後建立一個釋出版(Release)。因為篇幅的關係這裡不做詳細介紹,若你不知道什麼是 git 或對 Github 不熟悉,可以參考其他網路上的教學文件4
2. 註冊登入 Zenodo
你可以使用第三方登入的方式(支援 Github 及 ORCid 登入)或是註冊一個新帳號,如下圖一

3. 授權第三方程式權限
假設你已有 Github 帳號,點選 Sign up 註冊會連到以下的畫面 。請點 Sign up with GitHub

此時會出現授權 GitHub 權限給 Zenodo 的提示,包括 email 位址、repository webhooks 和服務及所屬團隊的權限,點選 Authorize Zenodo (授權給 Zenodo)後,即可透過 Zenodo 連結你的 GitHub 帳號

4. 啟用 Repository
接下來你在 Zenodo 右上角有個使用者帳號(你的 email 帳號),點選下拉式選單並選擇 GitHub,如下圖四

進入 GitHub 整合頁面後,會看到你所有的 repositories,以本例來說,我們將選擇 mutolisp/distrmap_tw.qgis 來建立 DOI。把要建立的 repository 開啟後(把開關滑向 ON),按右上角的 Sync now … Zenodo 就會自動連結到 GitHub 並建立 DOI,如下圖五所示:

點選啟用後的  DOI 徽章(badge)後,就會開出一個視窗讓你選擇使用的徽章的方法,一般來說我們在 GitHub repository 裡頭會使用 README.md (Markdown 語法的文件),所以就先把 Markdown 這個內容複製。

回到 mutolisp/distrmap_tw.qgis,編輯 README.md 加入上一步所複製的 DOI 徽章(參見圖七),存檔後就完成了(如圖八)。

5. 確認 Repository DOI
上述步驟都設定完成之後,回到首頁點選 Upload(參見圖九)就會顯示目前你所有連結並上傳的數位資源,此時可以直接點選剛剛建立的 distrmap_tw.qgis(參見圖十),將會顯示你的軟體(或是預印本、圖片等數位資源)的相關細節以及如何引用的格式。值得一提的是,Zenodo 對於軟體可以有共通的 DOI 或是不同版本的 DOI 引用,細節請參見版本引用說明

小結

和過去紙本文件的時代比較,如何讓這些數位資料集、軟體、文件能妥適引用,公開分享及建立引用的連結是學術研究在數位化過程中所要面臨的挑戰。雖然可以你用網址來快速引用,但網站位址更迭頻繁 可能會導致這些連結失效,因此善用開放科學平台、引用資料庫,例如本文中使用 Zonodo 和 GitHub 整合,可快速提升你的作品及研究成果能見度,和社群分享並彼此審查砥礪,讓科學研究邁向協作及公開的目標,也讓知識普及貢獻於全體人類。

備註

  1. 並非所有的 DOI 引用格式都相同,和各機構採用格式有關
  2. Zenodo 名稱源自古希臘亞力山卓圖書館的第一個館員 Zenodotus
  3. 預印本指的是草稿、審稿階段或是被接受刊出前的研究論文。對於高度競爭的學術界中,有些研究創新可能是接近時間提出,但以往期刊審查週期較長,所以有些研究者選擇將研究論文預先上傳至公開的平台上以取得學術上發表成果的優先權,以防在審查期間被別人搶先或進行重複研究,例如 ArXivbioRxiv 及這裡提及的 Zenodo 等都是預印本分享平台
  4. 可參考為你自己學 git 或是連猴子都能懂的 git 指南

參考資料

[1] Open science as a practice. URL: http://openscienceasap.org/open-science/

[2] Scott Chamberlain, Anna Krystalli, Lincoln Mullen, Karthik Ram, Noam Ross, Maëlle Salmon (2018) rOpenSci Packages: Development, Maintenance, and Peer Review. URL: https://ropensci.github.io/dev_guide/ Accessed: Nov. 22, 2018

[3] GitHub Guides: Making your code citable (2018) URL: https://guides.github.com/activities/citable-code/ Accessed: Nov. 22, 2018

分組運算作法

今天學生問我分組運算的問題,就順便來。舉個最簡單的例子來說,如下表呈現,目標是以山頭(mountain)和坡向(aspect)為一組,來計算thermophilization indicator,計算的方式是把不同的物種依照海拔分布上下限分成不同等級(rank; R),再乘以在該樣區之覆蓋度(cover; C),接下來將所有物種等級覆蓋度乘積加總,再除以該樣區覆蓋度總和,可用下列公式來表示:

\frac{\sum_{i}^{n} C \cdot R}{\sum_{i}^{n} C}

先來簡化問題,若要計算每一座山頭坡向的物種覆蓋度總和,該如何計算。以下用 R 的 data.table 之 group 概念來實作,也就是 DT[, j, by=group_by]:

# 先使用 data.table fread() 來讀取資料
library(data.table)
dummy <- fread('/path/to/the/file.csv', sep = ',')
# 再依照 DT[, j, by=group] 來運算
dummy[, sum(cover), by = .(mountain, aspect)]

就會得到依山頭、方位的覆蓋度總和

mountain aspect V1
1: SEN W11 40.5
2: SEN W13 33.1
3: SUN E11 21.5
4: SUN S13 51.0

因此,我們可以再進一步來計算 thermophilization indicator

Tsi <- dummy[, sum(cover*r)/sum(cover), by = .(mountain,aspect) ]

這個也就是在資料庫結構化查詢語言(Structural Query Language; SQL)的 group by 概念,SQL 寫法如下:

SELECT 
    mountain,
    aspect,
    sum(cover*r)/sum(cover) as tsi
FROM 
    table_name 
GROUP BY 
    mountain,aspect;

範例檔案及 R code:

mountain aspect species cover r
SEN W11 A 30 1
SEN W11 B 10 3
SEN W11 C 0.5 2
SEN W13 A 15 4
SEN W13 D 5 3
SEN W13 E 3 2
SEN W13 F 0.1 1
SEN W13 G 10 4
SUN E11 A 15 2
SUN E11 B 5 3
SUN E11 C 0.5 2
SUN E11 E 1 4
SUN S13 D 35 1
SUN S13 E 10 1
SUN S13 F 5 2
SUN S13 G 1 4
view raw dummy.csv hosted with ❤ by GitHub
library(data.table)
exampleFile <- 'https://gist.githubusercontent.com/mutolisp/4898bb2e25a33487385bf5ede8e553da/raw/f101cc6e126eb2475d2345377bd02bbee3474799/dummy.csv'
dummy <- fread(exampleFile, sep = ',', header = T)
# calculate cover summation by mountain and aspect
dummy[, sum(cover), by = .(mountain, aspect)]
# calculate thermophilization indicator
Tsi <- dummy[, sum(cover*r)/sum(cover), by = .(mountain,aspect) ]
view raw tsi.r hosted with ❤ by GitHub

從照片的 GPS 座標反推回 GPS 軌跡

昨天從棉花嶼回來後,不小心 GPS 被小孩摸走,弄一弄竟然把我辛苦收集的軌跡都刪除了,就算用了 testdisk 把整個 GPS 磁區重新搜尋也找不回來了,這可能是因為 Garmin GPS 收集的資料會存成 Current.gpx 檔案,這個檔案被她不知道怎麼按一按就覆寫了(就是沒有救的意思)。因此只能用另外的方法來推估移動的軌跡,例如說從已拍攝照片中的 GPS 座標依照時間連起來回推移動軌跡,本來想自己用 python 刻,但是以前常使用 exiftool 來讀寫相機的 exif (exchangeable image file format),看看有沒有相關的功能好了,找了一下說明竟然有從有座標的照片中反推 GPS 軌跡,雖然套用到單眼的照片中可能解析度沒這麼好,但總比一個一個點要快多了。以下是如何反推軌跡的說明(exifTool 是 command line 的程式,安裝就自行看一下官網說明):

繼續閱讀 “從照片的 GPS 座標反推回 GPS 軌跡"

iNaturalist 新增物種

在使用 iNaturalist 上傳觀察記錄時,有時候也許會遇到系統中沒有內建的物種,這時候有兩個處理方式,一個是將此物種資訊寄給 iNaturalist 客服 或是透過查詢外部資料庫匯入的方式來新增。這篇說明將示範後者的程序,詳細說明如下:

  1. 在首頁中的「物種」搜尋欄位,輸入該物種的學名,這裡以柯氏雞屎樹(Lasianthus curtisii)為例,如圖一

    screenshot
    圖一、搜尋要加入的新物種學名
  2. 搜尋未找到該物種,手動搜尋 Catalogue of Life: 2012 Annual Checklist  (COL) 或是生命大百科(Encyclopedia of Life; EOL)。以本例來說,可搜尋 EOL(因為 COL 的資料有些舊),如下圖二

    screenshot.png
    圖二、搜尋外部資料庫 COL 以及 EOL
  3. 搜尋 EOL 後,若有此物種,可按下該物種圖示加入 iNaturalist,如下圖三

    screenshot
    圖三、加入該搜尋到的物種
  4. 接下來就會開啟一個新的物種頁面(圖四),可以在「分類」頁籤中手動再新增物種的中文俗名(請參照圖五)。

    screenshot.png
    圖四、新增的物種頁面

screenshot.png
圖五、新增中文俗名(點選「加入名稱」)

最後您可以直接回到原先的觀察,編輯該觀察記錄的物種名稱,就能夠找到該種的名稱了。Screen Shot 2018-03-22 at 16.03.54.png

 

在 R 裡頭使用中文字型

(這個適用於 Mac 或是 GNU/Linux, *BSD 的使用者)

R 的繪圖功能十分強大,但美中不足的是在繪圖若要使用非西歐字母的 multibyte 字元時會無法顯示,這是因為字型的關係,因此我們可以在設定中使用 par 來設定字型(這裡預設使用 Noto Sans 字型,可以免費下載),例如使用 “Noto Sans T Chinese” :

par(family='Noto Sans T Chinese')

但是如果要輸出成 png, pdf 等格式的話,上述的參數不適用,因為 par() 只能夠針對 R 預設的 graphical device 輸出。所以我們可以安裝 R 的 cairo 套件。Cairo 是一套繪製 2D 圖型的 library,亦支援字型繪製,R 安裝 cairo library

install.packages(“cairo”)

接下來就可以設定一般的字型或粗體字

CairoFonts(regular = "Noto Sans T Chinese:style=Light", bold = "Noto Sans T Chinese:style=Regular")

最後在輸出圖之前,使用 Cairo() 設定輸出的細節,type 代表輸出圖片的格式,例如 png, pdf, jpg 等:

Cairo(1600, 1600, file=filename, type="png", bg="white", dpi=300)

#繪圖的指令

dev.off()

 

語言學習—使用線上字彙卡記憶

自從去年在俄國遠東地區看植物爬山參加研討會回來之後,發現俄國很多地方真的很不錯,森林類型和天然的地景都是很吸引我的地方,所以回來後這一年來都在學俄文(好想去勘察加和庫頁島、西伯利亞看針葉林和 Betula, Larix 森林!),雖然上了許多課,不過當開始熟悉文法之後,練習寫文章時,才發現單字的累積是很重要的。隨著年歲的增長,記憶力和專注力就不如以前了(以前可是上完課單字全部都記起來了,根本沒在背單字 XD),直到老婆 Света 介紹了 quizlet (一個線上字彙卡網站),才發現真的非常好用!好的工具加上毅力,讓我每次考試都考一百分了(星爺梗)!

提到「字彙卡(flashcard)」就想起以前國中的時候,班上許多同學都會寫字彙卡,正面寫英文單字,背面寫中文解釋,帶著這些卡片在空閒的時間背誦,好處是當你在看這張卡片的時候,整個人的專注力就集中在這個單字上,忘記了就翻到背面瞄一眼,同時自己也可以看著單字念出來,讓

使用方法非常簡單,網路上也可以搜尋到一些使用方法,所以這邊就不再像爸媽般碎念詳細說明每個步驟,只有重點的提示:

1. 建立

Quizlet 可以用單筆方式建立字彙卡(建立的時候,也可以搜尋有沒有其他人定義過這個字,有的話可以自動帶入),也可以使用批次匯入,或是線上去匯出別人已經建好的字彙卡等。跟土法煉鋼自己學語言做卡片的方式不同點就是 Quizlet 融合了社群的功能,你可以參與某些課程,或是一個小組編輯同個字彙卡(還沒測試過是否可以協同編輯?),讓語言學習變成群體作戰,互相交流學習。還有一個功能是標重音,當你在輸入(要先定義好是哪種語言)時,螢幕就會出現該語言的重音符號鍵盤,就可以直接點選輸入,省得再去找特殊符號輸入。最後,Quizlet 也提供了插入圖片的功能,但是免費的會員只能從 flickr 上開放 creative commons 授權的圖片可以插入,至於如果你要手動插入自己的圖片,就得要付費升級了(另外一個小撇步就是去申請 flickr 的會員(目前免費會員空間有 1TB),輸入關鍵字,再用 Quizlet 的插入圖片搜尋即可 XD)

quizlet flashcard mode

quizlet accent keyboard

2. 學習

Quizlet 的學習可以分成兩個部分,一個部分就是傳統的顯示定義(字彙卡背面),讓你自己拼出單字(字彙卡正面)的方式(也可以正反互翻);第二個則是拼音模式,念出你要記誦的語言,讓你自己輸入單字,如果你輸入上有錯誤,Quizlet speller 會將你錯誤的字母標出來,並把正確的訂正回去,再把每個字母唸一次,最後再把這個字唸一次:

https://www.youtube.com/watch?v=Qh0YfW4tWQ0&feature=youtu.be (似乎沒有錄到音,請見諒)

Screen Shot 2013-10-22 at 4.10.52 PM

3. 測驗

這個部分可以像出考卷一般,有拼字填空、連連看、選擇、true/false 等,練習過後加深印象,單字比較不容易忘記。

4. 輸出字彙表

這個功能我很喜歡,可以把一個單元的單字全部整理成字彙表或索引卡直接印出來,不解釋,直接看圖就知道了:

quizlet print

最後,quizlet 也有為行動版裝置開發 app,android & ios 都有,因為最近剛升級成爸爸,幾乎沒有什麼時間坐下來好好背單字,所以我幾乎都利用零散時間背單字,像是坐公車捷運的時候用 quizlet app 來背誦和測驗,每天累積幾個字,久了字彙量就會變多!

延伸閱讀:

輕輕鬆鬆背單字(1):Quizlet基本使用

Quizlet tutorial video

線上文獻引用樣式語言(citation style language)編輯器

前言

每個研究生都會碰到文獻管理及引用的問題,不同的期刊會有不同的引用文獻的格式,光是這點就十分麻煩,寫文章花在「喬」格式的時間就令人想要問候人家老師一下。如果投了某期刊被退稿,換另外一家期刊,就要整個大改。有些人索性全部用手動的方式插入文獻,但是這也太累了,不如用聰明一點的方式來做,省下來的時間拿來睡覺或是出去玩都很好 XD,所以這邊就來介紹一下如何用最省時間的方式來引用插入文獻,並且依照期刊的規範來格式化並排版參考文獻。

這邊要介紹的 CSL(citation style language; 引用文獻樣式語言) 最早是 Bruce D’Arcus 在 OpenOffice.org 中 CiteProc 子專案所發展出來的 XML 語言,目前 Zotero, Mendeley 以及 Papers 等書目文獻管理軟體都有支援 CSL 。但是要從無到有寫出你想要的 CSL 檔案,會花上許多時間,所以有人用 html5 寫出了 citation style 的編輯器(URL 為 http://editor.citationstyle.org/),除了可以直接從 XML 語法編輯外,它還支援幕前所見即所得的編輯。當你的文獻管理軟體搜尋不到相對應的期刊文獻格式時,CSL editor 可以幫你判斷你輸入最接近的格式,之後再直接根據最接近的引用文獻格式修改即可。

繼續閱讀 “線上文獻引用樣式語言(citation style language)編輯器"

將 ESRI Shapefile 轉成 postgis 格式匯入 PostgreSQL 資料庫

可以用 QGIS 的 SPIT 外掛,或是 shp2pgsql 指令,使用 SPIT,圖形介面很簡單,就不用多介紹了

Screen Shot 2012-12-25 at 1.05.25 AM

 

 

用 shp2pgsql 最簡單

shp2pgsql -I -D -c -s 3826 filename.shp > filename.sql  (-s 代表座標系統,常用的是 WGS84 (4326) 或 TWD97 TM2 (3826) )

psql -d database -f filename.sql

利用空間資料庫計算多邊形交集以及計算面積

話說「交集」是個常常被掛在嘴邊的語句,像我和一口巾工讀生們往往都沒有交集,他們不了解我的明白,我也不了解他們的明白啊。交集在幾何上可以用下圖來簡單表示,但是在 GIS 計算交集上,除了空間上的交集外,還有的資料表的交集(ex: join),這個我就不多花篇幅談。Image

以下簡單介紹用空間資料庫的概念來實作多邊形的面積以及交集

一、準備材料:

二、步驟

qgis_layout

上圖是八色鳥在的分布範圍(圖層: range_fairy_pitta,橘色虛線淺綠色底的多邊形區域,簡稱 sp),深綠色是世界的陸域地圖(圖層:map_world,資料屬性表中有國家名稱(cntry_name)以及大陸名稱(continent),簡稱 world),淺橘色則是 sp 和 world 交集的區域。當然我知道做這個很簡單,從 ArcMap 中的工具箱選擇交集工具就可以做出來了,或是用 QGIS 的向量外掛(fTools)的 Geoprocessing Tool/Intersect 即可做出來,但是 GUI 用起來就是有不踏實感 XD 所以我們用空間資料庫來實作!

繼續閱讀 “利用空間資料庫計算多邊形交集以及計算面積"

QGIS 更新屬性表以及用簡單的正規表示式(regular expression)來選擇資料之值

Qgis 中更新屬性表,簡單說就是類似像 SQL 語言去更新或計算某些欄位的資料。

先將屬性表開啟,然後開啟編輯模式(toggle edit mode)之後,選欄位計算(field calculator),如下圖

qgis attribute table

接下來就可以進入欄位計算的介面。如果你想計算後的結果建立一個新的欄位,就選擇建立新欄位(create a new field),並設定好該欄位的名稱、類型(例如整數、浮點數等),精確度等,之後就可在運算式(expression)處輸入你想要的值。

 

 

 

繼續閱讀 “QGIS 更新屬性表以及用簡單的正規表示式(regular expression)來選擇資料之值"