2017年4月26日 星期三

R | Data manipulation (1): select, filter, slice, piping

這邊要介紹幾個處理資料的幾個功能,因為太長所以分成兩篇,這篇介紹的功能有:select, filter, slice, piping

下篇會介紹:arrange, mutate, summarise

詳細功能介紹請參考這兩頁:Working with Data - Part 1 & Intro to R - Part 3

練習的部分可以參考 slides: Working with Data - Part 1 (pdf)

這幾個功能在 dplyr 這個 package 裡面,所以要先跑。同時要用內建檔案 mtcars 來練習,所以也要叫出來。下面還會用檔案資料 flights,因為它在 nycflights13 這個 packages 裡面,所以也需要安裝。

library(dplyr)
library(nycflights13)
mtcars

先介紹定義功能,幾個 operators 可看這篇

下面先指定 a = 6,然後問 a 是否為 7。

a <- 6
a == 7

[1] FALSE

a 不是 7,所以顯示出來為 FALSE。

如果問:a 不是 7 呢?

a!= 7

[1] TRUE

a 是六不是七是對的,所以顯示為 TRUE。


1. Select function: view only some variables

這是只選某些 variables 出來看,語法是:select(dataframe, var)

只選 mpg 和 wt 這兩項出來看。

select(mtcars, mpg, wt)

                     mpg    wt
Mazda RX4           21.0 2.620
Mazda RX4 Wag       21.0 2.875
Datsun 710          22.8 2.320
Hornet 4 Drive      21.4 3.215
Hornet Sportabout   18.7 3.44
Valiant             18.1 3.460
Duster 360          14.3 3.570
Merc 240D           24.4 3.190
Merc 230            22.8 3.150
Merc 280            19.2 3.440
Merc 280C           17.8 3.440
......

選出 variables 開頭是 "d" 的。

select(mtcars, starts_with("d"))

                     disp drat
Mazda RX4           160.0 3.90
Mazda RX4 Wag       160.0 3.90
Datsun 710          108.0 3.85
Hornet 4 Drive      258.0 3.08
Hornet Sportabout   360.0 3.15
Valiant             225.0 2.76
Duster 360          360.0 3.21
......

列出所有的 variables。

select(mtcars, everything())


2. Filter function: choose observations by their values

和 select() 不同的是 filter() 挑的更進一步,是選出某個 variable 裡的某個觀察(observations),例如下面是選出 cyl 這個 variable 裡面,數值為 8 的那些。

filter(mtcars, cyl == 8)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
2  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
3  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
4  17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
5  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
6  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
......

找出小於八的。

filter(mtcars, cyl < 8)

加兩個條件,用「或」(or),指令符號是:

例如下面是找出 cyl 是 4 或 8 的。

filter(mtcars, cyl == 4 | cyl == 8)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
2  18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
3  14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
4  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
5  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
6  16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
......

在上面的例子中,因為我們想找的是在 cyl 中符合 4 和 8 的條件的,因此我們也可以用 %in% 的語法:var %in% c(obs1, obs2)

這是指在某個 variable 中找出裡面符合觀察值(obs)為特定值的項目,不一定要兩個,可以只有一個,也可以兩個以上,看你想找什麼,用上面的例子就會是:cyl %in% c(4, 8)

filter(mtcars, cyl %in% c(4, 8))

找出同時符合兩個條件的,用「和」(and),指令符號是:

例如下面是找出 cyl 和 carb 都是八的。

filter(mtcars, cyl == 8 & carb == 8)

  mpg cyl disp  hp drat   wt qsec vs am gear carb
1  15   8  301 335 3.54 3.57 14.6  0  1    5    8

用上面的語法前面只會出現數字,如果要顯示出是每列的名稱(也就是哪種車),可以用下面的語法。

mtcars[mtcars$cyl == 4 | mtcars$carb == 8, ]

              mpg cyl disp  hp drat   wt qsec vs am gear carb
Maserati Bora  15   8  301 335 3.54 3.57 14.6  0  1    5    8

select() 是挑出你想看的 variables,那如果想看某種特定條件下 variables 裡面的觀察值呢?例如我想看 variable qsec,但不想看全部的,只想看 cyl = 8 下的 qsec 值是什麼,這時候可以分開設,先用 filter() 找出 cyl = 8 的,然後再用 select() 看裡面的 qsec。

df <- filter(mtcars, cyl == 8)
select(df, qsec)

    qsec
1  17.02
2  15.84
3  17.40
4  17.60
5  18.00
6  17.98
7  17.82
8  17.42
9  16.87
10 17.30
11 15.41
12 17.05
13 14.50
14 14.60


3. Slice function

和上面 filter() 不同的,slice() 是挑選某幾列(row)出來看,例如前三列或最後一列,而不是挑某種特定條件。

例如你只想要列出第三列的資料,可以這樣:

slice(mtcars, 3L)
slice(mtcars, 3)

上面的兩種語法會出現同樣的結果,如下。

# A tibble: 1 x 11
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  22.8     4   108    93  3.85  2.32 18.61     1     1     4     1

Note: slice() and filter() do not carry the row names with the subset of rows(注意:filter  和 slice 這兩個功能都不會在表格的前面顯示列的名稱,只有號碼。)

如果你想要列出第 1, 3, 5 列的資料,可以用 c(1, 3, 5)

slice(mtcars, c(1, 3, 5))

# A tibble: 3 x 11
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  21.0     6   160   110  3.90  2.62 16.46     0     1     4     4
2  22.8     4   108    93  3.85  2.32 18.61     1     1     4     1
3  18.7     8   360   175  3.15  3.44 17.02     0     0     3     2

如果你想要顯示最後一行,不用找出一共有幾行,可以用這個語法: n() 

n(): the number of observations in the current group.(表示那組有幾個觀察值就是幾個)

把它設在你想要挑選的列值的話,就會顯示最後一列,因為它的值是所有觀察值。例如 mtcars 總共有 32 個觀察值(就是有 32 列),那 n() 就是 32,於是就會顯示出第 32 列。

slice(mtcars, n())

# A tibble: 1 x 11
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  21.4     4   121   109  4.11  2.78  18.6     1     1     4     2

在上面的語法中,slice(mtcars, n()) 其實就是 slice(mtcars, 32),但如果用 n() 的話,就可以套用到所有資料李,不用每次改成最後一列的數字。

也可以用 filter() 的功能顯示最後一列,用的語法是:row_number() == n()

filter(mtcars, row_number() == n())

   mpg cyl disp  hp drat   wt qsec vs am gear carb
1 21.4   4  121 109 4.11 2.78 18.6  1  1    4    2

同理,如果要顯示從某行到最後一行的話,可以這樣:

slice(mtcars, 5:n())

