在R中的矩阵/ data.frame行上的t.test统计(均值,p值)

时间:2014-03-16 11:55:22

标签: r testing apply p-value

给定矩阵m我如何对行/变量进行t.test(测试均值是否与零不同)并得到一个矩阵,其中每列对应于例如行的t.test $ statistic和t.test $ p.value。由于某些行有几个NAs,我同时希望确保t.test不会因此而失败;因此,在这种情况下,结果矩阵的行在t.test $ statistic和t.test $ p.value列中都是NA。我想到了下面显示的内容,但我无法做到。最后我需要在一个矩阵列表上做这个,但是想象一旦我可以在单个矩阵上完成它,我就可以在矩阵列表中使用lapply。 谢谢!

res <- apply(m, 1, function(x) {
u <- matrix(NA, nrow = nrow(m), ncol = 4, dimnames = list(
    c(rownames(m)),
    c("Stats", "P-values")
    ))
if(sum(!is.na(x)) > 1)
    u[,1] <- t.test(x)$statistic
    u[,2] <- t.test(x)$p.value
else NA
return(u)
}
)

2 个答案:

答案 0 :(得分:0)

你可以沿着这些方向做点什么

第1步:生成玩具数据集

library(mvtnorm)
set.seed(1)
mat1 <- rmvnorm(n = 30, mean = sample(c(rep(0, 5), 1:5)), sigma = diag(10))
mat1[sample(seq(nrow(mat1) * ncol(mat1)), 5)] <- NA
mat1 <- t(mat1)
mat2 <- rmvnorm(n = 30, mean = sample(c(rep(0, 5), 1:5)), sigma = diag(10))
mat2[sample(seq(nrow(mat2) * ncol(mat2)), 5)] <- NA
mat2 <- t(mat2)
mat_list <- list(mat1, mat2)

步骤2:创建辅助函数以进行测试,并产生NA(如果有任何缺失值)

t_test <- function(x)
    c(stat = ifelse(any(is.na(x)), NA, t.test(x)$statistic),
      p_val = ifelse(any(is.na(x)), NA, t.test(x)$p.value))

步骤3:将其应用于矩阵行列表

lapply(mat_list, function(m) t(apply(m, 1, t_test)))
## [[1]]
##           stat      p_val
##  [1,]  1.02334 3.1461e-01
##  [2,] -0.17025 8.6599e-01
##  [3,] -0.55501 5.8314e-01
##  [4,]       NA         NA
##  [5,]  1.48641 1.4796e-01
##  [6,]       NA         NA
##  [7,] 25.64252 1.7737e-21
##  [8,]       NA         NA
##  [9,] 24.50047 6.2831e-21
## [10,]       NA         NA

## [[2]]
##           stat      p_val
##  [1,]       NA         NA
##  [2,]       NA         NA
##  [3,] -0.44341 6.6076e-01
##  [4,]       NA         NA
##  [5,]  1.28913 2.0754e-01
##  [6,]       NA         NA
##  [7,]  4.86929 3.6477e-05
##  [8,] 16.59708 2.4032e-16
##  [9,]  0.54102 5.9263e-01
## [10,]       NA         NA

答案 1 :(得分:0)

在很多情况下,仅使用完整的行是严格的。对于p值,您至少需要2个有效值。我更喜欢这样的东西。

t_test <- function(x){ c(stat = ifelse(sum(!is.na(x))>1, t.test(x)$statistic, NA), p_val = ifelse(sum(!is.na(x))>1, t.test(x)$p.value, NA)) }

您可以使用margin = 1的apply函数,这意味着该函数只是行式的。

apply(matrix, MARGIN=1, FUN=t_test)