2015-08-20 2 views
-1

У меня есть два кадра данных, один для SNP и один для генов.Как я могу найти все строки, соответствующие критериям, и возвращать соответствующие строки в R?

Для каждого гена, если позиция SNP находится в пределах размера окна, я хочу вернуть эту строку в фрейм данных. Затем я хочу найти корреляцию между этим конкретным SNP и этим геном, если он находится в окне. Я в настоящее время использую R.

Гены данных кадра:

Chr Start End sample1 sample2 sample3 
10 100015109 100015443 2 1 1 
10 100365832 100368960 1 0 2 
10 100486970 100487277 2 1 0 

ОНП кадр данных:

SNP CHROM POSITION sample1 sample2 sample3 
rs3766180 1 1478153 1 1 2 
rs7540231 1 1506035 2 2 0 
rs2272908 1 1721479 1 1 2 
rs10907187 1 1759054 0 1 2 

У меня есть этот код до сих пор, но я не уверен, если я делая правильную итерацию. Я хочу итерации через гены и проверить, какие snps расположены в пределах размеров окна, и найти r-квадрат между этим snp и этим геном. Например, если позиция snp1 находится в начале и конце диапазона гена, выберите эту строку, а затем найдите r-квадрат между этими двумя строками. Я думаю, что мой цикл неправильный, и может быть более простой способ. Пожалуйста помоги.

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t")) 
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t")) 

#Set upper and lower bounds 
size = 1000000 
window_left = genes$cnvStart - size 
window_right = genes$cnvEnd + size 
snp_pos <- snps$POS 
snp <- snps$ID 


for (s in 1:nrow(snps)){ 
    for(g in 1:nrow(genes)){ 
    if (snp_pos >window_left & snp_pos < window_right){ 
     corr.matrix2 <- (cor(t(s),t(g),use="pairwise.complete.obs", method="pearson")) 
     new_snps <- cbind(snp, snps[,-3]) 
    } 
    } 
} 

Мой желаемый результат представляет собой таблицу значений r-квадратов для каждого выбранного сравнения snp-генов. Любые идеи были бы весьма признательны.

Спасибо, Нев

+0

помочь, минимальный воспроизводимость примера с желаемым выходом помог бы мне понять, проблема. – user2673238

+0

Хорошо, спасибо. Я редактировал сообщение. Надеюсь, это разъяснит, с чем я столкнулся. Пожалуйста, дайте мне знать, если все еще неясно. – Nev

+0

