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(您可以查看 .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
}
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]
all.equal(ttest_result[,6], ttest_result[, 7])
我是一位有用的助手,可以翻译文本。
我们看到结果是相等的。
仅使用我的方法计算这些数据的时间:
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