2018年5月28日 星期一

偏頭痛的藥物研發

你有偏頭痛嗎?全世界有約 12% 的人年發生一次偏頭痛,女性發生的機率是男性的三倍,美國的 Migraine Research Foundation 估計美國員工每年因為偏頭痛請的病假共約 113 百萬天。

很久以前偏頭痛被認為是因為血管擴張(dilated)造成血流不正常,因此那時候給的藥都是收縮血管的藥,例如 ergotamine。不過 ergotamine 可能會使血管過度收縮,所以後來改用 triptans,其抑制偏頭痛的效果還可以,吃的人約有五、六成有改善,只是它並非對每個人都有用,且有的人是吃得越多,頭痛反而越頻繁。後來,一連串的 fMRI 研究發現,不正常的血流和偏頭痛似乎沒有關係 XD。之後,科學家試著找其他引發偏頭痛的原因,發現腦神經的電流傳遞如果被阻斷,造成的 cortical spreading depression (CSD) 可能也扮演著重要的角色,因為它會攪亂三叉神經(trigeminal nerve)和三叉血管系統(trigeminovascular system)。

接著,UCSD 的神經學家在研究一個控制體內鈉和鈣的甲狀腺賀爾蒙 calcitonin 的時候,發現同樣的 calcitonin 基因在腦中會製造出不太一樣的蛋白,也就是 alternative gene slicing,這個研究後來發表在 1982 年的 Nature。之後,CGRP (calcitonin gene-related peptide)被發現,其參與了痛覺,也控制血流。後來,瑞典的神經學家發現當偏頭痛發生時,三叉血管系統裡的神經(trigeminovascular nerves)會釋放出 CGRP,使血管擴張,並且會傳導痛覺。這些發現引起藥廠的興趣,德國的 Boehringer Ingelheim 和美國的 Merch 相繼研發抑制 CGRP receptor 的小分子藥物,可惜不是有不好的副作用,就是對肝臟有害。

2004 年開始,有些藥廠試著研發針對 CGRP 的抗體藥,不過後來因為 FDA 對止痛藥在安全上的要求越來越嚴苛,加上市場價值難以估計,範圍廣到從約為二十億美金到五百億美金,於是很多藥廠紛紛退縮。接著來到 2013,之前生技公司 Rinat 研發的抗體藥經過幾番轉手到了另一間生技公司 Teva 手中,此藥被命名為 TEV-38125,目前在臨床二期階段,顯示出來的效果不錯。除了 Teva 之外,另外有 Alder Biopharmaceuticals, Eli Lilly 和 Amgen 研發的抗體藥也在 Phase II,且效果也都不錯,這四間公司在爭第一個拿到 FDA 許可。

目前的臨床沒發現有什麼嚴重的副作用,不過也有科學家擔心,因為它會抑制血管擴張,如果用在有心血管疾病的患者身上,會不會使病情加重還未可知。


[2019-10-20 update] Amagen 研發的治療偏頭痛的新藥 Aimovig (erenumab) 已於去年通過 FDA 許可。


延伸閱讀:關於偏頭痛


Article:

Science / FDA just approved the first drug to prevent migraines. Here’s the story of its discovery—and its limitations

SG Amara et al, Alternative RNA processing in calcitonin gene expression generates mRNAs encoding different polypeptide products. Nature (1982)









2018年5月5日 星期六

Python | 用線上 repl.it 寫程式和一些基礎語言

Python 除了可以用之前介紹的 jupyter notebook 外,也可以線上直接寫:repl.it

repl.it 除了可以讓你線上寫 code 之外,也可以自學。先申請一個帳號,登入後在右上角會出現功能列:learn/teach, student, my repls

點入 learn/teach 後下面就會出現很多線上課程,像是 Python, Javascript 等等,我目前是在試 Auto-Graded Course with Solutions 這個課,主要是教你怎麼寫程式,如果你之前有學過 C++ 之類的可能會比較容易上手。


(點圖可以放大)

如果直接連上上面那個網址,就會出現下面這個 coding 的頁面,最左欄是檔案夾,你可以登入後把你寫的東西存入。中間那欄是寫 code 的地方,寫好後點上面的 "run",就會在最右邊那欄跑出來。

