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
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) –
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
Là gói 'tuyết rơi' ra khỏi bàn (không đánh tôi, Dirk)? –