Sunday, 28 February 2016

, ,

Practical System Biology Part 3: Belajar Membuat Plot dengan Matplotlib


Hai fellas, kali ini kita akan belajar membuat plot di python dengan menggunakan fitur dari matplotlib. Jika perlu, rekan-rekan bisa menilik lagi postingan saya sebelumnya:
Kali ini kita akan mencoba mengolah data sebuah eksperimen FISH (fluorescence in situ hybridization). Apa itu FISH? Mari kita bertanya pada wikipedia (opini saya tentang menggunakan wikipedia sebagai sumber ada di bawah):
Singkatnya, kita bisa menggunakan probe berupa potongan salah satu untai DNA yang nantinya akan menempel jika ada pasangan yang komplemen dengan si probe. Nah, dengan demikian, kita bisa mengetahui ada atau tidak sekuen yang kita cari dengan mengukur intensitas fluorosensi dari sel. Data fluorosensi ini diambil dengan menggunakan sensor dari alat seperti Spektrofluorometer (bayangin aja ada kamera lagi nge-video-in sel, terus kita ukur perubahan warnanya dari waktu ke waktu).

Selain bisa nempel di gen yang ada di inti sel (seperti di gambar dari wikipedia), kita juga bisa nempelin si probe ini ke mRNA yang diekspresikan oleh sel. Contoh aplikasi ini bisa dilihat dari video promosi (sumpah ane ga niat marketing) teknologi FISH dari Stellaris:


Dengan demikian, kita bisa mengambil data perubahan jumlah mRNA yang diproduksi sel dari waktu ke waktu.

Exercise Time!

Temen kamu sedang melakukan eksperimen untuk melihat perubahan ekspresi sebuah gen ketika dia memberikan si sel sebuah perlakuan. Untuk itu, temen kamu menggunakan FISH untuk menghitung jumlah mRNA pada sebuah populasi sel setiap enam menit sekali.
Ternyata, data yang dihasilkan dari si alat disimpan dalam format .pkl (pickle) yang merupakan salah satu format untuk bertukar data menggunakan program berbahasa Python. Kamu juga bisa mencari tahu lebih lanjut tentang pickle dengan memasukkan script pickle? di spyder.
Teman kamu meminta tolong untuk mengolah data tersebut menjadi sebuah plot yang mudah dipahami.

Loading data

Hal pertama yang kamu lakukan adalah membuka spyder dan meng-import library yang kita perlukan. Disini kita akan mengimport tiga library: Pickle, Numpy, dan Matplotlib:

import pickle
import matplotlib.pyplot as plt
import numpy as np

Untuk memudahkan mengetik kode, kita singkat matplotlib sebagai plt dan numpy sebagai np. Jadi, selanjutnya teman-teman tinggal menulis plt atau np untuk memanggil fungsi dari masing-masing library. Sementara, save dulu script mu di sebuah folder. 


Memanggil fungsi dari library yang sudah di import

Selanjutnya, kita akan nge-load data dari hasil eksperimen. Pertama, download data FISH, kemudian save di folder yang sama di tempat kamu nge-save script python-mu. Setelah file sudah siap, selanjutnya kita gunakan pickle (how to pickle disini):

d = pickle.load(open('mRNAdata.pkl', 'r'))

Disini, kita mendefinisikan variabel d sebagai data yang akan kita gunakan. 'r' setelah mRNAdata.pkl berarti kita memberikan perintah "read" dari objek pickle. Selanjutnya, yuk kita coba lihat raw data yang kita peroleh seperti apa dengan menulis:

print d

Dan kita peroleh hasilnya ternyata berupa Array yang berisi banyak angka. Di dalam array ini adalah hasil pengukuran intensitas fluorosensi dari 100 sel pada setiap time point. Nah, yg kita perlu lakukan adalah menghitung mean dari 100 sel tadi untuk setiap time point. Dengan demikian, kita bisa membuat plot dengan sumbu x = time points dan sumbu y = rata-rata intensitas fluorosensi dari 100 sel. 

Sek, bentar bro, kok bisa tahu ada 100 sel? Ngitung pake jari satu-satu? Lagian cuma bikin plot pake excel aja mah bisa!


