0

我有这个数据框,其中包含 4 个基因和 3 个重复测量的样本。TS 是标准。

我想在样品 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

3 回答 3

1

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

最简单的解决方法是通过因子->字符->数字将它们转换回数字。

尝试这个

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

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

于 2013-03-25T17:43:10.240 回答
1

@DWin 的评论很好(您的数据中有额外的结构,很难纳入 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)

反而。

于 2013-03-25T17:53:34.630 回答
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) 
于 2013-03-25T18:04:44.290 回答