2014-12-07 3 views
0

나는 인간의 22 번 염색체에 각각 다른 수의 유전자가 분포되어 있으며, 각 염색체의 위치는 0 염기쌍으로 시작하며, 나는 유전자 간격을 원을 가로 질러 골고루 분포시키는 방법을 찾으려한다. 각 유전자 사이의 위치와 각 유전자의 길이는 같지만 유전자가 각 염색체에 고르게 배치되고 각 염색체 사이에 공간을 남기도록 새로운 위치를 다시 만듭니다.R에서 동그라미로 균등하게 유전자 간격을 재분배 할 수 있습니까?

df = structure(list(Chr = structure(c(1L, 1L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 12L, 13L, 17L, 20L, 22L, 22L), .Label = c("chr1", 
"chr2", "chr3", "chr4", "chr5", "chr6", "chr7", "chr8", "chr9", 
"chr10", "chr11", "chr12", "chr13", "chr14", "chr15", "chr16", 
"chr17", "chr18", "chr19", "chr20", "chr21", "chr22"), class = "factor"), 
    start = c(19068972, 25996369, 235879265, 46650500, 57732485, 
    44224566, 127510071, 33694865, 2297266, 105108497, 35252252, 
    64633822, 125738394, 416309, 93636009, 50070191, 72389245, 
    36432660, 19608500, 31498612), stop = c(20068972L, 26996369L, 
    236879265L, 47650500L, 58732485L, 45224566L, 128510071L, 
    34694865L, 3297266L, 106108497L, 36267753L, 65633822L, 126754018L, 
    1416309L, 94636009L, 51070191L, 73389245L, 37432660L, 20608500L, 
    32498612L), Gene = c("KIAA0090", "ZNF593", "GPR137B", "MCFD2", 
    "ABHD6", "GUF1", "FBN2", "HMGA1", "GNA12", "LRP12", "GBA2", 
    "NRBF2", "ST3GAL4", "WNK1", "SOCS2", "DLEU2", "FADS6", "BPI", 
    "TRMT2A", "PISD")), .Names = c("Chr", "start", "stop", "Gene" 
), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 
5L, 6L,7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L)) 

그리고 내가 무엇을 달성하기 위해 시도하고 있다는 것을 방법으로 유전자 간격 재배포, 각 염색체 0부터 같은 것입니다 : 이것은 데이터의 예입니다 (전체 데이터 세트는 모든 염색체를 포함) 각각의 유전자 (그리고 다음 유전자 전에 일부 공간) 사이에 동일한 공간 :

out = structure(list(Chr = structure(c(1L, 1L, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 12L, 13L, 17L, 20L, 22L, 22L), .Label = c("chr1", 
"chr2", "chr3", "chr4", "chr5", "chr6", "chr7", "chr8", "chr9", 
"chr10", "chr11", "chr12", "chr13", "chr14", "chr15", "chr16", 
"chr17", "chr18", "chr19", "chr20", "chr21", "chr22"), class = "factor"), 
    start = c(2000000, 4000000, 6000000, 2000000, 2000000, 
    2000000, 2000000, 2000000, 2000000, 2000000, 2000000, 
    2000000,2000000, 2000000, 4000000, 2000000, 2000000, 
    2000000, 2000000, 2000000), stop = c(3000000L, 5000000L, 
    7000000L, 3000000L, 3000000L, 3000000L, 3000000L, 
    3000000L, 3000000L, 3000000L, 3000000L, 3000000L, 3000000L, 
    3000000L, 5000000L, 3000000L, 3000000L, 3000000L, 3000000L, 
    3000000L), Gene = c("KIAA0090", "ZNF593", "GPR137B", "MCFD2", 
    "ABHD6", "GUF1", "FBN2", "HMGA1", "GNA12", "LRP12", "GBA2", 
    "NRBF2", "ST3GAL4", "WNK1", "SOCS2", "DLEU2", "FADS6", "BPI", 
    "TRMT2A", "PISD")), .Names = c("Chr", "start", "stop", "Gene" 
), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 
5L, 6L,7L, 8L, 9L, 10L, 11L, 12L, 13L, 
14L, 15L, 16L, 17L, 18L, 19L, 20L)) 

데이터의 부분 집합에 대한 그러나 나는 데 어려움이 값을 선택하는 방법을 결정하는 사이에 1,000,000 염기쌍 말할 수 있습니다. 원주를 모든 염색체에 걸쳐있는 유전자의 수로 나눠서 올바른 간격을 찾기 위해 노력합니까? 어떤 제안을 해주셔서 감사합니다!

-fra

+0

이 세그먼트를 원의 반경에 그리기 만하면됩니까? 그렇다면 연결호를 사용하지 않는다면'chord' 또는'circlize' 패키지가 유용 할 것입니다. –

+0

안녕하세요 Bryan, 예, 저는 circlize 패키지를 사용하고 있습니다. 그러나 데이터를 사용하여 빈 공간이 너무 많아서 각 섹션의 각 부분에 유전자가 고르게 분포되도록 각 유전자의 시작과 끝 값을 다시 배열하고 싶습니다. 패키지에서이 작업을 자동으로 수행하는 방법이 있습니까? – user971102

+0

음 ...이게 맞나요? 각 유전자는 특정 길이를 가지고 있습니다. 그러나 절대 멈춤과 다른 멈춤의 시작과 관계없이 일정한 간격을두고 싶습니다. 그리고 각 섹션 (염색체)이 같은 (호) 길이가되기를 원합니다. 이것이 옳다면 저희에게 알려주십시오. 정상화 문제처럼 들리지만 일정한 간격으로 인해 더 어려워집니다. –

답변

1