Mencari tahu ukuran data


Nah, inilah kelebihan kita menggunakan Python, kita bisa lebih mudah untuk mengolah data yang berukuran besar. File .pkl yang kita buka tadi ukurannya cuma beberapa kilobyte saja, dan jika kita menghitung secara manual berapa banyak ulangan yang ada di data ini aja udah males :p. Bayangin kalo temen-temen mengolah data genomik yang ukurannya bisa sampai beberapa gigabyte. By the way, kalo filenya besar, fungsi print d tadi bisa membuat laptop kita kewalahan karena harus menampilkan semua data yang ada di dalamnya.

Tampilan data FISH, lingkaran merah menunjukkan sampel intensitas fluorosensi dari 100 sel untuk time point 1, 2, 3, dst. 
So, untuk menghitung ada berapa time points dan jumlah ulangan, kita bisa menggunakan fungsi yang sudah ada di dalam Python (hayo, buka lagi chapter 5!):

ntps= len(d)

atau bisa juga menggunakan modul dari NumPy: 

ntps= np.size(d, axis=0)

Disini kita mendefinisikan variabel ntps (singkatan dari number of time points, atau diberi nama apa aja terserah sih) dengan fungsi len atau np.size (lebih lanjut tentang NumPy). Coba gunakan fungsi print untuk melihat output dari ntps (output = 9).

Nah, untuk melihat ada berapa sampel di tiap time points (ndps = number of data points), kita bisa menggunakan:

ndps= np.size(d, axis=1)

Disini kita menggunakan np.size, tapi kita mengganti axis untuk melihat dimensi di dalam tiap time points.

Teman-teman juga bisa menggunakan fungsi len:

ndps= len(d[0])

Tapi ini hanya untuk melihat dimensi dari timepoints pertama. Coba gunakan fungsi print untuk melihat output dari ndps (output = 100).


Jumlah time points dan ukuran data points


Menghitung Mean dan Standar Deviasi

Untuk membuat plot, kita akan mengukur rata-rata (dm) dari intensitas fluorosensi di tiap time points:

dm= d.mean(axis=1)

dan untuk menghitung standar deviasi (sdm):

sdm= d.std(axis=1)

Dan kita lihat hasilnya:

Rata-rata fluorosensi (merah) dan standar deviasi (biru)

Membuat plot

Nah, data di sumbu Y udah siap nih, sekarang tinggal nyiapin sumbu X, yaitu time points. Dari data, kita sudah tahu bahwa ada 9 time points... artinya apa yak? Artinya, data diambil 9 kali setiap jeda beberapa waktu. Lah, emang jeda waktunya berapa? 6 Menit! (Scroll ke atas deh, yang di highlight dan di bold). Dengan demikian kita bisa tahu data untuk sumbu X:

t= np.arange(ntps)*6

dengan np.arange, kita membuat sebuah array [0, 1, 2, ..., 8], terus tinggal dikali 6 (jeda waktu). Dan kita peroleh:



Selanjutnya, kita akan menggunakan modul dari matplotlib untuk membuat plot. Kita akan menggunakan plt.errorbar() untuk membuat plot dengan error bar. Nah, value dari error bar disini adalah standar deviasi (sdm) dibagi dengan akar dari jumlah sampel (ndps). Kita akan menggunakan NumPy untuk mengakses fungsi square root (np.sqrt). Perhatikan di fungsi plt.errorbar(), t adalah input untuk sumbu X, dm adalah input untuk sumbu Y, dan yerr adalah error bar. Warna dan atribut lain bisa diubah dengan menambahkan argumen seperti ecolor dst. Lebih lengkap di www.matplotlib.org.

plt.figure()
plt.xlabel('time (minutes)')
plt.ylabel('mean mRNA')
plt.errorbar(t, dm, yerr= sdm/np.sqrt(ndps), ecolor= 'k', fmt= 'bo:')
plt.show()

Dan, inilah hasil dari eksperimen teman kita:


Selamat mencoba!
Ps: Error bar kecil jadi ga kelihatan, coba kalikan nilai sdm jadi beberapa kali lipat kalau penasaran.

Coming soon: Part 4 - Yuk belajar Entropi!





0 comments :

Post a Comment