# A tibble: 28 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  18.7     8 360.0   175  3.15  3.44 17.02     0     0     3     2
 2  18.1     6 225.0   105  2.76  3.46 20.22     1     0     3     1
 3  14.3     8 360.0   245  3.21  3.57 15.84     0     0     3     4
 4  24.4     4 146.7    62  3.69  3.19 20.00     1     0     4     2
 5  22.8     4 140.8    95  3.92  3.15 22.90     1     0     4     2
 6  19.2     6 167.6   123  3.92  3.44 18.30     1     0     4     4
 7  17.8     6 167.6   123  3.92  3.44 18.90     1     0     4     4
 8  16.4     8 275.8   180  3.07  4.07 17.40     0     0     3     3
 9  17.3     8 275.8   180  3.07  3.73 17.60     0     0     3     3
10  15.2     8 275.8   180  3.07  3.78 18.00     0     0     3     3
# ... with 18 more rows

因為 filter() 和 select() 功能都是不會給列名的,只有給數字,我們可以用 add_rownames() 或是 tibble::rownames_to_column() 的功能。

filter(add_rownames(mtcars), cyl == 8, carb == 3)

# A tibble: 3 x 12
      rowname   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear
        <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  Merc 450SE  16.4     8 275.8   180  3.07  4.07  17.4     0     0     3
2  Merc 450SL  17.3     8 275.8   180  3.07  3.73  17.6     0     0     3
3 Merc 450SLC  15.2     8 275.8   180  3.07  3.78  18.0     0     0     3

Warning message:
Deprecated, use tibble::rownames_to_column() instead.

filter(tibble::rownames_to_column(mtcars),
       cyl == 8, carb == 3)

      rowname  mpg cyl  disp  hp drat   wt qsec vs am gear carb
1  Merc 450SE 16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
2  Merc 450SL 17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
3 Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

在 slice() 的表格裡加 row name 的話就是這樣:(下面顯示第三到五列)

slice(tibble::rownames_to_column(mtcars), c(3:5))

# A tibble: 3 x 12
            rowname   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
              <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>

1        Datsun 710  22.8     4   108    93  3.85 2.320 18.61     1     1
2    Hornet 4 Drive  21.4     6   258   110  3.08 3.215 19.44     1     0
3 Hornet Sportabout  18.7     8   360   175  3.15 3.440 17.02     0     0


Exercise

Q1. 找出 mtcars 檔案裡面 qsec 和 am 的資料,並把檔案裡第一個 column 的資料(i.e., mpg)指定為 am。

因為是要把 qsec 和 am 這兩個 variables 找出來看,所以用的是 select() 這個功能。

select(mtcars, qsec, am = 1)

在 select() 的功能裡,如果用 var = #  這個語法,就是指把某個 variable 指定為檔案裡某一行的 variable,例如上面的 am = 1 就是指把 am 指定為檔案裡原本為第一行的 mpg,你可以看到 am 裡出現的的數值其實是 mpg 裡的。

                     qsec   am
Mazda RX4           16.46 21.0
Mazda RX4 Wag       17.02 21.0
Datsun 710          18.61 22.8
Hornet 4 Drive      19.44 21.4
Hornet Sportabout   17.02 18.7

下面我們用 am = 2,檔案裡的第二欄是 cyl,所以 am 裡的值會變成 cyl 裡的。

select(mtcars, qsec, am = 2)

                     qsec am
Mazda RX4           16.46  6
Mazda RX4 Wag       17.02  6
Datsun 710          18.61  4
Hornet 4 Drive      19.44  6
Hornet Sportabout   17.02  8

Q2. 找出檔案裡 am 是 1 的。

因為是挑處某個 variable 裡面的某個觀察值,所以要用 filter(),和上面不同的地方是要用 ==。

filter(mtcars, am == 1)

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2

Q3. Extract the 1/4 mile time for cars with manual transmissions (找出檔案裡面 am 是 1 的 qsec 值)

am: transmission (0 = automatic, 1 = manual)
qsec: 1/4 mile time

select(filter(mtcars, am == 1), qsec)

    qsec
1  16.46
2  17.02
3  18.61
4  19.47
5  18.52
6  19.90
7  18.90
8  16.70
9  16.90
10 14.50
11 15.50
12 14.60
13 18.60

Q4. Extract the mpg & wt for those cars with 5 gears or a manual transmission (找出檔案裡面 am 值是 1 或 gear 值是 5 的 qsec 值)

select(filter(mtcars, gear == 5 | am == 1), mpg, wt)

    mpg    wt
1  21.0 2.620
2  21.0 2.875
3  22.8 2.320
4  32.4 2.200
5  30.4 1.615
6  33.9 1.835
7  27.3 1.935
8  26.0 2.140
9  30.4 1.513
10 15.8 3.170
11 19.7 2.770
12 15.0 3.570
13 21.4 2.780


4. Piping (%>%): used when combining several function call together the command can be very hard to read

這個功能在 library(dplyr) 裡面,如果你用的疊層太多,很長的話,可以用 piping 把它分層變短。

Note: f(x) %>% g(y) is the same as g(f(x),y)

Exercise 1: Use %>% for Q3(把上面 Q3 的答案用 %>% 寫出來)

select(filter(mtcars, am == 1), qsec)

上面的是指在 mtcars 裡挑出 am == 1,再從裡面挑出 qsec 的資料。也就是說,mtcars 是最外層的,再來是 am == 1,最後才是 qsec。

mtcars %>%
   filter(am == 1) %>%
   select(qsec)

Exercise 2:

as.data.frame(select(filter(add_rownames(mtcars),
              mpg >= 30), rowname, mpg, cyl, hp))

把上面的語法用 %>% 分句寫。拆開來看是把 mtcars 加了列名之後,挑出 mpg >=30,再從裡面挑出 rowname, mpg cyl, hp 這幾項用 dataframe 的形式呈現出來。

add_rownames(mtcars) %>%
   filter(mpg >= 30) %>%
   select(rowname, mpg, cyl, hp) %>%
   as.data.frame()


最後,我們用檔案資料 flights 來練習一下。

Q1. Select all flights on January 2, but leave out the date columns.

選出所以一月二號的班機,不用顯示出日期(年月日)的那幾欄。

下面先看一下 flights 長怎樣。

head(flights)

# A tibble: 6 x 19
   year month   day dep_time sched_dep_time dep_delay arr_time
  <int> <int> <int>    <int>          <int>     <dbl>    <int>
1  2013     1     1      517            515         2      830
2  2013     1     1      533            529         4      850
3  2013     1     1      542            540         2      923
4  2013     1     1      544            545        -1     1004
5  2013     1     1      554            600        -6      812
6  2013     1     1      554            558        -4      740
# ... with 10 more variables: carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
# distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

挑出 variables 裡面的某個觀察,要用 filter() 挑出 month == 1day == 2。要挑出某些 variables 的話要用 select(),如果要剔除的話同樣用 select(),但是在不要的 variables 前面加  -

flights %>%
  filter(month == 1, day == 2) %>%
  select(-year, -month, -day)

也可以這樣:

flights %>%
  filter(month == 1, day == 2) %>%
  select(-(year:day))

