Circular Binary Segmentation
DNAコピー数のセグメントアルゴリズムの一つを体験する
library(DNAcopy)
library(tidyverse)
data(coriell)
head(coriell)
coriell.rmna <- drop_na(coriell)
chrom_pos <- coriell.rmna %>%
mutate(id = 1:nrow(coriell.rmna)) %>%
group_by(Chromosome) %>%
summarise(min = min(id), pos = median(id), max=max(id))
y.pos <- replace(rep(-1.6, 23), seq(0,23,2), -1.5)
coriell.rmna %>%
mutate(id = 1:nrow(coriell.rmna), class = coriell.rmna$Chromosome %% 2) %>%
ggplot2::ggplot() +
geom_point(mapping = aes(x = interaction(Chromosome, id, lex.order=T), y = Coriell.05296, color=class)) +
annotate(geom = "text", x = chrom_pos$pos, y = y.pos, size=3, label = unique(coriell.rmna$Chromosome)) +
theme(axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank(),
legend.position="none")
- #1 DNAcopyオブジェクトの作成
- #2 外れ値の除去(後述)
- #3 Circular Binary Segmentationの実行
※実装に関してはパッケージの中身をみるか、またはpythonが読める人ならこちらが役に立つ。
CNA.object <- CNA(cbind(coriell$Coriell.05296),
coriell$Chromosome, coriell$Position,
data.type="logratio", sampleid="c05296") #1
smoothed.CNA.object <- smooth.CNA(CNA.object) #2
segment.smoothed.CNA.object <- segment(smoothed.CNA.object, verbose=1) #3
オブジェクトの中身をみれば、具体的なブレイクポイントがわかる。
segment.smoothed.CNA.object
DataFrameも取得可能
segment.smoothed.CNA.object[['output']]
可視化も一瞬
plot(segment.smoothed.CNA.object, plot.type="whole")
各添字 $i\ (i = 1, 2, ..., n)$ に対して、$i - R, ..., i, ..., i + R\ (2≤R≤5)$ のウィンドウを定義する。
$m_i$ をウィンドウ領域の中央値とし、$\hat\sigma$ を標準偏差とする。
観測値 $X_i$ がウィンドウ領域の最大値または最小値だった場合、その値に最も近い値を持つ $X_j$ を探す。
$|X_j - X_i|>L\hat\sigma\ (default: L=4)$ だった場合、$X_i$ を $m_{i}+sign(X_i-X_j)M\hat\sigma$ に置き換える。