【问题标题】:Run wilcoxon rank sum test on each row of a data frame对数据框的每一行运行 wilcoxon 秩和检验
【发布时间】:2021-07-06 23:51:26
【问题描述】:

我在数据框中有大量生物数据,如下所示。每行都有条件、标识符(板和孔)以及预期表型 (EP) 和观察表型 (OP) 的 3 个重复。

我想添加一个带有 Wilcoxon 秩和检验的 p 值的列,测试每一行/Well 的 EP 和 OP 是否存在显着差异。

head(df)

  Temp Plate Well      EP1      EP2      EP3    OP1    OP2    OP3
1 30°C    31  A01 1.395874 1.323633 1.130804 0.1352 0.1632 0.1130
2 30°C    31  A02 1.449596 1.501810 1.111663 1.1474 1.1314 1.0628
3 30°C    31  A03 1.332983 1.416245 1.081833 1.0604 1.0947 1.0790
4 30°C    31  A04 1.333371 1.556057 1.091200 0.9786 1.0009 1.0127
5 30°C    31  A05 1.362556 1.343878 1.042433 1.0152 1.0534 1.0143
6 30°C    31  A06 1.542448 1.430897 1.031030 1.0266 1.0076 0.9785

我找到了这些帖子:Run a wilcox function for each row in each groupTrying to run many anovas and get an F value for each row,但我似乎无法将它们放在一起并制作一个有效的脚本。我在第一个链接中发现 mapply() 函数完全无法理解,我无法弄清楚如何在第二个链接中获取 Wilcox 测试而不是 f.stat。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    首先让我们使用 dput(head(df)) 将数据以更简单的 R 格式:

    df <- structure(list(Temp = c("30°C", "30°C", "30°C", "30°C", "30°C", 
    "30°C"), Plate = c(31L, 31L, 31L, 31L, 31L, 31L), Well = c("A01", 
    "A02", "A03", "A04", "A05", "A06"), EP1 = c(1.395874, 1.449596, 
    1.332983, 1.333371, 1.362556, 1.542448), EP2 = c(1.323633, 1.50181, 
    1.416245, 1.556057, 1.343878, 1.430897), EP3 = c(1.130804, 1.111663, 
    1.081833, 1.0912, 1.042433, 1.03103), OP1 = c(0.1352, 1.1474, 
    1.0604, 0.9786, 1.0152, 1.0266), OP2 = c(0.1632, 1.1314, 1.0947, 
    1.0009, 1.0534, 1.0076), OP3 = c(0.113, 1.0628, 1.079, 1.0127, 
    1.0143, 0.9785)), class = "data.frame", row.names = c("1", "2", 
    "3", "4", "5", "6"))
    

    现在单行上的 wilcox.test 是

    wilcox.test(unlist(df[1, 4:6]), unlist(df[1, 7:9]))
    # 
    #   Wilcoxon rank sum exact test
    # 
    # data:  unlist(df[1, 4:6]) and unlist(df[1, 7:9])
    # W = 9, p-value = 0.1
    # alternative hypothesis: true location shift is not equal to 0
    

    仅获取 p 值:

    wilcox.test(unlist(df[1, 4:6]), unlist(df[1, 7:9]))$p.value
    # [1] 0.1
    

    所以我们可以使用apply() 来获取所有行:

    p <- apply(df[, 4:9], 1, function(x) wilcox.test(x[1:3], x[4:6])$p.value)
    p
    #   1   2   3   4   5   6 
    # 0.1 0.4 0.2 0.1 0.2 0.1 
    

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 2013-09-19
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2020-08-13
      相关资源
      最近更新 更多