# A tibble: 943 x 16
   dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay
      <int>          <int>     <dbl>    <int>          <int>     <dbl>
 1       42           2359        43      518            442        36
 2      126           2250       156      233           2359       154
 3      458            500        -2      703            650        13
 4      512            515        -3      809            819       -10
 5      535            540        -5      831            850       -19

可以看到上面的顯示的結果沒有 year, month 和 day 那三欄。



另外幾個處理檔案資料的功能請看這篇:R | Data manipulation (2): arrange, mutate, summarise









2017年4月22日 星期六

年輕的血可以抗老(二): TIMP2

還記得前幾年的這個實驗嗎?把老年的老鼠和年輕老鼠縫在一起(parabiosis)後,年輕老鼠的血讓老年老鼠變年輕了。

2013 年的時候,哈佛大學的 Dr. Amy Wagers 團隊把年輕(兩個月大)的和老年(23 個月大)的老鼠縫在一起,發現老年老鼠的心室肥大症狀(cardiac hypertrophy)改善了[1, 6]。為了找出是什麼蛋白質造成這個現象,他們分析比較了年輕老鼠和老年老鼠的血,發現兩者間有十三個蛋白質的表現量差很多,其中一個是 GDF11 (BMP-11),老鼠血中的 GDF11 隨著年紀增加而減少 [6]。GDF11 是生長激素 TGF-β 家族裡的其中一個,他們把 GDF11 打進老老鼠腹腔後(i.p. injection),同樣可以改善因老化而造成的心室肥大症。隔年,他們又發表了兩篇研究在 Science 說 GDF11 可以增進肌肉功能 [2, 7] 和腦細胞生長 [8]。

不過這兩篇研究在 2015 年的時候引起爭議,因為 Novartis Institutes 的執行長(executive director) David Glass 說他們重複實驗後得到的是相反的結果 [3, 4],研究結果發表在 Cell Metabolism [9]。他們發現老鼠和人類血液中的 GDF11 是隨著年齡增長而增多的,而且不但不會改善肌肉傷害,還會使它更嚴重,因為 GDF11 會抑制肌肉重新生長 [4, 9]。對此 Dr. Wagers 表示結果不同可能是因為 GDF11 有不只一種 isoforms,而其中一種確實是減少的 [3, 4],並且 Novartis 用的 GDF11 量是她用的三倍之多,過多的 GDF11 可能造成反效果。另外要提的是 myostatin (GDF8) 和 GDF11 很像,根據 Novartis 的研究,GDF11 和 myostatin 有相同的功能,都會抑制肌肉生長 [9],Novartis 有一個研發藥物即是 myostatin blocker,是想用來治療肌肉萎縮(muscular atrophy)的。這兩個研究之間的爭議和不同之處在 Dr. Wagers 關於 GDF11 可以改善肌肉傷害那篇 [6] 的 PubPeer 有諸多討論。

好了,為什麼要提起上面這些研究呢?因為今天有一篇發表在 Nature 的研究說除了 GDF11 外,還有另一個蛋白質可以讓年老的老鼠變年輕變聰明 [5]。這個研究是史丹佛大學的 Dr. Tony Wyss-Cory 團隊做的,他們之前有和 Dr. Wagers 合作過連體老鼠的研究。在這篇 Nature 的研究裡,他們比較了老年人(61-82 yrs)、年輕人(19-24 yrs)和新生兒臍帶血(umbilical cord plasma)的血漿蛋白,發現臍帶血漿可以增進老鼠的腦神經功能。之後他們比較了年輕老鼠和年輕人的血漿,找尋在老鼠和在人類血液內都會隨著年紀增加而降低的蛋白質,其中一個是 TIMP2 [10] [註]。TIMP2 在人類臍帶血和年輕老鼠的血漿及海馬旋裡的表現量都很高,當他們把 TIMP2 打進老鼠體內後,老年老鼠的認知功能改善了。同時,他們也發現 TIMP2 對年輕老鼠的空間記憶(spatial memory)是必須的,如果 knock down TIMP2,LTP (long-term potentiation)就無法表現 [10]。不過,他們目前還不知道 TIMP2 作用在記憶力的機制是什麼,需要更進一步的研究。

註:在 Wagers 2013 [6] 的那個研究裡,發現隨著年紀減少的蛋白有一個是 TIMP3,不過雖然 TIMP2 和 TIMP3 都在同一個家族裡,但他們的功能似乎差很多。


延伸閱讀:年輕的血可以抗老(一)GDF11



Articles:

1. Science / Nineteenth Century Technique Turns Old Mouse Hearts Young (2013)

2. Science / Young Blood Renews Old Mice (2014)

3. Science / Doubts cast on 'rejuvenating' protein (2015)

4. Nature / 'Young blood' anti-ageing mechanism called into question (2015)

5. Nature / Young human blood makes old mice smarter (2017)


Papers:

6. FS Loffredo et al, Growth Differentiation Factor 11 Is a Circulating Factor that Reverses Age-Related Cardiac Hypertrophy. Cell (2013)

7. M Sinha et al, Restoring Systemic GDF11 Levels Reverses Age-Related Dysfunction in Mouse Skeletal Muscle. Science (2014)

8. L Katsimpardi et al, Vascular and Neurogenic Rejuvenation of the Aging Mouse Brain by Young Systemic Factors. Science (2014)

9. MA Egerman et al, GDF11 Increases with Age and Inhibits Skeletal Muscle Regeneration. Cell Metabolism (2015)

10. JM Castellano et al, Human umbilical cord plasma proteins revitalize hippocampal function in aged mice. Nature (2017)









2017年4月20日 星期四

除了人類基因體計畫,還有另一種:Human Knockout Project

做研究常常需要用到 KO (knock-out) mice 來確認目標蛋白質的重要性,或是主要功能是什麼。不過呢,人和老鼠還是有差別,我們可以把老鼠的某個基因 KO,但無法把人類的基因 KO。如果我們無法 KO 人類的基因,那總可以找本來就沒有某些基因的人來研究吧?

雖說近親繁殖會使隱性的突變和疾病顯現出來,例如某 A 帶的一對基因一個是正常的(X),一個是突變沒功能的(x),那他帶的這個基因就是 Xx。因為突變而喪失功能叫 loss-of-function (LoF),假設某 B 是近親因此也有同樣的情形 (Xx),兩個人通婚後生的小孩就會有 25% 的機會是 xx,也就是身體裡沒有正常功能的蛋白質 X,等於是人類的 X 基因 KO。這種近親通婚的情況目前在帕基斯坦還存在,他們常常會和自己的表親通婚,於是會出現讓隱性突變顯性表現出來的情形。然而,很多人即使因為這個情形而喪失了某些基因,但還是活得很健康,這表示這個基因不重要嗎?這些看似不重要的基因也許可以為藥物研發帶來什麼意義。

