R逐行将KS测试应用于2个矩阵

时间:2017-06-06 20:39:46

标签: r mapply

我有两个矩阵A& R中的B具有相同的行数,但列数不同。

我希望逐行运行Kolomogrov-Smirnov test每个矩阵。也就是说,第一个测试是ks.test(as.vector(A[1,]), as.vector(B[1,]),第二个测试是ks.test(as.vector(A[2,]), as.vector(B[2,]),依此类推。理想情况下,将每个测试的结果存储在向量或数据框中。

我认为mapply是合适的,但它不断给我提供比预期更多的结果。我认为它是逐个元素而不是逐行执行测试。这是我的代码块: mapply(ks.test, x=A, y=B)

在我运行时,只测试第一行无法正常工作: mapply(ks.test, x=as.vector(A[1,]), y=as.vector(B[1,]))

如何获得所需的N p值输出,其中N是原始矩阵的行数。?

这就是我的每个矩阵的第一行:

> A[1,]

[1] 0 0 0 0 0 0 0 0 0

> B[1,]

 V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 
  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 

2 个答案:

答案 0 :(得分:2)

您可以使用行索引

上使用的sapply获得所需内容
sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,])))

实际上,看起来唯一有趣的部分是p值,所以可以用

简化
sapply(1:nrow(A), function(i) ks.test(as.vector(A[i,]), as.vector(B[i,]))$p)
[1] 0.01587302 0.01587302 0.01587302 0.01587302

答案 1 :(得分:2)

我们可以使用Map/mapply。使用Map/mapply时,我们需要了解它是在输入数据的相应元素上应用函数。如果输入数据是向量,则相应的元素将是向量的每个元素,类似地,matrix是具有维度的vector。它将在每个元素上应用该函数。因此,我们可以split matrix row然后将该函数应用于相应的list元素

unlist(mapply(ks.test, split(A, row(A)), split(B, row(B)))[2,], use.names = FALSE)
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159

或使用for循环

r1 <- numeric(nrow(A))
for(i in seq_len(nrow(A))){
    r1[i] <- ks.test(A[i,], B[i,])$p.value
 }
r1
#[1] 0.3571429 0.8730159 0.8730159 0.3571429 0.8730159

数据

set.seed(24)
A <- matrix(rnorm(25), 5, 5)
set.seed(42)
B <- matrix(rnorm(25), 5, 5)