2013-06-08 36 views
7

Xem chỉnh sửa bên dưới Sử dụng R, tôi muốn lọc ma trận (dữ liệu biểu hiện gen) và chỉ giữ các hàng (gen/đầu dò) có giá trị cao phương sai. Ví dụ: tôi chỉ muốn giữ các hàng có giá trị ở phần trăm dưới cùng và trên cùng (ví dụ: dưới 20% và trên 80%). Tôi muốn giới hạn nghiên cứu của mình chỉ với các gen theo phương sai cao cho các phân tích hạ lưu. Có cách nào phổ biến để lọc gen trong R?R, ma trận lọc dựa trên phương sai cắt

Ma trận của tôi có 18 mẫu (cột) và 47000 đầu dò (hàng) với các giá trị được log2 chuyển đổi và chuẩn hóa. Tôi biết hàm quantile() có thể xác định ngưỡng cắt giảm 20% và 80% trong mỗi cột mẫu. Tôi không thể tìm ra cách để tìm các giá trị này cho toàn bộ ma trận, và sau đó đặt ma trận gốc để loại bỏ tất cả các hàng "không thay đổi".

ma trận Ví dụ với một trung bình của 5.97, do đó ba hàng cuối cùng nên được loại bỏ vì chúng chứa các giá trị giữa cutoffs 20% và 80%:

> m 

       sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 
ILMN_1814317 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814318 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814319 5.97 5.97 5.97 5.97 5.97 5.97 

Tôi đánh giá cao bất cứ đề nghị, hoặc chức năng mà Tôi nên xem xét. Cảm ơn!

EDIT

Xin lỗi, tôi đã không phải là rất rõ ràng trong OP. (1) Tôi muốn biết giá trị ngưỡng 20% ​​và 80% cho toàn bộ ma trận (không chỉ cho từng mẫu riêng lẻ). (2) Sau đó, nếu bất kỳ hàng nào chứa một giá trị trong phần trăm trên hoặc dưới, R sẽ giữ các hàng này. Nếu một hàng chứa các giá trị (đối với tất cả các mẫu) nằm gần giá trị trung bình, các hàng này sẽ bị loại bỏ.

+0

Cảm ơn bạn đã làm rõ. Tôi cũng đã cập nhật câu trả lời của tôi để phản ánh những gì bạn đã hy vọng đạt được. Câu hỏi nhanh - bạn có ma trận hay một khung dữ liệu (tức là cột ID là tên của ma trận hoặc cột đầu tiên của khung dữ liệu của bạn?). Một cách nhanh chóng để kiểm tra sẽ là 'class (m)'. –

+0

Nó phải là một ma trận (chỉ dữ liệu biểu thức) và cột ID là tên gọi cho ma trận của tôi (tôi nên để tên "ID" khỏi ví dụ của tôi). – Todd

+0

Ok tuyệt vời! Đó là những gì tôi nghĩ với ví dụ của tôi. –

Trả lời

6

Ok, giả sử bạn có ma trận (vì vậy tôi giả định rằng cột ID của bạn thực sự là tên gọi) thì việc này rất đơn giản.

# First find the desired quantile breaks for the entire matrix 
qt <- quantile(m , probs = c(0.2,0.8)) 
# 20% 80% 
#5.17 6.62 
# Next get a logical vector of the rows that have any values outside these breaks 
rows <- apply(m , 1 , function(x) any(x < qt[1] | x > qt[2])) 
# Subset on this vector 
m[ rows , ] 
#   sample1 sample2 sample3 sample4 sample5 sample6 
#ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
#ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
#ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
#ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
#ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
#ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
#ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
#ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 

Các any(x < qt[1] | x > qt[2]) phần của apply chức năng (được thiết kế để áp dụng một hàm trên bên lề của một ma trận) trả TRUE nếu giá trị nào ở hàng đó nằm ngoài quantiles 20% và 80% của bạn ma trận mẫu. Theo định nghĩa, nếu không có giá trị nào nằm ngoài các giới hạn này, nó trả về FALSE cho biết chúng tôi sẽ xóa hàng đó trong dòng tiếp theo.

+0

Cảm ơn bạn đã chỉnh sửa! Giải pháp của bạn có vẻ rất thẳng thắn. – Todd