例如你在中間欄打入:

a = int(input())
b = int(input())
print(a + b)

input() 這個功能是接受使用者輸入的東西,下面會解釋。

int() 的功能跟 R 的一樣,是指 integer,把輸入的東西變成數字的整數。str() 則是可以把數字變成 string。

print() 就是顯示出 () 裡面的結果

之前關於 Python 的那篇有簡單介紹一下,有興趣的可以先看那篇。(注意,這兩篇教的都是 Python 3.xx 以上的版本,Python 2.xx 的語法會有點不同。例如在 Python 2.xx 的版本裡,input() 的預設是 integer,但是在 Python 3.xx 裡則是 string,所以在上面的例子裡,a 和 b 需要用 int(input()) 把輸入的東西變成 integer,而在 Python 2.xx 的版本裡的話則不用,直接用 input() 讀出來的就是數字。)

上面寫好的 code 在跑了之後就會呈現在右欄,也就是你輸入的第一個數字會是 a,第二個數字會是 b,然後它會算出 a + b。所以當我輸入 3 和 5 後,它會算出 8,變成下面這樣:

3
5
8

上面的 3 和 5 是我輸入的數字,8 是它算出來的。

在 R 裡面設定一個 variable 是用 <-,例如上面的例子,在 R 裡面可以寫成這樣:

a <- 3
b <- 5
print(a + b)

之前那篇有提過,Python 讀取的資料型態分為三種:string (字), integer (整數), float (有小數點的)。在數字外加 str() 就會把它變成 string。另外,在 print() 的功能裡,在字的外面加上 " " 或是 ' ' 的話,就會把它變成 string。用 int() 功能就會把獨到的東西變成 integer。

上面的程式簡單介紹了 integer,接下來介紹一下 string 會在哪裡用到。如果你想要在使用者輸入自己的名字後,出現歡迎詞 "Hello, xxx!",那要怎麼寫呢?我們來拆解一下句子。

Hello, xxx! 這個句子可以拆成三部分:
"Hello, " 是 string。
"xxx" 是使用者輸入的名字,也就是 input()。
"!" 是 string。

要如何把這三個東西結合在一起變成一個句子顯示出來呢?有兩個方法,一個是用 +,另一個是用  ,

在 Python 裡面,+ 除了有數學的功能,在 print() 裡面還有結合顯示的功能。

所以這個句子要讓它呈現,需要這樣寫:

print("Hello, " + input() + "!")

Hello, ! 因為是 string,所以要用 " " 括起來。注意,"Hello, " 的後面有個空格,它也是 string 的一部份,所以要放進去,如果沒有放進去,逗號的後面就會直接連名字,變成:

Hello,xxx!

如果是用  的話,就是在每組字後面加  , ,而且每組之間會出現空白, 也就是說上面用 + 時需要自己加空格的部分,用  ,  的話就不需要。例如上面的句子用  ,  寫的話,就是這樣:

print("Hello,", input(), "!")

不過,因為每組字中間會出現空格,所以你輸入名字後,出現的會是:

Hello, xxx !

你也可以把使用者輸入的名字指定為一個 variable,例如 name,指令寫成這樣:name = input()

於是,中間欄的程式碼可以這樣寫:

name = input()
print("Hello, " + name + "!")
print("Hello,", name, "!")

跑了程式之後,當你在右邊輸入名字,它就會出現:

Peter
Hello, Peter!
Hello, Peter !

Peter 是你輸入的名字,"Hello, Peter!""Hello, Peter !" 是程式讀取後顯示出來的 greetings,看出用 + 和用  的不同了嗎?

另外,+ 和  除了空格這個部分不一樣外,還有一個就是 + 不同種類的不能相加在一起,也就是說 interger 和 string 不能相加在一起顯示,需要把它們變成同類。用  的話則沒有這個限制。

例如我想要讓使用者輸入自己的名字和年齡後,出現這樣的句子:xxx is ??? years old

