2013-03-25 80 views
0

我有這個數據框與4個基因和3個樣本重複測量。 TS是標準。如何在R中執行wilcox測試?

我想在樣品S1與TS和S2與每個蛋白質的TS之間進行wilcox檢測,但是我有for循環的問題。

MS.rawMV <- read.table("C:/Users/aaa/Desktop/genomic/MS.csv", header=T) 
     S1_1  S1_2 S2_1 S2_2  TS_1  TS_2 
gene 1 1   1  2  3  5   5 
gene 2 10  10  4  5  9   10 
gene 3 5   6  4  4  5   7 
gene 4 9   9  8  7  6   6  


Samples=list(
    S1=grep("S1_*", colnames(MS.rawMV), value=TRUE), 
    S2=grep("S2_*", colnames(MS.rawMV), value=TRUE), 
    TS=grep("TS_*", colnames(MS.rawMV), value=TRUE)) 

sample.names <- names(Samples) 
ref.sample <- "TS_" 

# Build a data.frame 
GRates <- data.frame(MS.rawMV[Reduce("c", Samples)]) 

## Statistics: non parametric test using TS as a standart 
for (i in names(Samples)) { 
    WILCOXTEST <- wilcox.test(GRates[c(Samples[[i]])],Samples[[ref.sample]]) 
    pnames <- paste(i,".wilcoxtest",sep="") 
    GRates[pnames] <- WILCOXTEST["p.value"] 
} 

Error in wilcox.test.default(GRates[Samples[[i]]], Samples[[ref.sample[i]]]) : 
    'x' must be numeric 
+4

我不相信'wilcox.test'應該能夠處理重複測量類型測試。也不清楚的是,即使你只是在測試S1_1與TS_1,測試單獨基因的數據情況纔是合適的應用。這似乎也是一個多項問題。 'wilcox.test'用於比較同一財產度量的單向分類。即使您刪除了重複測量方面的信息,您也可以進行雙向分類。 – 2013-03-25 17:46:39

回答

1

它看起來像數據被視爲一個因素。

最簡單的修復方法是通過factor-> character-> numeric將它們轉換回數字。

試試這個

wilcox.test(
    as.numeric(as.character(GRates[c(Samples[[i]])])), 
    as.numeric(as.character(Samples[[ref.sample]])) 
) 

如果嘗試直接轉換爲從要素的數字,你會與代表因子類,而不是實際值的整數結束。

+4

只修復語法問題不會解決語義統計問題。僅僅因爲可以讓機器轉圈並不意味着該產品將會有用。 – 2013-03-25 17:47:26

0

@Dinin的評論很好(你的數據中有很多結構難以納入Wilcoxon測試)。不過,如果你想忽略_1和_2列之間的區別和S1 VS TS和S2 VS TS運行Wilcoxon秩和檢驗,這裏有一個方法來重新排列數據,並做到這一點:

dat <- read.table(text=" 
gene S1_1 S1_2 S2_1 S2_2  TS_1  TS_2 
1  1 1  2  3  5   5 
2  10 10  4  5  9   10 
3  5 6  4  4  5   7 
4  9 9  8  7  6   6", 
        header=TRUE) 

library(reshape2) 
library(plyr) 
m1 <- melt(dat,id.var="gene") 
## break var_num into separate components 
m2 <- subset(data.frame(m1, 
      colsplit(m1$variable,"_",names=c("var","num"))), 
      select=-variable) 
## combine treatments with standards 
m3 <- merge(subset(m2,var!="TS"), 
     subset(m2,var=="TS"),by=c("gene","num")) 
## clean up 
m4 <- subset(rename(m3,c(value.x="value",var.x="var",value.y="standard")), 
      select=-var.y) 

## apply Wilcoxon test to each component, save the p value 
ddply(m4,"var", 
     function(x) with(x,wilcox.test(value,standard))$p.value) 

或者,如果您想要單獨測試每個複製(如在@ agstudy的答案中),做

ddply(m4,c("var","num"), 
     function(x) with(x,wilcox.test(value,standard))$p.value) 

改爲。

0

我想,因爲wilcox.test沒有向量化,所以你需要2個循環。即使我不知道這樣的統計意義,這裏怎麼可以這樣做:

nn <- colnames(dat) 
lapply(1:2,function(x){ 
    col.L <- grep(paste0('S',x,'_*'),nn) 
    col.R <- dat[,paste0('TS_',x)] 
    lapply(col.L,function(y) 
     wilcox.test(dat[,y],col.R)['p.value']) 
}) 

在這裏,我假設dat作爲

dat <- read.table(text='S1_1  S1_2 S2_1 S2_2  TS_1  TS_2 
gene_1 1   1  2  3  5   5 
gene_2 10  10  4  5  9   10 
gene_3 5   6  4  4  5   7 
gene_4 9   9  8  7  6   6',header=TRUE)