【问题标题】:Column-wise zscore using row mean and row standard deviation in R在 R 中使用行均值和行标准差的列 zscore
【发布时间】:2020-03-24 17:23:16
【问题描述】:

我正在尝试使用 R 中的行均值和行标准差来获得逐列 zscore。我对更复杂的函数(如 apply())不熟悉,因此我不确定在不手动执行的情况下执行此操作的最佳方法在嵌入的 for 循环中。 Exp 是一个表达式矩阵,会非常大,因此嵌入的 for 循环需要一些时间。请原谅粗略的语法。我需要保留列名。

Dat<-for (i in 1:length(nrow(Exp))) {
for (j in 1:length(ncol(Exp))) {
(Exp[,j]-rowMean(Ex[i,]))/rowSds[i,]
}
}

如果我按行使用 apply(),我不会保留列名,如果我按列使用 apply(),则会使用错误的均值和标准差。我需要遍历每个单元格,并使用该单元格行的行均值和标准差进行 zscore 计算,但保留列名。

任何资源或帮助方向将不胜感激。谢谢!

【问题讨论】:

  • 不清楚。关于按列,行均值。您能否展示一个可重复的小示例
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • length(nrow(...)) 将始终回复 1,因为 nrow 返回单个数字,而该单个数字的 length 为 1。如果帧有 0 行,length(nrow(mtcars[0,])) 仍然返回 1,当然不是你需要的。 (例外情况是nrow 失败。)对于健壮的编程,请考虑将1:length(...) 替换为seq_len(nrow(Exp))

标签: r


【解决方案1】:

首先,不要使用apply。您可以使用 colmeans 创建自己的 colVars 函数。这就是我所做的,现在该函数存在于 c++ 中。它是 Rfast::colVars(x)。

【讨论】:

    【解决方案2】:

    我们可以使用rowMeansrowSds

    library(matrixStats)
    (mtx - rowMeans(mtx))/rowSds(mtx)
    

    数据

    set.seed(42)
    mtx <- matrix(rnorm(200), ncol=10)
    

    【讨论】:

      【解决方案3】:

      我们可以加快速度(并使其更具可读性)。

      假数据:

      set.seed(42)
      mtx <- matrix(rnorm(200), ncol=10)
      mtx[1:4,1:3]
      #            [,1]       [,2]       [,3]
      # [1,]  1.3709584 -0.3066386  0.2059986
      # [2,] -0.5646982 -1.7813084 -0.3610573
      # [3,]  0.3631284 -0.1719174  0.7581632
      # [4,]  0.6328626  1.2146747 -0.7267048
      

      我们可以通过以下方式计算行均值和标准差:

      rowSigma <- apply(mtx, 1, sd, na.rm = TRUE)
      rowMu <- rowMeans(mtx, na.rm = TRUE)
      

      (我在这里推断na.rm=TRUE ...虽然它可能与您的数据无关。)

      从这里知道,基本的矩阵式数学(不是线性代数运算)通常是按列的。为了证明/证明这一点,

      m <- matrix(1:9, nrow = 3)
      m
      #      [,1] [,2] [,3]
      # [1,]    1    4    7
      # [2,]    2    5    8
      # [3,]    3    6    9
      m + 1:3
      #      [,1] [,2] [,3]
      # [1,]    2    5    8
      # [2,]    4    7   10
      # [3,]    6    9   12
      

      有了这种信心,我们现在可以简单地做

      (mtx - rowMu) / rowSigma
      #         [,1]  [,2]    [,3]    [,4]   [,5]    [,6]   [,7]  [,8]  [,9]  [,10]
      #  [1,]  1.259 -0.55  0.0051 -0.6119  1.412  1.0760 -1.824 -0.31 -0.41 -0.054
      #  [2,] -0.049 -1.48  0.1907  0.8327  0.918  1.8429 -1.113 -0.43 -0.64 -0.071
      #  [3,]  0.543 -0.49  1.3088  0.9670  0.011 -2.1048  0.081 -1.02  0.16  0.554
      #  [4,]  0.336  0.95 -1.1044  1.1492 -0.462  1.6248 -1.391 -0.37 -0.72 -0.022
      #  [5,]  0.604  2.16 -1.2403 -0.5734 -1.059 -0.5104  0.181 -0.25  0.80 -0.107
      #  [6,] -0.426 -0.79  0.1849  1.1712  0.388 -0.1863 -0.792  0.96  1.32 -1.821
      #  [7,]  2.137 -0.17 -0.8968  0.6015 -0.121 -0.3886 -0.639 -0.47 -1.13  1.078
      #  [8,]  0.017 -1.49  1.4082  1.0414 -0.063 -0.0085 -1.729 -0.29  0.51  0.603
      #  [9,]  1.828  0.19 -0.7497  0.6731  0.686 -0.0977 -1.584  0.44 -0.21 -1.176
      # [10,] -0.078 -0.76  0.7643  0.8408  0.959  0.1352  0.206 -1.24  1.05 -1.874
      # [11,]  1.416  0.23  0.0434 -1.8632  1.538 -0.4413  0.387 -0.46 -0.73 -0.120
      # [12,]  2.145  0.65 -0.7603 -0.1039 -0.469  0.0837 -0.485 -1.49  0.77 -0.345
      # [13,] -1.427  0.79  1.2895  0.4169  0.442 -0.5993 -0.154  0.92 -1.75  0.077
      # [14,] -0.358 -0.68  0.5283 -1.0064  1.248 -0.5745  0.990 -0.35  1.53 -1.334
      # [15,]  0.068  0.74  0.3022 -0.3631 -0.960 -1.5391  1.722 -0.28  1.12 -0.801
      # [16,]  0.993 -1.54  0.6062  0.9338 -0.618 -0.1029 -0.872 -1.02  0.15  1.477
      # [17,] -0.055 -0.73  1.2414  1.3609 -1.195 -0.3619  0.170  0.32 -1.62  0.871
      # [18,] -1.765 -0.56  0.0652  0.3143 -0.967  1.8055  0.806 -0.53  0.43  0.396
      # [19,] -1.057 -1.04 -1.4293 -0.0093  0.642 -0.3303  0.271  0.23  0.91  1.811
      # [20,]  1.498 -0.33  0.0227 -1.9499  0.547 -0.1876 -0.458  1.45 -0.39 -0.200
      

      其中每个值是每行原始数据的 z 分数。

      (mtx[1,1] - rowMu[1]) / rowSigma[1]
      # [1] 1.26
      (mtx[2,3] - rowMu[2]) / rowSigma[2]
      # [1] 0.191
      

      【讨论】:

        【解决方案4】:

        我会使用 scale() 函数,它完全符合您的要求。

        mtx <- matrix(rnorm(100), ncol= 2)
        mtx_z <- apply(mtx, 2, scale)
        

        【讨论】:

          猜你喜欢
          • 2012-03-27
          • 1970-01-01
          • 2017-02-02
          • 2014-11-23
          • 1970-01-01
          • 2020-07-22
          • 2019-09-29
          • 2019-05-15
          • 1970-01-01
          相关资源
          最近更新 更多