【问题标题】:R apply KS Test to 2 Matrices Row by RowR 将 KS 测试逐行应用于 2 个矩阵
【发布时间】:2017-06-06 20:39:46
【问题描述】:

我在 R 中有两个矩阵 A 和 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-values 的所需输出,其中 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 

【问题讨论】:

    标签: r mapply


    【解决方案1】:

    您可以使用行索引上使用的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
    

    【讨论】:

      【解决方案2】:

      我们可以使用Map/mapply。在使用Map/mapply 时,我们需要了解它是将函数应用于输入数据的相应元素。如果输入数据是向量,则对应的元素将是向量的每个元素,类似地,matrix 是带有维度的vector。它将在每个元素上应用该功能。因此,我们可以通过row split matrix 然后将函数应用到对应的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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-15
        • 2021-10-15
        • 1970-01-01
        • 2017-12-26
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        相关资源
        最近更新 更多