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 介紹就先到這吧。









2018年4月8日 星期日

抗發炎藥物似可預防阿茲罕默症

如果阿茲罕默症的預防可以這麼簡單,那真是好事。

關於阿茲罕默症的一些知識可以先看這篇:阿茲罕默症新藥 新進度 Aducanumab
或這篇:利用 ASO 治療阿茲罕默症

這個研究是 UBC 的教授做的,重點有兩個:

1. Aβ42 不只出現在腦部,全身上下的器官中都有,包括口水中也有,口水中的是由頷下腺(submandibular glands)產生的。口水中的 Aβ42 可以用 ELISA 就測出來,所以其實可以早期發現早期治療,而不是像現在這樣要等到輕微失憶(mild cognitive impairment, MCI)的症狀出來 [註]。在他們的控制組中沒有 AD 症狀的案例)裡,測出的 Aβ42 可以分成兩組,一組是口水中 Aβ42 量較低的(19-25pg/ml),一組是較高的(41-60pg/ml)。低的那組是沒有 AD 風險的 ,他們口水中的 Aβ42 量為約 20pg/ml。

註:AD 進展分為六個階段,一期五年,每五年會惡化一倍。通常症狀會在 65+ 歲顯現出來,倒推回去大概是在 55+ 歲左右開始。第二個階段(第二個五年開始)和第三個階段(第三個五年)可以用 PET scan 測出來。第四個階段會開始出現輕微失智(MCI),海馬迴(hippocampus)的萎縮也可以用 MRI 看出來,這個階段開始,AD 便無法被預防。

AD 的鑑定方法目前有三種:
- CSF (cerebrospinal fluid)裡的 Aβ 和 tau 量是否降低,但因為 CSF 是流動的,這個方法有限制。
- 用 PET scan 看腦中是否有 Aβ 堆積
- 用 MRI 看腦部(尤其是海馬迴的部分)是否有萎縮

2. 普拿疼(Ibuprofen)等的非類固醇抗發炎藥物(nonsteroidal anti-inflammatory drugs, NSAIDs)可以預防阿茲罕默症。

後發性(也就是非基因造成)的阿茲罕默症病因一直以來都是個問號,目前皆認同的是因為 Aβ (β-amyloid)和 p-tau 堆積造成腦細胞死亡,進而造成失智。但近來發炎這個現象也被考慮為病因之一,只是還不清楚是因為 Aβ 和 p-tau 堆積才造成發炎,加速惡化,還是因為發炎了才引發堆積。總之,抗發炎這個路徑也在研究治療的範圍之中。

之前就有臨床研究發現,類風濕性關節炎(rheumatoid arthritis, RA)的病患得 AD 的比例較低,但不知道原因。在過去的 25 年間,有很多研究顯示有服用抗發炎藥物的 RA 病患人口,其中有得到 AD 的比例比較低。另外,類風濕性關節炎發作時間比 AD 較早,RA 病患通常在早期就開始吃抗發炎藥物。他們發現服用 NSAIDs 需要在 AD 之前就開始吃,至少吃了半年,最好是已吃了五年以上。



Articles:

NNR / Ibuprofen Can Prevent Alzheimer's Disease -Apparently


Papers:

PL McGeer et al, Alzheimer’s Disease Can Be Spared by Nonsteroidal Anti-Inflammatory Drugs. J Alzheimers Disease (2018)

M Lee et al, A Method for Diagnosing Alzheimer’s Disease Based on Salivary Amyloid- Protein 42 Levels. J Alzheimers Disease (2017)

McGeer et al, Inflammation, Antiinflammatory Agents, and Alzheimer’s Disease: The Last 22 Years. J Alzheimers Disease (2016)










2018年3月31日 星期六

R | ggplot: 整理圖的外觀 - scale, legend

會畫一些基本的圖了以後,這篇要介紹怎麼整理圖的外觀,例如改變兩軸的 scales 或是加標示(legend)等等,讓圖看起來比較清楚又簡單易懂。

關於這篇的課堂講義請看這:R Graphics with Ggplot2 - Day 2

這邊同要需要先跑下面這些 library。