2000 年的時候,Daniel MacArthur 開始找人類沒有也不會有事的基因。那年他還是 Dr. Kathryn North 實驗室的大學生。Dr. North 是澳洲雪梨大學的教授,之前發現一對兄弟的 muscular dystrophy (MD) 早發症狀(early-onset)可能是因為 ACTN3 出問題,不過當他們確認了父母肌肉裡的蛋白表現時,發現並沒有正常的 ACTN3 蛋白,但是父母本身是健康的,表示兄弟倆的 MD 症狀並非是缺少 ACTN3 蛋白的緣故(他們後來也發現是另一個基因突變造成的)[1]。於是呢,Dr. North 便開始想找出有什麼基因是看似重要,但沒有也可以存活的,也許我們缺少了那個基因非但無害,反而還有好處,他把這個計畫叫做 Human Knockout Project。為 1000 Genomes Project [註] 的一部份,分析了 185 位的基因體,MacArthur 和同事發現健康的人平均有一百種 LoF variants 和二十個完全喪失功能的基因突變 [1, 8]。

健康人的 LoF variants 通常是這幾種情形 [8]:
- 兩個 alleles 只有一個有問題(heterogenous),而有問題的那個雖然造成嚴重疾病,但因為是 recessive 所以(病徵)不會表現出來。
- 有問題的 alleles 雖然沒那麼嚴重,但也不至於造成疾病。
- 那個基因是多餘的(redundant),也就是說有其他的基因可以取代它的功能。
- 不會影響基因的功能

2014 年的時候,MacArthur 和耶魯大學的 van Heel,還有英國倫敦大學(University of London)的 Richard Trembath 計畫花四年定序住在英國的倫敦東區的 25,000 位巴基斯坦裔英國人的基因,這些人的父母很多都是一等親(表親)通婚。2015 年的時候,他們開始這項計畫,Sanger Institute 也答應幫他們定序,預計 2017 年年底可以完成 [2]。2016 年的時候,他們把已經定序和分析了的 3222 位巴裔英國人的結果發表在 Science,發現他們真的缺少不少基因,在 821 人裡有 781 個基因共出現 847 種 variants,其中有 575 個 variants 是 LoF。有 38 個人缺少了之前以為很重要的基因,但只有 9 人因為缺少這些基因而生病 [3, 9]。

之後,MIT Broad Institute 的 Dr. Sekar Kathiresan 也做了類似的研究,他們分析了 10,503 位有參與長期心血管疾病和糖尿病研究的巴基斯坦人的基因,結果發表在這個月的 Nature。他們發現這些人的基因中有 1317 個是即便完全喪失功能(fully knock-out)也不會造成需要就醫的情形,有 1843 人至少有一個完全喪失功能的基因(就是兩個 alleles 都 KO),有兩個人以上是同時有七個喪失功能的基因:PLA2G7 (Lp-PLA2), CYP2F1 (Cytochrome P450 2F1), TREH (Trehalase), A3GALT2 (α1,3-galactosyltransferase 2), NRG4 (neureglin 4), SLC9A3R1, APOC3 [5, 11]。

七個基因中有一個是 PLA2G7,其蛋白是 Lp-PLA2 (lipoprotein associated phospholipase A2),這是和血塞有關的酵素,之前研究顯示如果血中的 Lp-PLA2 越高的話,心臟病發(heart attack)的機率就越高。GSK 在 2012 年花了三億美金(USD$3B)買下 Human Genome Sciences 研發抑制 Lp-PLA2 的藥物 Darapladib,不過它的兩個大型 phase III 臨床試驗都失敗 [7]。這個研究發現少了一個或一對 Lp-PLA2 基因的巴基斯坦人得到心血管疾病的機率並沒有比較低,也許可以解釋為什麼 Lp-PLA2 inhibitor 會失敗 [5, 11]。

七個基因中還有一個是 APOC3,其蛋白是 ApoC3 (apolipoprotein C3),它是 chylomicrons, VLDL (very low density lipoprotein) 和 HDL (high-density lipoprotein)裡的其中一個蛋白,會讓肝臟無法吸收富含甘油三酯(triglycerides, TGs)的脂肪粒(TG-rich lipoproteins, TRLs),使食物中的脂肪無法從體內循環中被清除,使得高血液中的 TRLs 升高。之前研究顯示當血中的 ApoC3 和 TRLs 過高的話,會造成高三酸甘油酯症(hypertriglyceridemia);而如果抑制 ApoC3 的話,則應該可以促進脂肪代謝。而在這個研究裡,有一整個家庭,包括雙親和九個孩子,全部都缺少 APOC3 基因,即便他們喝了一杯充滿脂肪的奶昔,但血液中的脂肪量卻很少會上升。這個家庭雖然缺少 ApoC3,但身體健康,表示如果用藥物抑制 ApoC-III 來治療應該是安全的 [5, 6, 11]。

另一個跟 ApoC-III 類似情況的是 PCSK9。德州大學 Southwestern Medical Center 的心血管疾病專家 Helen Hobbs 說他和同事之前懷疑過,有些人的壞膽固醇(LDL, low-density lipoprotein)異常的低是因為 PCSK9 喪失功能。他們找到一位個案是 34 歲的女士,她的一對 PCSK9 都因為突變而喪失功能,造成她的 LDL 極低但身體卻是健康的。因為這個研究,藥廠發現可以用藥物抑制 PCSK9 來降低膽固醇 [1]。事實上,PCSK9 inhibtor 已經進入臨床試驗階段,今年三月的時候,結果發表在 NEJM 中 [10]。這個藥物是 Amgen 的 evolocumab (Repatha),顯示不但可以降低血液中的膽固醇(up to 59%),也可以在已經服用降膽固醇藥物 statins 的病患身上再降低 20% 因心血管疾病致死的風險 [4]。

註:為 The 1000 Genomes Project Consortium 的計畫,目的是深入了解 genotype (基因)和 phenotype (表現出來的徵狀)的關係, genotype 如何影響 phenotype [12]。其中合作者眾多,有 Baylor College of Medicine, Broad Institute (MIT, Harvard), Illumina, Life Technologies, Roche, Wellcome Trust Sanger Institute, Cold Spring Harbor Laboratory, EBI, Yale, Stanford 等等。

這個計畫下面有三個主要計畫:
1. 從四個族群裡選出 179 人做全基因底定序(low-coverage WGS)
2. 兩代基因定序(high-coverage WGS),基本為父母和孩子三人的(mother-father-child trios)。
3. 從幾個族群裡選出 679 人做目標性定序(targeted sequencing)



Articles:

1. J Kaiser, The Hunt for Missing Genes. Science (2014)

2. J Kaiser, East London study to explore high disease rates in south Asians (2015)

3. J Kaiser, Human ‘knockouts’ reveal genes we don’t need. Science (2016)

4. H Ledford, Genome-based cholesterol drug boosts heart health. Nature (2017)

5. J Kaiser, Human ‘knockouts’ may reveal why some drugs fail. Science (2017)

6. Science News / Gene knockouts in people provide drug safety, effectiveness clues (2017)

7. Science Daily / New genetic research can significantly improve drug development (2016)


Papers:

