如何在R中执行wilcox测试?

问题描述:

我有这个数据框与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

它看起来像数据被视为一个因素。

最简单的修复方法是通过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

@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) 

改为。

我想,因为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)