nc <- 205
nr <- 15000
set.seed(30)
EC <- matrix(rnorm(nr * nc), nr, nc)
CP <- matrix(rnorm(nr * nc), nr, nc)
在循环之前计算行均值和变量(这是您最大的错误,将此操作放入循环中):
meansEC <- rowMeans(EC)
meansCP <- rowMeans(CP)
require(matrixStats)
varsEC <- rowVars(EC)
varsCP <- rowVars(CP)
使用预先计算的行均值和行变量,我们可以在没有 t.test 函数的情况下更快地计算 p.value(您可以查看t.test
代码以提取您需要的部分):
t.test.p.value <- function(i, j, nx, ny){
mu <- 0
mx <- meansEC[i]
vx <- varsEC[i]
my <- meansCP[j]
vy <- varsCP[j]
df <- nx + ny - 2
v <- 0
if (nx > 1) v <- v + (nx - 1)*vx
if (ny > 1) v <- v + (ny - 1)*vy
v <- v/df
stderr <- sqrt(v*(1/nx + 1/ny))
tstat <- (mx - my - mu)/stderr
pval <- 2 * pt(-abs(tstat), df)
pval
}
# create resulting matrix
ttest_result <- matrix(NA, nrow(EC), 7)
t <- Sys.time()
nx <- ncol(EC)
ny <- ncol(CP)
让我们用 bout t.test.p.value 函数和默认值进行计算t.test
:
for (i in 1:nrow(EC)) {
ttest_result[i, 2] <- meansEC[i]
ttest_result[i, 3] <- meansCP[i]
ttest_result[i, 4] <- (meansEC[i] - meansCP[i])
ttest_result[i, 5] <- (meansEC[i] / meansCP[i])
ttest_result[i, 6] <- t.test(EC[i, ], CP[i, ], var.equal = TRUE)$p.value
ttest_result[i, 7] <- t.test.p.value(i, i, nx, ny)
}
t <- Sys.time() - t
t
ttest_result[1:5, 5:7]
# [,1] [,2] [,3]
# [1,] -0.3248217 0.35084307 0.35084307
# [2,] -2.3455622 0.11621785 0.11621785
# [3,] -2.1586716 0.01294876 0.01294876
# [4,] 1.1556035 0.98065576 0.98065576
# [5,] 1.9875296 0.92340948 0.92340948
all.equal(ttest_result[,6], ttest_result[, 7])
# [1] TRUE
我们看到结果是相等的
仅使用我的方法对这些数据进行计时:
t <- Sys.time()
meansEC <- rowMeans(EC)
meansCP <- rowMeans(CP)
require(matrixStats)
varsEC <- rowVars(EC)
varsCP <- rowVars(CP)
ttest_result <- matrix(NA, nrow(EC), 7)
for (i in 1:nrow(EC)) {
ttest_result[i, 2] <- meansEC[i]
ttest_result[i, 3] <- meansCP[i]
ttest_result[i, 4] <- (meansEC[i] - meansCP[i])
ttest_result[i, 5] <- (meansEC[i] / meansCP[i])
ttest_result[i, 6] <- t.test.p.value(i, i, nx, ny)
}
t <- Sys.time() - t
t #Time difference of 0.145169 secs