如何在R中执行wilcoxon测试?

时间:2013-03-25 17:27:28

标签: r

我有4个基因的数据框,一式两份测量3个样本。 TS是标准。

我想在TS和S2的样品S1和每种蛋白质的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

3 个答案:

答案 0 :(得分:1)

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

最简单的解决方法是通过factor-&gt; character-&gt; numeric将它们转换回数字。

试试这个

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

如果你尝试直接从因子转换为数字,你最终会得到代表因子类而不是实际值的整数。

答案 1 :(得分:0)

@Ddin的评论很好(你的数据中有额外的结构很难融入Wilcoxon测试)。但是,如果你想忽略_1和_2列之间的区别并在S1对TS和S2对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)

代替。

答案 2 :(得分: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)