8. DG MacArthur et al, A Systematic Survey of Loss-of-Function Variants in Human Protein-Coding Genes. Science (2012)

9. VM Narasimhan et al, Health and population effects of rare gene knockouts in adult humans with related parents. Science (2016)

10. MS Sabatine et al, Evolocumab and Clinical Outcomes in Patients with Cardiovascular Disease. NEJM (2017)

11. D Saleheen et al, Human knockouts and phenotypic analysis in a cohort with a high rate of consanguinity. Nature (2017)

12. The 1000 Genomes Project Consortium, A map of human genome variation from population-scale sequencing. Nature (2010)









那件洋裝到底是什麼顏色?!

還記得前年很紅的那件洋裝嗎?你看到的是什麼顏色?白色和金色,還是黑色和藍色呢?



記得在那之後有好幾篇 papers 討論為什麼會出現這個情形,那時候有看了一下,但現在記不太得了(記憶力老化很嚴重 😭),沒想到事隔兩年多了(?)還有人繼續研究這個。這篇研究滿有趣的,他們在網上做了兩次問卷調查,第一次有 8048 人,第二次有 5333 人,問卷問題除了問他們第一次看到洋裝時是什麼顏色外,還有問是否認為洋裝在影子下,是否在看到洋裝之前就已經知道是什麼顏色,認為照片裡的光是自然光(natural light)還是人造光(artificial light),第一次看到洋裝的照片時是在什麼時間、室內還是外、用什麼看的(手機還是電腦等等),另外還有問一些個人資訊,例如住哪、生活作息,還有活動範圍(在室外的時間多,還是在室內的時間多)。


Figure: P Wallisch, Slate 2017

分析結果發現,大多數人看到的都是白色和金色,是看到黑色和藍色的快一倍多。有趣的是看到白色和金色的大多是早睡早起的(正常作息, morning larks),看到黑色和藍色的則大多是夜貓子(night owls)。他們認為會有這種現象是因為常看到短光的(short-wavelength),當看到不確定的光時會自然地認為那是短光或偏藍光(bluish)。反之,如果常看到長光就會先假設那是長光或偏黃光(yellowish)。

那這和作息時間還有看到洋裝是什麼顏色有何關係呢?如果你活動的時間大多是白天的話,那你接觸到的大部分光都是自然光;如果你活動時間都是晚上,那你大多數時間接收到的光都是人造光(也就是電燈)。而自然光和人造光是有不同光譜的,自然光是屬於短光,人造光屬於長光,也就是說如果你是 morning lark 的話,那你平常接受到的偏藍光比較多。如果這個理論是對的,那早睡早起的人看到的洋裝會是白色和金色的,因為會先排除掉那是偏藍光的假設。另外,看到白色和金色的人也大多認為照片裡的光是自然光,而夜貓子大多認為那是人造光,只有少數早睡早起的人覺得那是人造光。

雖說我的確如研究所說,是屬於白色和金色,同時是 morning lark 的那群,不過這個研究感覺只是分析樣本和推導結果,似乎並沒有真的證明看到的顏色和生活作息有關。是說還記得本實驗室大多數人都是看到白色和金色,只有一個看到黑色和藍色,他發現沒人跟他一樣的時候整個嚇到,以為我們在整他,明明是黑色和藍色,但是大家聯合起來騙他是白色和金色這樣。我們很認真的跟他說並沒有騙他,我們看到的真的是白色和金色之後,他開始陷入恐慌,以為他的眼睛出問題,超好笑的。XD



Article:

Science / Science says yes to the dress (2017)

Slate / Two Years Later, We Finally Know Why People Saw “The Dress” Differently (2017)


原論文:

P Wallisch, Illumination assumptions account for individual differences in the perceptual interpretation of a profoundly ambiguous stimulus in the color domain: “The dress.” JOV (2017)









2017年4月18日 星期二

Laura Dekker: 最年輕就繞地球一周的帆船手

昨天早上和我爸媽聊天時,我爸提起他最近看的這部紀錄片 Maiden Trip,是講一個十四歲小女孩自己駕帆船環繞地球一周的事情,好奇就孤狗了一下,以下簡述。



National Geographic / A 16-Year-Old Girl’s Solo Sail Around the World | Short Film Showcase


這個女孩叫 Laura Dekker,父親是荷蘭人,是為造船家(boat builder),母親是德國人,是街頭藝人。父母兩人有七年的時間在海上環遊世界,一樣是駕帆船。他們途經紐西蘭的時候是 1995 年,Laura 誕生了,所以她有三個國籍:德國、荷蘭和紐西蘭。Laura 出生之後的五年,都是在海上生活,直到五歲時他父母終於返航回到荷蘭。

她從小就跟父親 Nick Dekker 學駕帆船,六歲時得到第一艘船 Optimist,之後就跟著父親學如何駕馭帆船。

2006 年暑假,也就是她十一歲的時候,和父親參加一場 24 小時的帆船競賽,船是跟父親朋友借的一艘 Hurley 700,比賽完之後 Laura 問船主人可不可以借她,船主人說可以借她一年,返還的時候清潔乾淨和保養好即可。借到船之後,她每天晚上跟著父親學各種航海知識。

2007 年暑假,駕帆船的技術和航海的知識都準備好後,她便駕船在 Friesland (荷蘭最大省)的 Wadden Sea (Waddenzee) 遊玩了六個禮拜,期間只有她的狗 Spot 陪她。在這之後,Laura 決定她要一艘自己的 Hurley 700,於是她和爸爸開始看船。為了買到她想要的船,她打工存錢,終於在十二歲時可以駕著她自己的船 Guppy 出海。

2008 年的整個暑假,她駕著她的 Guppy 在荷蘭的海上到處遊玩,然後她告訴父親,她想要自己駕船繞地球一周,成為環繞地球一周最年輕的帆船手。父親跟她說,先穿越英吉利海峽來證明她有能力獨自環繞地球一周。

2009 年,她十三歲的時候,她準備了八個禮拜,終於趕在五月春假開始前一天把出航到英國所需的一切準備好。她禮拜五中午放學後就出發了,沒有告知家人,禮拜天早上抵達英國,上岸了之後被英國警察扣住,打電話要她父親來陪她駕船回去,他父親回說 Laura 自己會回去不需要他去帶,於是英國警察就把 Laura 送到小孩之家,不得已他父親才到英國去接女兒。雖說是接,其實只是把她領出來,讓她能上自己的帆船而已,之後 Laura 一樣是自己駕船回荷蘭,父親則是坐飛機回去。XD

雖然 Laura 跟父親證明了她可以自己出航,但荷蘭政府不同意。同年八月,在 Laura 宣布她要花兩年時間獨自繞地球一周後,引起社會上很多爭論,很多人認為讓小孩自己駕船趴趴走很危險,父母不該這樣放任小孩。同時荷蘭政府和社會局也介入了,因為荷蘭法律規定十六歲以前駕船要有監護人陪同,不能獨自出海。Laura 當然不服氣,她覺得自己有能力可以獨自出海,她有這個自信是因為她從小在海上生活,了解海的美麗和危險,她認為大家覺得危險和恐懼是因為不夠了解。

