给定矩阵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)
}
)
答案 0 :(得分:0)
你可以沿着这些方向做点什么
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)
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))
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)