核家族を抜き出そう

  • 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