"They thought it was dangerous. Well, everywhere is dangerous. They don't sail and they don't know what boats are, and they are scared of them."

Laura 的父親也對她充滿信心,覺得她比很多帆船手都厲害了,Laura 知道自己在幹麻,對自己想做的事也有計劃。

Nick Dekker: "It caused a lot of opposition from complete strangers and from parents of her girlfriends as well. However, I know about her abilities and I know how she has learnt them. I have absolute confidence to my daughter; I know that she won't undertake crazy actions and that she is well prepared for all eventualities. She is a better sailor and she has more experience than many seasoned sailors."

2009 年十月,法院雖然判定 Laura 不能自己出航,因為認為她經驗不夠,但也留了個後門,只要她能通過某些條件就可以出航。

2010 年七月,法院讓父母決定 Laura 是否能夠獨自航行,於是她在那年八月就出發了。

她從荷蘭到葡萄牙這段有父親陪同,一起測試船是否沒問題,之後便獨行。航行路線是由葡萄牙向西,經過 St. Maarten,穿過巴拿馬運河,經過珍珠島、大溪地、斐濟,然後 2011 年的八月到達澳洲的達爾文。原本計畫停 26 個點,每個點之間花的航行時間不超過兩週,不過在澳洲之後,她略過好幾個點,所以有時在海上航行了六、七個禮拜才到下個點。離開澳洲後,一路直航到南非,中間在海上的時間有 48 天,2011 年十一月到南非的 Cape Town。離開南非後同樣沒停任何點,直接航行至這趟旅程的終點站 St. Maarten,那天是 2012 年的七月 21 日。總共航行時間是一年五個月,519 天。不過結束之後她仍繼續航行,最後停留在紐西蘭,她的出生地。

TED Talk x Youth / Laura Dekker


Idea City / Laura Dekker - Youngest Circumnavigator to Sail Alone Around the World


她在航行時有自己攝影紀錄,面對鏡頭講述自己的當時的心情,一路航行的感想,之後剪輯成紀錄片 Maiden Trip。

紀錄片中有幾個令人印象深刻的點:

- 出航後的前幾天,她沒有真實感,直到要進入巴拿馬運河,她才有種正式啟航的感覺,因為過了運河,她就只能向前行,無法往回走了。
- 很多人問她獨航不會無聊嗎?她說剛開始沒網路很不習慣,後來也就習慣了。她喜歡航海,想要到世界各地,接觸其他文化,所以不會無聊。
- 從 Galápagos Islands 到法屬玻里尼西亞(French Polynesia)這一段,是她父母 1992 年時航行過的一段,她拿了父母那時的航海日記,每天看當時的航速,和當年父母比賽。那時她父母這段花了十九天,而她花了十八天。"Pretty Awesome!" She said.
- 航程的前半段,她很喜歡著陸活動和跟人群接觸,偶爾會覺得孤單,但後半她開始喜歡獨處的時間,她享受在海上的日子,因為獨處的時間可以讓她更了解自己。
- 她小時候時對她爸爸的感覺很複雜,既愛又怕,自從父母離婚後她跟著父親,幾乎每天都是她自己過活,因為父親很忙,從早上六點工作到晚上九點。有一陣子父親因為過勞崩潰,整天待在家、情緒不穩,讓她很害怕。父親了解自己的情況,跟她講之後再發生的時候要怎麼處理,她後來也習慣了,還是很愛她父親。
- 她到了法屬玻里尼西亞後愛上了那裡,一度不想離開,但是如果待太久,她就無法達成成為繞地球一周最年輕的帆船手的夢想,掙扎了一陣子後還是決定離開 Bora Bora 繼續往前,因為她還是想達成夢想。
- 從 Bora Bora 出發到南非的時候已是十一月,那個時節的海非常危險,風大浪高,她很緊張但還是成功到達南非。中間風浪很大的時候,她提高警覺,專注於往前航行,感覺不到恐懼、疲憊和餓。
- 在海上航行有很多不可掌控的因素,有時是好幾天沒風,有時是大風大浪。剛開始遇到好幾天沒風的時候,她會很焦慮,到後來已能處之泰然。
- 她在出發之前很多人唱衰她,但當她順利到達南非後又說「我們相信你能做到」,她後來對別人的批評都是一笑置之。
- "Freedom is when you're not attached to anything." 在船上獨處的日子讓她了解,真正的自由就是不依附於任何事。


看完這個覺得十四歲小孩的能力其實超乎大人的想像,而她父母對他的信任和信心也令人佩服啊。當小孩有夢想時,父母應該去幫助他完成,而不是跟他講很危險不要做,換別的。最重要的是 -- 小孩敢冒大人不敢冒的險。

台灣父母把小孩照(ㄍㄨㄢˇ)顧(ㄓˋ)的那麼周到,什麼都幫小孩做好,對小孩沒信心,覺得他們無法自己處理事情,一定要父母幫忙,害怕小孩去冒險,擔心小孩受傷或遇到危險。這種對小孩的控制欲和擔心是不是同時反應了父母本身就對自己極度沒信心?父母不相信自己的小孩有能力處理事情,到底是對自己(的教育)沒信心,還是對小孩沒信心?也許很多時候,並不是小孩做不到,而是父母自己做不到,所以覺得小孩也做不到。

有一種做不到,叫做父母覺得你做不到。
有一種危險,叫做父母覺得很危險。

也許父母在因為自己的擔心而想要限制小孩發展的同時,應該要先誠實的面對自己的弱點。




References

Wikipedia: Laura Dekker

BBC / Dreams scuppered for Dutch sailor girl

CNN / Dutch teen completes historic, controversial solo sail around the globe

Zeilmeisje Laura Dekker: 2009 ZEILEN 雜誌專訪

Laura Dekker personal blog









2017年4月10日 星期一

免疫缺乏症:一個花了 35 年才找到病因的病

在 CBC 看到這個案例的新聞,但是新聞寫得不清不楚,連是哪個基因突變都沒講,於是就找到 McGill 自己發的新聞稿。這個案例是三十年前時,有一位男孩 Steven Francis 不停的出現感染症狀,例如細菌感染、病毒感染、黴菌感染和上呼吸道感染之類的,要一直不停的治療,看了很多醫生(甚至還跑去美國看)卻都找不出原因。這個情況困擾的他三十年,中間還曾經因為嚴重感染差點死掉,直到 2012 年當年的男孩已經變成三十歲的成人時,家庭醫生轉介他到 McGill University (Research Institute of the McGill University Health Centre, RI-MUHC) 的 Dr. Donald Vinh。

Dr. Vinh 喜歡研究一些疑難雜症,當他接手 Francis 這個案例後,除了看他三十年來堆積成箱的病例,也開始查他祖宗十八代的病史。因為自 1980s 年代後許多免疫缺乏症(immunodeficiency)開始被發現,Dr. Vinh 便想會不會 Francis 的病跟免疫有關,然後他發現 Francis 的一個跟免疫有關的基因有突變。

