2014-06-29 28 views
3

我想通過從數據中獲取系統發育信號來轉換我的基因表達數據。我使用R包MCMCglmm。 我能將MCMCglmm到表達式列之一:R:如何製作一個MCMCglmm迴路

require(ape) 
library("MCMCglmm") 
expr1 <- c(5,6,5, 11,12,13, 32,33,36) 
expr2 <- c(1100,1212,1333, 32,33,36, 34, 38, 49) 
expr3 <- c(32,33,36, 110,120,130, 320,330,360) 
animal <- seq.int(9) 
popGroup <- c(rep('A', 3),rep('B', 3), rep('C', 3)) 
data <- as.data.frame(cbind(expr1, expr2, expr3, animal, popGroup)) 
class(data$expr1)<-'integer' 
class(data$expr3)<-'integer' 
class(data$expr2)<-'integer' 

# tree file content: 
# (((1:2.0,(2:1.0,3:1.0):1.0):3.0,((4:1.0,5:1.0):1.0,6:2.0):3.0):3.0,(7:2.0,(8:1.0,9:1.0):1.0):6.0); 
tree <- read.tree("tree.nwk") 

prior<-list(R=list(V=1, nu=1), G=list(G1=list(V=1, nu=1))) 
summary(MCMCglmm(expr1~popGroup-1, random=~animal, pedigree=tree, data=data, family="poisson", prior = prior)) 

但是我有超過20000這樣的列。所以,我的想法是循環所有這些:

for (i in 1:3) { 
    M <- ((colnames(data)[i]~popGroup-1, random=~animal, pedigree=tree, data=data, family="poisson", prior = prior)) 
    summM <- summary(M) 
    statM <- summM$statistics[,1:2] 
    print(statM) 
} 

問題是在循環中定義響應變量。我嘗試了很多方法,但都沒有成功。

+0

您可以使用'sapply'或'lapply'功能輕鬆地將您的功能引導至所有列。下面是一個簡單的'lm':'sapply(data [,1:3],function(x){M <-m(data [,i]〜data $ popGroup); summM < - summary( M); statM < - summM $ adj.r.squared; statM})' – jogall

+0

我發現的問題在於引用'MCMCglmm()'表達式中的列名,因爲函數似乎沒有處理變量以'data $ var1'或'data [,「var2」]'格式引用,而在'data = ...'參數中定義dataframe。也許別人可以幫忙! – jogall

+0

@jogal,感謝您的幫助。是的,問題在於'MCMCglmm()'如何處理變量。對於'glm()'它完美地工作: (for in(i in 1:3)M -slmm(data [,i]〜popGroup-1,data = data,family =「poisson」)); summM < - summary(M); print(summM) }' – dmkr

回答

2

這是賈羅德哈德菲爾德,包MCMCglmm筆者的解決方案:

不幸的是MCMCglmm工作稍有不同glm時 定義響應變量。你可以做的是:

固定< -as.formula(粘貼(colnames(數據)[I], 「〜popGroup-1」 09月= 「」))

MCMCglmm(固定=固定,...)

該腳本現在起作用。

+0

很高興你將它分類@dmkr。這確實應該包含在軟件包的幫助頁面中。 – jogall