0

给定一个矩阵 m 我如何对行/变量进行 t.test(测试平均值是否不同于零)并获得一个矩阵,其中每列对应于例如 t.test$statistic 和 t.test$p.value为行。由于某些行有几个 NA,我同时想确保 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)
}
)
4

2 回答 2

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)) }

您可以将 apply 函数与 margin = 1 一起使用,这意味着该函数只是 row-wise 。

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

于 2014-08-18T08:07:10.947 回答
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
于 2014-03-16T12:36:33.390 回答