ZAP70 是一個 cytoplasmic tyrosine kinase,負責啟動(activate) T cells,如果 ZAP70 喪失功能,那身體的免疫系統便無法作用,也無法啟動防禦系統對抗細菌或病毒入侵,造成 combined immunodeficiency (CID)。ZAP70 突變的話通常是致命的,如果兩個 ZAP70 的基因都突變的話,小孩會不停地反覆嚴重感染,需要在五歲以前接受骨髓移植才能存活。

Francis 的突變比較特別,並不是一個眾所皆知會造成免疫缺乏的突變,在 ZAP70 DNA 的序列上是 homozygous 1272C>T,氨基酸序列則是 G355G (DNA 上為 GGC > GGT),也就是這個 DNA 上的突變並不會造成氨基酸序列的改變,但為什麼會致病呢?因為這個突變產生的 mRNA 會導致不正常 mRNA slicing,結果會造成 19-bp deletion,這個 deletion 產生的 frame-shift 會使得氨基酸序列變短(premature stop codon)。突變的 ZAP70 (DSS mut) 表現量比正常的 ZAP70 (DSS wt) 要低,也無法啟動 TcR (T-cell receptor) signalling。

Dr. Vinh 發現如果只帶有一個突變的話(heterogenous),DSS wt 的功能會蓋過 DSS mut 的 ZAP70,所以對生理上不會造成太大影響,如果是 homogenous 的話,DSS mut 就會蓋過 MSS wt,造成 T cell 的功能失衡,於是他想了一個方法,就是用 oligonucleotide 來抑制不正常的 mRNA splicing,降低 DSS mut,讓 DSS wt 的表現和功能上升。他用的是一個目標序列為 1272C>T 突變的 antisense morpholino oligonucleotide (AMO),結果試驗在體外培養的細胞(病人的 PBMC)上的效果不錯。

三十年說短不短,但還是算在有生之年找到治療方法,雖然離用在人體身上可能還需要一段時間。是說這麼細微的突變(畢竟氨基酸序列並沒有改變),要怎麼發現是因為 ZAP70 mRNA splicing 不正常造成的呢?是把所有跟免疫相關的基因序列和它們的 mRNA 都定序比對,看哪個基因有突變或表現不正常嗎?覺得能找到病因真是很厲害啊。



CBC 的新聞:McGill researcher solves case of 'mystery boy' whose illness eluded doctors for decades

McGill 的新聞稿:Solving medical “cold cases” through genetics

論文:C Gavino et al, Morpholino-based correction of hypomorphic ZAP70 mutation in an adult with combined. Journal of Allergy and Clinical Immunology (2017)










2017年4月9日 星期日

史前人類為什麼要吃人?

之前的考古發現,舊石器時代的人類會吃同類(human cannibalism),但是原因眾說紛紜,有的認為是某種儀式(ritual),有人認為是因為人體有營養價值(nutritional),不過最近的研究認為營養價值這個原因不成立,因為人體能供給的熱量跟動物相比並沒有比較高,跟人類(體積)同樣大小的動物能提供的熱量跟人類一樣。

顯示為吃人的特徵(signatures of cannibalism)有幾項,包括有:

- 除了沒有頭骨(cranial base)外,其他部位皆完整。
- 沒有脊椎,因為要吃脊髓。
- 有刀切的痕跡
- 長骨被切成段
- 切人類和動物的的技法一樣
- 處理剩下的人體和動物屍體的方法是一樣的
- 有煮過的痕跡(例如骨頭被燒焦了)
- 有人類的齒痕

如果是某種儀式的話,會在頭蓋骨留下治療的痕跡之類的。

經過研究計算人體的成分,顯示一位成人男性體中的總脂肪和蛋白質量能提供的熱量只有 125,822 卡路里,只能提供六十個人一天所需的能量。之前有研究說,一位五十公斤的男性身體可以提供 30 公斤的可食用的肌肉,包含有 4.5 kg 的蛋白質,約 18,000 卡路里。人體中能提供最多能量的想當然爾是脂肪,一個人體的脂肪就能提供 49,399 卡路里,最少的則是牙齒,只有 36 卡路里。而且跟現代人相比,尼安德塔人的肌肉比現代人多,所能提供的能量也比較少。(人體中能提供最多卡路里的是脂肪,再來是 skeleton,第三才是肌肉。)

相較之下,古代動物如長毛象一隻就能提供 3,600,000 卡的熱量,犀牛有 1,260,000 卡路里,平常野牛也有 979,200 卡路里,隨便都是人類的好幾倍,當然打獵打他們比較划算啊,打一隻就可以吃好幾天,打自己的同類來吃太沒效益了。XD

最新的研究認為,發現的九個在舊石器時代 (936,000 - 14,700 年前)時吃人的地點中,人類會吃同類的原因可能是不想浪費食物,都已經死在那了,不吃埋起來好像有點可惜。或者是因為太餓了,所以就吃了。但最有可能的原因是慶祝打仗勝利的儀式,把殺死的敵人吃掉。



Article:

M Price, Why don’t we eat each other for dinner? Too few calories, says new cannibalism study. Science Magazine (2017)


原論文:

J Cole, Assessing the calorific significance of episodes of human cannibalism in the Palaeolithic. Scientific Reports (2017)









2017年4月2日 星期日

未來.... 我們可以把皮膚細胞變成小寶寶嗎?

自從日本京都大學的山中伸彌教授找出把已經分化的細胞變回幹細胞的方法後,好像沒什麼不能發生了。有唸過 developmental biology 的都知道,卵子受精後成為 zygote (這時候是 totipotent),會經過幾次細胞分裂,中間歷經 murula 的階段(約 10-30 個細胞),之後繼續分裂變成 blastocyst (這時候是 pluripotent)。在 totipotent 和 pluripotent 的階段,細胞都屬於 embryonic stem cells (ES cells),這時候的細胞可以自我複製(self-renewal),也可以繼續分化(differentiation)成各種細胞,例如表皮細胞。

Blastocyst 階段的初期主要是兩種細胞:pluripotent inner cell mass (ICM) 和外層的 trophectoderm (TE)。之後 ICM 之後會分化成 epiblast (primitive ectoderm) 和 hypoblast (primitive endoderm)。在 blastocyst 後期,epiblast 會分化生殖細胞(primordial germ cells, PGCs),而 hypoblast 和 TE 則會變成 extra-embryonic endoderm。PGCs 在雄性動物體內會變成精子(spermatozoa),在雌性動物體內則會變成卵母細胞(oocyte)。


Figure: W Tang et al, Nature Reviews Genetics 2016 (doi:10.1038/nrg.2016.88)