library(ggplot2)
library(dplyr)
data(mpg)
data(diamonds)

同樣是用檔案資料 mpg,下面之前設好的 p1。(解說看這篇

p1 <- ggplot(mpg, aes(displ, hwy))
p1 + geom_point(alpha = 1/5)



可以改變兩軸的名稱,只要在後面加這個:scale_x_continuous(" ")scale_y_continuous(" "),然後在 " " 裡面打入你想要的軸名就好了。

p1 + geom_point(alpha = 1/5) +
   scale_x_continuous("Engine displacement (L)") +
   scale_y_continuous("Highway mileage (miles/gallon)")



或是也可以簡單點用:xlab(' ')ylab(' '),然後在 ' ' 裡面打你要的軸名。

如果要加上圖的名稱或標題,則是在加上:ggtitle(' ')

p1 + geom_point(alpha = 1/5) +
   xlab('Engine displacement (L)') +
   ylab('Highway mileage (miles/gallon)') +
   ggtitle('How engine size relates its highway mileage')

也可以全部寫在一起:labs(x = ' ', y = ' ', title = ' ')

p1 + geom_point(alpha = 1/5) +
   labs(x = 'Engine displacement (L)',
        y = 'Highway mileage (miles/gallon)',
        title = 'How engine size relates its highway mileage')



我們也可以設定 variable 裡面各個觀察的顏色,例如在這個例子裡,我們加入 year 這個變項,然後用顏色區分。

若要加入年份這個 variable,需要在 geom_point 裡面加入:aes(colour = factor(year)

這個指令也可以加在 p1 那層裡面,在這邊為求方便和易理解,所以加在後面。(細節解釋請看這篇這篇

p1 + geom_point(aes(colour = factor(year))) +
     labs(x = 'Engine displacement (L)',
          y = 'Highway mileage (miles/gallon)',
          title = 'How engine size relates its highway mileage')



如果想指定這個年份的顏色,可以用下面的語法設定你要的顏色,也可以設定旁邊圖標(figure legend)的名稱,例如把 factor(year) 改為 Year。

scale_colour_manual(name = " ", values = c(" ", " "))

在名字的地方打入你想要的名稱,在 values = c(" ", " ") 的地方打入你要的顏色。

p1 + geom_point(aes(colour = factor(year))) +
     labs(x = 'Engine displacement (L)',
          y = 'Highway mileage (miles/gallon)',
          title = 'How engine size relates its highway mileage') +
     scale_colour_manual(name = "Year",
                         values = c("light green", "skyblue"))



除此之外,你也可以讓圖標只顯示出你要的觀察,例如說只顯示 2008 年的,並且把它改名為 To Date。

只想顯示某個觀察用:bearks = 
把那個觀察改名用:labels = " "

ggplot(mpg, aes(hwy, cty, colour = factor(year))) +
   geom_point() +
   scale_colour_manual(name = "Year",
                       values = c("light green", "skyblue"),
                       breaks = 2008, labels = "To Date"))



也可以改變圖標的位置,用 theme() 功能裡的 legend.position。

語法是:theme(legend.position = )

p1 + geom_point(aes(colour = factor(year))) +
     labs(x = 'Engine displacement (L)',
          y = 'Highway mileage (miles/gallon)',
          title = 'How engine size relates its highway mileage') +
     scale_colour_manual(name = "Year",
                         values = c("light green""skyblue")) +
     theme(legend.position = 'top')



如果不要圖標,就寫 none:theme(legend.position="none")

如果要更細部的挑整圖標,可以用 guides() 的功能。

對應前面的 colour = factor(year)guides() 功能裡面用的是 colour = guide_legend()。可以在 guide_legend() 裡面設定圖標的標題、位置和格式。

設定標題的話就是直接在 guide_legend() 裡面輸入 "title" (title = 你想要的標題)。

設定位置則是用:label.position = 

也可以把圖標設成兩欄的格式:ncol = 

p1 + geom_point(aes(colour = factor(year))) +
     labs(x = 'Engine displacement (L)',
          y = 'Highway mileage (miles/gallon)',
          title = 'How engine size relates its highway mileage') +
   guides(colour = guide_legend("Year",
                   label.position = "bottom", ncol = 2))



有從上面的圖中看出哪個語法是對應到哪個變化嗎?

接下來,我們用檔案資料 diamonds 來做其他改變。

在之前這一篇有畫過這個圖:

ggplot(diamonds, aes(carat, price)) +
                 geom_point(alpha = 1/15)



可以在其中加入另一個變項 cut,用顏色區分。

ggplot(diamonds, aes(carat, price, colour = cut)) +
                 geom_point(alpha = 1/15)



因為點太多,我們可以隨機挑出兩百個點做試驗,並把圖設為 d1。

隨機挑數的語法是:sample_n(dataframe, #)

d1 <- ggplot(sample_n(diamonds, 200),
      aes(carat, price, colour = cut)) + geom_point()



上面的圖的 Y-axis 間隔都是相同的,我們可以把它改成倍數,也就是用 log 或是 log10。

要改軸的格式可以用上面介紹的 scale_x_continuous()scale_y_continuous()

在這兩個功能裡面可以設軸名、軸的格式、最大值和最小值,還有顯示哪幾個值。

設軸名:name = " " 

設軸上各點的名字:label = c(" ", " ", " ", ...)

例如 X-axis 的標示是 2, 4, 6 的話,可以用 label = c("two", "four", "six") 這個語法改成 two, four, six。

軸的格式可以設成倍數,也就是從原本的 1, 2, 3, .... etc. 轉換成 1, 2, 4, 8, 16, ... etc,用的語法為:trans = "log" 或是 trans = "log10"

最大值和最小值:limits = c(min, max)
也可以用之前介紹過的:xlim(min, max)

只顯示某幾個值:breaks = c(x, y, z, ....)

顯示副軸(minor scale):minor_breaks = (如果沒設的話就是 default 會出現,如果不想要就設 minor_breaks = NULL。)

接下來直接用上面的圖做變化,為了清楚表現以上幾個功能,先從最少的語法開始。下面是

d1 + scale_x_continuous(name = "Carat", limits = c(0.2, 4),
                        breaks = c(0.25, 0.5, 1, 2, 4),
                        minor_breaks = NULL) +
     scale_y_continuous(name = "Price",
                        breaks = 1000 * c(0.5, 1, 2, 4, 8, 16),
                        minor_breaks = NULL)



跟上面的比較,可以看出軸名改了,成為:Price 和 Carat。圖的橫軸變成從 0.2 到 4,軸的點為指定的那四點,各點間依比例設距離,因此畫出來會是 log 的圖。圖的直軸也只顯示設的那幾個點,數字間的距離也是依比例畫的。兩軸皆沒有副軸。

再來加入副軸,也就是把 minor_breaks = NULL 拿掉。然後讓顯示的點都為等距,也就是用 trans = "log" 的功能來畫 log 的圖。

d1 + scale_x_continuous(name = "Carat", limits = c(0.2, 4),
                        trans = "log",
                        breaks = c(0.25, 0.5, 1, 2, 4)) +
     scale_y_continuous(name = "Price", trans = "log10",
                        breaks = 1000 * c(0.5, 1, 2, 4, 8, 16)



再來,我們可以改變圖標的名稱,用的語法是:scale_colour_discrete()

d1 + scale_x_continuous(name = "Carat", limits = c(0.2, 4),
                        trans = "log",
                        breaks = c(0.250.5, 1, 2, 4)) +
     scale_y_continuous(name = "Price", trans = "log10",
                        breaks = 1000 * c(0.5, 1, 2, 4, 8, 16)
     scale_colour_discrete("Cut")



可以看到右邊圖標的名稱改了,如果想要改裡面各個小標的名稱的話,就在功能裡面加:labels = c(" ", " ", " ", ...)


最後,我們用檔案 msleep 來做個練習吧。


Exercise

1. Using the msleep data frame, plot the length of the sleep cycle versus the total amount of sleep. Indicate the animal’s diet by colour. Add appropriate labels to the axes and colour legend, and make the colour key labels more reader-friendly.

ggplot(msleep, aes(sleep_total, sleep_cycle, colour = vore)) +             geom_point() +
       labs(x = "Total sleep (h)",
            y = "Length of sleep cycle",
            title = "Animal Sleep") +
       scale_colour_discrete("Animal Diet",
       labels = c("carnivore", "herbivore",

                  "insectivore", "omnivore", "N/A"))



2. Using the msleep data frame, plot the body weight vs. the brain weight. Indicate the animal’s diet by colour. Add appropriate labels to the axes and colour legend. (Use a log axis if warranted.)

這邊我們會用另一個顏色的功能嘗試:scale_colour_brewer()

用法跟上面的很像,一樣是可以在裡面設定圖標名稱,另外就是這個是調色盤,也可以設定不同的色調,用的語法是:palette = " "

另外,上面介紹的 scale_x_continuous(trans = "log10")scale_y_continuous(trans = "log10") 也可以用較短的 scale_x_log10()scale_y_log10() 代替。

ggplot(msleep, aes(brainwt, bodywt, colour = vore)) +
       geom_point() +
       labs(x = "Brain Weight (kg)",
            y = "Body Weight (kg)",
            title = "Animal Weight") +
       scale_x_log10() + scale_y_log10() +
       scale_colour_brewer("Diet")



如果沒有設定色調的話,預設是藍色。如果想用其他色調的話,可以參考這裡,下面用的是 "Set2"。

ggplot(msleep, aes(brainwt, bodywt, colour = vore)) +
       geom_point() +
       labs(x = "Brain Weight (kg)",
            y = "Body Weight (kg)",
            title = "Animal Weight") +
       scale_x_log10() + scale_y_log10() +
       scale_colour_brewer("Diet", palette = "Set2")



3. Same as Exercise 2, but use the species name instead of a point. Add appropriate labels to the axes and colour legend. (Use a log axis if warranted.)

這邊要把點改成動物名稱,也就是用字去顯示每個點,用的功能是:geom_text()

因為我們要用動物名稱去標示每個點,所以要加入這個指令:label = name

ggplot(msleep, aes(brainwt, bodywt, colour = vore)) +
       geom_text(aes(label = name)) +
       labs(x = "Brain Weight (kg)",
            y = "Body Weight (kg)",
            title = "Animal Weight") +
       scale_x_log10() + scale_y_log10() +
       scale_color_discrete("Diet")




好了,主要的幾個功能大概都介紹了,這篇就先到這邊吧。(總算把這篇打完惹)










2018年3月11日 星期日

太空旅行會改變基因的表現嗎?

Note: 這篇是去年二月寫在臉書專頁上的,不知道為什麼忘了移到這邊。總之,過了一年之後,有新的 update。

同卵雙生兄弟 Mark Kelly 和 Scott Kelly 兩位都是太空人,他們在兩年前參加了一個太空基因計畫(US$1.5-million),看看人類在太空無重力狀態時,DNA 和體內腸道菌會產生什麼變化。

Mark 在 2011 年退休前共在太空中待了 54 天,Scott 則是約 180 天,但是他在之後的 2015-16 年間(連續)待在太空中 340 天,合計一生中在太空待了 520 天。在 Scott 待在太空的那一年間,Mark 則待在地球,兩兄弟在 Scott 飛上太空之前、在太空中和回到地球後,都會固定收集血液、口水、尿液和糞便樣本,之後兩人全部的基因體(genome)都會被完整定序(但因為個人隱私所以只有十個科學家能取得定序結果)。

結果發現 Scott 在太空中的時候 telomere 變得比較長(比在地球的 Kelly 的還長),但是回到地球後,會迅速變短,回到他飛太空之前的長度。(telomere 是染色體兩端的蓋子,隨著年齡增長會越變越短。)科學家目前不知道為什麼會這樣,因為他們本來預期在太空中會變短,所以也正在研究另外十位太空人的 telomere,看是不是所有太空人都出現這種情形,預計 2018 年會知道結果。(哦哦~ 所以這是說在太空中會很長壽的意思嗎?XD)

另外就是 DNA methylation 在太空中的時候也漸少了,但是同時間在地球的 Mark 的 DNA methylation 卻增加了,而在 Scott 回到地球後,兩人的 DNA methylation 又回到 Scott 飛太空前的程度,為什麼會這樣還不知道。(這好神奇~)

"Personalized medicine could play into NASA’s plans for how to keep astronauts healthy during long-duration spaceflight, such as any future trips to Mars."

所以人類是已經準備好要進軍火星了嗎?XD


March 2018 update:

NASA 在今年一月發表了新的報告,他們發現 Scott 在太空時改變的基因表現中,雖然大多數(93%)在回到地球後又變回和飛太空之前一樣,但是有 7% (約幾百個)的基因表現並沒有變回去,這些基因和免疫系統(immune system)、DNA 修復(DNA repair)、骨頭形成(bone formation networks)、 缺氧(hypoxia)和高碳酸血症(hypercapnia)相關。




References

Alexandra Witze, Astronaut twins study raises questions about genetic privacy. Nature (2015)

Alexandra Witze, Astronaut twin study hints at stress of space travel. Nature (2017)

NASA / NASA Twins Study Investigators to Release Integrated Paper in 2018 (Jan 2018)

NASA / NASA Twins Study Confirms Preliminary Findings (Jan 2018)









2018年2月4日 星期日

關於抗體和抗體藥的一些小知識

近幾年來抗體藥變得頗為流行,不少藥廠研發抗體藥,其中包括治療阿茲罕默症的 aducanumab 和 solanezumab。藥名後面為 -mab 的代表是抗體藥,-mab 即為 mAb (monoclonal antibody)。


Figure: Wiki - Drug nomenclature

學名藥命名方式可參考這:Generic Name Stems

大家都知道抗體 IgG 長什麼樣子吧?就是兩個 heavy chains 和兩個 light chains,辨認抗原(antigen)的那端是 Fv (variable regions),另一端則是會被醣化(glycosylation)和引發免疫反應的 Fc (constant regions)。但是,你知道嗎?駱駝(camelid, llama)的體內有兩種抗體哦哦哦!一種是跟人類一樣的 IgG,另一種是只有 heavy chains 的抗體(HCAbs),這種特別的抗體的 Fv 叫做 HHV (下圖),又稱 nanobodies,雖然只有 heavy chain,但是對抗原的 binding affinity 並沒有比較弱,加上體積小,可以用來做抗體藥。


Figure: P. Holier & P. J. Hudson, Nature Biotechnology 2005 (doi: 10.1038/nbt1142)

簡單來說抗體藥有幾種,一種是整個 IgG,一種是只有 Fab,或甚至是只有 Fv。另外,近來更小的 single-chain Fv (scFv) 和 HHV (Nbs) 也引起關注,這兩種小抗體有個好處,就是比完整的 IgG 更容易穿透細胞,也容易被清洗掉(這點有好也有壞,要看用在哪),而且因為小又沒有 Fc,所以打入體內做為治療時不會引起不必要的免疫反應。

目前做抗體藥的方法有分三種,一種是大家比較知道的 in vivo,先打到動物裡,再取出 B cells 和 myeloma 合成 hybridomas 生產 monoclonal antibody。另一種是在 E. coli 裡面製造,這種大家應該也知道,在細菌裡面製造的優勢就是量大且便宜。最後一種是在酵母菌裡面製造,在酵母菌製造的優勢也是量大且便宜,但比細菌好的是它是 eukaryotic。

因為正常情況下,Fc 的部分會醣化,所以如果要做整個 IgG 的話,最好是在 mammalian cells 裡面製造,就是用 hybridomas,因為細菌並沒有 glycosylation,所以如果用細菌的話,還要再另外 in vitro glycosylation,這麼麻煩的話為什麼還要用細菌呢?如果你是要製造 Fab 或是 scFv 的話,因為不需要 glycosylation,這時候用細菌就可以省時省錢。

酵母菌的話,則是可以用來製造 IgG 或是 Fab, scFv。但是酵母菌的 glycosylation 和人類的不一樣,酵母菌的只有 mannose,生產出來的會附帶大量的 mannose,但是人類的是比較複雜的,通常不只有 mannose,還有 galactose 和 sialic acids 等等,所以需要改造酵母的基因,讓它能夠生產 galactose 和 sialic acid。所以同樣的,如果只是製造 Fab 或是 scFv 的話,用酵母菌會比用動物便宜。如果要製造整個 IgG 的話,雖然比較複雜一點,但是如果基因調控好了,除了可以大量生產外,還可以控制抗體的品質,省錢省時間。另外就是利用酵母菌的話,生產的蛋白質可以讓它釋放出來到培養液中,這樣純化起來會比較容易。


Figure: Jens Nielsen, Bioengineered 2013 (doi: 10.4161/bioe.22856)

當然用 E. coli 或酵母菌的話,不只能製造抗體藥,其他的蛋白質藥物也可以,例如目前市面上已有用酵母菌生產的胰島素(by Novo Nordisk)。

有興趣的可以看下面幾篇 papers。



References:

S. Steeland et al, Nanobodies as therapeutics: big opportunities for small antibodies. Drug Discovery Today (2016)

P. Holliger & P.J. Hudson, Engineered antibody fragments and the rise of single domains. Nature Biotechnology (2005)










2018年1月14日 星期日

怎樣才算 hard working

對不是我們這個領域的人來說,週末還要到實驗室叫做 hard working,但週末到實驗室其實沒什麼,尤其是如果只是禮拜六來收個實驗,或是禮拜天來用個 inoculation 好隔天可以做 miniprep。真要我週末來待整天,我還無法,會覺得好累,感覺沒放到假,對我就是草莓,我一直都覺得我算是很偷懶的 slacker,尤其跟我們實驗室的中國交換生相比更是(來很久變加拿大人的中國人週末幾乎不會來,除了我老闆),他們都是週末兩天來一天半的(沒來的半天是因為要買菜),像他們週末還跑 Western 這種事我是不會做的,除非真的有必要(不過到目前為止還沒有)。

但我之前被每天都待到七、八點,週末還都在實驗室待整天的中國人說我真是 hard working 時真是不解我 hard working 在哪?他是說他都快中午才來,他來的時候我做事都做到一半了,但是他待到八、九點,我都六點就走人了啊,而且我週末最多只待半天,除非我真的需要一個人靜一靜才會待比較久。

說到這,想到我研究所時系上同學週末也都是會來的,但也是只待個半天,就是收個實驗或做些簡單的實驗而已。然後從某天開始,隔壁實驗室的兩位同學說,他們覺得週末來實驗並不會做得比較順,做不出來的還是做不出來,並沒有因為週末來就做出來了,做得出來的週末沒來還是做得出來。他們經過比較之後,發現週末有來跟沒來結果並沒有差,實驗進度還是一樣,並沒有變得比較快或比較順,那週末幹嘛來呢?所以之後他們週末就不來了。

又想到我在大學時,在實驗室幫一位博士生做他的 side project,他本來都是早上八、九就點來的,但是從某天開始十點多才來,原因是他發現,他早來是因為想早走,但結果還是待到七、八點才走,那幹嘛早來呢?於是他就改成十點多才進實驗室。

之前 UBC 校長也說,研究生活不用只有工作,還是要有正常人的生活,週末多去交朋友,有些私人時間,多些社交空間,work-life balance 很重要,這也是他的親身經驗,他在研究不順的時候讓自己放鬆一下,過回正常人的生活後,研究就變順了。

好了,其實這篇只是想突然有感而發,覺得其實生活還是很重要的,還是需要 work life balance 才不會 burnout。



#加拿大人真沒競爭力XD










2018年1月13日 星期六

利用 ASO 治療阿茲罕默症

阿茲罕默症(Alzheimer's Disease, AD)的致病原因除了大家都知道的 β-amyloid (Aβ) 和 tau 堆積外,還有一個是 ApoE (apolipoprotein E)。ApoE 在腦中是由 astrocytes 製造的,原本的功能是運送膽固醇(cholesterol)到神經細胞,但並不知道它在 AD 裡扮演的角色為何。雖然早在 25 年前就發現它會增加 AD 的風險,帶有 ApoE4 基因得到 AD 的機率比帶有 ApoE3 的高三倍以上,但其詳細機制還不清楚。

目前認為 Aβ 是引起阿茲罕默症的原因,但它的堆積似乎和疾病的症狀沒有直接關係,在它之後發生的 tau 堆積反而會造成腦部的損害。那 ApoE 呢?它在其中扮演獨立的角色,還是牽線的角色?ApoE 的 variants 有三種:ApoE2-4,並不是每種都會增加阿茲罕默症的風險,目前所知只有 ApoE4 會。這期的 Neuron 有兩篇是關於 ApoE4,第一篇研究顯示 ApoE4 是造成 Aβ 開始堆積的原因。之前有研究顯示帶有 ApoE4 基因的人其 Aβ 堆積的 plaques 比沒帶得多,也許它是造成 Aβ 堆積的原因,或是它會促進 Aβ 的堆積。Aβ 在腦中一開始只是緩慢的微量堆積,稱為 seeding stage,到後期量邊多了以後,堆積速度會變快,而在這個過程中 ApoE 是從哪個階段開始參與呢?

Liu et al 的這篇研究用了可以控制 ApoE3 和 ApoE4 表現且帶有基因突變(APP/PS1)的 AD 老鼠,AD 老鼠在四、五個月大的時候會開始出現 Aβ 堆積的徵兆,然後六到九個月大是 Aβ 堆積最快速的時期,十個月大的時候則接近巔峰。他們讓老鼠的 ApoE 在三個不同時期開始表現:從剛出生到九個月大時都持續表現、只在前面六個月(也就是 Aβ 的 seeding stage)表現,或是在疾病的後期(也就是六到九個月大時)才表現。他們發現 ApoE4 從剛出生到九個月大都持續表現的老鼠,牠們的 Aβ 堆積有明顯的增加,而只表現 ApoE3 的老鼠則沒出現這個現象。他們也比較了只表現前六個月(出生到六個月大)和只表現後三個月(六到九個月大)的老鼠,發現前六個月有 ApoE4 表現的老鼠的 Aβ 堆積也有明顯增加,而只有後三個月有 ApoE4 表現的老鼠卻沒這個現象。另外,他們也發現 ApoE4 會讓 Aβ 無法被自然清理掉,使得它更容易堆積在腦內。

ApoE4 除了會加速 Aβ 的堆積外,也會增加 tau 對腦部的傷害。幾個月前刊在 Nature 的研究顯示 ApoE4 會加速 tau 的堆積,之前也有研究顯示 ApoE4 會增加 phospho-tau (p-tau) 的表現量。 Shi et al 的這個研究用了帶有突變 tau 基因(P301S)的老鼠,這個突變會產生大量 tau (是原本 endogenous tau 的五倍量),隨著年紀增長,insolube tau 會漸漸增加,最後形成 tau tangles,且這些堆積在腦部的 tau 都被高度磷酸化(phosphorylated)。這種老鼠在 1.5 個月大的時候腦部就會出現 tau 的堆積,在八個月大的時候即可觀察到腦細胞死亡和腦萎縮,海馬迴尤為嚴重。他們把這種老鼠本身的 ApoE4 基因拿掉,讓它不帶任何 ApoE 基因(ApoE KO, TEKO),或是拿掉 ApoE4 基因(TEKO)後再轉進其中一種人類的 ApoE 基因(P301S/ApoE2 (TE2), P301S/ApoE3 (TE3), P301S/ApoE4 (TE4))。

About AD transgenic mice: Tau P301S (Line PS19)

突變 tau 的老鼠在三個月大時,帶有人類 ApoE4 基因的老鼠腦部的 tau 表現量就比帶有其他種 ApoE 的高很多,其海馬迴裡的 p-tau 表現量也比較高。當老鼠九個月大的時候,他們檢視老鼠腦部,發現帶有 ApoE4 基因的老鼠腦部損害(萎縮)最嚴重,而帶有 ApoE2 的則是最輕。有趣的是沒帶有任何 ApoE 基因的老鼠(P301S/TEKO)腦部幾乎沒有被 tau tangles 損害;而不管是否帶有其中一種 ApoE,但是只帶有正常 tau 而非突變 tau 基因的老鼠,在九個月大的時候腦部也沒有萎縮的跡象。另外,帶有 ApoE4 基因的老鼠 (P301S/TE4)出現因為免疫反應引起的發炎,但是帶有其他 ApoE 的老鼠並沒有這個情形。而且同樣的,如果是正常 tau 而非突變 tau 的話,即便帶有 ApoE 也沒有出現免疫反應。體外試驗顯示並非只有 ApoE4 會使表現突變 tau 的細胞出現免疫反應和引起神經細胞的死亡,其他的 ApoE 也會,只是沒 ApoE4 那麼嚴重。

除了老鼠實驗,他們也檢視了 ApoE 和 tau 在人類患者中的關係是否和在老鼠中相同。大多數人帶有的是 ApoE3,少數沒有帶任何 ApoE 基因的人通常會出現膽固醇過高的情形,如果沒治療的話,可能會在年輕時便因心血管疾病而死。在這個研究裡, 他們檢視了 79 位因為 tau 堆積致死患者的大腦和他們帶有的 ApoE 基因,發現 Aβ 堆積的程度和腦部萎縮的程度沒有直接關係,反倒是帶有 ApoE4 的患者惡化的比較快,腦部萎縮、損害的比較嚴重。總結來說,這篇研究顯示相較於 Aβ,tau 和 ApoE4 比較像是使病情惡化的主因,ApoE 會加速 p-tau 的堆積,並且引發免疫反應造成發炎現象,最終導致腦細胞死亡。



既然 ApoE4 似乎是造成疾病的關鍵因素之一,於是這期 Neuron 的第二篇相關研究便是用了ASO (antisense oligo)去抑制 ApoE 的表現,看看是否會有效果。他們用了兩種老鼠,分別是帶有 AD 突變基因(APP/PS1)和人類 ApoE3 的老鼠(AD/ApoE3)和帶有人類 ApoE4 的 AD 老鼠(AD/ApoE4),然後在不同的時期把 ASO 打入這兩種老鼠:從剛出生第一天就給 ASO,或從六週大時(腦中已出現 plaques)才給 ASO,然後在十六週(四個月)大的時候檢視這兩種老鼠腦中的 Aβ 堆積情形。結果發現不管從何時開始打 ASO 都能有效降低 ApoE3 和 ApoE4 至約一半的量。至於在 Aβ 的部分,剛出生就給與 ASO 治療的老鼠,不管是 ApoE3 還是 ApoE4 的老鼠,牠們腦中的 Aβ 都明顯的降低了,並且 ApoE4 老鼠腦中的 plaques 也比沒 ASO 治療的低。如果是六週後才進行 ASO 治療的話,Aβ 量則沒有明顯的降低。不過有趣的是不管是剛出生就給 ASO,還是六週後才給 ASO,Aβ plaques 旁邊的 neuritic dystrophy 都有變少,即便六週才給 ASO 的老鼠腦中的 Aβ 量並沒有減少,表示 ApoE4 可能有參與 Aβ 引起的發炎反應。


由以上研究看來,ApoE4 雖然是配角,但卻是關鍵配角。好想知道我的 ApoE variants 是哪一種哦,希望不是 ApoE4。



延伸閱讀:阿茲罕默症新藥 Aducanumab



Articles:

WU in St. Louis Press Release / Newly ID’d role of major Alzheimer’s gene suggests possible therapeutic target

Alzheimer's News Today / Targeting ApoE in Brain Alone May Lead to Alzheimer’s Treatment, Researchers Say

NNR / Treatment Reduces Alzheimer's Damage


Papers:

Y Yoshiyama et al, Synapse Loss and Microglial Activation Precede Tangles in a P301S Tauopathy Mouse Model. Neuron (2007)

Y Shi et al, ApoE4 markedly exacerbates tau-mediated neurodegeneration in a mouse model of tauopathy. Nature (2017)

C Liu et al, ApoE4 Accelerates Early Seeding of Amyloid Pathology. Neuron (2017)

TV Huynh et al, Age-Dependent Effects of apoE Reduction Using Antisense Oligonucleotides in a Model of β-amyloidosis. Neuron (2017)