酔歩で平滑化

  • 先日、体系的発現データ解析で遺伝子の重みをつけるにあたって既知パスウェイ情報から作ったグラフの上で酔歩をさせて遺伝子の重みづけを変更する→結果として平滑化状態に収束する、という話があった
  • じゃあ、ありきたりな量的計測値があったときに「分布」を作るときにそれが使えないか、という話
  • 滑らかな分布を作るには、1、平滑にする、2、密度として高低を揃える、の2処理があるが、そのうちの1、平滑にする、の方だけ

my.rw.density <- function(X,Y,n,r){
# 観測点の距離行列
	D <- as.matrix(dist(X))
# 距離に関して正規分布的な『振り分け確率』を指定する
	D.e <- exp(-D^2)
# 自身から自身への振り分けは別途指定する
	diag(D.e) <- 0
# 振り分け確率なので行和を1にする
	D.e.2 <- D.e/apply(D.e,1,sum)
	diag(D.e.2) <- r
	D.e.2 <- D.e.2/apply(D.e.2,1,sum)
# 収束する(ことがわかっている)ので、指数行列化する
	eigen.out <- eigen(t(D.e.2))
	V <- eigen.out[[2]]
	S <- diag(eigen.out[[1]]^n)
	U <- solve(V)
	M <- V%*%S%*%U
	M%*%Y
}
X <- c(rnorm(50),rnorm(500,10,3))
Y <- rep(1,length(X))
tmp.out <- Re(my.rw.density(X,Y,2000,0.3))

d.X <- density(X)
plot(d.X)
points(X,tmp.out/max(tmp.out)*max(d.X[[2]]))
  • 2つの峰を離すと、峰の形はよいが、「点の数の場所」で点の数に相当する量を山分けにする仕組みなので、2つのピーク間で点のy座標を対等に比較できていない様子が見える

X <- c(rnorm(50),rnorm(500,100,3))
Y <- rep(1,length(X))
tmp.out <- Re(my.rw.density(X,Y,2000,0.3))

d.X <- density(X)
plot(d.X)
points(X,tmp.out/max(tmp.out)*max(d.X[[2]]))