ES cells 可以說是生命的起頭,而分化後的細胞則是終端,無法變成其他種細胞。Blastocyst 裡面的 ICM 可以被挑出來體外培養,也就是研究常用的胚胎幹細胞(embryonic stem cells, ESCs)。而山中伸彌的研究,則是利用四個 transcription factors (Oct3/4, Sox2, Klf4, c-Myc) 把分化後的細胞重新設定(reprogram),使它變回 pluripotent ES cells,這些被重新設定的人造幹細胞就是 iPS cells (induced pluripotent stem cells)。當細胞被變回幹細胞後,你可以誘導它分化成你想要的細胞,例如卵子或精子。


Figure: modified from M. Berdasco et al, Stem Cell Research & Therapy 2011 (doi: 10.1186/scrt83). EE: extra-embryonic tissue, ICM: inner cell mass.

在老鼠的生長過程中,約在胚胎期第六天(embryonic day 6, E6)時,extra-embryonic ectoderm 會釋放出訊號蛋白 Bmp4 (bone morphogenetic protein 4),誘導 epiblast 生成生殖細胞。Epiblast 跟 ICM 同樣可以體外培養,由 epiblast 培養出來的則是 epiblast stem cells (EpiSCs)。

2011 年的時候,日本京都大學的斎藤通紀(Mitinori Saitou)和九州大學的勝彥林(Katsuhiko Hayashi)嘗試在體外(in vitro)誘導由公鼠胚胎取出的 ESCs,使其分化成 epiLCs (induced epiblast-like cells),之後再把 epiLCs 誘導分化成 PGCLCs (PGC-like cells)。他們也試著把三株山中彌伸的 iPSCs (20D17, 178B5, 492B4) 轉成 PGCLCs,這三株是由老鼠的 embryonic fibroblasts 轉成的。他們把這些 ESC-derived 和 iPSC-derived PGCLCs 放進公鼠體內(testes, 睪丸)後,這兩種從體外誘導生成的 PGCLCs 都成功變成可受精的精子(spermatogenesis),和卵子受精後長成的小鼠也都一切正常 [3, 10]。隔年 2012 年,他們嘗試是否也可以體外誘導母鼠胚胎的 ESCs,使其分化成有功能的 epiLCs 和 PGCLCs。同樣的,他們把母鼠胚胎的 ESCs 在體外分化成 PGCLCs,然後放入母鼠體(ovaries, 卵巢)內,這些從 PGCLCs 分化成的可受精的卵子(oogenesis)被放入母鼠體內後,也長成的正常的小鼠 [1-3, 11]。不過,由體外 ESCs 和 iPSCs 誘導分化成的精子和卵子雖然可以順利受精和生長,但在分化成卵子的階段成功率並不高,有的卵子很脆弱,有的染色體數目不正常 [2, 3, 11]。

之後,他們嘗試讓整個卵子生成的過程都在體外發生,在體外分化(in vitro differentiation, IVDi)、在體外生長(in vitro growth, IVG)和在體外熟成(in vitro maturation, IVM)。他們在培養皿裡製造類似卵巢的環境,也就是讓 PGCLCs 和女性性腺細胞(gonadal somatic cells)混在一起生長,混在一起的細胞團就是 reconstituted ovaries (rOvaries)。培養的最初三個禮拜為 IVDi,可以觀察到初級卵母細胞(primary oocyte)的出現,在第十一天時濾泡(follicles)會出現在卵母細胞周圍。IVDi 期結束後,加了些刺激生長的賀爾蒙到培養液裡,繼續培養了十一天左右,這段時期為 IVG,初級卵母細胞會長成 germ vesicle oocytes (GV oocytes)。經過一天的熟成期(IVM)後,則成為卵子。為了確認這些成熟卵子是可受精的,他們把體外培養出來卵子和正常精子受精後放到母鼠體內,這些受精卵同樣順利長成為小鼠 [5-9, 12]。

為了確認這整套體外卵子生成系統是可行的,他們也試了另外五種細胞株,包括另一株 ESCs (BVSCH14), 兩個由老鼠胚胎 fibroblasts (mouse embryonic fibroblasts, MEFs)轉成的 iPSCs,和兩株由十週大成鼠的尾巴 fibroblasts (tail tip fibroblasts, TTF) 轉成的 iPSCs。結果這五株不管是 ESCs, MEFs, 還是 TTFs,都成功的分化生成為可受精卵子,並且在體外受精、放入母鼠體內後,也順利長成小鼠 [5, 8, 12]。至於這個技術能不能應用在人類身上呢?勝彥和齊藤得到了五年共 1.2 兆日圓(US$1.2M)的經費,預計在未來的五到十年內先試驗在猴子身上 [3]。

2013-2014 年的時候,勝彥和齊藤在英國劍橋大學工作時的指導教 Dr. Surani 和以色列 Weizmann Institute of Science 的教授 Dr. Hanna 用齊藤的方法去誘導人類的 ESCs,也成功使其變成 hPGCLCs,和老鼠不同的地方是人類需要的是 Sox17 (老鼠是要用 Sox2)。雖然他們能夠體外把 ESCs 轉換成 hPGCLCs,但目前還不知道這些 hPGCLCs 能不能夠分化成有功能的精子或卵子,Hanna 說他們之後可能把 hPGCLCs 放到老鼠體內試驗 [4, 13]。

雖然說利用 iPSCs 的技術把人類的表皮細胞變成可受精的卵子或精子,然後生長成嬰兒,好像是並非不可能的事,不過人類的胚胎構造和發展比老鼠複雜很多,加上如果真的能夠成功的話,還得面臨一些人類倫理的問題(想必在法律這關就會拖很久),所以想要用自己的皮膚製造出一個小孩,可能還要再等等吧。



Articles:

1. The Scientist / Mouse Eggs Made with Stem Cells (October 2012)

2. New Scientist / Mouse eggs created from stem cells for the first time (October 2012)

3. Nature / Stem cells: egg engineers (August 2013)

4. Nature / Rudimentary egg and sperm cells made from stem cells (Dec 2014)

5. The Scientist / From Stem Cell to Oocyte In a Dish (October 2016)

6. Nature / Mouse eggs made from skin cells in a dish (October 2016)

7. Science / Mouse egg cells made entirely in the lab give rise to healthy offspring (October 2016)

8. New Scientist / Eggs made from skin cells in lab could herald end of infertility (October 2016)

9. Scientific American / Healthy Baby Mice Produced from Mouse Mom's Skin Cells (October 2016)



Papers:

10. K Hayashi et al, Reconstitution of the Mouse Germ Cell Specification Pathway in Culture by Pluripotent Stem Cells. Cell (2011)

11. K Hayashi et al, Offspring from Oocytes Derived from in Vitro Primordial Germ Cell–like Cells in Mice. Science (2012)

12. O Hikabe et al, Reconstitution in vitro of the entire cycle of the mouse female germ line. Nature (2016)

13. N Irie et al, SOX17 Is a Critical Specifier of Human Primordial Germ Cell Fate. Cell (2015)


Other resources:

1. SCQ / Stem Cell Bioengineering

2. BC Open Textbook / Cellular Differentiation (Chapter 3: The Cellular Level of Organization)