对矩阵中的每一行执行 t 检验 - 处理 NA

Posted

技术标签:

【中文标题】对矩阵中的每一行执行 t 检验 - 处理 NA【英文标题】:Perform t-test for every row in matrix - handle NAs 【发布时间】:2016-11-23 17:17:05 【问题描述】:

我想对矩阵中的每一行进行 t 检验。矩阵如下所示:

data <- 
structure(c(NA, NA, 216750, 440450, NA, NA, 597510, 1839055, 
            851820, 1210200, NA, NA, NA, NA, 486720, 602970, 333150, 346532, 
            NA, NA, 421290, 425660, NA, 375440), .Dim = c(6L, 4L), .Dimnames = list(
              c("Gregg", "Mark", "Donnie", 
                "Fred", "Tim", "Gracie"
              ), c("AUC_Rep1", "AUC_Rep2", "AUC_Rep3", "AUC_Rep4")))

如您所见,数据存在两个问题。第一个是它包含NAs,第二个是在某些行中没有足够的数据——整行只有一个值。

你知道有什么方法可以避免这个问题吗?我想创建一个首先忽略NAs 的函数,如果行中只有一个值,它应该将NA 作为t 检验的输出。

我通常使用 pi0 包中的函数 - matrix.t.test

【问题讨论】:

如果您的数据是data.frame,这可能有效:apply(dat,1,function(x) ifelse(sum(is.na(x))%in%c(length(x),length(x)-1),"NA",t.test(x,na.rm=TRUE))) 没有解决问题。给出错误Error in ifelse(sum(is.na(x)) %in% c(length(x), length(x) - 1), "NA", : error in evaluating the argument 'no' in selecting a method for function 'ifelse': Error in t.test.default(x, na.rm = TRUE) : not enough 'x' observations 以你的例子为我工作。实际数据是否会出现错误? 它也不适用于我的示例数据。出现的第一个错误是Called from: t.test.default(x, na.rm = TRUE),当我按下继续时,它给出了前面评论中提到的错误。 【参考方案1】:

调整来自 @count 的注释以返回 p 值:

tpval <- function(x) 
  if(sum(!is.na(x)) < 2) 
    NA_real_
   else 
    t.test(x, na.rm=TRUE)$p.value
  


> apply(data, 1, tpval)
 Gregg       Mark     Donnie       Fred        Tim     Gracie
    NA         NA 0.03350020 0.03600664         NA 0.02547686

我经常遇到同样的问题。所以最近创建了一个包matrixTests 来完成你正在寻找的东西:

library(matrixTests)
row_t_onesample(data)

结果是:

> row_t_onesample(data)
       obs    mean          var   stderr df statistic     pvalue  conf.low conf.high alternative mean.null conf.level
Gregg    1  597510          NaN      NaN  0        NA         NA        NA        NA   two.sided         0       0.95
Mark     1 1839055          NaN      NaN  0        NA         NA        NA        NA   two.sided         0       0.95
Donnie   4  494145  70080791100 132363.9  3  3.733231 0.03350020  72904.05  915386.0   two.sided         0       0.95
Fred     4  669820 136234723133 184549.9  3  3.629478 0.03600664  82499.72 1257140.3   two.sided         0       0.95
Tim      1  333150          NaN      NaN  0        NA         NA        NA        NA   two.sided         0       0.95
Gracie   2  360986    417836232  14454.0  1 24.974817 0.02547686 177330.52  544641.5   two.sided         0       0.95

Warning message:
row_t_onesample: 3 of the rows had less than 2 "x" observations.
First occurrence at row 1

【讨论】:

以上是关于对矩阵中的每一行执行 t 检验 - 处理 NA的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数应用于 MATLAB 中矩阵的每一行/列?

如何将矩阵的每一行除以R中的向量元素

Matlab中的左循环移位,用于不同数量位置的矩阵的每一行

如何使用numpy将矩阵与另一个矩阵中的每一行相乘

numpy用向量减去矩阵的每一行

C ++在n * m矩阵的每一行中查找最小值