在R中进行Wilcoxon检验-x必须是数值错误

5

我在R中使用wilcox.test时遇到了问题。 我的数据对象是一个矩阵,其中第一列包含名称,所有其他列都包含数值(基因表达)测量结果:

str(myMatrix)
'data.frame':   2000 obs. of  143 variables:
$ precursor               : chr  "name1" "name2" "name3" "name4" ...
$ sample1: num  1.46e-03 2.64e+02 1.46e-03 1.46e-03 1.46e-03 ...
$ sample2: num  1.46e-03 1.91e+02 1.46e-03 1.46e-03 1.46e-03 ...
$ sample3: num  1.46e-03 3.01e+02 1.46e-03 1.46e-03 4.96 ...

我希望测试矩阵的2000行中,是否存在2个给定部分之间的差异。我尝试了4种不同的方法:

wilcox.test(as.numeric(myMatrix[i,2:87],myMatrix[i,88:98]))$p.value
#[1] 1.549484e-16

wilcox.test(myMatrix[i,2:87],myMatrix[i,88:98])$p.value
#Error in wilcox.test.default(myMatrix[i, 2:87], myMatrix[i, 88:98]) : 
#'x' must be numeric

t.test(as.numeric(myMatrix[i,2:87],myMatrix[i,88:98]))$p.value
#[1] 0.2973957

t.test(myMatrix[i,2:87],myMatrix[i,88:98])$p.value
#[1] 0.3098505

如您所见,仅当我对已经是数字的值使用 as.numeric() 时,才能得到无错误消息的 Wilcoxon 测试结果,但即使它们不应该有所区别,结果与 t.test 的结果完全不同。

通过使用在线工具手动验证,显示使用 as.numeric() 值的 t.test 结果是错误的。

关于如何解决这个问题并进行正确的 Wilcoxon 测试,是否有任何建议?如果需要更多信息,请告诉我。


3
我不确定为什么在代码中没有使用as.numeric就会出现错误,但是as.numeric(myMatrix[i,2:87], myMatrix[i,88:98])忽略了第二个参数,并且返回与as.numeric(myMatrix[i,2:87])相同的结果。看起来你实际上想要的是as.numeric(myMatrix[i,2:87]), as.numeric(myMatrix[i,88:98]) - eipi10
你能运行一下这个吗: colnames(myMatrix)[which(unlist(lapply(1:dim(myMatrix)[2],function(x)class(myMatrix[[x]])))!="numeric")] 以检查所有列是否为数字。 - Nightwriter
谢谢你的帮助!当使用as.numeric()函数对两个参数进行转换时,它似乎可以工作!运行你的代码Nightwriter会返回所有列名,即使内部的值显示为数字(请参见我上面的第一个代码示例)。 - stefanie
这是一个令人困惑的错误,但看起来问题在于 myMatrix[i, 2:87]等是一个数据框(data frame),而wilcox.test不知道如何处理。使用unlistas.matrix具有与as.numeric相同的效果,在此处使用任何一个都会使其更容易知道它实际上是为了什么。另外,您可以将数据保留在真正的矩阵中,这意味着您需要摆脱“precursor”列(您可以将该信息保存为行名称)。 - janattack
1个回答

1
实际上,myMatrix [i, 2:87] 仍然是一个数据框。请看下面的示例。
> myMat  
    fir X1 X2 X3 X4  
1 name1  1  5  9 13  
2 name2  2  6 10 14  
3 name3  3  7 11 15  
4 name4  4  8 12 16  
> class(myMat[1, 2:4])  
[1] "data.frame"  
> as.numeric(myMat[1, 2:4])  
[1] 1 5 9  

将您的数据转换为真正的矩阵将解决您的问题。
> myMat_01 <- myMat[, 2:5]  
> rownames(myMat_01) <- myMat$fir  
> myMat_01 <- as.matrix(myMat_01)  
> class(myMat_01[1, 2:4])  
[1] "integer"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接