Что вы ожидаете от «r-squared». Как вы думаете, что это значит? Я рекомендую вам ознакомиться с [wikipedia] (https://en.wikipedia.org/wiki/Coefficient_of_determination). Насколько велики ваши данные? – Llopis

ответ

1

Хорошо, что все еще есть, о чем я не понимаю.

Первое: ни одна из позиций в SNP dataframe не находится в пределах Start и End в Genes dataframe - я привел пример, где они находятся.

Во-вторых: вы хотите использовать строку для корреляции с другой строкой под образцами1,2 и 3?

e.i если вы хотите, чтобы они гребли.

Chr Start End sample1 sample2 sample3 
10 100015109 100015443 2 1 1 <---- THIS ROW? 

SNP CHROM POSITION sample1 sample2 sample3 
rs3766180 1 1478153 1 1 2 <---- AND THIS ROW? 

My understanding is that you want to correlate 2 1 1 with 1 1 2 

У меня есть рабочий пример прямо сейчас:

Genes<-data.frame(Chr=c(10,10,10),Start=c(100015109,100365832,100486970),End=c(100015443,100368960,100487277),sample1=c(2,1,2),sample2=c(1,0,1),sample3=c(1,2,0)) 
SNP <- data.frame(SNP= c("rs3766180","rs7540231","rs2272908"),CHROM=c(1,1,1),POSITION=c(100015200,100365831,100486971),sample1=c(1,2,1),sample2=c(1,2,1),sample3=c(2,0,2)) 

> Genes 
    Chr  Start  End sample1 sample2 sample3 
1 10 100015109 100015443  2  1  1 
2 10 100365832 100368960  1  0  2 
3 10 100486970 100487277  2  1  0 
> SNP 
     SNP CHROM POSITION sample1 sample2 sample3 
1 rs3766180  1 100015200  1  1  2 
2 rs7540231  1 100365831  2  2  0 
3 rs2272908  1 100486971  1  1  2 

CorTestMatrix <- data.frame() 

for (igene in 1:nrow(Genes)) { # for every gene 
     curGeneRow <- Genes[igene ,] # take that row 
     for (isnp in 1:nrow(SNP)) { # for every SNP 
       cursnp <- SNP[isnp ,] # take that row of SNP 
       if (cursnp$POSITION > curGeneRow$Start & curGeneRow$End > cursnp$POSITION) { # is the SNP in the Gene Window= 
         x<-as.numeric(as.vector(cursnp[,4:ncol(cursnp)])) # if you want the row from Position, 
         y<-as.numeric(as.vector(curGeneRow[,4:ncol(curGeneRow)])) # and want the row from End 
         corTest <- cor.test(x,y) # correlate those two 
         CurTestMatrix <- data.frame(GeneChr=curGeneRow$Chr,SNP=levels(droplevels(cursnp$SNP)),test=as.numeric(corTest[3])) 
         # saves some info from both Dataframes and the p Value from the cortest. 
         # you need edit this to get additional data. 
         CorTestMatrix <- smartbind(CorTestMatrix,CurTestMatrix) 

       } 

     } 
} 

> CorTestMatrix 
    GeneChr  SNP  test 
1:1  10 rs3766180 0.6666667 
1:2  10 rs3766180 0.6666667 
2  10 rs2272908 0.3333333 

Там может быть намного более быстрый способ сделать это, но цикл просто редактировать и играть с. Я сделал так, чтобы первая и третья строки SNP находились в начале и конце GeneRow 1 и 3, соответственно, равных 2 корреляционным тестам.

Я бы посоветовал коррекции для не нормально распределенных выборок, если это необходимо:

sp_Cov1 <- shapiro.test(x);sp_Cov2 <- shapiro.test(y) # correction for non-normallity 
if(sp_Cov1[2] < 0.05 | sp_Cov2[2] < 0.05) {correlationToUse = 'kendall' 
} else {correlationToUse = 'pearson'} 

corTest <- cor.test(x,y,method=correlationToUse) 

Чтобы избежать предвзятой оценки p$value

+0

Да, ваше понимание верное. Я полностью забыл взять примеры того, что SNP упадет в этом диапазоне. Извини за это. Но, да, я хочу сопоставить эту строку в snp df со строкой в ​​гене df. Я понимаю, что вы имеете в виду для оценки смещения. Я попробую и проверю !! Спасибо. – Nev

+0

Прохладный, что-нибудь еще, то укажите, что ответ правильный: D – user2673238

+0

Конечно. Просто закончил с ним бежать. Я получаю эту ошибку: Ошибка в UseMethod ("droplevels"): не применимый метод для «пупов», примененный к объекту класса «NULL». Я думал, что уровни падения были частью базового пакета. Я не уверен, почему эта ошибка возникает. – Nev

1

скопировать код и комментарии его

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t")) 
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t")) 

Это не так, но это лучше сделать ясно, во имя какой тип файла является, если они разделены по вкладке они являются tsv-файлами (t ab s f iles). Таким образом, вы можете открыть их проще с другими программами (Microsoft Excel или аналогичные)

#Set upper and lower bounds 
size = 1000000 
window_left = genes$cnvStart - size 
window_right = genes$cnvEnd + size 
snp_pos <- snps$POS 
snp <- snps$ID 

Здесь вы можете установить переменные, но вы получаете векторы, так SNP или snp_pos векторы. Вы должны знать, какие данные вы хотите, если хотите использовать его позже.

for (s in 1:nrow(snps)){ 
    for(g in 1:nrow(genes)){ 

После получения необходимой информации из данных фреймов вы итерацию как по ОНП количества строк и числа генов строк. Почему вы не используете переменные snp_pos и snp?

if (snp_pos >window_left & snp_pos < window_right){ 

Здесь вы сравниваете все, что хотите, вам не нужны два предыдущих цикла.

  corr.matrix2 <- (cor(t(s),t(g),use="pairwise.complete.obs", method="pearson")) 

Вы не используете переменные, выбранные для создания парной корреляции. Вы должны использовать переменные. Я также рекомендовал бы составить корреляции для визуального сравнения. (Вы, возможно, потребуется их тоже)

 new_snps <- cbind(snp, snps[,-3]) 
    } 
    } 
} 

Это не создает таблицу, соединяющую в векторы в одном кадре данных, который не является таблицей.

Я не проверял, но я хотел бы сделать что-то вроде этого:

snps <- as.matrix(read.table("snps.txt", header=T, sep="\t")) 
genes <- as.matrix(read.table("genes.txt", header=T, sep="\t")) 

#Set upper and lower bounds 
size = 1000000 
window_left = genes$cnvStart - size 
window_right = genes$cnvEnd + size 

in_window = snps[snps$POS >window_left & snps$POS < window_right] 
corr.matrix2 <- (cor(in_window$, in_window$ ,use="pairwise.complete.obs", method="pearson")) 

Я не очень известный, который корреляционная вы хотите сделать, так что вы должны изменить первые два аргумента кор function (Неполный in_window $). Я думаю, вы хотите сравнить, какие образцы имеют SNP. Но это еще один вопрос;)

+0

Хорошо, я создавал две петли, а затем делал то же самое для своего состояния. Неудивительно, что я ничего не получал. Я попробую оба эти метода, а затем подтвержу. Спасибо. – Nev

+0

Эй ничего не получаю, ни ошибок? – Llopis

+0

Я ничего не получил в своей версии. Даже ошибка. Я все еще использую эти два метода. Будет обновляться, когда я закончу. Благодаря!!!! – Nev

 Смежные вопросы

  • Нет связанных вопросов^_^