如何在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
答
它看起来像数据被视为一个因素。
最简单的修复方法是通过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)
我不相信'wilcox.test'应该能够处理重复测量类型测试。也不清楚的是,即使你只是在测试S1_1与TS_1,测试单独基因的数据情况才是合适的应用。这似乎也是一个多项问题。 'wilcox.test'用于比较同一财产度量的单向分类。即使您删除了重复测量方面的信息,您也可以进行双向分类。 – 2013-03-25 17:46:39