- paramlinkというパッケージがある
- Diallelicなマーカーでのパラメトリック連鎖解析のパッケージ
- 連鎖解析では家系から「核家族」を抜き出して、その核家族のジェノタイプの満足するべき条件によって、伝達のパターン数を減らす処理をする
- そのための関数が、このパッケージの関数linkdat()関数の中で定義されている関数subnucs()である
- 抜き出して使ってみよう
- 掲載家系図には5個の核家族があることがわかる
- 返り値のうち、父、母、子はわかるとして、pivotというのは、家系図内で核家族をつなぐ要素
- pivotで家系図は刈り込める
- 逆に言うと、サイクルのある家系図では、pivotでうまく刈り込めない
subnucs <- function(ped) {
parents <- unique(ped[, 2:3])
parents = parents[-match(0, parents[, 1]), , drop = FALSE]
list1 <- lapply(nrow(parents):1, function(i) {
par = parents[i, ]
c(fa = par[[1]], mo = par[[2]], offs = as.vector(ped[,
1])[which(ped[, 2] == par[[1]] & ped[, 3] ==
par[[2]], useNames = FALSE)])
})
res = list()
i = 1
k = 1
while (length(list1) > 1) {
if (i > length(list1)) {
warning("Loop detected, likelihood calculations will not work.")
return(NULL)
}
link = ((sub <- list1[[i]]) %in% unlist(list1[-i]))
if (sum(link) == 1) {
res[[k]] <- c(pivot = sub[[which(link)]], sub)
list1 <- list1[-i]
k <- k + 1
i <- 1
}
else i <- i + 1
}
res[[k]] <- c(pivot = 0, list1[[1]])
res
}
p<-matrix(
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
0, 0, 0, 0, 2, 2, 4, 4, 6, 6, 0, 0, 12, 13,
0, 0, 0, 0, 1, 1, 3, 3, 7, 7, 0, 0, 11, 10,
0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1,
1,1,1,1,3,1,1,1,1,2,1,1,2,1),
ncol=5)
subnucs(p)
> subnucs(p)
[[1]]
pivot fa mo offs
13 12 11 13
[[2]]
pivot fa mo offs
10 13 10 14
[[3]]
pivot fa mo offs1 offs2
7 4 3 7 8
[[4]]
pivot fa mo offs1 offs2
6 6 7 9 10
[[5]]
pivot fa mo offs1 offs2
0 2 1 5 6