- 久しぶりにSNPデータのR処理の話し
- SNPデータからIBD推定としてz0,z1,z2を算出する(こちら)が、この3つの値は足し合わせると1になるので、自由度が2〜2次元平面に描ける。
- z0,z1,z2をそれぞれ正三角形の頂点にとって描く
Nsample<-100
library(MCMCpack)
zdata<-rdirichlet(Nsample,c(1.2,0.3,0.1))
v3<-matrix(c(0,1,-sqrt(3)/2,-0.5,sqrt(3)/2,-0.5),3,2,byrow=TRUE)
out<-matrix(0,Nsample,2)
for(i in 1:Nsample){
out[i,]<-t(v3)%*%zdata[i,]
}
plot(as.data.frame(zdata),xlim=c(0,1),ylim=c(0,1))
plot(out,xlim=c(-1,1),ylim=c(-1,1))
for(i in 1:3){
pre<-i
post<-i+1
if(post>3)post<-1
segments(v3[pre,1],v3[pre,2],v3[post,1],v3[post,2])
}
- この話は2次元
- 多次元にできる
- 3次元、4要素にすれば、2SNPの4ハプロタイプ頻度が相当する。それを描くのが以下のソース
- 2SNPの4ハプロタイプの状態は正四面体上の位置に対応するので、連鎖平衡面がこの正四面体上に存在する
CategoryVector <-
function (nc = 3)
{
df <- nc - 1
d <- df + 1
diagval <- 1:d
diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df -
diagval + 2))
others <- -diagval/(df - (0:(d - 1)))
m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
diag(m) <- diagval
m[upper.tri(m)] <- 0
as.matrix(m[, 1:df])
}
Nsample<-10000
zdata<-rdirichlet(Nsample,c(0.1,0.01,0.02,0.1))
v4<-CategoryVector(nc=4)
out<-matrix(0,Nsample,3)
for(i in 1:Nsample){
out[i,]<-t(v4)%*%zdata[i,]
}
plot(as.data.frame(zdata),xlim=c(0,1),ylim=c(0,1))
library(rgl)
xlim<-ylim<-zlim<-c(min(v4),max(v4))
plot3d(out[,1],out[,2],out[,3],xlim=xlim,ylim=ylim,zlim=zlim)