我們可以把句子拆成這樣:
"xxx" 是使用者輸入的名字,所以是 input()。
"is" 是 string
"???" 是使用者輸入的年齡,所以是 input()。
"years old" 是 string

跟上面一樣,可以把名字指定為 name,年齡指定為 age。

name = input()
age = input()

然後用 + 來寫的話就是:(注意要自己空格和把數字改為 string)

print(name + " is " + str(age) + " years old")

用  來寫的話則是:

print(name, "is", age, "years old")

除了讓使用者輸入,Python 跟 R 一樣也可以指定 variable,例如我們可以指定 year 為 1990,birthmonth 為 Feb。

year = 1990
birthmonth = "Feb"
print(birthmonth, year)

Feb 是 string 所以要加 " "。上面的程式碼跑出來就會在右欄顯示出:

Feb 1990

把上面的程式碼混在一起,比較完整的打在中間那欄:

name = input()
age = input()
birthmonth = "Feb"
year = 1990

print(name, "was born in", birthmonth, year)
print(name, "is", age, "years old")

print(name + " was born in " + birthmonth + str(year))
print(name + " is " + str(age) + " years old")

把程式碼跑完後,在右欄輸入名字和年齡:Peter, 28

就會出現:

Peter
28
Peter is 28 years old
Peter was born in Feb 1990
Peter is 28 years old
Peter was born in Feb1990

看出用 + 和用  的不同呢嗎?

最後,+ 用在數字是把兩個數字加在一起,但是用在 string 是把兩個字連在一起。咦,這不是上面講過了嗎?下面用數字做例子,解釋一下為什麼要再次提出來讓大家注意。

例如我想要顯示:The sum of a and b is (a + b)

把句子拆開來看就是:(記得要把句子中的空格算進 string 裡面)
"The sum of " 是 string
a 是 input(),是數字。
" and " 是 string
b 是 input(),是數字。
" is " 是 string
a + b 是算出來的結果,是 integer。

因為句子是 string,所以要用 + 的話,需要把裡面數字的部分在 print() 裡面設為 string,於是就會變成這樣:

print("The sum of " + str(a) + " and " + str(b) + " is " + str(a + b))

如果用 , 的話就不需要,可以寫成這樣:

print('The sum of', a, 'and', b, 'is', a+b)

前面說過,Python 3.xx 裡的 input() 預設是 string,所以要把 a 和 b 設為 integer。

a = int(input())
b = int(input())

另外加 c 和 d 沒有設 int() 的做比較:

c = input()
d = input()

跟 R 一樣,可以查 variable 的格式是什麼。在 R 裡面是用 class() 的功能,在 Python 裡是用 type() 。查詢 a, b, c, d 的格式:

print(type(a), type(b), type(c), type(d))

算算看 a + b 和 c + d 不同在哪:

print(a + b)
print(c + d)

+ 和  的功能顯示:The sum of a and b is ....

print("The sum of " + str(a) + " and " + str(b) + " is " + str(a + b))

print('The sum of', a, 'and', b, 'is', a+b)

把上面的程式碼整合,打在中間欄完整的 code 是:

a = int(input())
b = int(input())

c = input()
d = input()

print(type(a), type(b), type(c), type(d))

print(a + b)
print(c + d)

print("The sum of " + str(a) + " and " + str(b) + " is " + str(a + b))

print('The sum of', a, 'and', b, 'is', a+b)

print('The sum of', c, 'and', d, 'is', c+d)

跑程式碼後,在右邊輸入 a, b, c, d 四個數字,例如 3, 4, 5, 6,就會出現:

3
4
5
6
<class int=""> <class int=""> <class str=""> <class str="">
7
56
The sum of 3 and 4 is 7
The sum of 3 and 4 is 7
The sum of 5 and 6 is 56

3, 4, 5, 6 是你輸入的數字,後面幾行是程式算出來的。可以看到 3 和 4 是 integer,5 和 6 是 string,所以 3 + 4 算出來是 7,但是 5 + 6 算出來是 56,因為是兩個 string 連在一起,而不是兩個數字加在一起。


以上,這篇的 Python 介紹就先到這吧。