2011-12-13 27 views
7

Tôi đang sử dụng R để phân tích dữ liệu nghiên cứu hiệp hội trên toàn bộ bộ gen. Tôi có khoảng 500.000 biến dự báo tiềm năng (đa hình nucleotide, hoặc SNP) và muốn kiểm tra mối liên hệ giữa chúng và kết quả liên tục (trong trường hợp này là nồng độ lipoprotein mật độ thấp trong máu).Sử dụng đa lõi trong R để phân tích dữ liệu GWAS

Tôi đã viết một tập lệnh thực hiện việc này mà không gặp vấn đề gì. Để giải thích ngắn gọn, tôi có một đối tượng dữ liệu, được gọi là "Dữ liệu". Mỗi hàng tương ứng với một bệnh nhân cụ thể trong nghiên cứu. Có các cột về tuổi, giới tính, chỉ số khối cơ thể (BMI) và nồng độ LDL trong máu. Ngoài ra còn có nửa triệu cột khác với dữ liệu SNP.

Tôi hiện đang sử dụng một vòng lặp for để chạy các mô hình tuyến tính nửa triệu lần, như:

# Repeat loop half a million times 
for(i in 1:500000) { 

# Select the appropriate SNP 
SNP <- Data[i] 

# For each iteration, perform linear regression adjusted for age, gender, and BMI and save the result in an object called "GenoMod" 
GenoMod <- lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) 

# For each model, save the p value and error for each SNP. I save these two data points in columns 1 and 2 of a matrix called "results" 
results[i,1] <- summary(GenoMod)$coefficients["Geno","Pr(>|t|)"] 
results[i,2] <- summary(GenoMod)$coefficients["Geno","Estimate"] 
} 

Tất cả điều đó hoạt động tốt. Tuy nhiên, tôi thực sự muốn tăng tốc phân tích của mình. Do đó tôi đã thử nghiệm với các gói đa lõi, DoMC và foreach.

Câu hỏi của tôi là, ai đó có thể vui lòng giúp tôi điều chỉnh mã này bằng cách sử dụng lược đồ foreach không?

Tôi đang chạy tập lệnh trên máy chủ Linux có 16 lõi sẵn có. Tôi đã thử nghiệm với gói foreach và kết quả của tôi sử dụng nó đã tương đối tồi tệ hơn, có nghĩa là phải mất dài hơn để chạy phân tích bằng cách sử dụng foreach.

Ví dụ, tôi đã cố gắng tiết kiệm các đối tượng mô hình tuyến tính như:

library(doMC) 
registerDoMC() 
results <- foreach(i=1:500000) %dopar% { lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) } 

này mất hơn gấp đôi thời gian như sử dụng chỉ là một thường xuyên cho vòng lặp. Bất kỳ lời khuyên nào về cách làm điều này tốt hơn hoặc nhanh hơn sẽ được đánh giá cao! Tôi hiểu rằng việc sử dụng phiên bản song song của lapply có thể là một tùy chọn, nhưng cũng không biết cách thực hiện điều này.

All the best,

Alex

+0

Cập nhật thành R 2.14 và sử dụng gói 'song song'. Và trong khi chúng tôi đang ở đó, cho chúng tôi một ví dụ tái sản xuất để làm việc với, chắc chắn sẽ giúp đỡ là tốt. Xem [câu hỏi này] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

Joris, cảm ơn lời khuyên. Tôi đã tìm thấy tài liệu cho 'song song' tại http://www.biomedcentral.com/content/pdf/1471-2105-9-390.pdf và sẽ đọc nó ngay bây giờ. – Alexander

+0

Là gói 'tuyết rơi' ra khỏi bàn (không đánh tôi, Dirk)? –

Trả lời

7

Để cung cấp cho bạn một khởi động: Nếu bạn sử dụng Linux, bạn có thể thực hiện cách tiếp cận multicore chứa trong gói parallel. Trong khi bạn cần thiết để thiết lập toàn bộ điều khi sử dụng ví dụ như gói foreach, đó là không cần thiết nữa với cách tiếp cận này. Mã của bạn sẽ được chạy trên 16 lõi đơn giản bằng cách thực hiện:

require(parallel) 

mylm <- function(i){ 
    SNP <- Data[i] 
    GenoMod <- lm(bloodLDLlevel ~ SNP + Age + Gender + BMI, data = Data) 
    #return the vector 
    c(summary(GenoMod)$coefficients["Geno","Pr(>|t|)"], 
    summary(GenoMod)$coefficients["Geno","Estimate"]) 
} 

Out <- mclapply(1:500000, mylm,mc.cores=16) # returns list 
Result <- do.call(rbind,Out) # make list a matrix 

Tại đây bạn thực hiện một hàm trả về một véc tơ với số lượng mong muốn và áp dụng các chỉ số này. Tôi không thể kiểm tra điều này mặc dù tôi không có quyền truy cập vào dữ liệu, nhưng nó sẽ hoạt động.

+0

Joris, cảm ơn sự giúp đỡ! Tôi đã thực hiện giải pháp của bạn và nó dường như đã hoạt động. Tôi chỉ cần chạy một công việc mà trước đó đã hơn 12 giờ và nó đã đi ra khỏi lò chỉ trong 15 phút!Bây giờ tôi chỉ ước rằng tôi đã hỏi bạn câu hỏi này ba tháng trước! – Alexander

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