좋아, 여기 당신에게 아이디어를 제공하고 모든 일을 완료 할 수있는 부분적인 대답이다. 내 결과가 chr1에 중복을 표시하지만, 그것은 내 수학 수 있습니다. 이것이 당신이 필요로하는 해결책인지 확신 할 수 없기 때문에 나는 그것을 추적하도록 할 것이고 나는 플로팅 측면을 테스트 할 수 없다.

# Focus on chr1, 20 as they have multiple genes 
df2 <- df[c(1:3, 19:20),] 

Norm <- function(chrom) { # run on one chromosome at a time 
    start <- chrom$start 
    stop <- chrom$stop 
    totLength <- max(stop) - min(start) 
    # simple normalization & offset 
    newSt <- start/totLength 
    newSt <- newSt - min(newSt) 
    newEnd <- stop/totLength 
    newEnd <- newEnd - min(newSt) 
    totMax <- max(newSt, newEnd) 
    newSt <- newSt/totMax 
    newEnd <- newEnd/totMax 
    return(data.frame(start = newSt, stop = newEnd)) 
} 

normAll <- function(df) { 
    #chromLvls <- levels(df$Chr) # this would work except your example data is truncated 
    # and some levels are missing 
    chromLvls <- unique(as.character(df$Chr)) 
    noChrom <- length(chromLvls) 
    drop <- 1:nrow(df) 
    for (i in 1:noChrom) { 
     df2 <- subset(df, df$Chr == chromLvls[i]) 
     df2[,c(2,3)] <- Norm(df2) 
     df <- rbind(df, df2) 
     } 
    df <- df[-drop,] # row no's are mangled, may not matter 
} 

res <- normAll(df2) 

addGapBtwGenes <- function(df, gap = 0.05) { 
    # gap is a fraction on [0...1] 
    # this acts on a subset composed of just one chromosome 
    for (i in 1:nrow(df)) { 
     df$start[i] <- df$start[i] + (i-1)*gap 
     df$stop[i] <- df$stop [i]+ (i)*gap 
     # this denormalizes things but that probably doesn't matter 
     } 
    return(df) 
    } 

gapAllGenes <- function(df, gap = 0.05) { 
    #chromLvls <- levels(df$Chr) # this would work except your example data is truncated 
    # and some levels are missing 
    chromLvls <- unique(as.character(df$Chr)) 
    noChrom <- length(chromLvls) 
    drop <- 1:nrow(df) 
    for (i in 1:noChrom) { 
     df2 <- subset(df, df$Chr == chromLvls[i]) 
     if (nrow(df2) == 1) { # no gap needed 
      df <- rbind(df, df2) 
      next 
      } 
     df2 <- addGapBtwGenes(df2, gap = gap) 
     df <- rbind(df, df2) 
     } 
    df <- df[-drop,] # row no's are mangled, may not matter 
} 

res2 <- gapAllGenes(res) 

플로팅 소프트웨어 어쨌든이 허용하지 않으면 당신은,이 간격을 제어 할 수 addGapBtwChrom를라는 함수를 작성할 수 있습니다.

위는 입술이 있습니다 :

 Chr  start  stop  Gene 
6 chr1 0.00000000 0.08472237 KIAA0090 
7 chr1 0.02924442 0.11396679 ZNF593 
8 chr1 0.91527763 1.00000000 GPR137B 
191 chr22 0.00000000 0.63413477 TRMT2A 
201 chr22 0.36586523 1.00000000  PISD 

및 RES2을 위해 :

 Chr  start  stop  Gene 
61 chr1 0.00000000 0.1347224 KIAA0090 
71 chr1 0.07924442 0.2139668 ZNF593 
81 chr1 1.01527763 1.1500000 GPR137B 
1911 chr22 0.00000000 0.6841348 TRMT2A 
2011 chr22 0.41586523 1.1000000  PISD 

아마도 이것은 당신이 원하는 가까이입니다. 여러분의 의견을 다시 읽으십시오. 모든 chromosomes를 거의 같은 길이로 만들었지 만 다시 생각해 봅니다.

+0

대단히 Bryan! 정상화에 대한 아이디어는 훌륭합니다! 같은 단위로 결과를 얻을 수 있을지 궁금해서 원문과 동일한 유전자 길이를 얻을 수 있습니다. 어쩌면 저는 처음에 곱하면 될 수 있고 * 100000000만큼 멈출 수 있습니까? 나는 아직 초기 데이터에서 겹치지 않는 영역이 결과에서 겹쳐 보이는 이유를 아직 이해하지 못했다. 시작 위치 만 정규화 한 다음 원본 유전자의 정확한 길이를 추가하여 시도하고있다. 하지만 그것이 정확하다고는 생각하지 않습니다. – user971102

+1

실험을 위해 익은 것입니다. 원래의 상대 길이로 되돌리려면 현재 길이가 [0 ... 1] 인 각 염색체를 늘려 원본 길이에 ​​비례 할 수 있습니다. 사실, 갭이 추가 된 데이터에 대해 수행하십시오. 반 정량 데이터를 표시하려고하거나 매우 정확해야하는 경우 여기에서 어떻게 이동합니까? 하지만 여기에서 계속할 수있는 아이디어가 있습니다. 너무 많은 작업을하기 전에 입력 구조가 '순환'을 위해 무엇을 제공해야하는지, 그리고 어떤 플롯 옵션을 제공해야하는지 알기 때문에 휠을 다시 발명하지 마십시오. –

+0

도움 주셔서 대단히 감사합니다. 정규화는 나에게 중복 영역을 제공하지만,이 단계를 제거하면 #newSt <- newSt - min (newSt) 및 newEnd <- newEnd - min (newSt), 작동하지만 염색체는 더 이상 정규화되지 않습니다. [0..1] ... – user971102

관련 문제