+1

@Todd Tuyệt vời! Nếu bất kỳ giải pháp nào trong số 3 giải pháp này giải quyết được vấn đề của bạn, bạn có thể cân nhắc đánh dấu một trong số đó là câu trả lời được chấp nhận để câu hỏi này không còn xuất hiện nữa (dĩ nhiên nếu bạn cần thêm điều gì đó, hãy cho chúng tôi biết). Đây là trang [** about **] (http://stackoverflow.com/about) trong trường hợp bạn cần thêm thông tin về cách hoạt động của SO. Chúc mừng! –

+0

Giải pháp này thực hiện chính xác những gì tôi đã yêu cầu trong OP của tôi! Tuy nhiên, tôi cũng đang khám phá gói genefilter Bioconductor cho các phương pháp thay thế có thể rất hữu ích. Cảm ơn tất cả mọi người vì sự ủng hộ và kiên nhẫn tuyệt vời của bạn với kiến ​​thức hạn chế về R và stackoverflow của tôi. – Todd

1

Tôi không phải là chuyên gia thống kê, Vì vậy, tôi không biết liệu có một phương pháp chung để giải quyết vấn đề này hay không. Đối với tôi, vấn đề sẽ đơn giản hơn nếu bạn định hình lại dữ liệu của mình ở định dạng dài.

library(reshape2) 
dat.m <- melt(dat) 
dat.m$value <- as.numeric(dat.m$value) 
head(dat.m) 
      ID variable value 
1 ILMN_1762337 sample1 7.86 
2 ILMN_2055271 sample1 5.72 
3 ILMN_1736007 sample1 3.82 
4 ILMN_2383229 sample1 6.34 
5 ILMN_1806310 sample1 6.15 
6 ILMN_1653355 sample1 7.01 

Sau đó cho mỗi biến bạn làm như sau:

  1. giới hạn Tính sử dụng quantile
  2. loại bỏ gen mà không thoả mãn điều kiện.

Bạn có thể làm điều này cho ví dụ, sử dụng ddply từ plyr:

res <- ddply(dat.m,.(variable),function(x){ 
    ## compute limits for each sample 
    z <- x$value 
    qq <- quantile(z, probs = c(0.2,0.8)) 
    ## keep only genes with high or low variance 
    dd <- x[z < qq[1] | z > qq[2],] 
}) 
## return to the wide format 
acast(res,ID~variable) 

      sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1653355 7.01  NA 6.62  NA 4.77  NA 
ILMN_1705025  NA 6.68 6.80 6.85 8.35 4.15 
ILMN_1736007 3.82 6.48  NA 7.13 8.20 4.06 
ILMN_1762337 7.86  NA 4.89  NA  NA  NA 
ILMN_1806310  NA  NA  NA 5.22 4.59  NA 
ILMN_1814316  NA  NA  NA  NA  NA 7.20 
ILMN_2055271 5.72 4.29 4.64 5.00  NA 8.02 
ILMN_2383229  NA 4.34  NA  NA  NA  NA 

EDIT sau khi làm rõ OP, nếu bạn muốn các giá trị cắt 20% và 80% cho toàn bộ ma trận không chỉ cho mỗi mẫu riêng lẻ, bạn tính qq bên ngoài ddply

qq <- quantile(dat.m$value, probs = c(0.2,0.8)) 

Sau đó, bạn nhận xét dòng tương ứng, như sau:

res <- ddply(dat.m,.(variable),function(x){ 
    z <- x$value 
    ## keep only genes with high or low variance 
    dd <- x[z < qq[1] | z > qq[2],] 
}) 

PS đây dat là:

dat <- read.table(text='   ID sample1 sample2 sample3 sample4 sample5 sample6 
ILMN_1762337 7.86 5.05 4.89 5.74 6.78 6.41 
ILMN_2055271 5.72 4.29 4.64 5.00 6.30 8.02 
ILMN_1736007 3.82 6.48 6.06 7.13 8.20 4.06 
ILMN_2383229 6.34 4.34 6.12 6.83 4.82 5.57 
ILMN_1806310 6.15 6.37 5.54 5.22 4.59 6.28 
ILMN_1653355 7.01 4.73 6.62 6.27 4.77 6.12 
ILMN_1705025 6.09 6.68 6.80 6.85 8.35 4.15 
ILMN_1814316 5.77 5.17 5.94 6.51 7.12 7.20 
ILMN_1814317 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814318 5.97 5.97 5.97 5.97 5.97 5.97 
ILMN_1814319 5.97 5.97 5.97 5.97 5.97 5.97',header=TRUE) 
+0

+1 Tôi nghĩ rằng cả hai chúng ta đều có thể hiểu lầm OP mặc dù. Tôi nghĩ rằng họ muốn tính toán 20% và 80% cắt của toàn bộ ma trận và sau đó tập hợp con trên các giá trị này. –

+1

Vâng, đó là * "Tôi không thể tìm ra cách tìm các giá trị này cho toàn bộ ma trận" * và sau đó là "ba hàng cuối cùng nên được xóa vì chúng chứa giá trị giữa 20% và 80% ngưỡng" * khiến tôi nghi ngờ giả định ban đầu của chúng tôi. Có lẽ OP có thể làm rõ? –

+0

Xin lỗi, tôi không rõ ràng trong OP. (1) Tôi muốn biết giá trị ngưỡng 20% ​​và 80% cho toàn bộ ma trận (không chỉ cho từng mẫu riêng lẻ). Sau đó, nếu bất kỳ hàng nào chứa một giá trị trong phần trăm trên hoặc dưới, R sẽ giữ các hàng này. Nếu một hàng chứa các giá trị (đối với tất cả các mẫu) nằm gần giá trị trung bình, các hàng này sẽ bị loại bỏ. cái đó có giúp ích không? Cảm ơn rất nhiều đề xuất của bạn - Tôi khá mới ở R. – Todd

3

Gói Biocondcutorgenefilter cung cấp các bộ lọc thông thường liên quan đến phân tích microarray. Một bộ lọc điển hình dựa trên sự thay đổi khôn ngoan theo hàng sẽ là

m = matrix(rnorm(47000 * 6), 47000) 
varFilter(m) 

Trang đích gói tham chiếu hoạt ảnh cơ bản và cung cấp hướng dẫn chẩn đoán để sử dụng tính năng lọc.

Nguyên tắc cơ bản trong phân tích microarrays là các giá trị trong một hàng có thể so sánh, nhưng không phải là giá trị giữa các hàng. Điều này là do các đầu dò liên kết với mỗi hàng có các đặc điểm riêng biệt giới thiệu độ lệch hàng cụ thể - một giá trị trong hàng đầu tiên có thể biểu thị một cách hợp lý hơn, biểu hiện gen ít hoặc bằng so với giá trị cho cùng một mẫu trong hàng thứ hai. Điều này có nghĩa là mong muốn bình thường của @ Todd dựa trên so sánh giữa hàng (giá trị lớn nhất và nhỏ nhất trong toàn bộ ma trận) không được khuyến khích. Thay vào đó, varFilter tính toán một số đo thay đổi của mỗi hàng (phạm vi giữa các phần tư hàng) và chọn một phân số (đối số var.cutoff) với hầu hết các biến đổi.

Một đỉnh nhanh chóng vào định nghĩa của varFilter cho thấy nói chung đây là không còn khó khăn hơn, đối với một số biện pháp biến hàng khôn ngoan var.func và một (duy nhất) quantile var.cutoff

vars <- apply(m, 1, var.func) 
m[vars > quantile(vars, var.cutoff), ] 
+0

+1! có vẻ tốt đẹp. Tôi đã làm như sau, 'mm <- as.matrix (dat [, - 1]); tên gọi (mm) <- dat [, 1]; rr <- varFilter (mm, var.cutoff = c (0,2,0,8)) ', nhưng tôi nhận được một cảnh báo, tôi có bỏ sót điều gì không? – agstudy

+0

Cảm ơn lời khuyên - Tôi sẽ xem xét điều này ngay lập tức, vì có thể có những cách tiêu chuẩn để làm điều này. – Todd

+0

Cảm ơn @Martin vì đã giải thích về "các phương pháp hay nhất" để lọc mảng gen. Tôi dự định sử dụng giải pháp của bạn cho tập dữ liệu của tôi. – Todd

Các vấn đề liên quan